# Rest in Notes: A Local AI That Haunts You Back Into Your Own Vault

> Source: <https://dev.to/hiya_24477/rest-in-notes-a-local-ai-that-haunts-you-back-into-your-own-vault-1nlj>
> Published: 2026-10-31 09:14:38+00:00

*This is a submission for the [Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine](https://dev.to/challenges/hacktoberfest-week4-2026-10-26)*

Every note-taker has a graveyard. Mine is a folder of Markdown files I swore I'd come back to: half-finished lecture notes, a "project ideas" list from August, a todo that has said `- [ ] revise` since July.

**Haunted Vault** points at a folder of Markdown notes (an Obsidian vault works) and draws that graveyard. Each note is a node, each `[[wiki link]]` is an edge, and any note untouched for 14+ days becomes a **ghost**.

Click a ghost and a local model gives it a tombstone:

There's also a **haunting report**, a short, spooky-but-kind summary of your most neglected notes. Your open `- [ ]` tasks age from Recent to Old to Abandoned, so forgotten todos turn into ghosts too.

For the theme, I read "ghost in the machine" literally and emotionally. The ghosts are the parts of your own thinking that your tools quietly keep and never surface. The AI's job isn't to scare you. It's to make you feel a little guilty, then show you the way back in.

Notes you stop touching turn into ghosts. A local AI writes their epitaphs and tells you how to bring them back.

Live demo: [https://hiyalukka.github.io/Haunted-Vault/](https://hiyalukka.github.io/Haunted-Vault/)

Built for the **DEV x Hacktoberfest Open-Source AI Challenge, Week 4: Ghost in the Machine**.

Point it at a folder of Markdown notes (an Obsidian vault works). It scans them and draws a graveyard map:

`[[wiki links]]`. Notes untouched for 14+ days become ghosts.`- [ ]` todos from your notes. Tasks also age from Recent to Old to Abandoned, so forgotten ones turn into ghosts too.
**Stack:** Flask, Ollama running `gemma3:1b` (open-weight), D3.js, vanilla JS/CSS, and MongoDB Atlas as an *optional* store.

The pipeline is deliberately small:

`scanner.py``[[links]]` and `ghost.py`` app.py``static/`
Two design choices mattered most:

`tasks.json`.` GHOST_MODEL` to any model Ollama can run.

```
ollama pull gemma3:1b
python make_demo.py   # generates a demo vault with old and new notes
python app.py
```

A notes vault is about the most private thing you own: half-formed ideas, personal reflections, unfinished plans. A tool that asks an AI to comment on your abandoned notes is only usable if the notes never leave your machine.

That's what a closed API wouldn't give me. With an open-weight model on local inference there's no API key, no per-call cost, no rate limit, and it works offline. I can scan a whole vault without worrying what each call costs or who sees the text. And because the model is just a setting, anyone can swap in a bigger or smaller one that fits their hardware.

A 1B model is small, and I'd rather be honest about that. Its epitaphs can be cheesy, which suits a graveyard. For a short, structured, creative output like this, a small local model is enough, and the privacy is worth more than a bigger model's polish.

Most productivity tools are cheerful about your unfinished work. They show a progress bar, a streak, a gentle "you have 47 unread items." Nobody tells you the truth, which is that some of those notes were once the most exciting thing you'd thought of all week.

That's the feeling I built this around. A note isn't clutter. It's a version of you who cared about something enough to write it down. When you stop opening it, it doesn't disappear. It just goes quiet, and the machine keeps holding it.

So I made the machine speak for the dead, kindly. The epitaph gives the note back its dignity: *this was an idea about something you wanted to understand.* The cause of death is honest without being cruel: most notes don't die because the idea was bad, they die because life got busy. And the resurrection ritual is deliberately small, fifteen minutes and one step, because the only way to bring a ghost back is to walk into the room.

If someone opens the graveyard, sees a cluster of grey nodes, and thinks *oh, I forgot about that one*, and then actually opens it, the project did its job. It's a ghost story where the ghost isn't there to haunt you. It's there to be remembered.

Best use of Gemma

Best use of MongoDB
