This is a submission for the Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady.
What I Built
The journal and I are in a situationship. I write two honest sentences, feel like a person with a practice, and then leave it on read for a week. đź§
My second brain is fine with that. It already stored the launch plan. The diary is the part that goes quiet, and quiet is how I lose the thread.
Bumpy is how I get back to the page. Summarize journal brings the days I did write into one place, making gaps easier to notice. Daily briefing puts today’s notes next to the tasks that are due. And if I capture “write tonight” as a dated task and then pretend I am busy, Bumpy bumps me.
I still have to write the paragraph. I just stop getting to pretend I forgot.
The short film follows Maya through that same mess. Stylized pictures, two minutes, the feeling of it.
Watch the Bumpy story:
TL;DR: Bumpy is an open-source Obsidian sidekick. Your vault stays ordinary Markdown. Gemma, running on your machine, helps you revisit what you wrote. A reminder named Bumpy nudges you back to the tasks you dated and then abandoned.
The bump 👊
While Obsidian is open, Bumpy checks open tasks on load and about once a minute after that. A time on the task means a bump at that time. A date alone means a bump at your reminder hour.
The notice says Reminder: plus the task. On desktop, Notification Center gets the same bump, titled Bumpy.
Each task gets one bump, remembered across reloads. Overdue reminders have a 36-hour eligibility window; after that, Bumpy lets them go.
Close the app and the sloth is asleep. 🦥 Write “soon” or “next week” and it will not invent a day. You pick one.
A little help getting back into your notes
- Ask the vault answers from retrieved passages, with the sources beside the answer.
- Clean up drafts a rewrite of your selection or note. You review it first. Apply is the only pen.
- Connections finds related notes and suggests wikilinks you accept yourself.
- Calendar, Daily briefing, and Summarize journal help you see what is due and pick up where you left off.
- Trace thoughts and Find knowledge gaps surface shared words, thin sections, questions, and possible follow-ups.
- Suggest tasks lifts the maybes out of a paragraph. You choose which ones become real.
There are optional paths for speech, web research, Google Calendar, and other model providers.
A BUMPY.md in the vault sets the voice, with a closer folder-level file taking precedence. The note being read stays evidence, not a secret instruction.
Demo
The full walkthrough shows the actual app in a separate demonstration vault: local Gemma, a cleanup preview, related notes, tasks, the calendar, the briefing, and the journal summary. Optional integrations get a minute at the end.
Watch the full Bumpy demo:
Recorded local setup: Gemma 3 12B through Ollama, with local hashing for retrieval.
The public page is bumpyai.tech.
Code
Open source, 0BSD. Bumpy starts from the Obsidian sample plugin and keeps its license and attribution.
The repo contains the plugin, documentation, website, voice call board, and Temporal research worker.
How I Built It
TypeScript, bundled with esbuild into the main.js Obsidian loads.
The vault is the hub. Models are a lane you enter on purpose. The reminders, calendar, briefing, and journal digest work without one.
flowchart TB
Vault["Obsidian vault: ordinary Markdown"]
Rules["BUMPY.md: vault and folder preferences"]
Local["Local tools: briefing, journal digest, tasks, calendar"]
Retrieval["Local passage retrieval"]
Gemma["Gemma 3 12B through Ollama"]
Preview["Review the result"]
Apply["Explicit Apply"]
Reminder["Bumpy reminder"]
Vault --> Local
Local --> Reminder
Vault --> Retrieval
Retrieval --> Gemma
Rules --> Gemma
Gemma --> Preview
Local --> Preview
Preview --> Apply
Apply --> Vault
Local hashing matches shared words on the device and retrieves passages for Ask the vault. Gemma drafts the answer and the cleanup. Apply checks that the note has not changed underneath the preview.
Briefings, the journal digest, thought traces, gaps, the calendar, and reminders never call a model.
A dated task is an ordinary Markdown line:
- [ ] Write tonight đź“… 2026-10-27
Optional integrations add web research, speech, calendar sync, and other model providers. Google Calendar conflicts require a choice: Keep the note or Use the calendar. Events Bumpy did not create stay untouched.
Why Does Open Innovation Matter?
A journal that has to live on someone else’s server is a diary with a landlord.
Gemma and Ollama ran the vault answers and cleanup on the same machine as the demonstration notes. No paid inference key was needed for that path.
You can swap the model, point a feature at another provider, and inspect what gets retrieved and what is allowed to be written. The journaling tools keep working when you unplug the cloud on purpose. 🦥
The Lazy Payoff
Synthetic notes, separate vault. I asked:
“What did we decide about the launch?”
Local Gemma answered: solo creators first, teams later. The source notes were beside the answer.
I also cleaned a rough note, accepted a link, captured a dated task, opened the calendar, and generated a briefing and a journal digest.
The digest is the consistency trick. The days I showed up are on one page. Gaps are easier to spot. The dated “write tonight” task is how I give myself a nudge to return.
The notes already contain the work. Bumpy gets me back to the page, and it bumps me when I ghost it.
Prize Categories
1. Best Use of Gemma
Used it for: Vault answers and cleanup in the app walkthrough, using Gemma 3 12B through Ollama.
Why: The journal and the launch plan should not have to leave the laptop to be useful.
What changed: I could ask a question across the notes and inspect the retrieved passages beside the answer. For cleanup, the rewrite waited for Apply.
Proof: In the full demo, I ask “What did we decide about the launch?” Gemma answers solo creators first, teams later, with the source notes beside it.
2. Best Use of a .tech Domain
Used it for: Bumpy’s public front door, bumpyai.tech.
Why: People should be able to understand the plugin before deciding whether to clone it.
What changed: The introduction, story film, and repository link have one address. The page opens on “Notes stay notes.” The film renders live in the browser while you scroll.
3. Best Use of Temporal
Used it for: A research worker over a folder of move notes, answering “What is still open before the move?”
Why: Loading documents and asking a model can fail independently. A model failure should not require reading the folder again, and a missing key should not look like an answer.
What changed: loadDocuments and interpretDocuments are separate activities. Interpretation retries start at 2 seconds, double, cap at 30 seconds, and stop after 5 attempts. The client can reconnect using the workflow ID. Output goes to a separate draft file.
Proof and limit: Workflow bumpy-research-what-is-still-open-before-the-move-1792949809615 loaded four notes: boxes.md, budget.md, lease.md, and mom.md, along with instructions to be brief and attribute conflicting claims.
Those notes disagree. boxes.md says the deposit was paid on Monday. lease.md says it has not been paid. budget.md has no line for the deposit, and the truck is not booked.
Interpretation then stopped with a non-retryable error because PAPERINSTRUMENTS_API_KEY was missing. The folder was not read a second time, and nothing was written into a vault note.
This run demonstrates loading and failure handling. It does not demonstrate a completed research answer.
4. Best Use of SerpApi
Used it for: Research a topic and Research this on a knowledge gap.
Why: A question that comes up while journaling should be able to become a research note with sources.
What changed: Bumpy sends the topic to SerpApi as a Google search query, sets num to 5, and asks for organic results only. The research preview cites the URLs that come back and labels the interpretation as generated. Model-added URLs outside that result set are stripped. An existing note at the output path is left unchanged. If search is off, Bumpy asks you to turn it on.
Proof: The Monday journal asks “How can we reduce setup friction?” The gap finder drops the question mark, so the query is How can we reduce setup friction. I sent that query with the plugin’s parameters: engine=google, num=5, json_restrictor=organic_results.
SerpApi answered HTTP 200. The response included 8 organic results. The preview would cite each of them in Research/how-can-we-reduce-setup-friction.md:
The first result is about automating developer setup. Several of the others are about chip timing or tube friction. The preview keeps those links beside the question, so the interpretation has to live with what the search actually returned.
This capture is that search response. It does not include a model interpretation of the snippets.
5. Best Use of ElevenLabs
Used it for: Reading a note or selection aloud through ElevenLabs using eleven_v3.
Why: A journal you will not reread might still get heard.
What changed: Read note and Read selection can use ElevenLabs. George is the default voice until you choose another, and List voices loads the voices available to your key.
Dictation uses the speech-to-text provider you selected. You can edit the transcript before inserting it.
Proof: I also made a separate eleven_v3 voice sample in Amara’s storytelling voice:
Hey. You left the journal on read again. This is your bump. One paragraph. Then you can go back to being a sloth.
The take is on this ElevenLabs flow.
This is a voice sample, not an automatic spoken task notification. The story film uses separate narration.
6. Best Use of Render
Used it for: Hosting the website, configured through render.yaml.
Why: The film renders in the browser with Remotion, so the website can be served as static files.
What changed: The build runs in site/ and publishes dist. The public introduction and film are available at bumpyai.tech, without sending vault notes to the website.
7. Best Use of Backboard
Used it for: Accessing three open-weight models through one message-API key. Memory and web search stay off. The vault does the remembering.
Why: I wanted to see how different models interpreted the same launch note. One key made it easier to try several models without setting up three separate accounts.
What changed: I sent the same launch note through Backboard and asked what we decided.
- gpt-oss-120b: “We decided to launch with solo creators first and roll out teams later, aiming to get the first result in two minutes and cutting the setup stuff.”
- Llama 3.1 8B Instruct: “We're launching within 2 minutes and sticking to solo creators.”
- Command R7B: “We decided to launch the project in two minutes.”
In these responses, gpt-oss-120b preserved the solo-creators-first decision and the later team rollout. The other two turned the two-minute target into a launch claim and omitted “teams later.”
This is a small demonstration, not a benchmark. It does show why the preview still waits for a human.
Text it back
I hope the situationship feels a little more mutual now. Your journal can go quiet for a week. You can still come back with two honest sentences.
Date the night you mean to return. If you get busy and pretend you forgot, that is what the bump is for. The paragraph is still yours. The sloth can wait. 🦥
If you try Bumpy and want the nudge to work another way, leave a comment. I want to hear what happened.
Top comments (0)