Inspiration

I built Dabble Me in 2014 after OhLife shut down. I had been a near-daily user for three years. The trick was that the medium was email: a prompt arrived in my inbox, I replied, and the habit stuck. No extra app or thumbs-only typing. No notification fatigue. It was designed precisely for my sick desire to constantly need Inbox Zero.

Dogfooding this app has become my sacred space now: the first dates with my now wife, photos and how I felt seeing my boys grow up, and the personal growth I would've otherwise missed had I not read how far I've come. The daily email bring these private days back to me, the way Timehop does for public posts.

What it does

Dabble Me is a live, private journal. You can still write by replying to email. PRO users can also search, reflect, and draft in the browser.

With WebMCP enabled , a signed-in tab registers structured tools:

  • search_journal_entries / list_journal_entries / analyze_journal — read this session’s journal only
  • open_journal_day / open_search_page / open_write_page — move the UI so the person sees the same screen
  • draft_journal_entry — fill the write form and highlight it
  • get_journal_session — tell the agent whether the tab is signed in and whether PRO tools are available

Signup, login, search, and write forms also use declarative toolname / tooldescription attributes so an agent can fill fields without guessing labels. A status banner on the page makes the agent’s action visible.

How we built it

The product was already a Rails app with a remote, OAuth MCP server at /mcp. WebMCP is a different layer: tools run in the page, with the user’s cookie session, not a headless API token.

  • Discovery so a client that only has https://dabble.me can find the surface: /.well-known/webmcp, /mcp/server-card, /.well-known/ai-catalog.json, plus Link headers and /llms.txt
  • Session JSON at /webmcp/journal/* that reuses the same search/list/analyze logic as remote MCP, always scoped to current_user
  • public/webmcp.js that feature-detects document.modelContext (and the older navigator.modelContext), registers tools for the current auth state, fills Summernote on draft, and navigates for “open this day”
  • Declarative forms for account and journal UI, without toolautosubmit

Challenges we ran into

The biggest challenge was privacy vs. demo-ability. Journal apps cannot run anonymously. They also cannot require WebAuthn if we want an in-app browser to finish login. The compromise: session cookies, PRO for write/search, and a dedicated demo account...not a real diary.

The second was editors. The write box is Summernote, not a plain <textarea>. A declarative form fill would look done and still leave the rich editor empty. draft_journal_entry has to talk to the editor, then leave Create Entry for the human.

Accomplishments that we're proud of

  • This is not a toy journal. Dabble Me has been a real, private, email-first product since the OhLife shutdown in 2014.
  • The agent and the user share one interface. When the agent searches or drafts, the page shows it.
  • Writes are cooperative by construction: fill and highlight so the draft is reviewed by a human before submitting ai-only entries.
  • We kept two complementary layers honest: remote MCP for ChatGPT/Claude connectors, WebMCP for the live tab.

What we learned

WebMCP is not “MCP in a JSON file.” It is a browser API for this document, this session, this user. Discovery helps agents find you. registerTool + execute is what they actually call.

We also learned that the best tool for a journal is often the one that refuses to finish. Submission should be human-reviewed...a feature, not a bug. 😁

What's next for Dabble Me

  • More page-state tools: jump to a hashtag, open last year on this day, draft into an existing date the way email replies already append
  • Tighter visual feedback when a tool is running (toolchange, :tool-form-active)
  • A first-class “agent draft” review state so a filled form is obvious even after a refresh
  • Keep the remote MCP server for headless clients, and keep WebMCP for the tab where the human is sitting
Share this project:

Updates

Submission history