A course exercise became a product with a point of view
It started as a course project. A mentor suggested it as a way to learn a heavier, more technical toolchain. From the first sketch I steered it toward something I believed in. I added the features it actually needed, not the ones the exercise asked for. It could have stayed a throwaway. It grew into a working tool for self-knowledge.
People are already treating a chatbot as a therapist that only agrees with them
Therapy is seen as expensive, or hard to trust. So people improvise. More and more of them bring their mental health to a general-purpose chatbot. It knows nothing about their week. The risk is quiet. These tools affirm rather than ground or challenge. They can state things with a confidence they have not earned.
Most journaling apps are either an empty text box or a mood-emoji tracker
The tools made for reflection sit at two extremes. The blank page gives you nowhere to start. The mood tracker shrinks a whole day to one tapped face. It never says anything back. Neither closes the loop between writing and understanding. That loop is the only reason to keep a journal.
In a country that funds mental health heavily, it is still the costliest condition
Norway spends more on mental health than almost any country. It is still the single costliest condition there, close to three percent of GDP. Care exists. Access is uneven. The everyday layer, the one with low stakes, is thin. There is room before and beside professional care for something cheap and private. Something that helps a person notice their own patterns.
The first build made the same mistake it set out to fix
The first version worked. It had never really been designed. Writing, mood rating and tagging were crammed onto one screen. No focus. No payoff for the effort. It was the exact shape of the problem, staring back at me.
One rule held the scope: an adjunct, never a replacement
Every decision ran through one commitment. Complement care and self-knowledge. Never impersonate a therapist. Each reflection carries the same line: patterns in your own words, not a diagnosis.
The evidence base was the partner
The design does not invent its own claims. It defers to validated psychology and cites it.
- Russell’s circumplex model of affect, for mood.
- Pennebaker’s expressive-writing research, for the language reflection.
- CBT vocabulary, for the prompts.
- Low-validity personality quizzes refused, such as MBTI and the Enneagram.
A focused two-step flow: write first, rate later
Writing and judging are different mental modes. So they were separated. Step one is a distraction-free editor and nothing else. Step two comes only after the writing. It asks for mood and themes. One home, one task. The navigation and the clutter came out. Nothing floats over the writing surface.
Mood became two axes, because calm and exhausted are not the same low
A single sad-to-happy scale hides half of how a day feels. Calm and exhausted both score low. They are not the same day. The emoji gave way to an Affect Grid: a square where one axis is mood and the other is energy, drawn from Russell’s circumplex. One placed dot captures both at once. Pleasant or heavy. Wired or worn out.
Dictation worked in Chrome and nowhere else, so it was rebuilt
Voice input was added to lower the barrier to writing. The first version sat on the browser’s built-in speech API. It failed silently outside Chrome. It was torn out. The rebuild records audio and transcribes it server-side with Whisper. That works everywhere, including mobile. A small, honest loop: build, test, adapt, with a concrete cause.
It reads between the lines only when asked
The reward for journaling is the Between the Lines card. By default it shows a plain-language conclusion computed on the device. This week against last, next to a swipeable mood-and-energy trend. No model is called to produce it.
The deeper AI reflection is one deliberate tap away, and opt-in every time. By default no entry is sent off for reflection. What every entry does get is a search embedding, so it can be found later by meaning.
The entries live in the writer’s own account. The line this product defends is consent, not secrecy. Nothing is read for reflection that was not explicitly offered up. That is what personvern and GDPR actually ask for.
The Companion answers the chatbot problem instead of ignoring it
A journal that reads between the lines invites an obvious next wish: someone to talk to about it. The product does not pretend that wish away. It ships a conversation built the other way round from the generic chatbot. The Companion opens from the page. It quotes what the week actually says. It hands a question back before it answers one. When the language crosses a crisis threshold, it drops the conversation and shows Norway’s real help lines, right in the thread. The same rule as everywhere else: an adjunct, never a therapist. Only now it can hold a conversation without breaking it.
The reply to a chatbot that always agrees is not silence. It is a companion that asks back.
From a course project to a product with accounts, payments and an API
The point of the technical layer is a design that ships, not just a mockup. The course version ran on React and TypeScript, a Tiptap editor and Vercel serverless functions. Whisper did the dictation. Grok models wrote the reflections and the Companion’s replies.
What it became after the course is the part worth reading. Entries moved into a Postgres database behind real accounts. Search became hybrid: meaning through pgvector embeddings, wording through trigrams. So “that argument in July” finds the entry that never used the word. Subscriptions run on Stripe with idempotent webhooks.
Then the journal grew an OAuth 2.1 authorisation server and an MCP server. An AI assistant can read and write it on the owner’s behalf. Dynamic client registration. PKCE. Refresh tokens that rotate. A reused token invalidates its whole chain.
AI was the accelerator throughout. The judgement was mine. What to build. When it was genuinely done. Which shortcut to refuse. Every decision in that repository is one I can defend.
Not a mockup to imagine, a product to open.
The component that defines this product is the one most likely to lock someone out
A square you drag a dot into is a pointer-only idea. And the two-axis grid is the heart of the product. It ships as a slider. Focusable. Driven by the arrow keys. It announces its position in words, “pleasant, low energy”, not as coordinates nobody can picture.
The Companion had the quieter version of the same bug. Its typing indicator carried an aria-label on a plain div. A plain div announces nothing. For a screen reader the wait was simply silence. It became a live region instead. Motion follows the system’s reduced-motion setting throughout.
An automated scan catches the contrast. It does not catch a grid that only answers to a mouse.
What the project taught, and where it goes next
Building it, rather than only drawing it, made every trade-off concrete.
- Subtraction did more than addition. The navigation, the clutter and the crude single mood axis all came out.
- Constraints from the evidence base sharpened the work. They did not narrow it.
- The most honest feature is also the most trustworthy. On demand, clearly labelled, never pretending to diagnose.
- With no real users yet, every choice is still a hypothesis. Real journalers are the next test.
The product will keep developing: real journalers first, then deeper analysis of language over time.
The public material behind the framing
Cited as references, not claimed as fieldwork. US usage data and Norwegian market context are kept separate. Re-verify the figures against the primary texts before any public use.
- Sentio University (2025). Survey of people with an ongoing mental health condition; about half use language models for mental-health support.
- Healthline; Toronto Metropolitan University; Psychiatric Times (2025 to 2026). Expert warnings that chatbots affirm rather than challenge, can state false information confidently, and are an adjunct, not a replacement.
- Norwegian GP-DEP Study; NCDNOR. Depression treatment and referral patterns in Norwegian general practice, and uneven access to specialised care.
- ScienceDirect welfare-state review (2024). Mental disorders as the costliest condition in Norway, close to three percent of GDP.