This is a submission for the Hacktoberfest Open-Source AI Challenge: Week 4, Ghost in the Machine.
What I built
El Eco is an algorithmic ofrenda for unfinished work. Not for a person. For the repository you stopped pushing, or a CSV of a habit you stopped logging.
You set a public GitHub repository on the altar, or a file that stays on your machine, or the fictional sample ghost lumen-notes. The page finds the week the work went quiet. TabPFN-3.5 draws the weeks after that as a continuation of the last rhythm: same season, same lag, no invented stars and no invented lines of code. Gemma, through Ollama on this machine, may then speak in the first person as that project. If it cites a number that is not in the dossier, the speech is thrown out and the altar reads the record instead.
The page is one Halloween night. A moon, bats, drifting ghosts, and a graveyard sit behind the altar. Orange columns are the weeks the project was alive. A green line is what TabPFN says the silence would have held. The eulogy sits in a tombstone. A music-box waltz, synthesised in the browser, plays under it and ducks while a voice is speaking.
Demo
- Live altar: https://el-eco.onrender.com
- Repository: https://github.com/Koushiklalala/el-eco
Koushiklalala
/
el-eco
An ofrenda for abandoned projects. TabPFN-3.5 forecasts the silence and local Gemma speaks.
El Eco
An algorithmic ofrenda for the ghosts of unfinished work.
You give it a public GitHub repository, or a CSV that never has to leave your machine, or the fictional sample ghost bundled with this repo. It finds the week the work went quiet. TabPFN-3.5, running locally, says what the later weeks would have held if the last rhythm had continued. Gemma, through Ollama, may then speak as that project. A fact check throws the speech away if it cites a number that is not in the record.
This altar is for abandoned projects. It is not a memorial for a person, and it will not invent one.
Why the open pieces are the product
A closed chat API could write a spooky paragraph. It would also be the thing the project depends on: the history leaves the machine, the bill starts when the candle is…
The first forecast on a cold instance takes a while. TabPFN loads on CPU, and the weights download the first time. /api/health is up before that finishes.
Try the sample ghost first. lumen-notes is a fictional local journal: born 6 June 2022, last touched 6 February 2023, quiet for 1362 days, 142 commits across 36 living weeks. On the run I kept, TabPFN-3.5 on CPU expected about 1.87 commits in the week the work stopped, and 620 across the silence. Gemma 3, locally, wrote the eulogy from that dossier.
Then walk a GitHub username. The longest silences are listed first. A repository touched in the last 90 days is still breathing: the altar shows the weeks, and it refuses to invent a ghost timeline or a eulogy.
On your own machine, with Ollama and gemma3 running, the eulogy is Gemma. On the Render URL, Ollama is not in the container, so the hosted altar reads the grounded record. Speak on this machine uses the browser voice. Send to ElevenLabs is a separate button, and the label says the text leaves the machine.
How it works
flowchart LR
altar[Ofrenda page]
api[FastAPI]
gh[GitHub public API]
bb[Browserbase page read]
csv[CSV in the browser]
death[Silence split]
tab[TabPFN-3.5]
gem[Gemma via Ollama]
check[Number check]
altar --> api
gh --> api
bb --> api
csv --> api
api --> death --> tab --> check
death --> gem --> check
check --> altar
A week is the death of the work when the last commit is at least 90 days behind today. Training rows stop there. Each silent week is a row of month, ISO week, and the lag-1, lag-2, and lag-4 commit counts frozen at the end of the life. Those features stay inside the range TabPFN saw. That is the honest way to ask a tabular model about a counterfactual, instead of extrapolating a week-index off the edge of the table.
Gemma gets a dossier and a list of allowed integers. The server checks the reply. The grounded fallback is there so a missing model does not become a made-up future.
Commit dates come from GitHub's public API. For a public repository, a Browserbase browser also opens the page and brings back the title and description. Digits are stripped before Gemma sees them, so a number on the webpage cannot sneak into the eulogy. The sample ghost and a CSV never open a browser.
ElevenLabs is the second button. The rite does not press it for you.
Why open innovation matters here
A closed model could write the paragraph. It could not do the thing the altar is for.
The interesting input is a personal history: a dead repo, or a spreadsheet of a habit. Posted to a chat API, that history becomes someone else's log. With TabPFN and Gemma on the machine, a CSV séance needs no network once the weights are local. The GitHub path only asks GitHub for a repository the world can already open.
People who run models locally in 2026 describe the same trade: David Ucolo's guide treats a local model as a real tool rather than a toy, and Suresh Kumar's note on Ollama is blunt about what a hosted API costs you, lock-in and a bill for every call. El Eco is that choice made concrete. The séance is editable. Swap the Ollama tag and the ghost changes voice. A non-Gemma override is refused, so the project cannot quietly enter a Gemma category with a different model. The fact check is possible because the forecast is a table of numbers we computed, not a vibe from a hosted agent we cannot inspect.
I also did not ask a hosted LLM to estimate how big the project would be now. That number would have been a costume. TabPFN's sum is a specific expectation under a stated assumption, that the last rhythm held, and the eulogy is not allowed to improve on it.
Agent session
Prize categories
- Best Use of TabPFN. TabPFN-3.5 forecasts the unwritten weeks from the commit table, locally and on the Render service.
- Best Use of Gemma. Gemma 3, through Ollama, writes the eulogy on this machine, and a number check rejects anything that is not in the dossier.
-
Best Use of Render. The altar is live at https://el-eco.onrender.com from the Docker blueprint in
render.yaml, on the standard plan so the forecast has room to load. - Best Use of ElevenLabs. A labeled button turns the eulogy into narration. The text leaves the machine only when someone presses it.
- Best Use of Browserbase. For a public repository, a remote browser opens the GitHub page and the words come back into the local séance.
Top comments (0)