<feed xmlns='http://www.w3.org/2005/Atom'>
<title>doot.git/cmd, 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:12:55+00:00</updated>
<entry>
<title>feat(widget): add recurrence lookup endpoint (GET /api/widget/recurrence)</title>
<updated>2026-07-12T11:12:55+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-07-12T11:12:55+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=6fdd09bfe030ce91ee188f18c198fd6a57c7b42f'/>
<id>urn:sha1:6fdd09bfe030ce91ee188f18c198fd6a57c7b42f</id>
<content type='text'>
</content>
</entry>
<entry>
<title>feat(widget): add POST /api/widget/add for quick-add</title>
<updated>2026-07-12T10:34:34+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-07-12T10:34:34+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=dfb06e896b92003d219979cbb1476ed16b7734a3'/>
<id>urn:sha1:dfb06e896b92003d219979cbb1476ed16b7734a3</id>
<content type='text'>
</content>
</entry>
<entry>
<title>feat: remove Todoist integration entirely</title>
<updated>2026-07-06T00:00:59+00:00</updated>
<author>
<name>Doot Agent</name>
<email>agent@doot.local</email>
</author>
<published>2026-07-06T00:00:59+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=945c34590677e161a711ccaff0e1077197b1b178'/>
<id>urn:sha1:945c34590677e161a711ccaff0e1077197b1b178</id>
<content type='text'>
Native tasks (native_tasks table) fully replace Todoist. All Todoist
API code, store functions, handlers, routes, templates, and tests have
been removed. Migration 021 drops the now-unused tasks cache table.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>feat(gateway): add publicPaths bypass for all-method service routes</title>
<updated>2026-07-05T04:44:54+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-07-05T04:44:54+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=081d06794a90ce45406ac1f12db9f843d8077327'/>
<id>urn:sha1:081d06794a90ce45406ac1f12db9f843d8077327</id>
<content type='text'>
Adds a publicPaths field to serviceMount alongside webhookPaths.
webhookPaths remains POST-only (HMAC-signed webhooks). publicPaths
bypasses session auth for all methods, relying on the upstream
service's own bearer-token auth instead.

Used to expose /claudomator/chatbot/mcp for MCP client connections
(claude-code) which carry their own Authorization header and cannot
carry a doot session cookie.
</content>
</entry>
<entry>
<title>fix: calendar/meals sync, tomorrow flat layout, /health endpoint</title>
<updated>2026-06-29T10:29:12+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-06-29T10:29:12+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=8c55b9b10fecd45ac5acf3f13fc23d342a4aa53b'/>
<id>urn:sha1:8c55b9b10fecd45ac5acf3f13fc23d342a4aa53b</id>
<content type='text'>
- Calendar: fall back to GOOGLE_CALENDAR_ID config when no source_configs
  synced yet (fixes blank calendar after fresh deploy)
- Meals: call fetchMeals in HandleTimeline so PlanToEat cache refreshes
  on every timeline load, not just during manual refresh
- Tomorrow section: replace calendar-grid with flat chronological list
  matching widget layout (time label | source bar | title)
- Add /health endpoint (no auth required) for deploy health checks

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>feat: reschedule tasks from widget bottom sheet</title>
<updated>2026-06-29T09:31:37+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-06-29T09:31:37+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=e7aee6b9d0c2be22530f7813bf677c0c8bff99e4'/>
<id>urn:sha1:e7aee6b9d0c2be22530f7813bf677c0c8bff99e4</id>
<content type='text'>
Tapping a doot task shows a date picker. On confirm, POSTs to
/api/widget/reschedule, updates due_date in native_tasks, refreshes
widget. Reschedule button only shows for source="doot" tasks.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>feat: native task management + Todoist migration</title>
<updated>2026-06-29T08:53:48+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-06-29T08:53:48+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=3fbfdd1f9441299eb146bf215449f238977deb66'/>
<id>urn:sha1:3fbfdd1f9441299eb146bf215449f238977deb66</id>
<content type='text'>
Adds doot-owned task storage (native_tasks table) so tasks can be
managed without Todoist. CompleteTask for 'doot' source just updates
the DB — no external API call, no token dependency.

Migration path:
  POST /settings/import-from-todoist  — copies Todoist cache → native_tasks
  Then remove TODOIST_TOKEN from .env to disable Todoist

Changes:
- migration 020: native_tasks table
- store: GetNativeTasks, GetNativeTasksByDateRange, GetUndatedNativeTasks,
  CreateNativeTask, CompleteNativeTask, UncompleteNativeTask,
  UpdateNativeTask, ImportFromTodoist
- timeline: native tasks appear as source="doot" (teal)
- handleAtomToggle: "doot" case — no external API needed
- HandleWidgetComplete: method on Handler, handles "doot" natively
- HandleUnifiedAdd: "doot" source creates in native_tasks
- widget: "doot" tasks are completable, teal color indicator

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>feat: add standalone task detail page for Android widget deep-links</title>
<updated>2026-06-29T07:09:43+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-06-29T07:09:43+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=dacb710fc4ea63baa05cc47016def3849b9db5fa'/>
<id>urn:sha1:dacb710fc4ea63baa05cc47016def3849b9db5fa</id>
<content type='text'>
Adds GET /task?id=xxx&amp;source=xxx route that renders a full mobile-friendly
task detail page (session-protected). Widget task rows now open this page
when tapped. HandleUpdateTask redirects back to the page after a non-HTMX
save. Android: threads serverUrl through composable chain to TaskRow.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>feat: register /api/widget routes behind WIDGET_TOKEN bearer auth</title>
<updated>2026-06-29T00:47:14+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-06-29T00:47:14+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=541941ceefd7ef267a7fb86bab4344f8561bb959'/>
<id>urn:sha1:541941ceefd7ef267a7fb86bab4344f8561bb959</id>
<content type='text'>
Add widget API routes for Android widget integration. Routes use bearer token
authentication and are placed outside session-protected groups. GET
/api/widget returns today's timeline items; POST /api/widget/complete
completes Todoist tasks. Routes only register if WIDGET_TOKEN env var is set.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>feat: add scout service mount to gateway</title>
<updated>2026-06-18T00:44:14+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-06-18T00:44:14+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=35e5cb916391e98181169d0228fc23514362988f'/>
<id>urn:sha1:35e5cb916391e98181169d0228fc23514362988f</id>
<content type='text'>
Wires scout listing feed (SCOUT_URL env var) into the service gateway
loop. Set SCOUT_URL=http://127.0.0.1:8081 to expose it at /scout/.

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