<feed xmlns='http://www.w3.org/2005/Atom'>
<title>doot.git/web/static/js, 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-09-07T07:07:32+00:00</updated>
<entry>
<title>Split timeline width across lanes instead of stacking overlapping events</title>
<updated>2026-09-07T07:07:32+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-09-07T07:07:32+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=86f1486b77cb345f3cfdacecbc676692cd0d89f7'/>
<id>urn:sha1:86f1486b77cb345f3cfdacecbc676692cd0d89f7</id>
<content type='text'>
The CSS gives every .calendar-event `left: 8px; right: 8px`, and the
positioning code only ever overrode `left` (by 16px per column). So two
events occupying the same slot both stayed full-width to the right edge
and the later one simply covered the earlier one, leaving a 16px sliver.
The column assignment was computing a correct answer that the layout then
threw away.

Reported as two yard-work chores rendering on top of each other. They sit
at byte-identical timestamps because a bucket cycle stamps every item it
activates with the same due_date, which makes this the maximally-bad case
(identical top and height, so the overlap is total).

Events now split the available width across the number of lanes in their
overlap cluster, and a lone event keeps the full-width behaviour it had.

Co-Authored-By: Claude Sonnet 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_018AwnALZL6bD4VBtATDVv3B
</content>
</entry>
<entry>
<title>Fix swipe-nav false positives on scroll, shopping quick-add overflow</title>
<updated>2026-08-30T20:46:36+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-08-30T20:46:36+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=a17a15966be5db6de423cdcb7c427195102b99d8'/>
<id>urn:sha1:a17a15966be5db6de423cdcb7c427195102b99d8</id>
<content type='text'>
Swipe-to-change-tab only ever compared horizontal touch delta against
a 50px threshold, with no check against vertical movement -- an
ordinary scroll through a long tab (the shopping list, in particular)
drifts that far horizontally from natural thumb motion alone, and was
getting misread as an intentional swipe. Since timeline sits right
before shopping in TAB_ORDER, that's specifically what a rightward
drift landed on: "shopping randomly jumps back to timeline." Now
requires the horizontal delta to be at least 2x the vertical delta
before treating it as a swipe instead of a scroll.

Also fixed the shopping tab's inline quick-add row: the store &lt;select&gt;
had no width cap, so a long store name could claim enough width to
push the Add button past the right edge of the screen -- not just
cramped, actually unreachable. Capped the select's width and let the
name input actually shrink (needs min-w-0 alongside flex-1, since flex
items don't shrink below their content size by default), with
flex-wrap as a backstop for anything that still doesn't fit.

Co-Authored-By: Claude Sonnet 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_018AwnALZL6bD4VBtATDVv3B
</content>
</entry>
<entry>
<title>Remove confirmed-orphaned routes, handlers, and templates</title>
<updated>2026-08-24T06:20:52+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-08-24T06:20:52+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=5c659d9046add8c77bd7699961a910505dcb4bc2'/>
<id>urn:sha1:5c659d9046add8c77bd7699961a910505dcb4bc2</id>
<content type='text'>
From the sitemap audit: /tabs/meals (same dead-tab pattern as the
removed /tabs/conditions, only reachable via ?tab=meals with no nav
button), /partials/lists (superseded by inline .Lists rendering in
trello-board.html), /shopping/toggle and /shopping/mode/{store}/toggle
(superseded by the one-way complete/filter model), plus the orphaned
trello-boards.html and error-banner.html templates that nothing
rendered or included. Rewrote the meals grouping test to exercise
groupMeals() directly since that logic is still live via the timeline.

Co-Authored-By: Claude Sonnet 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_017GMEkHeqKz6FLkmizowBTK
</content>
</entry>
<entry>
<title>feat: color clock based on build version hash</title>
<updated>2026-03-22T09:43:36+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-03-22T09:43:36+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=77f4aa8d1f818169490a35bf2ec3eb43e60166b4'/>
<id>urn:sha1:77f4aa8d1f818169490a35bf2ec3eb43e60166b4</id>
<content type='text'>
Embeds the build version as a data attribute on #last-updated and
derives an HSL hue from the first 6 hex chars, matching the
claudomator logo color technique.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Fix missing settings button, disappeared events, and tab refresh bug</title>
<updated>2026-02-07T00:53:47+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-02-07T00:53:47+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=27ee1a271248e9f1de8ecb981a6cabfa8e498b1b'/>
<id>urn:sha1:27ee1a271248e9f1de8ecb981a6cabfa8e498b1b</id>
<content type='text'>
- Add settings gear icon link to dashboard header
- Fix GetTasksByDateRange/GetCardsByDateRange to include overdue items
  (changed from BETWEEN to &lt;= end, filter completed tasks)
- Fix refresh replacing active tab with tasks tab by using
  htmx.trigger(body, 'refresh-tasks') instead of innerHTML+htmx.process
- Add refresh-tasks hx-trigger to meals, shopping, conditions tabs
- Add tests for overdue inclusion/exclusion, settings link, template data

Co-Authored-By: Claude Opus 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Improve session handling, shopping UI, and cleanup</title>
<updated>2026-02-05T20:43:19+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-02-05T20:43:19+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=1eab4d59454fa5999675d51b99e77ac6580aba95'/>
<id>urn:sha1:1eab4d59454fa5999675d51b99e77ac6580aba95</id>
<content type='text'>
Session improvements:
- Extend session lifetime to 7 days for mobile convenience
- Add idle timeout to extend session on activity
- Use standard cookie name for better compatibility

Shopping model:
- Add FlattenItemsForStore helper for extracting store items
- Add StoreNames helper for store list
- Improve shopping-tab.html with inline add forms

Frontend:
- Add WebSocket reconnection and agent approval UI to app.js
- Simplify timeline calendar JS (move event positioning to CSS)
- Update login page styling

Deployment:
- Remove unused git checkout step from deploy.sh
- Update apache.conf WebSocket proxy settings

Documentation:
- Add Agent Context API feature spec to issues/

Co-Authored-By: Claude Opus 4.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Improve timeline view with dynamic bounds, now line, and overlap handling</title>
<updated>2026-02-01T20:52:28+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-02-01T20:52:28+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=1c6552117038cb7c01e016dbf1ac062e1d9f9c73'/>
<id>urn:sha1:1c6552117038cb7c01e016dbf1ac062e1d9f9c73</id>
<content type='text'>
- Add dynamic calendar clipping: show 1 hour before/after events instead of hardcoded 6am-10pm
- Add "NOW" line indicator showing current time position
- Improve time label readability with larger font and better contrast
- Add overlap detection with column-based indentation for concurrent events
- Apply calendar view to Tomorrow section (matching Today's layout)
- Fix auto-refresh switching to tasks tab (default was 'tasks' instead of 'timeline')

Co-Authored-By: Claude Opus 4.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Add Agent Context API for external agent integration</title>
<updated>2026-01-29T08:19:28+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-01-29T08:19:28+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=05b1930e04ac222d73ffb2f45c1b1febb69f893d'/>
<id>urn:sha1:05b1930e04ac222d73ffb2f45c1b1febb69f893d</id>
<content type='text'>
Phase 1: Authentication and read-only context
- POST /agent/auth/request - request access with name + agent_id
- GET /agent/auth/poll - poll for approval status
- POST /agent/auth/approve|deny - user approval (browser auth required)
- GET /agent/context - 7-day timeline context (agent session required)

Phase 1.5: Browser-only agent endpoints (HTML pages)
- GET /agent/web/request - request page with token
- GET /agent/web/status - status page with polling
- GET /agent/web/context - context page with timeline data

WebSocket notifications:
- GET /ws/notifications - push agent requests to browsers
- Approval modal with trust indicators and countdown timer

Database:
- agents table for registered agent tracking
- agent_sessions table for pending/active sessions

Co-Authored-By: Claude Opus 4.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Fix UI bugs #44, #45, #46</title>
<updated>2026-01-26T03:11:00+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-01-26T03:11:00+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=6518a7ed5ee8800741351166a724da53cb2f271e'/>
<id>urn:sha1:6518a7ed5ee8800741351166a724da53cb2f271e</id>
<content type='text'>
- #44: Replace oversized SVG arrow with simple ▾ character for Details dropdown
- #45: Change Conditions from external link to normal tab button (fixes back button)
- #46: Use dark medium-opacity background (black/50%) for atoms instead of white/5%

Co-Authored-By: Claude Opus 4.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Implement architectural refactors for feature requests #28, #30, #31, #33-38</title>
<updated>2026-01-26T03:09:41+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-01-26T03:05:49+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=dedda31d064ddcb4f857f2db851c5a8c1e19deba'/>
<id>urn:sha1:dedda31d064ddcb4f857f2db851c5a8c1e19deba</id>
<content type='text'>
Phase 1: Bugs as First-Class Atoms (#28)
- Add resolved_at column to bugs table (migration 007)
- Add GetUnresolvedBugs(), ResolveBug(), UnresolveBug() store methods
- Include bugs in Tasks tab via BugToAtom() with completion toggle
- Add unit tests for bug resolution

Phase 2: Timeline as Default + Enhancements (#35, #37)
- Change default tab from tasks to timeline
- Add IsCompleted, DaySection, Source fields to TimelineItem
- Group timeline items by today/tomorrow/later sections
- Add completion checkboxes for tasks/cards, grey completed items
- Collapse tomorrow/later sections by default

Phase 3: Shopping Quick-Add (#33)
- Add user_shopping_items table (migration 008)
- Add SaveUserShoppingItem(), GetUserShoppingItems(), ToggleUserShoppingItem()
- Add HandleShoppingQuickAdd() and HandleShoppingToggle() handlers
- Add quick-add form to shopping tab

Phase 4: Mobile Swipe Navigation (#38)
- Add touch event handlers for swipe left/right tab switching
- 50px threshold triggers tab change

Phase 5: Consistent Background Opacity (#30)
- Add CSS variables for panel/card/input/modal backgrounds
- Update templates to use consistent opacity classes

Phase 6: Tab Reorganization (#37)
- Reorganize tabs: Timeline, Shopping, Conditions as main tabs
- Move Tasks, Planning, Meals under Details dropdown

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