diff --git a/assets/js/crt-logs.js b/assets/js/crt-logs.js
new file mode 100644
index 0000000..e7a57ff
--- /dev/null
+++ b/assets/js/crt-logs.js
@@ -0,0 +1,110 @@
+// CRT Log Screen with Analytics
+// This script updates the CRT screen with a mix of fake logs and real visitor stats
+
+function initCRTLogs() {
+ const crtScreen = document.getElementById('crt-logs');
+
+ if (!crtScreen) {
+ return;
+ }
+
+ const fakeLogs = [
+ '[WARN] High load detected - time for coffee break',
+ '[ERROR] 404: Motivation not found',
+ '[WARN] Firewall detected actual fire.',
+ '[ERROR] Keyboard not found. Press F1 to continue.',
+ ];
+
+ function formatDate(dateStr) {
+ const date = new Date(dateStr);
+ return date.toLocaleString('en-US', {
+ month: 'short',
+ day: 'numeric',
+ hour: '2-digit',
+ minute: '2-digit',
+ hour12: false
+ });
+ }
+
+ function updateCRTScreen(stats) {
+ const logs = [];
+
+ // Add initial command
+ logs.push('> tail -f /var/log');
+
+ // Mix fake logs with real stats
+ const totalLogs = 10;
+ const statsPositions = [3, 6, 9]; // Insert stats at these positions
+
+ let fakeLogIndex = 0;
+
+ for (let i = 0; i < totalLogs; i++) {
+ if (statsPositions.includes(i) && stats) {
+ // Insert real stats
+ if (i === 3) {
+ logs.push(`[STATS] Total visitors: ${stats.totalHits.toLocaleString()}`);
+ } else if (i === 6) {
+ logs.push(`[STATS] Unique visitors: ${stats.uniqueVisitors.toLocaleString()}`);
+ } else if (i === 9 && stats.lastUpdated) {
+ logs.push(`[STATS] Last updated: ${formatDate(stats.lastUpdated)}`);
+ }
+ } else {
+ // Insert fake log
+ logs.push(fakeLogs[fakeLogIndex % fakeLogs.length]);
+ fakeLogIndex++;
+ }
+ }
+
+ // Animate logs appearing one by one
+ crtScreen.innerHTML = '> tail -f /var/log
\n_';
+
+ let currentIndex = 0;
+ const lineDelay = 150; // milliseconds between each line
+
+ function addNextLine() {
+ if (currentIndex < logs.length - 1) { // -1 to skip the initial command we already added
+ const displayedLogs = logs.slice(1, currentIndex + 2); // Skip initial command, add lines progressively
+ crtScreen.innerHTML = logs[0] + '
\n' + displayedLogs.join('
\n') + '
\n_';
+ currentIndex++;
+ setTimeout(addNextLine, lineDelay);
+ } else {
+ // Final update with cursor
+ crtScreen.innerHTML = logs.join('
\n') + '
\n_';
+ }
+ }
+
+ setTimeout(addNextLine, lineDelay);
+ }
+
+ function fetchAnalyticsStats() {
+ fetch('https://api.ritual.sh/analytics/stats')
+ .then(response => {
+ if (!response.ok) {
+ throw new Error('Failed to fetch stats');
+ }
+ return response.json();
+ })
+ .then(stats => {
+ updateCRTScreen(stats);
+ })
+ .catch(err => {
+ // Silently fail and show fake logs only
+ console.debug('Failed to load analytics stats:', err);
+ updateCRTScreen(null);
+ });
+ }
+
+ // Initial load
+ fetchAnalyticsStats();
+
+ // Refresh stats every 30 seconds
+ setInterval(fetchAnalyticsStats, 30000);
+}
+
+// Wait for DOM to be ready
+if (document.readyState === 'loading') {
+ document.addEventListener('DOMContentLoaded', initCRTLogs);
+} else {
+ // DOM already loaded
+ initCRTLogs();
+}
diff --git a/layouts/index.html b/layouts/index.html
index b5ac2f2..d442f57 100644
--- a/layouts/index.html
+++ b/layouts/index.html
@@ -89,18 +89,8 @@