Dayflow
approvedby caezium
Read your Dayflow activity timeline read-only and write daily + weekly notes into your vault, with inline SVG charts, Bases dashboards, and optional ActivityWatch enrichment. - This plugin has not been manually reviewed by Obsidian staff.
Dayflow 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.
For plugin developers
Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.