Journal
egon-journal adds structured journaling to your Egon graph. Write daily entries linked to the content you already have, follow guided programs, and run local reports across mood, physiology, and personality — without any data leaving your device.
Getting started
You need Python 3.13+ and uv. Clone the repository and install:
Configure your graph directories by copying the example env file:
Open .env and set the three paths:
Create your first journal entry:
Entries are named Journal — YYYY-MM-DD.md and written as plain Markdown with YAML frontmatter. They land in EGON_JOURNAL_DIR and sit alongside your content nodes in Obsidian or Logseq.
Prompts and programs
Journaling prompts are short, topic-linked questions that sit as nodes in your graph alongside the content they refer to. Structured programs are time-bounded sequences — each day is a node that frames a reading and a reflection.
Weekly and monthly summaries
Summary nodes give each week or month a structured reflection: overall tone, recurring themes, one thing noticed, and what to carry forward. Fill them in by hand or use a local AI tool to draft them from your entries.
Reports
Reports are generated locally as PDFs (or .png / .svg) and saved to ./reports/. They read only from your local files — no API calls, no data transmitted.
Run everything at once with the full report command:
Which analyses appear is controlled by egon.toml in the project root. All analyses are enabled by default except wordcloud (opt-in) and topics (requires the topics extra).
Journal insights
Word count
Daily word count across all entries as a bar chart — a proxy for how much you've been engaging with your graph.
Word cloud
A visual summary of the most frequent words across a period. Opt-in: set wordcloud = true in egon.toml.
Topics
Latent theme discovery using BERTopic — a bar chart of recurring topics and a stacked timeline showing how they shift across months.
Cognitive distortions
Detects cognitive distortions in journal text across seven categories (personalization, emotional reasoning, overgeneralizing, labeling, should statements, catastrophizing, reward fallacy) using a BERT-tiny classifier. Two-panel figure: daily distortion signal line and a stacked area by distortion type.
Personality & affective patterns
Sentiment
Daily sentiment score (VADER, −1 to +1) as a line chart with a neutral band. A fast, local measure of overall emotional tone.
Emotion
Daily emotion profile across seven categories (anger, disgust, fear, joy, neutral, sadness, surprise) using a DistilRoBERTa model. Includes a joy-vs-sadness overlay.
Big Five traits
Scores each entry on the five personality dimensions (Openness, Conscientiousness, Extraversion, Agreeableness, Neuroticism) using a DistilBERT regression model. Five subplots, one per trait, with the period average annotated.
MBTI dimensions
Classifies each entry into four binary MBTI dimensions (E/I, N/S, T/F, J/P) and shows the dominant pole and proportion across the period.
Physiological measures
Sleep
Nightly time asleep (hours) from an Apple Health export, with 7 h and 9 h reference lines. Sleep quality is strongly correlated with mood and mental health symptoms.
Resting heart rate
Daily resting heart rate (bpm) from Apple Health. A useful proxy for stress and recovery. Set a target via EGON_TARGET_RESTING_HEART_RATE in .env.
HRV
Daily heart rate variability (ms, SDNN) from Apple Health. HRV is associated with autonomic nervous system function and stress levels.
Weight
Daily body weight (kg) from Apple Health. Sudden weight changes can be an early indicator of shifts in mental health.
Step count
Daily steps from Apple Health as a bar chart with a 10,000-step reference line.
Exercise time
Daily Apple Exercise Time (minutes) with a WHO-recommended 30 min/day reference line. Customise via EGON_TARGET_EXERCISE_MINUTES in .env.
VO2 max
Daily mean VO2 max (mL/min/kg) from Apple Health with the period average annotated.
Cross-signal analysis
Correlations
Pairwise Pearson correlations across all available journal and health signals — a full heatmap and a top-pairs chart. Requires at least two signals.
All report commands accept --period (week, month, quarter, year, all-time) and --for (e.g. 2026-02, 2026-W14, 2026-Q1). Health reports also accept --xml to specify an Apple Health export path.
Next steps
- Browse the Registry to download content packs to read alongside your entries
- Follow the Getting Started guide to set up your Obsidian or Logseq vault
- View the full source on GitHub