Sunsama-style vertical day timeline for macOS. Reads, renders, and writes back the same Obsidian Day Planner markdown file Obsidian itself uses, so the file stays the single source of truth.
swift build -c release
.build/release/day-timelineRequires macOS 13+ and the Swift toolchain.
Out of the box the app looks for ~/Documents/Brain dump/claude-mcp-daily-plans/Plan D.M.YYYY.md, which is the author's vault. Point it at yours with defaults write, no rebuild needed:
defaults write fi.dude.day-timeline planDirectory "~/Documents/Notes/Daily"
defaults write fi.dude.day-timeline planFileNameFormat "yyyy-MM-dd'.md'"
defaults write fi.dude.day-timeline obsidianVaultName "Notes"
defaults write fi.dude.day-timeline timeZone "Europe/Lisbon"| Key | Default | Meaning |
|---|---|---|
planDirectory |
~/Documents/Brain dump/claude-mcp-daily-plans |
Folder holding the plan files. ~ is expanded. |
planFileNameFormat |
'Plan 'd.M.yyyy'.md' |
DateFormatter pattern for one day's file. Literal text needs single quotes. |
obsidianVaultName |
Brain dump |
Vault name used in obsidian://open links. The in-vault path is derived from planDirectory. |
timeZone |
Europe/Helsinki |
Zone every timestamp resolves in. Falls back to the system zone if unknown. |
timelineStartHour |
7 |
First hour drawn. The timeline still expands to fit earlier blocks. |
timelineEndHour |
19 |
Last hour drawn, expanding for later blocks. |
Check what the app resolved, including whether today's file actually exists:
.build/release/day-timeline --print-configSettings can also be overridden per launch without touching your preferences, which is handy for trying a vault out:
.build/release/day-timeline -planDirectory "~/Notes/Daily" -planFileNameFormat "yyyy-MM-dd'.md'"Use the fi.dude.day-timeline domain for the installed .app and day-timeline for a binary run straight out of .build.
Scripts/make-app.sh --installBuilds dist/Day timeline.app with the icon rendered by the binary itself (day-timeline --export-icon <dir> writes the iconset, iconutil turns it into AppIcon.icns), so the art never drifts from the code that draws it. --install moves it to ~/Applications, replacing any running copy, and clears dist so Launchpad does not list the build copy too. Without the flag the bundle is left in dist for you to place yourself.
- Minimize, zoom and close in the title bar; menu bar with cmd+M, cmd+W, cmd+H, cmd+Q
- Vertical timeline 07:00-19:00 by default, expanding to fit blocks outside that range
- Click status circle to cycle planned → in progress → done → skipped, with completion timestamp appended automatically
- Drag block body to move, drag top or bottom edge to resize, snapping to 15 min on release
- Floating + button or cmd+N adds a new 30-min block at the next quarter hour
- Cmd+scroll, cmd+-, cmd+=, cmd+0, or the bottom-right magnifier for zoom; level persists across launches
- Right-click for status, rename, delete, open in Obsidian
- Inline markdown rendering for Linear links and similar
- FSEvents file watch with a 2 s mtime poll fallback keeps the view in sync with Obsidian and
/plan_todayedits - Atomic save touches only the
## Day Plannersection, every other section preserved byte-for-byte
- [ ] 10:00 - 11:00 Task name (Source)
- [>] 11:00 - 12:30 In-progress task
- [x] 12:30 - 13:00 Completed task (done 12:58)
- [-] 13:00 - 13:30 Skipped task