A voice journal
that reads your week back

Tap to record a diary entry. Cartesia's ink-whisper model turns it into text, and an LLM adds a title, a mood and a one-line reflection. Whenever you like, Sonic 3.6 reads you a short recap of your last seven days in a voice you pick.
Phone screenshot of the Weekly recap screen: a This week panel with one entry and a Hopeful mood badge, the voice picker set to Tessa, the Write my recap button, and the latest recap playing at 0:04 of 0:32

Screenshot. The template running locally.

Models
ink-whisper, sonic-3.6
Languages
English
License
Apache-2.0
Stack
ExpoReact NativeExpo Router API routesAI SDKAsyncStorage
Cartesia products
InkSonic 3.6

What it does

One app runs on iOS, Android and the web. Entries stay on your device, so there is no database and no login. Recordings go to Cartesia for transcription, and transcripts go to your LLM provider. The app says so under the record button, and its server stores no audio.

Run it yourself

  1. Install

    Run the commands below with Node 22.22 or newer. pnpm works too. Fill .env.local from the table below.

    npx degit cartesia-ai/cookbook/examples/voice-journal voice-journal
    cd voice-journal
    # add CARTESIA_API_KEY, LLM_MODEL and the matching provider key
    cp .env.example .env.local
    npm install
    npm run dev
    

    Environment variables
    CARTESIA_API_KEY
    play.cartesia.ai/keys
    LLM_MODEL
    provider/model, for example openai/gpt-5.4-mini
    OPENAI_API_KEY
    If LLM_MODEL starts with openai/
    ANTHROPIC_API_KEY
    If LLM_MODEL starts with anthropic/
    AI_GATEWAY_API_KEY
    For any other provider
    TRUST_PROXY
    Optional. 1 behind your own reverse proxy
  2. Record an entry

    Run npm run dev, then press w to open the web app. To use a phone instead, scan the QR code with Expo Go, Expo's free app for trying projects. Record an entry with Start recording. Then open Recap and tap Write my recap.

Build it with your coding agent

One prompt that tells your coding agent where to start and what to read first.

Prompt

Claude CodeCursorCodex

Build a voice journal app in Expo with Cartesia. Start from https://github.com/cartesia-ai/cookbook/tree/main/examples/voice-journal and follow its AGENTS.md for the commands, files and rules. Expo Router API routes hold the keys: /api/transcribe sends each recording to ink-whisper with client.stt.transcribe from @cartesia/cartesia-js, the AI SDK writes the title, mood, reflection and weekly recap, and /api/speak turns the recap into an MP3 with sonic-3.6 through client.tts.generate. Never give a key an EXPO_PUBLIC_ prefix. If I don't have a Cartesia API key yet, follow https://www.cartesia.ai/agent-quickstart.md to get one.

How it works

Recordexpo-audio, m4a on phones and WebM on the web
ink-whisperThe server sends each recording to Cartesia
LLMA title, a mood and a reflection, then a recap of the last seven days
Sonic 3.6Returns the recap as an MP3
DeviceEntries and recaps stay on the device

Why it works this way

A finished recording needs no stream

A journal entry is a finished recording, so one upload to ink-whisper is simpler than a live stream. Streaming would also need raw audio while you talk, and Expo's recorder can't give you that on the web.

The recap is written to be heard

The recap reads your last seven days of entries, oldest first, and comes out at 120 to 200 words written for listening. Sonic 3.6 returns it as an MP3 that plays on every platform.

Make it yours

Change the default voice

The default voice is set in lib/limits.ts. Pick a replacement from the Cartesia voice library, then update its tagline in app/recap.tsx.

Transcribe another language

Change the transcription language in app/api/transcribe+api.ts. Then change the speech language in app/api/speak+api.ts and pick a voice that speaks it.

Change the moods

The list of moods is in lib/schema.ts. The prompts for the reflection and the recap are in lib/server/prompts.ts.

Questions

Is my API key safe in a mobile app?

Yes, as long as it stays on the server. The app's server routes read the key, and it never goes into the app that ships to phones. Don't give a key the EXPO_PUBLIC_ prefix, because Expo puts those values in the app where anyone can read them.

Does it work on a real iPhone or Android phone?

Yes, in Expo Go during development. For a store build, you deploy the server routes and point the app at them. The web build was tested in Chrome, and the phone builds compile but were not run on a device.

Can I put it online as is?

No. The server routes are open to anyone, so add sign-in and check it in each route before you deploy. The built-in rate limit only slows casual abuse.

Is this a therapy app?

No. The prompts tell the model not to diagnose or give medical advice. If an entry mentions self-harm, the model points to someone you trust or a local crisis line.

Can I use my own voice for the recap?

Not in this template. Voice cloning was left out on purpose, so the app only uses voices from the Cartesia library.

Is there a step-by-step guide to this template?

Yes. The recipe walks through the code, the README covers setup, environment variables and deployment, and the batch transcription API reference explains the Cartesia side.

Get started today

Talk to an expert.

Connect with a member of our team and learn how Cartesia can help you build world-class voice experiences.

Contact Sales

Start building.

Access our models via API and bring a voice agent into production in minutes.

Try Cartesia