<feed xmlns='http://www.w3.org/2005/Atom'>
<title>doot.git/android/app, branch master</title>
<subtitle>doot — personal productivity web app
</subtitle>
<id>https://git.terst.org/doot.git/atom?h=master</id>
<link rel='self' href='https://git.terst.org/doot.git/atom?h=master'/>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/'/>
<updated>2026-07-12T11:18:37+00:00</updated>
<entry>
<title>feat(widget): add event detail popup showing recurrence schedule</title>
<updated>2026-07-12T11:18:37+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-07-12T11:18:37+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=4126fe4f56a6eb9703a084d4793a597f37bf2867'/>
<id>urn:sha1:4126fe4f56a6eb9703a084d4793a597f37bf2867</id>
<content type='text'>
Co-Authored-By: Claude Sonnet 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01VTUSAEKfsPc6WGDq45yPHD
</content>
</entry>
<entry>
<title>fix(widget): add IME handling to quick-add's keyboard-covering input field</title>
<updated>2026-07-12T10:41:12+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-07-12T10:41:12+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=b1c76cdf30b7d491f3791588c8aa8c66ee5a0950'/>
<id>urn:sha1:b1c76cdf30b7d491f3791588c8aa8c66ee5a0950</id>
<content type='text'>
</content>
</entry>
<entry>
<title>feat(widget): add quick-add button and entry sheet</title>
<updated>2026-07-12T10:38:59+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-07-12T10:38:59+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=029902606396cf5ec583e187e7adc576c4aafb71'/>
<id>urn:sha1:029902606396cf5ec583e187e7adc576c4aafb71</id>
<content type='text'>
</content>
</entry>
<entry>
<title>feat(widget): make the due-date display the reschedule tap target</title>
<updated>2026-07-12T10:26:56+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-07-12T10:26:56+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=e1e632c1e57c8aa0940e7ff566a1c7ab267625c8'/>
<id>urn:sha1:e1e632c1e57c8aa0940e7ff566a1c7ab267625c8</id>
<content type='text'>
</content>
</entry>
<entry>
<title>feat(widget): color overdue task titles distinctly</title>
<updated>2026-07-12T09:51:06+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-07-12T09:51:06+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=0089863559fbbcc3bc39ecac300d7f08e9b932e1'/>
<id>urn:sha1:0089863559fbbcc3bc39ecac300d7f08e9b932e1</id>
<content type='text'>
</content>
</entry>
<entry>
<title>feat(widget): add manual refresh button with loading-state icon</title>
<updated>2026-07-12T09:41:26+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-07-12T09:41:26+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=e1d93d9de7a8af3d47fefdb797ae36c7bde555aa'/>
<id>urn:sha1:e1d93d9de7a8af3d47fefdb797ae36c7bde555aa</id>
<content type='text'>
</content>
</entry>
<entry>
<title>fix(widget): pin all-day calendar events to the top instead of losing them</title>
<updated>2026-07-12T06:21:40+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-07-12T06:21:40+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=84252756c687044d73a0ea5cebf8088c7c9ed3e8'/>
<id>urn:sha1:84252756c687044d73a0ea5cebf8088c7c9ed3e8</id>
<content type='text'>
WidgetItem.isAllDay was carried by the client's data model but nothing
ever read it. All-day events had no Start at all, so they fell into the
same floating-task queue as ordinary untimed tasks; if enough tasks were
ahead of one in the queue, SlotPacker could assign it an hour slot past
the visible grid range entirely -- not merely unpinned, actually
invisible.

Server: TimelineItemToWidgetItem now populates Start for all-day
CALENDAR EVENTS specifically (their real event date), while leaving
undated doot/gtask tasks -- also flagged IsAllDay as a "no specific
time" fallback, a different concept -- on the existing nil-Start
floating behavior.

Client: all-day events are filtered out of the hourly grid/floating-task
pipeline entirely, bucketed by day using the new Start date, and
rendered in a new pinned AllDayRow section right after the TODAY/TOMORROW
headers.
</content>
</entry>
<entry>
<title>fix(widget): dedup rapid completeTask taps on the same task</title>
<updated>2026-07-12T06:09:29+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-07-12T06:09:29+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=a43cc7b8f007a86742756bd4b67f9ba1c204bbd0'/>
<id>urn:sha1:a43cc7b8f007a86742756bd4b67f9ba1c204bbd0</id>
<content type='text'>
CompleteWorker.enqueue used a plain WorkManager.enqueue(), which allows
unlimited concurrent OneTimeWorkRequests. A rapid double-tap on the same
row (plausible since the checkbox doesn't visually update until the full
async round-trip -- complete() -&gt; fetchAndPersist() -&gt; updateAll() --
finishes) could spawn two independent, unordered CompleteWorker runs for
the same task, each doing its own fetchAndPersist(); a second worker's
fetch started before the first worker's complete() call had actually
landed server-side could persist a stale snapshot after the first
worker's correct one.

Now uses enqueueUniqueWork("complete_$id", KEEP, ...) so a tap on a task
that already has a completion in flight is dropped rather than racing a
second worker. Different task ids remain independent.
</content>
</entry>
<entry>
<title>fix(widget): separate checkbox and row clickables to fix completeTask tap</title>
<updated>2026-07-06T00:03:07+00:00</updated>
<author>
<name>Claudomator Agent</name>
<email>agent@claudomator.local</email>
</author>
<published>2026-07-06T00:03:07+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=73fbd05a1230552bcef9834d3ee999ef19957693'/>
<id>urn:sha1:73fbd05a1230552bcef9834d3ee999ef19957693</id>
<content type='text'>
In Glance 1.1.0 (RemoteViews), a parent Row with .clickable() silently
overrides any nested child .clickable() — tapping the checkbox fired the
detail-open action instead of CompleteTaskAction, producing no visible
effect. Fix by splitting TaskRow into two sibling Boxes: a 24dp tap
target wrapping the checkbox icon (routes to CompleteTaskAction) and a
defaultWeight Box for the title (routes to actionStartActivity). No
nesting, so both actions are independently reachable.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>feat: show tomorrow section in widget; note web view</title>
<updated>2026-06-29T09:39:06+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-06-29T09:39:06+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=d826bf5e9561a8c66a2c52bb1c2a3835fc6de32c'/>
<id>urn:sha1:d826bf5e9561a8c66a2c52bb1c2a3835fc6de32c</id>
<content type='text'>
Widget now renders a TOMORROW block below the today grid: events with
inline time labels (slightly dimmed) and task rows. Separated by a
divider. Covers both explicit-start tomorrow items and slot-packed
fragments that overflow from today.

Web view: TODO comment to flatten the tomorrow section to match widget.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
</feed>
