This is a submission for the Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine
What I Built
Pale Hours (Las Horas Pálidas) is a local-first digital graveyard for the things you abandoned. Every developer and writer leaves a trail of quiet ghosts: unsent letters in draft folders, repos abandoned at commit 4 (wip refactor), voice memos recorded at 2 a.m. and never opened again, domain names bought and forgotten.
You bring those things to Pale Hours, and an open-weight model running on your own machine performs three rites:
- The Epitaph: a short, literary obituary. What the thing was, when it stopped breathing, and what it was trying to become.
- The Candle: if you choose to revive it, the model drafts the single smallest step to start again, without guilt.
- The Ash: if you choose to let it go, the artifact dissolves into a cold ember and is kept only as a memory on the Ofrenda.
I read the theme through Día de los Muertos rather than horror. The ghosts here are not other people. They are your past selves, and the site honors them with fog, vellum, breath and marigold candlelight instead of jump scares.
The inspiration was a simple, slightly uncomfortable thought. The most private things we own are the things we never finished, and nobody should have to hand an unsent apology to a cloud service just to be told it deserves a gentle goodbye.
Demo
- Live demo: https://pale-hours.onrender.com/ (the hosted version has no model attached, so it runs a local simulation of the epitaphs; the real thing uses your own model)
The site has four spaces and nothing else:
-
/The Cinematic Scroll: a WebGL fog field that parts around your cursor like breath, a pinned "disappearing sentence," a horizontal drift of six ghosts, and a "severed Wi-Fi" moment showing the network line cut while inference carries on. -
/vigilThe Ritual Room: drop in real files (.md,.py,.ts,.txt,.json, audio transcripts) or write a thought, then watch the epitaph stream in token by token as a floating vellum sheet follows your mouse. -
/ofrendaThe Digital Altar: a three-tier Día de los Muertos altar (spoken words, stalled engines, unborn ideas) with swaying papel picado banners and flickering marigold candles for every revival. -
/openHow It Haunts: the architecture, an open-vs-closed comparison, and a live voice swapper.
Code
Pale Hours (Las Horas Pálidas)
A local-first digital graveyard for the things you abandoned.
"Everything you began was an attempt to be understood by someone who hadn’t arrived yet. Now let it rest, or let it breathe."
🕯️ Concept & Philosophy
Every developer, writer, and maker leaves behind a trail of quiet ghosts:
- Unsent letters in draft folders
- Repositories abandoned at commit 4 (
git commit -m "wip refactor") - Voice memos recorded at 2:00 AM that were never opened again
- Stalled essays, forgotten domain registrations, half-wired electronics
Closed-source AI products treat everything as raw training fodder, mining your unfinished thoughts to feed corporate weights in distant data centers.
Pale Hours was built for the "Ghost in the Machine" hackathon (Halloween / Día de los Muertos theme). It is a sacred, private, and local-first ritual space. You point it at your discarded work on your own machine. An open-weight model…
Setup is a few commands: bun install, optionally ollama pull gemma3, then bun dev.
How I Built It
The open-weight model is the heart of it.
-
Local inference: Ollama running open-weight models on
localhost:11434, with Gemma 3 as the primary. Epitaphs stream to the browser over Server-Sent Events, token by token, with a soft candle flicker tied to each token's arrival. - Graceful fallback: the app auto-negotiates. If Ollama is running, it uses the real model. If the daemon is asleep, it falls back to a high-fidelity local simulation, so the site never breaks.
-
Swappable voices: the
/openpage lets you swap between five open-weight options (Gemma 3, Qwen 3, Llama 3.3, Mistral Nemo, and a Personal LoRA voice) and watch each one write a different epitaph for the same dead git commit. The same prompt gets a different temperament from each model, which was the most fun part to build. - Storage: MongoDB through Mongoose if you provide a connection string, otherwise an automatic in-memory repository seeded with 12 historical ghosts. No account is ever required.
- Front end: Next.js 16 (App Router, Turbopack) on Bun, Tailwind CSS v4, Three.js with React Three Fiber and drei for the vellum sheet and fog, GSAP and Lenis for scroll choreography, and Framer Motion for transitions and the shared-layout reading chamber.
- Sound: no audio files at all. A native Web Audio synthesizer produces a 55 Hz room hum, 432 Hz singing-bowl chimes, and candle crackle.
- Look: a strict light palette of layered off-whites with one marigold accent, zero gradients, an 8 fps animated film-grain filter, and a custom marigold cursor that leaves a fading breath trail.
Why Does Open Innovation Matter?
Pale Hours only makes sense if the model is yours.
Privacy is the whole product. An abandoned draft is more personal than a finished one. It is the apology you never sent, the idea you were embarrassed by, the poem you stopped translating halfway. Closed AI products treat unfinished thoughts as raw material. With an open-weight model on my own GPU, the model is not an agent of anyone else. It is an instrument of reflection, and the files stay on the machine that holds them.
It keeps working when the lights go out. Because inference is local, the epitaph ritual doesn't depend on a connection, a quota, or a company's uptime. A memorial that depends on a vendor's API is a memorial with an expiry date.
You can swap and reshape the voice. Open weights mean I can switch from Gemma to Qwen to Llama in one line and hear a different temperament, and the same openness is what makes tuning a model to your own writing possible. A closed API gives everyone one polite, generic voice.
It costs nothing to run. No per-token bill means you can point it at years of abandoned files and let it read all night.
It isn't locked inside a service that might disappear. The model, the runtime and the code are all open. Nothing in Pale Hours can be deprecated, rate-limited or repriced out from under the memories it holds.
Top comments (0)