Skip to content
All builds

TidemarkMood + Habit Journal

What it does for you

A private mood and habit journal that summarizes each week locally, with an optional Claude reflection fenced against anything clinical.

Tidemark screenshot

Screenshots

Tidemark screenshot 1

In more detail

Tidemark is a private mood and habit journal. You log how you feel, your sleep, your energy, and your habits, and it reads your week back to you in plain words. There is an optional Claude reflection, but the journal works fully without an account or an API key, and it stays on the notebook side of the line, not the clinic side.

Honest limits

The Claude mode was never called during the build, by rule, so the live reflection is untested against real responses. The UI was checked by headless screenshots. The optional passphrase lock (PBKDF2 and AES-GCM) re-derives its key on every save, which is wasteful. It assumes Monday week starts and a US-first crisis line. This is a personal tool that runs, not a health product.

How I built it

Claude Code built it on September 20 in about 0.4 hours, from a brief where I set the guardrails: local first, AI optional, no diagnosis, a crisis line that does not depend on the model, and correlations worded as patterns, never causes.

The core is journal.js. It computes every stat for the week (averages against the prior week, best and hardest day, streaks, a correlation between each habit and next-day mood, top words, tags) and writes a template narrative from those numbers. Claude mode only ever receives that same stats object plus one week of entries. The prompt builder and the defensive response parser both live in the tested core, so the exact text sent to Claude is shown in the UI and covered by verify.mjs without ever calling the network.

Claude Code also designed the demo seed with a real signal baked in (a morning walk lifts next-day mood), so the screenshots show something true and the tests have a known answer to check. A local keyword check shows crisis resources no matter what the AI does.

What I learned

  • Two layers work. Compute the facts deterministically, then let the model only rephrase them. That makes the AI optional, inspectable, and testable.
  • Guard a correlation three ways before showing it: minimum paired samples, at least two days in each group, and non-zero variance. Showing the two group means next to r is much easier to read than r alone.
  • backdrop-filter on a sticky header makes it the containing block for position: fixed children, so the mobile tab bar pinned to the header. I drop the filter under the mobile breakpoint.
  • The hidden attribute loses to any author display rule. A global [hidden]{display:none!important} is worth having in every project.
  • Journal date math should stay on YYYY-MM-DD strings in UTC, or streaks break quietly across daylight saving changes. The tests cover both US DST edges.

What carried forward

The two-layer AI pattern (local engine by default, Claude optional, prompt and parser tested with no network) is the same shape the shared brief asked every AI-powered build to follow, and #35 Dogear uses it too. The backdrop-filter bug is a less flattering carry-forward: #34 Tonnage hit the exact same trap three days later, because the lesson lived in this case study and not in the brief.

If I took it further

I would cache the derived key for the session, keep the API key inside the encrypted blob when the lock is on, and make the week start and crisis line into settings.

#033 Built with Claude Code September 20, 2026 166 automated checks

Want one like this?