Skip to main content

Effortless Daily Journaling With Your Voice

Journaling has well-documented benefits for mental clarity, reflection, and personal growth. But many struggle to build a consistent habit for two key reasons: not knowing what to write and the daunting blank page.

This guide shows you how to eliminate both barriers. With hns, you can speak freely in a stream-of-consciousness style, rambling about your day, thoughts, and feelings in any order. No structure required. An LLM then transforms your casual speech into a polished, coherent journal entry, saved directly to Obsidian or any markdown-based note-taking app.

The result is a journaling practice that's finally sustainable.

Why Voice-First Journaling Works

Speaking is faster and more natural than typing. You can capture thoughts as they occur without worrying about grammar, structure, or finding the "right" words. The freedom to ramble removes the pressure of the blank page, while the LLM editing step ensures your final entry is readable and coherent.

Simple Workflow: Direct Transcription

The most straightforward approach is to append your raw voice transcription directly to a daily journal file. This is fast, works completely offline, and requires no third-party tools beyond hns.

First, set an environment variable pointing to your journal directory.

~/.bashrc or ~/.zshrc
export JOURNAL_DIR="$HOME/Documents/Obsidian/Journal"

Now you can use a simple command to append your thoughts to a dated file.

hns >> "$JOURNAL_DIR/$(date '+%Y-%m-%d').md"

If the file for the current day doesn't exist, this command will create it automatically. If it does exist, your new entry will be appended to the end.

Advanced Workflow: LLM-Polished Entries

Raw spoken language is messy. For a more readable journal, you can use an LLM to clean up your transcription. The model acts as a personal editor, fixing grammar, removing filler words, and structuring your thoughts into a coherent narrative—all while preserving your unique voice.

We'll create two shell functions:

  • hjrnl: Transcribe a new voice recording and save it as a journal entry.
  • hljrnl: Process your last hns recording and save it as a journal entry.

The functions will:

  1. Transcribe your voice using hns.
  2. Pipe the text to an LLM with a specialized "journaling editor" prompt.
  3. Append the polished output to a daily note with a timestamp.
  4. Confirm the entry was saved.

Here is the implementation using the llm CLI tool, which is great for accessing high-quality remote models.

Add to your ~/.bashrc or ~/.zshrc:

~/.bashrc or ~/.zshrc
export JOURNAL_DIR="$HOME/Documents/Obsidian/Journal"

_hjrnl_common() {
local transcription=$1
local journal_file="$JOURNAL_DIR/$(date '+%Y-%m-%d').md"
local timestamp=$(date '+%H:%M')
local system_prompt="You are an AI editor for personal journaling. Your role is to take a casual, spoken transcription and transform it into a coherent journal entry. Fix grammar and spelling, remove filler words, and organize the thoughts into a clear narrative. Preserve the author's personality, word and phrase choices, tone, and emotions. While shuffling the sentences around to produce a cohurent narrative, use the same words and phrases as much as possible. Do not add new information or answer questions. Output the journal entry in markdown format. Do not add any preambles like 'Journal Entry:' or any closing remarks. Use escape characters where necessary for markdown formatting."

mkdir -p "$JOURNAL_DIR"

local cleaned=$(llm --model gpt-4.1-nano --system "$system_prompt" "$transcription")

echo -e "\n---\n## $timestamp\n\n$cleaned" >> "$journal_file"
echo "✓ Journal entry saved to $journal_file"
}

hjrnl() {
_hjrnl_common "$(hns)"
}

hljrnl() {
_hjrnl_common "$(hns --last)"
}

After adding the functions, restart your terminal or source your config file (e.g., source ~/.zshrc).

The --last Flag

hljrnl uses hns --last to re-process your previous recording. This is incredibly useful if the LLM call fails due to a network error or if you want to try again with a different model.

Obsidian Integration

Obsidian automatically detects new markdown files in your vault. After running hjrnl, switch to Obsidian and your new entry will already be there, no manual import or refresh needed. You can immediately add tags, links, or continue editing if desired.

What Your Journal Looks Like

Each entry is appended to a daily file with a timestamp header. For example, 2025-11-01.md might look like:

---
## 14:30

Today was productive. I finally tackled the authentication refactor I'd been putting off. The key insight was separating the session management from the user model. This made testing much easier and the code more maintainable.

---
## 19:45

Took a walk after dinner and had some thoughts about the project roadmap. We should probably prioritize the API documentation before the next release. Users keep asking about the webhook system, and good docs would save everyone time.

This format integrates seamlessly with Obsidian, and new entries appear instantly in your vault.

Privacy-First: Using Local LLMs

Journals are private. If you prefer to keep your data entirely on your machine, you can use a local LLM for the editing task. This is the ultimate privacy-preserving setup, as no data ever leaves your computer.

We recommend llama-cli or Ollama for this.

Option 1: Ollama

Ollama is a popular tool for running local models. Small, efficient models like llama3 are excellent for this task.

To use it, simply replace the llm command in the _hjrnl_common function with ollama.

local cleaned=$(ollama run llama3 "$system_prompt\n\nText: $transcription")

Option 2: llama-cli

For more fine-grained control, llama-cli is a fantastic choice. It allows you to pass the system prompt separately from the user prompt, which can improve reliability.

Replace the llm command in _hjrnl_common with the following:

local cleaned=$(llama-cli \
--model "$HOME/models/llama-3-8b-instruct-q4_k_m.gguf" \
--system "$system_prompt" \
--prompt "$transcription")
System Prompts Matter

Using a dedicated system prompt (as with llm and llama-cli) tells the model to act as an editor. This prevents it from trying to answer questions in your journal entry (e.g., "Should I take that new job?"). It ensures the model sticks to editing, not advising.

Quick Start

  1. Add the hjrnl function to your shell config (choose remote or local LLM version above).
  2. Restart your terminal or source your config file.
  3. Run hjrnl in your terminal.
  4. Speak freely about your day. Don't worry about structure or order.
  5. Press Enter when done.
  6. Open Obsidian to see your polished entry.

Your thoughts are now preserved, organized, and ready to revisit.

Summary

Voice-first journaling with hns removes the barriers that prevent consistent journaling. By speaking your thoughts freely in a stream-of-consciousness style, you bypass the blank page problem and capture ideas as they naturally occur.

Three Approaches:

  • Direct Transcription: Pure, unfiltered thoughts. Completely offline and private.
  • LLM-Polished (Remote): Professional-quality entries with minimal effort. Best for clarity and readability.
  • LLM-Polished (Local): The best of both worlds: polished entries that never leave your machine.

This workflow integrates seamlessly with Obsidian and other markdown-based tools, creating a journaling practice that is finally sustainable. Happy journaling!