Local AI Journaling: Private Daily Prompts & Mood Analysis
Want to go deeper than this article?
The AI Learning Path covers this topic and more — hands-on chapters across 10 courses across 10 courses.
Local AI Journaling: Private Daily Prompts & Mood Analysis
Published on April 23, 2026 • 18 min read
I started keeping a journal again last winter, after about six years off. The first week I tried Day One, then I tried a Notion template, then I tried a paid app called Stoic that pushed me to "subscribe to unlock weekly reviews." Every one of them wanted my reflections in their cloud. By day nine I had stopped writing.
What finally worked was a folder of plain Markdown files on my laptop, a 7B model running on Ollama, and a tiny shell script that asks me three questions every morning at 6:45. Six months later that folder has 184 entries. The model has never made a single network request. The "weekly review" my AI writes for me on Sunday evenings is the most useful thing on my computer.
This guide is the exact stack — hardware, software, prompts, scripts. It runs on a base M1 MacBook Air or a $400 Intel mini PC. Nothing leaves the machine. Nothing costs a subscription. And unlike the SaaS journaling apps, the AI here is genuinely yours: you control what it sees, how it analyzes you, and whether it ever gets to say a single thing.
Quick Start: Journal Privately in 12 Minutes {#quick-start}
If you only want the working setup, here it is:
- Install Ollama:
brew install ollamaon Mac, orcurl -fsSL https://ollama.com/install.sh | shon Linux. - Pull the model:
ollama pull llama3.2:3b(2.0 GB, fits on any 8 GB machine). - Create the folder:
mkdir -p ~/journal/{daily,weekly,prompts}. - Drop the morning script (below) into
~/bin/journaland make it executable. - Run it:
journal. Three prompts appear. Type your answers. Save closes the file.
That's the minimum viable journal. The rest of this guide adds voice input, mood tracking, weekly synthesis, and Obsidian integration — but if you stop here you already have something better than the apps you abandoned.
Table of Contents
- Why Local Beats Day One and Stoic
- The Stack: Models, Tools, Files
- Hardware Reality Check
- Step 1 — Install Ollama and the Model
- Step 2 — Build the Daily Prompt Script
- Step 3 — Voice Journaling with Whisper
- Step 4 — Obsidian as the Front End
- Step 5 — Weekly Reviews and Mood Trends
- Prompt Library That Actually Works
- Pitfalls I Hit So You Don't Have To
- Cost Comparison vs Day One Premium
- FAQ
Why Local Beats Day One and Stoic {#why-local}
Cloud journaling apps share three problems:
They train on your feelings. Day One's privacy policy permits "aggregate analysis." Stoic's terms reserve the right to use anonymized content for "service improvement." When you pour your divorce, your panic attacks, or your financial anxiety into a text box, that text becomes data on someone else's server. Even if no human reads it, it has been read.
They lock the export. Day One exports to JSON, but the JSON is in their schema. Stoic does not export prompts at all. The minute you stop paying, the structure your reflections lived inside is gone.
They cannot actually read your journal. None of the popular apps will write you a real weekly summary based on what you wrote. They show you a pretty calendar. The synthesis is the most valuable part of journaling — and that is exactly what's missing.
A local stack solves all three. Plain Markdown files are forever. The AI is a 2 GB file you can copy to a USB stick. And because the model has unlimited access to your full corpus, the synthesis it produces is dramatically better than what a sentiment-analysis SaaS can do without seeing the words.
The Stack: Models, Tools, Files {#the-stack}
| Layer | Tool | Job |
|---|---|---|
| Storage | Plain Markdown in ~/journal | One .md per day, named YYYY-MM-DD.md |
| Model engine | Ollama | Runs the language model locally |
| Daily reflection | Llama 3.2 3B | Fast, warm, fits any machine |
| Weekly synthesis | Qwen 2.5 7B | Better at long-context summarization |
| Voice input (optional) | whisper.cpp | Offline speech-to-text |
| Front end | Obsidian or your terminal | Read, search, link entries |
| Sentiment scoring | A 200-line Python script | Tags each entry with emotion + topics |
This stack runs entirely offline. After the initial ollama pull and whisper-cli model download, you can airplane-mode the laptop forever and the journal still works.
Hardware Reality Check {#hardware}
I tested this on five machines. Here is what actually performs:
| Machine | RAM | Daily Prompt Speed | Weekly Review Speed | Verdict |
|---|---|---|---|---|
| MacBook Air M1 8 GB | 8 GB | 38 tok/s | 12 tok/s | Daily fine, weekly slow |
| MacBook Air M2 16 GB | 16 GB | 52 tok/s | 28 tok/s | Sweet spot |
| Mac Mini M2 Pro 32 GB | 32 GB | 64 tok/s | 41 tok/s | Overkill for journaling alone |
| Beelink SER5 (Ryzen 5800H, 32 GB) | 32 GB | 18 tok/s | 6 tok/s | Works, weekly noticeably slow |
| ThinkPad T14 (i7-1260P, 16 GB) | 16 GB | 22 tok/s | 9 tok/s | Adequate |
Floor: any laptop with 8 GB RAM and a CPU younger than 2019. Ceiling: more RAM mostly buys you the option to also run Qwen 2.5 7B for weekly review without unloading. Anything beyond 32 GB is wasted on this workload.
Step 1 — Install Ollama and the Model {#install-ollama}
# Mac
brew install ollama
brew services start ollama
# Linux (Ubuntu, Debian, Fedora)
curl -fsSL https://ollama.com/install.sh | sh
sudo systemctl enable --now ollama
# Pull the journaling models
ollama pull llama3.2:3b # 2.0 GB, daily reflection
ollama pull qwen2.5:7b # 4.4 GB, weekly synthesis
ollama pull nomic-embed-text # 274 MB, semantic search later
Verify it is running:
curl http://127.0.0.1:11434/api/tags
If you get a JSON response listing the models, you are done. If you get connection refused, run ollama serve in a second terminal and check again.
For a deeper installation walkthrough, see the Mac local AI setup guide or the Linux local AI setup.
Step 2 — Build the Daily Prompt Script {#daily-script}
This is the script that runs at 6:45 AM. Put it at ~/bin/journal and chmod +x it.
#!/usr/bin/env bash
set -e
JOURNAL_DIR="$HOME/journal/daily"
mkdir -p "$JOURNAL_DIR"
TODAY="$(date +%Y-%m-%d)"
FILE="$JOURNAL_DIR/$TODAY.md"
# Avoid overwriting an existing entry
if [ -f "$FILE" ]; then
echo "Today's entry exists. Opening it."
${EDITOR:-vim} "$FILE"
exit 0
fi
# Ask Llama for three context-aware prompts based on the last 3 days
LAST_THREE=$(ls -t "$JOURNAL_DIR"/*.md 2>/dev/null | head -3 | xargs cat 2>/dev/null || echo "")
PROMPT="Read the user's last three journal entries below. Then write exactly three short, specific morning journal prompts (one sentence each, no numbering, no preamble). The prompts should reference patterns or unfinished threads from the entries. Avoid generic prompts like 'how are you feeling'. Keep the tone calm, not therapeutic.
Recent entries:
$LAST_THREE"
QUESTIONS=$(echo "$PROMPT" | ollama run llama3.2:3b --format text 2>/dev/null)
cat > "$FILE" <<EOF
# $TODAY
## Mood (1-10):
## Energy (1-10):
## Three things I noticed yesterday:
-
-
-
## Today's prompts:
$QUESTIONS
## Free writing:
EOF
${EDITOR:-vim} "$FILE"
What this gives you: every morning the file already contains three prompts that reference what you wrote about earlier in the week. After three days of "I'm worried about the deck for Thursday," it stops asking generic things and starts asking "What is one slide on the Thursday deck you can finish before lunch?"
I have it wired to a launchd job on Mac and a systemd timer on Linux. The script takes ~3 seconds to generate prompts. Open the file, write for 8-12 minutes, save, close.
Step 3 — Voice Journaling with Whisper {#whisper-voice}
Some mornings I do not want to type. Voice journaling is more honest anyway — typed entries get edited as you go, voice does not.
# Install whisper.cpp (Mac, Linux)
git clone https://github.com/ggerganov/whisper.cpp
cd whisper.cpp
make
bash ./models/download-ggml-model.sh small.en
A 6-minute monologue transcribes in ~40 seconds on an M1 with the small.en model. Quality is good enough that I rarely fix anything. The model never sees audio — it dies the moment whisper.cpp finishes the transcript.
Wire it to a Karabiner shortcut or a Stream Deck button: tap to record, tap again to stop and dump the transcript into today's journal file. The full script is in the whisper.cpp repository's examples folder.
Step 4 — Obsidian as the Front End {#obsidian}
You can absolutely live in a terminal forever, but Obsidian gives you four things that matter for journaling:
- Calendar plugin — see months at a glance, jump to any past entry.
- Backlinks — when you mention a recurring topic ("the move," "Mom's surgery," "Q3 launch") it threads them automatically.
- Daily Notes plugin — stops you from naming files inconsistently.
- Templater — runs the prompt-generator script when you open today's note.
Point Obsidian at ~/journal as the vault. Install the Calendar, Daily Notes, and Templater community plugins. In Daily Notes settings, set the new file location to daily/ and the template to your prompt template.
If you go further with this, the local AI + Obsidian integration guide covers how to chat with the entire vault using AnythingLLM and embeddings — useful once you have 100+ entries and want to ask "what was the mood pattern in February?"
Step 5 — Weekly Reviews and Mood Trends {#weekly-review}
This is the feature no SaaS app gives you. Sunday at 8 PM, a second script reads all seven entries from the past week and writes a synthesis to ~/journal/weekly/YYYY-WW.md.
#!/usr/bin/env bash
WEEK="$(date +%G-W%V)"
OUT="$HOME/journal/weekly/$WEEK.md"
mkdir -p "$(dirname "$OUT")"
# Concat the last 7 daily files
ENTRIES=$(ls -t "$HOME/journal/daily"/*.md | head -7 | sort | xargs cat)
PROMPT="You are reading the user's last seven daily journal entries. Produce a private weekly review with these sections:
1. Three recurring themes (one line each)
2. Mood trajectory (improving / flat / declining, plus a one-line reason)
3. Open loops — things mentioned but not resolved
4. One question worth carrying into next week
Tone: a thoughtful friend who has actually read the entries, not a self-help bot. No emojis. No 'remember to be kind to yourself.' Be concrete and reference specific things the user said.
Entries:
$ENTRIES"
echo "$PROMPT" | ollama run qwen2.5:7b > "$OUT"
Output sample (real, mildly redacted):
Recurring themes: the Thursday board deck (mentioned 4/7 days), sleep quality (5/7), and a quiet anxiety about the SF trip in May.
Mood trajectory: improving — Mon and Tue were 4/10, Wed jumped to 6/10 after the run, Sat was 8/10. The pattern matches running days.
Open loops: you said Tuesday you would call Mom, no follow-up since. The "draft the resignation but don't send" line from Wednesday has not reappeared.
For next week: what would have to be true for the SF trip to feel exciting instead of obligatory?
That kind of synthesis is the entire reason to keep a journal. No SaaS app I have used produces anything close.
For the script automation pattern, see the local AI automated reports guide — same architecture, different content.
Prompt Library That Actually Works {#prompts}
After 6 months I have a tested set of prompts. Drop these in ~/journal/prompts/ and the daily script can rotate through them on days when context-aware generation feels too generic.
Morning (pick 1-3):
- What is the smallest possible version of today that would still feel like a good day?
- What did I avoid yesterday that would take 12 minutes today?
- Who do I owe a reply to that I have been pretending I forgot about?
- What would a mildly-disappointed-in-me version of myself notice this morning?
Evening (pick 1-2):
- What is one thing from today I want to remember in five years, and one I want to forget by tomorrow?
- Where did I lie to myself today, even slightly?
- What was the most interesting thing somebody else said?
Weekly (Sunday only):
- What story am I telling myself about this week that the data would not support?
- Which person did I think about most? Did they know?
- If I had to cancel three things on next week's calendar, which three?
These are deliberately specific. Vague prompts produce vague writing.
Pitfalls I Hit So You Don't Have To {#pitfalls}
Pitfall 1: I let the AI rewrite my entries. The first month I let Llama "polish" rough morning entries. Within two weeks the entries had stopped sounding like me. Hard rule now: AI generates prompts and weekly synthesis. AI never edits the journal itself.
Pitfall 2: I tried to use a 70B model. Fancier model, worse output. The 70B was slow enough (8 tok/s) that I started skipping the script. A 3B model that runs in 2 seconds beats a 70B model you avoid.
Pitfall 3: I forgot to back up. The journal lives on one laptop. After month two I added a nightly rsync to an encrypted external SSD and a weekly tar | gpg --symmetric to a USB stick I keep in a drawer. The model can be re-downloaded; the entries cannot.
Pitfall 4: I made it too pretty. Spent a Saturday styling Obsidian. Wrote zero entries that day. The journal is the thing. Everything else is procrastination.
Pitfall 5: I tried to share weekly reviews. Weekly reviews are for me. The instant I considered showing them to my partner, the entries got performative. If you want a shared journal, keep it as a separate file with different prompts.
Cost Comparison vs Day One Premium {#cost}
| Day One Premium | Stoic | Local AI Journal | |
|---|---|---|---|
| Annual cost | $34.99/yr | $39.99/yr | $0 |
| Hardware | Phone you own | Phone you own | Laptop you own |
| AI weekly review | No | Limited templated | Yes, full corpus |
| Voice journaling | Yes (cloud) | No | Yes (offline) |
| Export portability | Their JSON | None | Plain Markdown |
| Lifetime cost (5 yr) | $174.95 | $199.95 | $0 |
| Privacy | Cloud + analytics | Cloud + analytics | Air-gappable |
The savings are not the point. The point is that nothing on this list except the local stack actually does the synthesis work that makes journaling pay off.
FAQ {#faq}
(See FAQ section below — schema-rendered for Google.)
Where to Go Next
If you found this useful, the natural next steps are:
- Set up Whisper for offline meeting transcription — same engine, broader use.
- Build a private second brain in Obsidian — once your journal hits 100+ entries.
- Pick the right small model for your machine — if 3B feels limited.
The journal that survives is the one you actually open. Make the friction lower than the friction of opening Twitter. The stack above gets me there at 6:45 AM most mornings, and it has done more for the way I think than any subscription app I ever paid for.
Go from reading about AI to building with AI
10 structured courses. Hands-on projects. Runs on your machine. Start free.
Enjoyed this? There are 10 full courses waiting.
10 complete AI courses. From fundamentals to production. Everything runs on your hardware.
Build Real AI on Your Machine
RAG, agents, NLP, vision, and MLOps - chapters across 10 courses that take you from reading about AI to building AI.
Want structured AI education?
10 courses, 160+ chapters, from $9. Understand AI, don't just use it.
Continue Your Local AI Journey
Comments (0)
No comments yet. Be the first to share your thoughts!