---
title: Daily Journal Check-In (AI Coaching check-in nudge)
---

# Daily Journal Check-In (AI Coaching check-in nudge)

## What it is

**Daily Journal Check-In** is an opt-in ritual inside AI Coaching: a gentle inbox nudge that
invites you to journal with your AI coach. Two kinds:

- **Daily Check-in** — a short (~5 minute) "unload your day" conversation: what
  happened, how you feel, what mattered, and anything to carry into tomorrow.
- **Weekly Review** — a longer, more reflective look back over the whole week: the
  wins, the hard parts, the patterns underneath, and an intention for next week.

The point is twofold: a place to get things out of your head, and — because it runs
as a real coaching interview — a way to build context your coach can draw on later.

**Your entries stay private to coaching.** They enrich future coaching sessions (and
your Core Profile), but they are **never** folded into the "Things to know about the
user" block that ordinary sessions (like a coding session) receive. Journal in, and
it informs coaching only.

## Where to find it

Daily Journal Check-In rides on AI Coaching, so **AI Coaching must be on** for it to do
anything.

1. Set your **nudge time** and **weekly review day** in **Settings → AI Coach**.
   Default: 8:00 PM, weekly review on Sunday.
2. To turn it off, toggle **"Daily Journal Check-In"** in **Settings → Features**.

The two interviews also show up on the AI Coaching **Dashboard** the moment they're
seeded, so you can run a check-in anytime without waiting for a nudge.

## How it behaves

- At your chosen time each day, a friendly card appears in your **inbox**:
  "Time for your daily check-in" (or, on your weekly day, "Time for your weekly
  review" — you never get both in one day).
- The card's **"Start check-in"** button launches the actual coaching interview.
  When you finish, your coach writes a dated entry, saved as a coaching artifact.
- Each day's entry accumulates as a new **version** of the same artifact ("Daily
  Check-in" / "Weekly Review"), so you build a browsable journal over time.
- The nudge only fires when it can actually succeed — AI Coaching on, the feature
  on, and a working API key present — so it never nudges toward a dead end. If the
  app was asleep at your nudge time, it catches up once on the next check and never
  double-fires.
- Snooze or dismiss the card like any inbox item; turn the whole thing off anytime
  in Settings.

### Cost & privacy

Running an interview is a normal coaching session (you click to start it), plus the
usual Haiku artifact-summary generation — it rides the existing AI Coaching cost caps,
with no new spend path; the nudge itself is free. Entries are stored locally like every
coaching artifact, and stay private to coaching (see above).

## For agents

### Under the hood

- **Single source of truth**: `src/shared/daily-journal.ts` —
  the builtin interview ids, the artifact titles, the inbox dedup keys, the
  `COACHING_ONLY_ARTIFACT_TITLES` set, and the pure scheduling decision
  (`resolveCheckinKindForDay` + `shouldFireCheckin`, both unit-tested with frozen clocks).
- **The two interviews** live in
  `resources/ai-coaching-seed-prompts/ongoing.json`
  (`Daily Check-in`, `Weekly Review`; `sessionCategory: 'ongoing'`), auto-seeded like
  every other coaching interview.
- **The nudge** is raised by a small scanner,
  `src/main/services/ai/ai-coaching/session/checkin-scanner.ts`
  (a 5-minute `createPeriodicTask` tick, modeled on `feature-nudge-scanner-service`),
  gated on `dailyJournalEnabled` + `aiCoachingEnabled` + a usable key + the interview
  being seeded. The once-per-period gate is the nudge's own inbox row
  (`findLatestCreatedAtByDedupKey`) — no extra table. Registered in `startup/registry.ts`,
  stopped in `app/shutdown.ts`.
- **The nudge → interview launch** is an `AlertInboxViewer` carve-out (like the
  gmail-reconnect / stuck-task custom buttons): the "Start check-in" button calls the
  existing `AI_COACHING_START_INTERVIEW` IPC with a fixed constant promptId resolved
  from the dedup key — never user input.
- **Coaching-only** is a persisted flag (`ai_coaching_artifacts.coaching_only`,
  migration `20260705220309`) stamped at save from the artifact title, and excluded
  from the profile block at exactly ONE chokepoint —
  `buildSessionProfileContext` passes `listLatestArtifacts({ includeCoachingOnly: false })`.
  The Core Profile is itself coaching-session-only, so journals may safely feed it.
- **Contract + invariants**:
  `daily-journal-contract.md`
  locks the stamp/filter, the scanner gating, and the nudge carve-out — each to a named test.

## Related

The coaching side of this — what a coaching session is, the interview library it draws on, and the
Core Profile your journal entries feed — is on the [AI Coaching](ai-coaching.md) page, with a
practical walkthrough on the [AI Coaching getting started](ai-coaching-guide.md) page. If you would
rather keep a journal that is not tied to a coaching interview, the plain [Journal](journal.md)
page covers that separate feature, and what this costs to run sits with the rest of the app's
spending controls on the [cost control](cost-control.md) page.
