This is a submission for the Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine
What I Built
Every developer has a few ghosts in their package.json. A library you once leaned on every day, still installed somewhere, whose repository has not moved in years. Nobody announces when a project dies. The commits just stop, and one day you notice that the last thing anyone ever said to it was "Change hyperlink".
For DÃa de los Muertos, families build an ofrenda: an altar with a photo, the things the person loved, candles, marigolds, so the dead are remembered instead of forgotten. Last Commit builds one for a repository.
Paste any public GitHub repository and you get a remembrance card:
- The years it was alive, and whether it is archived or has simply gone quiet.
- Last words: the real final commit message written by a person (merges and version bumps are skipped).
- Tended by: the people who kept it alive.
- An epitaph and a remembrance, written by an open-weight model running inside your browser tab.
Then you can download the card as a PNG, share a ?repo=owner/name link, and, the part I care about most, fork the project or leave its maintainers a star. Some of these ghosts are still holding up half the internet.
Here is a real card from the live site. Both the epitaph and the "What it gave us" lines were written by Qwen2.5 0.5B, on the CPU, in headless Chrome:
Demo
Live: https://last-commit-ofrenda.vercel.app
Narrated demo (47 s): https://last-commit-ofrenda.vercel.app/demo/last-commit-demo.mp4
Click one of the examples (atom, brackets, angular.js, BrowserQuest, co) or paste a repository, then Let it write. No account, no key, no server.
The card fills in instantly from GitHub facts, before any AI is involved. Then the model writes, word by word, and replaces the fact based lines only if its reply passes the checks:
These are real runs on the live site on October 26, 2026, using the 0.5B model on the CPU (WebAssembly) path in headless Chrome. The first load downloaded 793 MB of weights and took 54.7 s.
| Repository | Epitaph | Result |
|---|---|---|
| atom/atom | It was a hackable text editor, not just a hack, but a true hack, by any standards. | Model, 23 tokens in 29.7 s |
| adobe/brackets | It gave 7,429 forks a place to begin, then rested in March 2021. | Model reply set aside (first person), so the fact based line stayed |
| request/request | It was here, waiting for its day. | Model, 10 tokens in 18.0 s |
And the remembrances:
- atom/atom (model, 45 tokens in 49.7 s): "Atom was not just a tool; it was a living, breathing ecosystem of features and libraries. It's like a giant sponge that absorbed all the best parts from other tools, making it even more powerful than ever before."
- adobe/brackets (model, 47 tokens in 48.1 s): "Brackets was a powerful tool for developers, its simplicity and elegance have been a testament to its longevity. It stands as a reminder of the dedication and hard work of those who created it, and the enduring legacy of its creator."
- request/request (model reply set aside for first person, so this is the fact based text): "Simplified HTTP request client. Across 2011 to 2020, it was tended by many hands, mikeal first among them. 3,135 people carried a copy home, so it lives on somewhere. The last change landed on February 11, 2020."
atom and brackets come from snapshots bundled with the app. request/request was typed in and fetched live from the GitHub API. Its card, "Gone quiet" rather than archived, last words "README: typo in deprecation message (#3268)":
It works on a phone too, and when a repository does not exist, it says so kindly:
Code
Joe-Simo
/
last-commit
An ofrenda for open source that went quiet. An open-weight model in your browser writes the epitaph.
Last Commit
An ofrenda for open source that went quiet.
Paste a public GitHub repository and Last Commit lays out a remembrance card for it: the years it was alive, what it gave people, its last words (the real final commit message) and the people who tended it. Then an open-weight model, running entirely in your browser tab, writes its epitaph.
Live: https://last-commit-ofrenda.vercel.app
Demo
A 47 second narrated walkthrough recorded on the live site: last-commit-demo.mp4. The model download and writing part is sped up 12x and labeled as such; in real time it took 2 minutes 15 seconds on the CPU path in headless Chrome. The voiceover was generated with ElevenLabs text to speech (narration-elevenlabs.mp3).
Made for the DEV Hacktoberfest Open-Source AI Challenge, Week 4: Ghost in the Machine.
How it works
- Facts first. Your browser calls GitHub's public REST API with no token: the repository, its…
MIT licensed. Next.js 16, React 19, TypeScript, Tailwind CSS 4, Transformers.js, Vitest (48 tests covering parsing, status, fallback text and reply checks).
How I Built It
Facts first, AI second. The browser calls GitHub's public REST API with no token: the repository, its last ten commits, its top contributors, its README and its latest release. That is five requests per lookup. The whole card is built from those facts alone, so it is complete and correct before a model ever loads. The model can only make it nicer, never make it wrong.
The model. Qwen2.5 Instruct in the ONNX builds from the Hugging Face onnx-community, under Apache 2.0, run with Transformers.js in a Web Worker so the page never freezes. On WebGPU (with 16 bit float support) the app uses 4 bit q4f16 weights and defaults to the 1.5B model, with a one click swap to 0.5B. Without WebGPU it uses WebAssembly on the CPU with q4 weights and the 0.5B model. I tried the 8 bit CPU weights and they produced garbled text. I also tried the 1.5B model on the CPU path: it downloaded about 1.8 GB and then ran out of memory inside WebAssembly, so the app now only offers 1.5B on WebGPU and explains why.
A tiny prompt. The model only sees four lines: name, what it was about, the years it was active, and whether it is archived or how long it has been quiet. Two short examples (left-pad and jshint) show the tone. Decoding is greedy and capped at 32 tokens for the epitaph and 96 for the remembrance.
Every reply is checked. Before a reply reaches the card, it is set aside if it invents a number that is not in the facts, slips into first person, includes links or emoji, echoes the prompt, starts chatting, or runs too long. When that happens, the fact based line stays and the panel says why, as with brackets and request above. Small models do this a lot, and I would rather show a plain true line than a confident invented one.
Keepsakes. The card exports to PNG with html-to-image, fonts included. Lookups are cached in localStorage for six hours, the five examples are bundled as snapshots so they work even when the 60 requests an hour GitHub limit runs out, and the rate limit error tells you when it resets.
The demo. I recorded the live site with Playwright, sped up the download and writing part 12x (it is labeled on screen; in real time it took 2 minutes 15 seconds), and added a voiceover generated with ElevenLabs text to speech.
Why Does Open Innovation Matter?
This app only exists because everything in it is open. The facts come from public repositories and a public API. The model is open-weight, so it can run inside a browser tab on my own machine with no server, no account and no bill, and nothing anyone looks up leaves their browser except the GitHub requests. And the projects on the cards are open source, which is why they are not really gone: atom still has 17,160 forks on GitHub. A closed product that shuts down is lost. An open one can be picked up by anyone with a fork button.
That is the point of the ofrenda. Remembering is not only nostalgia, it is a nudge: before you add a dependency, look at its last words. And if a quiet project still matters to you, fork it, or thank the people who tended it while they still read their notifications.
Limitations
- The 0.5B model writes flat or clumsy lines. You can see it above: "a true hack, by any standards" and "a giant sponge" are not poetry. The checks catch invented facts and first person, not dull prose. The 1.5B model on WebGPU writes better, but my runs above are all 0.5B on the CPU.
- The first model download is large (793 MB on the CPU path) and CPU generation is slow: 18 to 50 seconds per part in my runs.
- Without a token, GitHub allows 60 API requests an hour per IP, and one lookup uses five.
- "Gone quiet" is a heuristic: archived, or no commits on the default branch for a year. A quiet repository is not always a dead one.
Prize Categories
Best Use of ElevenLabs: the demo narration was generated with ElevenLabs text to speech from a script I wrote (mp3). The app itself does not use ElevenLabs.
AI disclosure: I built Last Commit with help from an AI coding assistant. The epitaphs and remembrances in the app are written in the browser by Qwen2.5 Instruct (0.5B or 1.5B, open-weight, Apache 2.0); every model line quoted in this post is copied from a real run on the live site. The demo voiceover is ElevenLabs text to speech.






Top comments (0)