diff --git a/svg.cpp b/svg.cpp
new file mode 100644
index 0000000..3e04594
--- /dev/null
+++ b/svg.cpp
@@ -0,0 +1,45 @@
+#include <iostream>
+#include <vector>
+#include "svg.h"
+
+void svg_begin(double width, double height) {
+    std::cout << "<?xml version='1.0' encoding='UTF-8'?>\n";
+    std::cout << "<svg ";
+    std::cout << "width='" << width << "' ";
+    std::cout << "height='" << height << "' ";
+    std::cout << "viewBox='0 0 " << width << " " << height << "' ";
+    std::cout << "xmlns='http://www.w3.org/2000/svg'>\n";
+}
+
+void svg_end() {
+    std::cout << "</svg>\n";
+}
+
+void svg_text(double left, double baseline, std::string text) {
+        std::cout << "<text x='" << left << "' y='"<< baseline <<"'>"<< text <<"</text>";
+}
+
+void svg_rect(double x, double y, double width, double height) {
+        std::cout << "<rect x='"<< x <<"' y='"<< y <<"' width='"<< width <<"' height='"<< height <<"' fill='#FF0000' />";
+}
+
+void show_histogram_svg(const std::vector<double>& bins) {
+    const auto IMAGE_WIDTH = 400;
+    const auto IMAGE_HEIGHT = 300;
+    const auto TEXT_LEFT = 20;
+    const auto TEXT_BASELINE = 20;
+    const auto TEXT_WIDTH = 50;
+    const auto BIN_HEIGHT = 30;
+    const auto BLOCK_WIDTH = 10;
+
+    svg_begin(400, 300);
+    double top = 0;
+    for (size_t bin : bins) {
+        const double bin_width = BLOCK_WIDTH * bin;
+        svg_text(TEXT_LEFT, top + TEXT_BASELINE, std::to_string(bin));
+        svg_rect(TEXT_WIDTH, top, bin_width, BIN_HEIGHT);
+        top += BIN_HEIGHT;
+    }
+
+    svg_end();
+}
diff --git a/svg.h b/svg.h
new file mode 100644
index 0000000..f4f7c5b
--- /dev/null
+++ b/svg.h
@@ -0,0 +1,9 @@
+#ifndef SVG_H_INCLUDED
+#define SVG_H_INCLUDED
+
+#include <vector>
+
+void show_histogram_svg(const std::vector<double>& bins);
+
+
+#endif // SVG_H_INCLUDED