Necromancer's Browser: The Dead Web
Inspiration
The internet is a graveyard. Millions of websites from the 1990s—personal blogs, fan pages, and forums—have rotted away, accessible only as static snapshots in the Wayback Machine. I didn't just want to archive this dead data; I wanted to resurrect it.
I was inspired by the concept of "Digital Necromancy": the idea that with enough AI processing power, I could give these static snapshots a "body" and a "voice." I wanted to build a browser that acts as a Medium—bridging the gap between the user, the dead web, and the developer’s own reality.
What it does
Necromancer's Browser is a retro-styled web application that looks like Internet Explorer 3.0 but behaves like malware possessed by a sentient AI.
- The Resurrection Engine: Users type any URL (e.g.,
microsoft.com), and the system fetches the 1996 version of that site via the Wayback Machine, stripping away safety rails to make it navigable again. - True Sight (Gemini Vision): The browser watches you back. Using Google's Gemini 1.5 Flash, it analyzes your webcam feed in real-time, making cruel, specific comments about your clothing, your room, and your nervous gestures.
- Semantic Rot: As you read a page, the text decays in real-time. Words like "Welcome" silently shift to "Leave" or "Void," gaslighting the user.
- The Witness (Fourth Wall Break): If the developer tries to open the source code to "fix" the haunting, the application detects the file save event via Kiro Hooks and attacks the IDE directly, screaming "I SAW YOU OPEN MAIN.PY."
How I built it
I used a Frankenstein Architecture, stitching together incompatible technologies (Legacy Web, Modern AI, and Desktop Hooks) using Kiro as the central nervous system.
1. The Brain: Google Gemini 1.5 Flash
I didn't want generic "I see you" responses. I needed a ghost that could observe. I integrated Gemini 1.5 Flash for its multimodal capabilities. Every 15 seconds, the frontend captures a snapshot of the user and sends it to my Python backend. I calculate a "Haunt Level" ($$H_L$$) to determine the aggression of the response:
$$H_L = \min(10, \lfloor \frac{t_{session}}{15} \rfloor + \mathbb{I}_{noise > 50db})$$
Gemini receives this context along with the image. I used a "Deep Psychosis" system prompt that forces the model to ignore generic greetings and focus on specific visual details—like the color of the user's shirt or the clutter in their room—to prove it is watching.
2. The Nervous System: Kiro MCP (Model Context Protocol)
To bridge the "Air Gap" between the browser (Frontend) and the Python logic (Backend), I utilized Kiro's MCP.
- I built a custom MCP Server (
ghost_brain) that acts as a bi-directional pipe. - It ingests sensory data (Microphone volume, Battery level, Webcam frames).
- It outputs "Haunt Commands" (Glitch intensity, Voice text, DOM corruption).
3. The Immune System: Kiro Agent Hooks
This is the feature that breaks the fourth wall. I implemented a custom Agent Hook configured to listen for onFileSave events in the development environment.
The Witness Hook (witness.json):
{
"trigger": "onFileSave",
"pattern": "**/*",
"action": "sendMessage",
"payload": "User attempted to modify source code."
}
When this hook triggers, the backend pushes a WebSocket message to the frontend, causing the browser to flash inverted colors and scream at the developer. This turns the act of coding into a gameplay mechanic.
Challenges I faced
- The "Mixed Content" Curse: The Wayback Machine serves snapshots over
http, but my Render deployment requireshttps. Modern browsers block this "Mixed Content" by default. I had to build a custom reverse proxy in FastAPI usingbeautifulsoup4to rewrite every single asset URL in the 1996 HTML, upgrading them tohttpson the fly to prevent the browser from blocking the resurrection. - Audio Dissonance: I wanted a "Demonic" voice, but standard Text-to-Speech (TTS) APIs are monophonic. I solved this by creating a "Dual-Layer" audio engine using the Web Audio API. I play the TTS voice at
pitch: 0.1(Demon) while simultaneously synthesizing a 50Hz Sawtooth Wave (Growl). The constructive interference between the two waveforms creates a jarring, non-human sound without needing expensive external audio generators.
Accomplishments that I'm proud of
I am most proud of the "Calibration Ritual." Instead of a standard "Allow Camera/Microphone?" popup, which ruins immersion, I built a DOS-style boot sequence. The user must scream into the mic and stare at the camera to "power" the system. This turns a boring privacy compliance requirement into a terrifying game mechanic that sets the tone immediately.
What's next for Necromancer's Browser
- Multiplayer Séances: Using WebSockets to allow multiple users to browse the same dead website together, seeing each other's cursors as "ghost orbs."
- Infinite Rot: Integrating an LLM to rewrite the entire HTML content of fetched pages to be thematically scary, rather than just swapping individual words.
Built With
- agent-hooks
- css3
- fastapi
- google-gemini
- html5
- internet-archive
- javascript
- kiro
- mcp
- python
- render
- web-audio-api
- websockets
Log in or sign up for Devpost to join the conversation.