Keeping a Local, Searchable Journal with `jrnl`, Syncthing, and Obsidian
I’ve bounced between a dozen journaling tools over the years:Day One, Standard Notes, Joplin, even bullet journals scrawled in Moleskines. Some were polished but locked down; others were open-source but clunky. Nothing really clicked.
Until now.
What finally worked wasn’t one perfect app. It was a simple, local-first system built around tools I already use: jrnl
, Syncthing, Obsidian, and a few Zsh functions. It’s fast, frictionless, and entirely mine. No subscriptions. No vendor lock-in. No sync drama.
This post walks through how I set it up, how I use it daily, and why it’s finally stuck. If you want a journal that’s private, grep-friendly, and Markdown-native, this post is for you.
Step 1: Installing jrnl
jrnl
is a command-line journaling tool written in Python. It’s great for quick logging with natural syntax. Here’s how I got started on Arch:
pipx install jrnl
Or, for other systems:
pip install --user jrnl
Then configure it:
jrnl --setup
Set the default format to Markdown, and pick a journal file location like:
~/Syncthing/Journal/jrnl.md
This is where all your quick entries will go. You can also create a folder structure for daily and monthly logs, which I’ll show in a bit.

jrnl.md
for quick entries
(You could also break it up by day, but I mostly use jrnl
for quick thoughts or scratch entries.)
Step 2: Sync It All with Syncthing
I use Syncthing to sync my ~/Syncthing/Journal
folder across devices: Linux desktop, laptop, and phone. This means my journal is always accessible, even offline. There’s no cloud service middleman. If I open Obsidian on my phone, I can browse and search my journal markdown instantly.
Step 3: Daily and Monthly Markdown Files (with Zsh helpers)
For more structured entries—morning notes, logs, reflection—I use daily and monthly files in plain Markdown. I wired up a couple shell functions to make this frictionless:
# Add a line to today's daily file
jday() {
local file=~/Syncthing/Journal/daily/$(date +%F).md
local header="## $(date '+%A, %B %d, %Y')"
mkdir -p "$(dirname "$file")"
if [ ! -f "$file" ]; then
echo -e "$header\n" >> "$file"
fi
echo "- $(date '+%Y-%m-%d %H:%M') :: $*" >> "$file"
}
# Add a line to the current month's log
jmonth() {
local file=~/Syncthing/Journal/monthly/$(date +%Y-%m).md
local header="### $(date +%F)"
mkdir -p "$(dirname "$file")"
if ! grep -q "$header" "$file" 2>/dev/null; then
echo -e "\n$header\n" >> "$file"
fi
echo "- $(date '+%Y-%m-%d %H:%M') :: $*" >> "$file"
}
I keep these in my ~/.zshrc
. Now I can write:
jday Working on the RTCC survey protocol. Need to tighten up the logic model.
jmonth Had a good early AM workout. Hit squats, RDLs, and core.
You get nicely timestamped lines in clean, daily or monthly markdown logs. It’s great for personal tracking, future memos, or even paper breadcrumbs.
Step 4: Quick Edit Aliases
Sometimes you want to open today’s entry in a GUI. I use GNOME, so I set up:
alias jedit='gnome-text-editor ~/Syncthing/Journal/daily/$(date +%F).md'
alias medit='gnome-text-editor ~/Syncthing/Journal/monthly/$(date +%Y-%m).md'
Swap gnome-text-editor
with code
, nano
, or whatever suits you.

Step 5: Open in Obsidian
If you point Obsidian at your ~/Syncthing/Journal
folder, you get the full power of backlinks, graph view, tags, and search. I use this less for atomic notes and more for flipping through daily logs or tagging specific entries (e.g., #project
, #health
, #teaching
).
Bonus: Obsidian Mobile works perfectly with this setup via Syncthing. No plugins needed.

Step 6: Search with grep
I can search my entire journal with a simple grep
command:
grep -i 'RTCC' ~/Syncthing/Journal/daily/*.md ~/Syncthing/Journal/monthly/*.md
This gives me quick access to any entry mentioning “RTCC” across all my daily and monthly logs. It’s fast, efficient, and respects my privacy.
Why This Setup Works for Me
- Fast: I can log a thought in seconds without leaving the terminal.
- Local-first: All Markdown, all synced peer-to-peer, no proprietary lock-in.
- Flexible:
jrnl
for quick logs; structured markdown for deeper reflection. - Portable: Obsidian gives me a UI when I want it, CLI when I don’t.
It’s not a silver bullet. But it’s fast, clean, and works the way I think. That’s enough to keep me writing.
Conclusion
This setup has transformed how I journal. It’s not just about writing; it’s about creating a system that fits my workflow, respects my privacy, and keeps me engaged. If you’re looking for a local, searchable journal that integrates seamlessly with your existing tools, give this a try.