1<!DOCTYPE html> 2<!-- 3 Developed by Paramjot Singh (https://github.com/Param2596) 4 Copyright (c) 2025 Paramjot Singh. All rights reserved. 5--> 6<html lang="en" > 7<head> 8 <meta charset="UTF-8"> 9 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> 10 11 <!-- Cache prevention for development --> 12 <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate"> 13 <meta http-equiv="Pragma" content="no-cache"> 14 <meta http-equiv="Expires" content="0"> 15 16 <!-- SEO Meta Tags --> 17 <title>Retro Terminal â A Nostalgic AI Chat Experience</title> 18 <meta name="description" content="A retro-styled terminal interface for modern AI chat with theme support, chat history, and local API key usage. Experience the nostalgic feel of old-school computing." /> 19 <meta name="keywords" content="retro terminal, AI chat, vintage computing, terminal interface, custom API key, theme support, private chatbot" /> 20 <meta name="author" content="Paramjot Singh, https://github.com/Param2596" /> 21 <meta name="robots" content="index, follow" /> 22 <link rel="canonical" href="https://iristerminal.vercel.app/" /> 23 <meta name="theme-color" content="#2c2c2c" /> 24 <link rel="icon" type="image/png" href="assets/icon.png"> 25 <link rel="icon" href="/favicon.ico" type="image/x-icon" /> 26 <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" /> 27 <!-- PWA removed --> 28 <!-- Open Graph --> 29 <meta property="og:title" content="Retro Terminal â A Nostalgic AI Chat Experience" /> 30 <meta property="og:description" content="A retro-styled terminal interface for modern AI chat with theme support, chat history, and local API key usage. Experience the nostalgic feel of old-school computing." /> 31 <meta property="og:url" content="https://iristerminal.vercel.app/" /> 32 <meta property="og:type" content="website" /> 33 <meta property="og:image" content="https://gemini-app-lake.vercel.app/preview.png" /> 34 <!-- Twitter Card --> 35 <meta name="twitter:card" content="summary_large_image" /> 36 <meta name="twitter:title" content="Retro Terminal â A Nostalgic AI Chat Experience" /> 37 <meta name="twitter:description" content="A retro-styled terminal interface for modern AI chat with theme support, chat history, and local API key usage. Experience the nostalgic feel of old-school computing." /> 38 <meta name="twitter:image" content="https://gemini-app-lake.vercel.app/preview.png" /> 39 <meta name="google-site-verification" content="pw6FRQQdebSTq_FFL-Pmm31okHKYSCklqEYw2dMAMNE" /> 40 <!-- Structured Data --> 41
41<script type="application/ld+json"> 42 { 43 "@context": "https://schema.org", 44 "@type": "WebSite", 45 "url": "https://iristerminal.vercel.app/", 46 "name": "Retro Terminal â A Nostalgic AI Chat Experience", 47 "description": "A retro-styled terminal interface for modern AI chat with theme support, chat history, and local API key usage. Experience the nostalgic feel of old-school computing." 48 } 49 </script>
49 50 <link rel="stylesheet" href="css/styles.css"> 51 <!-- Load the Google GenAI library --> 52
52<script async src="https://ai.google.com/js/api.js"></script>
52 53 <!-- Vercel Speed Insights --> 54
54<script> 55 window.si = window.si || function () { (window.siq = window.siq || []).push(arguments); }; 56 </script>
56 57
57<script defer src="/_vercel/speed-insights/script.js"></script>
57 58 <!-- Vercel Analytics --> 59
59<script> 60 window.va = window.va || function () { (window.vaq = window.vaq || []).push(arguments); }; 61 </script>
61 62
62<script defer src="/_vercel/insights/script.js"></script>
62 63 <!-- Sitemap --> 64 <link rel="sitemap" type="application/xml" title="Sitemap" href="https://iristerminal.vercel.app/sitemap.xml" /> 65</head> 66<body> 67 <div id="crt-container" class="crt-on"> 68 <div id="terminal-header"> 69 <div id="terminal-title">RETRO TERMINAL v1.0.1</div> 70 <div id="terminal-controls"> 71 <a href="features.html" class="header-button" target="_blank" rel="noopener noreferrer">EXPLORE</a> 72 <div class="select-wrapper"> <select id="theme-selector"> 73 <option value="amber">AMBER</option> 74 <option value="green">GREEN</option> 75 <option value="blue">BLUE</option> 76 <option value="white">WHITE</option> 77 <option value="red">RED</option> 78 <option value="soft">SOFT</option> 79 </select> 80 </div> 81 </div> 82 </div> 83 84 <!-- Product Hunt badge removed --> 85 86 <div id="chat-container"> 87 <div id="chat-output"> 88 <div class="message bot-message">SYSTEM: Terminal online. Awaiting input...<span class="typing-cursor"></span></div> 89 <!-- Chat messages will appear here --> 90 </div> 91 <div id="status-bar"> 92 <span id="status-message">SYSTEM READY</span> 93 <span id="memory-usage">MEM: 640K</span> 94 <span id="clock">00:00:00</span> 95 </div> 96 <!-- Replace your current input-area div with this improved version --> 97 <div id="input-area"> 98 <input type="text" id="user-input" placeholder="Type your message..." autofocus> 99 <div class="mobile-controls"> 100 <div id="file-upload-container"> 101 <label for="file-upload" class="file-upload-btn" title="Upload file"> 102 <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> 103 <path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path> 104 <polyline points="17 8 12 3 7 8"></polyline> 105 <line x1="12" y1="3" x2="12" y2="15"></line> 106 </svg> 107 </label> 108 <input type="file" id="file-upload" multiple> 109 </div> 110 <button id="send-button">SEND</button> 111 </div> 112 <div id="file-preview-container"></div> 113 </div> 114 </div> 115 116 117 </div> 118 119 <!-- Add these before your other scripts --> 120
120<script src="https://cdn.jsdelivr.net/remarkable/1.7.1/remarkable.min.js"></script>
120 121
121<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script>
121 122 <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/monokai.min.css"> 123 124 <!-- Config file should be loaded first --> 125
125<script src="js/config.js"></script>
125 126 127 <!-- Changelog data --> 128
128<script src="js/changelog.js"></script>
128 129 130 <!-- Main scripts --> 131
131<script src="js/api.js"></script>
131 132
132<script src="js/terminal.js"></script>
132 133
133<script src="js/app.js"></script>
133 134 135 <!-- Development helper script --> 136
136<script> 137 // Add console helper for development only 138 if (window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1') { 139 console.log('%cð§ DEVELOPMENT MODE ACTIVE', 'background: #ff6b35; color: white; padding: 4px 8px; border-radius: 4px; font-weight: bold;'); 140 } 141 </script>
141 142 143 <!-- PWA KILL-SWITCH Script --> 144
144<script> 145 if ('serviceWorker' in navigator) { 146 window.addEventListener('load', async () => { 147 try { 148 // Register the KILL-SWITCH (does nothing except self-destruct) 149 const reg = await navigator.serviceWorker.register('/sw.js', {updateViaCache:'none'}); 150 151 // For good measure, explicitly unregister any service workers 152 const regs = await navigator.serviceWorker.getRegistrations(); 153 await Promise.all(regs.map(r => r.unregister())); 154 155 // Clear all caches 156 const cacheNames = await caches.keys(); 157 await Promise.all(cacheNames.map(name => caches.delete(name))); 158 159 const isDev = window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1'; 160 if (isDev) { 161 console.log('PWA completely removed and all caches cleared'); 162 } 163 } catch (err) { 164 console.error('Service worker cleanup failed:', err); 165 } 166 }); 167 } 168 </script>
168 169</body> 170</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.