Save button is missing a loading state and double-fires offline
Two notes from 09:42 and 14:55 describe the same async-write race. Suggested: pessimistic spinner + queue-side dedup keyed on payload hash.
- src/ui/save-button.tsx
- src/lib/queue.ts
a local-first developer journal
Pilog is a quiet markdown scratchpad on a global hotkey and an inbox that turns the pile of rough notes into repo-aware GitHub issue drafts. You write what you noticed in flow; Pilog drafts the issues when you have a moment.
02 — the move
what you typed
what Pilog drafts
Two notes from 09:42 and 14:55 describe the same async-write race. Suggested: pessimistic spinner + queue-side dedup keyed on payload hash.
Two notes flag a 12px gap where the scale expects 16px. Likely a shared token misuse, not two bugs.
03 — what’s inside
A global hotkey opens a markdown scratchpad with no chrome competing with what you’re writing. The window is waiting for you, not demanding attention. HitCtrlSto save, anywhere is gone before you finish moving your hand.
Every issue draft is anchored visibly to its source notes and a short reasoning summary. Confidence is named. Nothing is hidden behind an expander.
from notes at 09:42, 14:55
from notes at 10:24, 13:02
Notes, drafts, agent run history live in local SQLite. Secrets live in your OS keychain. There is no Pilog server.
The agent reads the active repository alongside your notes — affected files, labels, owners, prior issues — and proposes drafts that actually fit.
repo: nick-neely/pilog labels: bug, ux-polish codeowners: @nick-neely prior: #142 (similar)
04 — keyboard-first
The hotkey-driven scratchpad is the product’s defining gesture. The rest of the app honors it. The few you’ll learn first:
05 — the stance
The scratchpad is a sanctuary, not a form. No chrome competes with the writing. Required fields, label pickers, and repo selectors live elsewhere or are deferred until triage. The first beat of the experience is just typing.
Every generated draft is anchored visibly to its source notes and a short, user-facing reasoning summary. Confidence is named, rationale is concise, and the raw notes are never hidden behind an expander by default.
Notes, drafts, repo metadata, and agent run history live in local SQLite. Secrets live in OS credential storage. The product makes obvious what leaves the machine and when.