diff --git a/var/www/static/js/d3/barchart_stack.js b/var/www/static/js/d3/barchart_stack.js
new file mode 100644
index 00000000..fe356795
--- /dev/null
+++ b/var/www/static/js/d3/barchart_stack.js
@@ -0,0 +1,154 @@
+//Requirement: - D3v5
+// - jquery
+// data input: var data = [{ date: "2024-02-21", down: 0, up: 0}, { date: "2024-02-22", down: 1, up: 3}]
+//
+
+const barchart_stack = (container_id, data, options) => {
+
+ const defaults = {
+ style: {
+ stroke: "rgb(0, 0, 0)",
+ strokeWidth: 2,
+ strokeWidthHover: 4.5
+ },
+ margin: {top:20, right:90, bottom:55, left:0},
+ width: 500,
+ height: 500
+ };
+
+ options = $.extend(true, defaults, options);
+
+ let width_graph = options.width - options.margin.left - options.margin.right;
+ let height_graph = options.height - options.margin.top - options.margin.bottom;
+
+ let x = d3.scaleBand().rangeRound([0, width_graph]).padding(0.1);
+ let y = d3.scaleLinear().rangeRound([height_graph, 0]);
+
+ let xAxis = d3.axisBottom(x);
+ let yAxis = d3.axisLeft(y);
+
+ let color = d3.scaleOrdinal(d3.schemeSet3);
+
+ let svg = d3.select("#"+container_id).append("svg")
+ .attr("viewBox", "0 0 "+width_graph+" "+options.height)
+ .attr("width", options.width)
+ .attr("height", options.height)
+ .append("g")
+ .attr("transform", "translate("+options.margin.left+","+options.margin.top+")");
+
+ // popover
+ $('[data-toggle="popover"]').popover({
+ placement: 'top',
+ container: 'body',
+ html : true,
+ });
+
+ const mouseover = function(d) {
+ $(this).popover({
+ title: d.name,
+ placement: 'top',
+ container: 'body',
+ trigger: 'manual',
+ html : true,
+ content: function() {
+ return d.label + "
num: " + d3.format(",")(d.value ? d.value: d.y1 - d.y0);
+ }
+ });
+ $(this).popover('show')
+ }
+ const mouseleave = function(d) {
+ $('.popover').each(function() {
+ $(this).remove();
+ });
+ }
+
+ let labelVar = 'date';
+ let varNames = d3.keys(data[0])
+ .filter(function (key) { return key !== labelVar;});
+
+ data.forEach(function (d) {
+ let y0 = 0;
+ d.mapping = varNames.map(function (name) {
+ return {
+ name: name,
+ label: d[labelVar],
+ y0: y0,
+ y1: y0 += +d[name]
+ };
+ });
+ d.total = d.mapping[d.mapping.length - 1].y1;
+ });
+
+ x.domain(data.map(function (d) { return (d.date); }));
+ y.domain([0, d3.max(data, function (d) { return d.total; })]);
+
+ svg.append("g")
+ .attr("class", "x axis")
+ .attr("transform", "translate(0," + height_graph + ")")
+ .call(xAxis)
+ .selectAll("text")
+ .style("fill", "steelblue")
+ .attr("transform", "rotate(-18)" )
+ //.attr("transform", "rotate(-40)" )
+ .style("text-anchor", "end");
+
+ svg.append("g")
+ .attr("class", "y axis")
+ .call(yAxis)
+ .append("text")
+ .attr("transform", "rotate(-90)")
+ .attr("y", 6)
+ .attr("dy", ".71em")
+ .style("text-anchor", "end");
+
+ let selection = svg.selectAll(".series")
+ .data(data)
+ .enter().append("g")
+ .attr("transform", function (d) { return "translate(" + x((d.date)) + ",0)"; });
+
+ selection.selectAll("rect")
+ .data(function (d) { return d.mapping; })
+ .enter().append("rect")
+ .attr("width", x.bandwidth())
+ .attr("y", function (d) { return y(d.y1); })
+ .attr("height", function (d) { return y(d.y0) - y(d.y1); })
+ .style("fill", function (d) { return color(d.name); })
+ .style("stroke", "grey")
+ .on("mouseover", mouseover)
+ .on("mouseout", mouseleave)
+
+
+ data.forEach(function(d) {
+ if(d.total != 0){
+ svg.append("text")
+ .attr("dy", "-.35em")
+ .attr('x', x(d.date) + x.bandwidth()/2)
+ .attr('y', y(d.total))
+ .style("text-anchor", "middle")
+ .text(d.total);
+ }
+ });
+
+ // drawLegend(varNames)
+ let legend = svg.selectAll(".legend")
+ .data(varNames.slice().reverse())
+ .enter().append("g")
+ .attr("transform", function (d, i) { return "translate(0," + i * 20 + ")"; });
+
+ legend.append("rect")
+ .attr("x", width_graph)
+ .attr("width", 10)
+ .attr("height", 10)
+ .style("fill", color)
+ .style("stroke", "grey");
+
+ legend.append("text")
+ .attr("x", width_graph - 2)
+ .attr("y", 6)
+ .attr("dy", ".35em")
+ .style("text-anchor", "end")
+ .text(function (d) { return d; });
+
+ return svg
+
+}
diff --git a/var/www/templates/crawler/crawler_splash/last_crawled.html b/var/www/templates/crawler/crawler_splash/last_crawled.html
index 467fd1e6..d4a9363b 100644
--- a/var/www/templates/crawler/crawler_splash/last_crawled.html
+++ b/var/www/templates/crawler/crawler_splash/last_crawled.html
@@ -16,21 +16,9 @@
+