The design of the full desktop app was still bad, and the reason it stayed bad
is that it had no business existing. Five pages — Timer, Tasks, Blocker, Report,
Settings — each a second view of the *server's* data: a second place to be
wrong, a second place to style, and a second place to keep in step with a web
app that already does lists, rules and reports properly in a browser, on any
device. So it is gone, along with 2,100 lines of QML and the controller surface
that fed it.
What is left is what only a program on your machine can do, plus the two
surfaces worth having in front of you:
* **the tray menu — unchanged**, as asked. All fourteen entries, plus
"Settings…". "Open Kadence" now brings the countdown up, because that is what
it meant all along.
* **the mini timer**, which is now the whole of this app's own interface and so
finally carries the house style on its own: warm surface, hairline instead of
shadow, a letterspaced eyebrow, the progress lane as a rule, and exactly one
filled button — whichever action is the obvious next one. The countdown is set
in the display serif on a **fixed advance**, because Fraunces has no tabular
figures and ships no `tnum`: each glyph now sits in a box as wide as the widest
digit, instead of the clock shifting sideways on every tick. The phone client
documents the same trap; the desktop had it too and nobody had looked.
It also says OFFLINE when the backend is away — the count and the clock are
both the server's, and this is the only window left to say it in.
* **a settings dialog**, because a fresh install has to be pointed at a backend
somewhere. One column, hairline sections: the backend and its token, where the
mini timer sits, what this machine enforces, and what it does to the session.
It edits `desktop.json` and nothing else — with one honest exception, view-only
mode, which is a server-side flag the other clients have to honour too.
Structurally, `app.py` no longer loads a QML root at all: a plain `QQmlEngine`
with the mini timer as a component, and the dialog built on demand. Everything
that used to ask "is the main window visible?" is simpler for not having one —
the mini timer's auto-show rule is now just "an interval is running", which is
what the setting always claimed.
The window-only controller surface goes with the pages: tasks and task writes,
stats, the daily report, the settings document, the presets, the cycle and
interruption counters, and their worker jobs and API calls. Two things were kept
deliberately: the task list is still read once a minute for one fact — which task
is pinned, so "Start focus" from the tray attaches what you pinned this morning —
and `timerEnabled` now comes from the timer state, which already carries
`timer_enabled`, rather than from a second fetch of a document this app can no
longer edit.
Also: `--settings` and a `Settings` D-Bus verb; toasts go to the tray's balloon
now that the snackbar is gone; the launcher entry starts the agent and grew a
Settings action; a systemd user unit is shipped rather than only written at
runtime; and both READMEs say what this piece is.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The android README still described the app as unbuilt and pointed `glyph/libs/`
at a path that does not exist. It now covers what the app is made of, how to get
the SDK, and the three Glyph behaviours that cost an afternoon — two of which
fail with no exception and no log at all.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- Refactored TimerPage component to improve layout and user experience.
- Updated theme configuration to utilize design tokens for better maintainability.
- Introduced new tokens for colors and typography to align with design principles.
- Simplified state management and improved timer functionality.
- Enhanced accessibility and responsiveness of UI elements.