github krelltunez/dayGLANCE v5.4.0

latest release: v5.4.1
4 hours ago

New widgets and languages, and a new Goals & Projects workspace

dayGLANCE 5.4.0 brings the Day Dial to the Android home screen, at parity with the iPhone widget that shipped in 5.3.0. The dial also learns to draw your GTD Frames, on every platform and in the app. MONTH gets home-screen widgets on both phones, Ukrainian and Polish join the app's languages, and Goals & Projects becomes a space of its own on desktop rather than a modal over the calendar. Everything here ships on desktop, Android and iOS unless a section says otherwise.

Day Dial on Android

  • The same dial, not a lookalike. The Android widget draws from the same snapshot fields as the iPhone one and is held to the same exported geometry vectors, so the two faces cannot drift. The hub states, the block band, the sky ring and the needle all come across.
  • A needle that moves by the minute. Its own minute tick, exact where the system grants it and windowed where it does not, and skipped entirely while the screen is off. Each tick compares the face key: the same key sends a partial update for the needle and the live row, and only a real change (a block boundary, a new day, a push, a resize) redraws the face.
  • Wired into every refresh path the other widgets use: a push from the app, midnight, a time-zone or clock change, the background worker and boot.
  • This reverses the "no Android dial" decision recorded on 22 September. The spike that changed it, and what it measured, are in the handoff doc.

Frames on the dial

  • Your GTD Frames are drawn on the face, as enclosures around the blocks that sit inside them, in the app and on both widgets. Nesting is resolved by containment and capped at one level, so a busy day stays readable.
  • The hub names the frame you are in and how much free time is left in it.
  • A Frames percentage joins the day's totals: framed block minutes against the time your top-level frames cover.
  • Frames arrive in their own colours. Every frame in the widget sections used to fall back to blue.
  • The frame geometry is stated once, in the shared vectors, and ported to both the Swift and Kotlin dials alongside the web one.

Day Dial on iPad

  • An extra-large size, split down the middle: the dial on one side, the All Day and legend cards on the other, on black rather than the system's gradient. The cards scale with the placement and let long titles use the row.

MONTH on the home screen

  • iOS gets a Month widget in large and extra large. The extra-large one adds the day's agenda beside the grid.
  • Android gets two: the month grid, and the grid with an agenda beside or below it depending on the shape you give it.
  • They know their own dates. Each runs its own device-calendar fetch over the six-week window the grid draws, rather than borrowing the app's, and carries a dated "Planned as of" so a projected day says so.
  • Paging and today. Chevron arrows move a month at a time, with targets big enough to hit, and a Today button returns.
  • Tap through to the day. Tapping opens MONTH on that day, with the day's sheet in the same render, and on a phone the timeline tab comes forward with it.
  • Both follow the system light and dark appearance, with no lag on a theme switch.

Ukrainian and Polish

  • Ten languages. Ukrainian and Polish join the app, including the plural forms Slavic grammar needs rather than an English shape with the words swapped.
  • Selectable on Android, whatever the phone's own language is. The app's text follows; the widgets and notifications are still English and will follow.
  • AI answers now follow the app's language. Every prompt is written in English, so a Chinese Evening Reflection card could contain an English reflection. The briefing caches record the language they were written in, so switching at noon regenerates instead of serving the morning's text.
  • Dates, durations and speech recognition all route through the app's language rather than each surface deciding for itself, with one duration formatter behind the lot.
  • The plural-coverage test now derives its scope from each language's own rules instead of a hardcoded list, which caught real gaps in languages nobody had thought to check.

Goals & Projects, as a space

  • No longer a modal over the calendar. A switcher at the far left of the header swaps the sidebar and main area between the Calendar space and Goals & Projects, and g toggles from either side.
  • A real desktop layout: a Goals and Projects sidebar with an area filter, goal rows that accept a dropped project, a List and Roadmap toolbar, the selected goal's card with connector lines to its projects, and a "Move to..." picker.
  • The calendar keeps its place. It stays mounted behind the space, so scroll position survives a round trip.
  • The phone's Goals tab follows the same design, with tighter controls, smoother goal swipes, a Filter button in the Projects row and one way to clear it.
  • One Stalled rule. Five surfaces each applied it with their own extra conditions and disagreed with each other; they now share one gate. The Weekly Review keeps the raw rule on purpose, since it is the momentum report.
  • Inbox actions become buttons you can reach. The filter buttons are on desktop and tablet as well as the phone, the phone's Inbox actions are floating buttons, and the GLANCE Goals pill is gone.

Widgets everywhere

  • Real previews in the Android picker for Today, Up Next, Project, Goal and both Month widgets, instead of a generic tile.
  • The pickers only offer what the app shows. Projects left linked to an archived or deleted goal were listed although no screen in the app shows them. Completed projects are hidden from the pickers, while a widget already pinned to one still shows it as done.
  • Rows open the thing they name. A task row its task, a goal row the goal, a hyperGLANCE row its project, and a Month agenda row on another day that day in MONTH.
  • The project widget lists tasks in the app's order, and that order now holds across devices.
  • The next alarm set in your clock app appears on the dial and in GLANCEahead (Android). Any app can register an alarm clock, so a calendar's event alarm used to show up as your wake-up time; only alarms from a known clock app count now.

Everywhere

  • A fragment inside a web address is no longer read as a tag. A URL ending in #section turned the rest into a tag.
  • Android deep links are no longer dropped when their slashes arrive escaped.
  • TRMNL pushes fit the service's real limit. The cap was 5 kB rather than the 2 kB the code assumed, and a full day crosses it at 21 tasks in Ukrainian against 33 in English. The payload now drops schedule rows until it fits, completed first, then past, then the furthest ahead, so the next thing due is the last to go, and a refused push says why.
  • MCP create_task inherits the project's colour and assigned users, so a task an assistant files into a project looks like one made in the app.

Experimental

  • JOBO, plan versus actual, is now a working Plan and Do view rather than the groundwork it was in 5.3.0: the plan on one side, what actually happened on the other, drawn on the app's own timeline. It remains behind the Experimental switch in Settings, off by default, and work on it continues.
  • Aspire is switched on the same way and is still a placeholder.

Under the hood

  • An unloaded ledger no longer looks like a deletion. The push diff read a collection missing from the payload the same as an empty one, so JOBO rows in the saved snapshot became vanish-deletes on every launch, costing a wall of guard warnings and a re-fetch per row. An absent kind is now carried forward; an explicit empty list still means empty.
  • A sync killed mid-pull no longer strands rows. The pull cursor is rewound whenever a cycle fails, because the rows that cycle applied were written only to a per-cycle copy that a failure throws away. That covered an error, but not the app's process being killed outright, which Android does on backgrounding and under memory pressure and a desktop does not. The cursor stayed advanced past pages that were never committed, and those rows sat below it permanently: a device quietly missing a handful of edits while everything later synced normally, with nothing to show for it. The cursor is now recorded before each pull and rewound on the next launch if that cycle never finished. It only ever rewinds, and re-reading rows the device already holds changes nothing.
  • Four surfaces now have to agree about which languages exist: the web bundles, Android's language list, its string resources and the iOS catalogs. A new parity test forces a shipped language to be either localized natively or recorded as pending with a reason, which is how the Android and iOS gaps above came to be written down rather than discovered.
  • The Obsidian bridge plugin is unchanged and stays at 0.9.1.

Thanks

  • polymatheiia for Ukrainian and Polish, and for the i18n work underneath them: one duration formatter in place of the hand-rolled ones, dates and speech recognition routed through the app's language, and the plural-coverage test rebuilt to derive its own scope. A first contribution, and a substantial one.
  • Lcub3d for JOBO: the core records and their tests, and the Plan and Do view in #1840.

Don't miss a new dayGLANCE release

NewReleases is sending notifications on new releases.