README file from
GithubDayflow for Obsidian
Bring Dayflow into your Obsidian vault.
This plugin reads Dayflow's chunks.sqlite read-only and writes daily + weekly notes into your vault, with inline SVG charts, Bases dashboards, optional ActivityWatch enrichment, and a side-pane Today view that refreshes after every sync.
Local-first. Zero network calls. (Except optional localhost:5600 when you opt in to ActivityWatch enrichment.)
What you get
Daily notes
A > [!info] Day at a glance callout at the top — tracked hours, top categories, focus/distraction progress, current focus streak. Then a compact 24-cell hourly strip colored by what you mostly did each hour, your standup highlights/tasks/blockers, journal intentions and reflections, the full timeline (each card with thumbs-up/down ratings inline), top apps, and goal categories. Frontmatter exposes every signal — total_minutes, focus_pct, categories, top_apps, etc. — so Bases and Dataview can slice it freely.
Weekly notes
Inline SVG charts that read in both light and dark themes (they all use currentColor):
- Donut of weekly distribution with total in the hole
- Bar chart of category totals
- Nested treemap — categories as soft tinted blocks, apps inside colored by brand (YouTube red, GitHub charcoal, Claude orange, …)
- Workflow grid — 30-min × 7-day cells colored by dominant category (mirrors Dayflow's "your workflow this week")
- Focus heatmap — intensity by hour × day
- Context shifts vs distractions — multi-series line chart over the days
- Sankey of app-to-app transitions
- Week-over-week comparison —
▲ +2h/▼ -3hdeltas vs last week's totals + focus + distraction
Year notes
Dayflow_YYYY.md written on every sync with a GitHub-style 53-week × 7-day activity heatmap plus year totals and your best day.
Side panes
Three views you can dock anywhere:
- Today — live-rendered today's note with refresh + last-sync indicator
- This Week — same shape, for the current weekly note
- Dashboard — tiny start page: hero number (today's hours), one-sentence focus-goal status, three navigation buttons. Heatmap-free, deliberately minimal.
Bases dashboards
One click installs three .base files:
- Recent days — card gallery of the last 30 days
- Weekly review — sortable table of every weekly note
- Focus performance — table grouped by goal hit / close / miss
ActivityWatch enrichment (opt-in)
Flip a toggle to query your local ActivityWatch and get precise per-app minutes under every Dayflow timeline card, plus a full per-day app breakdown. Web-tab noise filtered to active-browser windows only. Localhost only — auto-detects buckets via /api/0/buckets.
Schema drift detection
Every sync checks the live chunks.sqlite against the schema fingerprint the plugin actually reads. Missing required tables abort with a clear error; unknown new tables Dayflow.app added since the plugin was written surface as a Notice so you know to check for an update.
Stamp into your Obsidian Daily Note
Optional toggle: appends a small > [!info] Dayflow callout into your existing core-Daily-Notes file linking the Dayflow note for that day. Stamp block is bounded by HTML comments so re-syncs update in place instead of duplicating.
Status bar + commands + ribbon
- Status bar:
Dayflow · synced 12m ago— click to sync now - Commands:
Sync now,Open today's note,Open this week's note,Open Today side pane,Open This Week side pane,Open Dashboard - Ribbon icons: sync · Today view · Dashboard
Install
Via BRAT (recommended for now)
- Install BRAT from Obsidian's community plugin store
Cmd+P → BRAT: Add a beta plugin- Paste
caezium/obsidian-dayflow-plugin - Enable Dayflow in Settings → Community plugins
Manual install
- Download
main.js,manifest.json,styles.cssfrom the latest release (the SQLite WASM is bundled intomain.js— no separate asset) - Place them in
<vault>/.obsidian/plugins/dayflow/ - Reload Obsidian, then enable Dayflow in Settings → Community plugins
Requirements
- macOS (Dayflow.app is macOS-only)
- Dayflow installed and recording activity
- Obsidian 1.8.0 or newer
Setup
After enabling the plugin:
- Open Settings → Dayflow
- Confirm the Output folder (default
30_resources/Dayflow) - Click Install Bases dashboards to drop the three
.basefiles - (Optional) Toggle Enable ActivityWatch sync if you have ActivityWatch running
- Trigger your first sync:
Cmd+P → Dayflow: Sync now
Your daily and weekly notes appear under the configured folder. Open the side pane via Cmd+P → Open Today side pane or by clicking the activity icon in the ribbon.
Settings
| Group | Setting | Default | What it does |
|---|---|---|---|
| Output | outputFolder |
30_resources/Dayflow |
Vault folder for all generated notes |
| Sync | syncDays |
3 |
How many days back each sync covers |
| Sync | skipDaysBefore |
(empty) | YYYY-MM-DD lower bound. Days before this are never synced. |
| Sync | syncOnStartup |
true |
Run a sync 5s after Obsidian opens |
| Sync | intervalMinutes |
30 |
Background sync interval. 0 disables. |
| Sync | dbPath |
(empty) | Override path to chunks.sqlite |
| Formatting | categoryWikilinks |
true |
Render categories as [[wikilinks]] |
| Formatting | includeDeleted |
false |
Include cards marked deleted in Dayflow |
| Formatting | appendToDailyNote |
false |
Stamp a callout into your existing Daily Notes file |
| ActivityWatch | awEnabled |
false |
Off by default — flip on if you have AW running |
| ActivityWatch | awUrl |
http://localhost:5600 |
Your AW server URL |
| ActivityWatch | awWebBrowserOnly |
true |
Filter web events to active-browser windows only |
Privacy
- Read-only SQLite — the plugin opens
chunks.sqlitewithwasmBinary+sql.jsin read-only mode. It cannot modify Dayflow's data, even by accident. - Zero network calls by default. The only network code path is the optional ActivityWatch enrichment, which only ever talks to
localhost:5600. - No telemetry. No analytics, no error reporting, no remote logging.
- Desktop-only.
isDesktopOnly: truein the manifest. Runtime guard viaPlatform.isMobilemeans even if loaded on mobile, the plugin no-ops cleanly with a one-line explainer. - Build provenance. Every release is built in GitHub Actions and signed with a sigstore attestation linking the binary to its exact source commit. Verify with
gh attestation verify main.js --owner caezium.
You can audit the network surface with grep -RIE 'fetch\(|axios|requestUrl|XMLHttpRequest|https?://' src/. The only matches will be inside src/data/activitywatch.ts (gated behind the awEnabled toggle) and the SVG XML namespace (http://www.w3.org/2000/svg) which is not a network call.
Build
git clone https://github.com/caezium/obsidian-dayflow-plugin
cd obsidian-dayflow-plugin
npm install
npm run build # type-check + bundle to main.js
Output: main.js (CJS bundle, ~1 MB — esbuild's binary loader inlines sql-wasm.wasm directly into the bundle so there's no separate asset). Drop that + manifest.json + styles.css into <vault>/.obsidian/plugins/dayflow/.
Architecture notes
src/db.ts—sql.jswrapper. The WASM blob is imported via esbuild'sbinaryloader at build time (import wasmBytes from '../node_modules/sql.js/dist/sql-wasm.wasm') so it ends up inlined inmain.jsas aUint8Array. We hand it toinitSqlJs({ wasmBinary })so sql.js never tries tofetch()it — that fails in Electron's renderer.src/data/— One module per Dayflow table: timeline, journal, standup, goals, ratings, observations. Each gracefully degrades when a table is missing (for older Dayflow schemas).src/aggregators/— Pure functions that turn rows into category breakdowns, per-app totals, focus heatmaps, context shifts, dominant-category grids, week-over-week deltas, focus streaks, etc.src/viz/— Pure-JS SVG generators (treemap with nested mode, heatmap, sankey, bars, donut, lines, workflow-grid, hourly-strip, year-heatmap). Text fills usecurrentColorfor theme awareness; app tiles use brand colors viacolorForApp.src/exporters/— Daily-note + weekly-note + year-note + Bases + daily-note-stamp.src/ui/— ThreeItemViewsubclasses (today, week, dashboard). Today and Week embed their respective notes viaMarkdownRenderer.render(); Dashboard is fully DOM-rendered.src/data/activitywatch.ts— REST calls via Obsidian'srequestUrl(fetch/axios are CORS-blocked). Auto-discovers window/web/afk buckets.src/util/schema-check.ts— Compares the live SQLite schema to the fingerprint each fetcher expects. Notice for drift, abort for missing-required.
Acknowledgements
- Dayflow by Jerry Liu — the app that captures everything
License
MIT — see LICENSE.