DEV Community

Hardik
Hardik

Posted on

Building Camposanto: a local-AI graveyard for abandoned repos

Hacktoberfest Open-Source AI Challenge: Ghost in the Machine Submission 👻🌼

This is a submission for the Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine

What I Built

Camposanto is a quiet graveyard for abandoned side projects. You point it at a folder of old repos, and each one becomes a tombstone in a small 2D night scene. Click a stone and a local language model writes an epitaph and a "cause of death" from the repo's real git log and README. A resurrect button then tells you what the project was, how to revive it, and three next steps.

Every developer has a folder of projects that just stopped: the last commit says "wip", and nobody came back. I wanted something that honors those projects in the spirit of Día de los Muertos. The projects get remembered, and the ones with recent commits keep a small candle lit.

The UI is deliberately minimal: an ink-black page, one candle-amber accent, thin line-art stones, a slow candle flicker, drifting fog, and a faint papel picado strst drifts to whicheverstone you hover.

Demo

Code

Camposanto

A quiet graveyard for your abandoned projects. Point it at a folder of old repos and each one becomes a tombstone. A local open-weight model writes an epitaph and a "cause of death" from the real git log and README, and a resurrect button tells you what the project was and how to bring it back.

Everything runs on your machine: no accounts, no API keys, no network once the model is pulled.

Run

ollama pull qwen2.5:3b       # ~2GB, fits a 4GB GPU
node server.js               # Node 18+, no npm install needed

Open http://localhost:7331, set the folder to scan, pick a model from the dropdown.

config.json holds port, scanRoot, ollamaUrl, defaultModel and staleDays (a repo with no commits for that many days counts as dead; the rest keep a candle lit).

Swapping models

The dropdown lists whatever Ollama has installed. Good small choices: llama3.2:3b…

Run it yourself:

ollama pull qwen2.5:3b
node server.js        # Node 18+, no npm install
# open http://localhos
Enter fullscreen mode Exit fullscreen mode

How I Built It

  • Model runtime: Ollama running open-weight models locally. I deveAM and a 4GB RTX 3050,mainly with qwen2.5:3b (about 2GB). The model dropdown lists whatever is installed, so I could nd others.
  • Server: about 150 lines of dependency-free Node (http, child_process, fetcsgit log`, the firstcommits, file types and the README, and streams the model's reply to the browser over server-se
  • Prompts: two small prompts in lib/llm.js, one for epitaphs and one for resurrection. Smalrose, so I added alength cap, a stop at the first blank line, a repeat penalty, and a format template. Without thospied text from my ownexample.
  • Cache: results a and model, sore-clicking a stone is instant and switching models regenerates.
  • UI: vanilla HTMLbuild step. Systemfonts only, so the page loads with no external requests.

Why Does Open Innovation Matter?

  • Your unfinished code stays private. Abandoned projects often hold half-baked ideas, privmmit messages. With alocal model, none of that is sent to a server I don't control.
  • **It works with the ith wifi disabled. Thewhole thing, scanning, model and UI, runs on a laptop.
  • **I could change theing the model is onedropdown. Changing the persona from a gentle poet to a disappointed parent is a prompt edit. Beca could tune samplingsettings like the repeat penalty and stop sequences, which is what fixed the looping.
  • It costs nothing to run across as many repos as I like.

A closed API would have worked as a one-off demo, but I wouldn't want to
point it at a folder o

My Agent Session

Building Camposanto: a local-AI graveyard for abandoned repos
You

Ghost in the Machine challenge (open-source AI, Halloween / Día de los Muertos theme). Help me brainstorm ideas I can run on my laptop with local models, with swappable models. UI on a local port, not generic, 2D subtle minimalistic Halloween look.

Agent

Proposed five ideas: Ofrenda (remembrance altar), Camposanto (graveyard of abandoned repos), haunted shell, séance for dead tech, night watch. Shared stack: Ollama/llama.cpp behind a small local server, model dropdown from /api/tags. Visual direction: ink-black, one candle-amber accent, thin line art, papel picado strip. Asked which idea and what hardware.

You

Camposanto only. Hardware: 16GB RAM, 4GB VRAM RTX 3050.

Agent

Wrote a plan: zero-dependency Node server, lib/scan.js (git history + README per repo), lib/llm.js (Ollama streaming + prompts), lib/cache.js, vanilla SVG UI; models <=4B to fit 4GB VRAM.

Agent

Built server.js, lib/scan.js, lib/llm.js, lib/cache.js, config.json, and public/index.html, style.css, app.js. A bash heredoc truncated server.js and mangled config.json escaping; I caught both with node --check and a JSON parse error and rewrote them.

Agent

Smoke-tested against throwaway git repos. Ollama was not running, so I tested the SSE streaming and cache against a mock NDJSON server: first request streamed, second was served from cache. A headless Edge screenshot confirmed the look. Fixed the papel picado mask and the stone font.

You

ollama is installed and even multiple models are in the system

Agent

Ollama was installed but not running. Installed models did not include my defaults, so I switched the default to qwen2.5:3b and made think:false retry-safe for models that reject it. First real output echoed my prompt labels and omitted the cause of death.

Agent

Second pass: the model looped three times and copied 'fix animation bug' from my example. Fixed with num_predict cap, stop at first blank line, repeat_penalty 1.15, a placeholder template instead of a copyable example, and passing the real last-commit year. Result: real project names, real facts, no loops. Remaining weakness: the 3B model sometimes misreads day counts.

You

Give me steps to run it, then to create a repo and push to GitHub, then write the dev.to post and save this session.

Agent

Provided run steps (ollama running, node server.js, open localhost:7331), git init / gh repo create steps, the dev.to post draft with placeholders for demo, repo and session, and DevRelay session steps.

Top comments (0)