Voice journaling CLI with Whisper transcription and Claude follow-ups
Project description
Healthy Self Journal
Voice-first reflective journaling for the command line. Speak freely; your words are captured, transcribed with Whisper, and met with concise, evidence‑informed follow‑up questions from Claude to keep you moving forward without drifting into rumination.
See also: AGENTS.md
Why this exists (vision)
- Lower friction to start: voice-first input encourages natural expression
- Keep momentum: adaptive dialogue vs static prompts
- Avoid harmful patterns: gentle redirection away from unproductive rumination
- Build continuity: multiple daily sessions with brief summaries for context
Core feature set (implemented today):
- Live audio recording with real-time meter and simple controls (any key to stop;
ESCcancels;Qsaves then quits) - Immediate WAV persistence; background MP3 conversion when
ffmpegis available - OpenAI Whisper STT with retries; raw
.stt.jsonstored per take - Claude-generated follow‑ups using Jinja prompts with embedded example questions
- Recent session summaries loaded under a budget and fed into prompts
- Background summary regeneration written to YAML frontmatter
- Resume the latest session with
--resume; change location with--sessions-dir
Snapshot: What it feels like
(experim__healthyselfjournal) experim/healthyselfjournal git:(main) ✗ uv run --active healthyselfjournal journal --resume
╭───────────────────────────────── Healthy Self Journal ──────────────────────────────────╮
│ Recording starts immediately. │
│ Press any key to stop. ESC cancels the current take; Q saves then ends after this entry. │
╰──────────────────────────────────────────────────────────────────────────────────────────╯
AI: I can hear you weighing a few options. Before we try to solve anything, what's the
one part of this that matters most to you right now?
Recording started. Press any key to stop (ESC cancels, Q quits after this response).
Recording [██░░░░░░░░░░░░░░] Press any key to stop (ESC cancels, Q quits)
Saved WAV → 250917_101234_01.wav (1:48); MP3 conversion queued.
╭──────────────────────────────────────────────────── You ────────────────────────────────────────────────────╮
│ I’m torn between applying for the new role and doubling down on my current project. I’m worried I’ll │
│ disappoint people either way. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────────────────────────────── Next Question ───────────────────────────────────────────────╮
│ It sounds important to honor both commitment and growth. In the next week, what would a small step look │
│ like that tests the new role idea without burning bridges? │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
AI: You mentioned wanting to grow without letting people down. What’s a 30‑minute experiment you could try
this week to explore the new role while keeping current work healthy?
Recording started. Press any key to stop (ESC cancels, Q quits after this response).
Recording [████░░░░░░░░░░░░] Press any key to stop (ESC cancels, Q quits)
Saved WAV → 250917_101234_02.wav (0:56); MP3 conversion queued.
╭──────────────────────────────────────────────────── You ────────────────────────────────────────────────────╮
│ I could draft a short proposal for the role and ask for feedback from one mentor. That feels doable. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
Quit requested. Ending session after summary update.
╭──────── Session Complete ─────────╮
│ Session saved to 250917_101234.md │
╰───────────────────────────────────╯
Prerequisites
- Python 3.12+
ffmpegonPATH(optional, for background MP3 conversion)- Environment variables (set according to the backends you use):
OPENAI_API_KEY– required for OpenAI speech-to-text or TTS features.ANTHROPIC_API_KEY– required only when usinganthropic:*models for questions/summaries (cloud default).OLLAMA_BASE_URL– optional override when running localollama:*models (defaults tohttp://localhost:11434).
Setup
Prefer the external virtualenv workflow in docs/reference/SETUP.md:
source /Users/greg/.venvs/experim__healthyselfjournal/bin/activate
uv sync --active
Usage
Getting started (PyPI users)
Use either pip or uvx:
# pip
pip install healthyselfjournal
uvx healthyselfjournal -- init
uvx healthyselfjournal -- journal
# Or install with pip if you prefer
pip install healthyselfjournal
healthyselfjournal init
healthyselfjournal journal
To run the dialogue loop fully offline, install Ollama + Gemma (see docs/reference/OLLAMA_GEMMA_DEPLOYMENT_GUIDE.md), ensure the daemon is running, then start the CLI with:
healthyselfjournal journal --llm-model ollama:gemma3:27b-instruct-q4_K_M
Notes:
- The init wizard helps you add keys and pick Cloud vs Privacy mode.
- Default sessions directory is
./sessionsin your current folder.
- Activate the project virtualenv:
source /Users/greg/.venvs/experim__healthyselfjournal/bin/activate
- Export keys:
export OPENAI_API_KEY=sk-... export ANTHROPIC_API_KEY=ant-...
- Start a session:
uvx healthyselfjournal -- journal
Handy flags:
--resume– continue the most recent session--sessions-dir PATH– store audio and markdown elsewhere
Key behavior during recording:
- Recording starts immediately
- Press any key to stop
ESCcancels the take (audio discarded)Qsaves the take, transcribes it, then ends the session
By default, sessions are saved under ./sessions/. Each response is written immediately to sessions/yyMMdd_HHmm_XX.wav (and .mp3 when ffmpeg is available) and appended to a matching markdown file with YAML frontmatter containing summaries and metadata.
Research & methodology
This project is explicitly research‑informed. See:
docs/reference/SCIENTIFIC_RESEARCH_EVIDENCE_PRINCIPLES.md– search strategy, quality standards, implementation focus (effect sizes, RCTs, cultural nuance)docs/research/POTENTIAL_RESEARCH_TOPICS.md– completed topics and prioritized pipelinedocs/reference/DIALOGUE_FLOW.md– conversation sequencing and safety considerations
Highlights of the approach:
- Emphasis on meta‑analyses and RCTs (2019–2025 for digital interventions)
- Guardrails to avoid maladaptive rumination; preference for concrete, time‑bounded prompts
- Implementation‑ready guidance that maps directly to CLI and prompt templates
Prompting and question design
Follow‑up questions are generated using healthyselfjournal/prompts/question.prompt.md.jinja:
- Analyzes emotional intensity, thought patterns, topic persistence, exhaustion, and change talk
- Adapts strategy (validation, redirection, Socratic deepening, or implementation planning)
- Uses clean‑language techniques (user’s exact words), single‑focus questions, and brevity
If the model cannot confidently select an approach, it can select from embedded example questions for safe variety.
Storage, events, and formats
- File layout and metadata:
docs/reference/FILE_FORMATS_ORGANISATION.md - Append‑only event log:
sessions/events.log - Audio and transcripts live per session under
./sessions/
Testing
Targeted tests can be run without network access:
PYTHONPATH=. pytest tests/test_storage.py
Running the full suite requires valid API keys exported in the environment.
See also
- CLI usage and controls:
docs/reference/COMMAND_LINE_INTERFACE.md - Dialogue flow:
docs/reference/DIALOGUE_FLOW.md - Prompt templates:
docs/reference/LLM_PROMPT_TEMPLATES.md - Product vision & features:
docs/reference/PRODUCT_VISION_FEATURES.md - Whisper/STT notes:
docs/reference/AUDIO_VOICE_RECOGNITION_WHISPER.md
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file healthyselfjournal-0.2.0.tar.gz.
File metadata
- Download URL: healthyselfjournal-0.2.0.tar.gz
- Upload date:
- Size: 534.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.16
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
374ea341350cbd4c1ab7a501fdf05f8badcf4b56e4a5da8cd5150e7453313454
|
|
| MD5 |
38afc014c2de91d5464e5276fd5fbaed
|
|
| BLAKE2b-256 |
d1b4666b70590e61f5fc54fb41f7a32ad3920795a4bae4070bff5cb6f42b58d8
|
File details
Details for the file healthyselfjournal-0.2.0-py3-none-any.whl.
File metadata
- Download URL: healthyselfjournal-0.2.0-py3-none-any.whl
- Upload date:
- Size: 100.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.16
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
848161f42d7f18eaffb84cac5a177de91686c80b6e4565d4ef4a28e84a40efd6
|
|
| MD5 |
1ee45face9bcd362cefb89cd707143ec
|
|
| BLAKE2b-256 |
9d90a84666217c26bc816170ae071ee471216f928f06ce29327643b04e21a240
|