caezium40 downloadsRead your Dayflow activity timeline read-only and write daily + weekly notes into your vault, with inline SVG charts, Bases dashboards, and optional ActivityWatch enrichment.
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.)
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.
Inline SVG charts that read in both light and dark themes (they all use currentColor):
▲ +2h / ▼ -3h deltas vs last week's totals + focus + distractionDayflow_YYYY.md written on every sync with a GitHub-style 53-week × 7-day activity heatmap plus year totals and your best day.
Three views you can dock anywhere:
One click installs three .base files:
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.
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.
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.
Dayflow · synced 12m ago — click to sync nowSync now, Open today's note, Open this week's note, Open Today side pane, Open This Week side pane, Open DashboardCmd+P → BRAT: Add a beta plugincaezium/obsidian-dayflow-pluginmain.js, manifest.json, styles.css from the latest release (the SQLite WASM is bundled into main.js — no separate asset)<vault>/.obsidian/plugins/dayflow/After enabling the plugin:
30_resources/Dayflow).base filesCmd+P → Dayflow: Sync nowYour 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.
| 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 |
chunks.sqlite with wasmBinary + sql.js in read-only mode. It cannot modify Dayflow's data, even by accident.localhost:5600.isDesktopOnly: true in the manifest. Runtime guard via Platform.isMobile means even if loaded on mobile, the plugin no-ops cleanly with a one-line explainer.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.
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/.
src/db.ts — sql.js wrapper. The WASM blob is imported via esbuild's binary loader at build time (import wasmBytes from '../node_modules/sql.js/dist/sql-wasm.wasm') so it ends up inlined in main.js as a Uint8Array. We hand it to initSqlJs({ wasmBinary }) so sql.js never tries to fetch() 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 use currentColor for theme awareness; app tiles use brand colors via colorForApp.src/exporters/ — Daily-note + weekly-note + year-note + Bases + daily-note-stamp.src/ui/ — Three ItemView subclasses (today, week, dashboard). Today and Week embed their respective notes via MarkdownRenderer.render(); Dashboard is fully DOM-rendered.src/data/activitywatch.ts — REST calls via Obsidian's requestUrl (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.MIT — see LICENSE.