by tripstoph
Pace a writing session against a gentle words-per-hour ghost, with thinking and writing intervals.
Focus Flow
Focus Flow paces a writing session against a gentle words-per-hour ghost. Thinking and writing take turns. The counter shows whether you are ahead, even, or behind that pace. It does not use a countdown panic or a quota.
This is a community plugin for Obsidian. It is not an official Obsidian product, and it is not affiliated with Dynalist Inc.
The plugin is offline. It does not use the network, telemetry, an account, or audio files. Session settings and records stay in the vault through Obsidian's plugin data.
Install for development
The plugin folder inside .obsidian/plugins/ must be named focus-flow, the same as the plugin id.
npm install
npm run build
Copy main.js, manifest.json, and styles.css into that folder, then enable Focus Flow in Obsidian.
Use
- Open a Markdown note.
- Open the writing panel from the ribbon or the command "Open writing panel".
- Choose a pace and the thinking and writing lengths in settings. The helper shows the pace in words per minute, and how much of that pace falls on the writing interval when thinking time counts.
- Start the session. Words you write in any Markdown note count.
- Pause, add a minute, skip an interval, or end the session from the panel. On the desktop, the status bar shows the same phase and delta.
Reaching a goal plays a short chime and a glow. The session keeps going until you end it, unless you turn off "Keep going after the goal". The summary and the session callout appear only after the session ends.
If Obsidian closes mid-session, the panel offers to resume. Time spent away is not added to the ghost.
Checks
npm test
npm run lint
npm run lint uses eslint-plugin-obsidianmd and fails on any warning. A phone layout can be checked in the developer console with app.emulateMobile(true).
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.