<feed xmlns='http://www.w3.org/2005/Atom'>
<title>doot.git/internal/handlers/tab_state_test.go, 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-06T00:00:59+00:00</updated>
<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>Refactor template rendering with Renderer interface for testability</title>
<updated>2026-02-04T01:15:07+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-02-04T01:15:07+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=9f35f7149d8fb790bbe8e4f0ee74f895aea1fc58'/>
<id>urn:sha1:9f35f7149d8fb790bbe8e4f0ee74f895aea1fc58</id>
<content type='text'>
Introduce a Renderer interface to abstract template rendering, enabling
tests to use MockRenderer instead of requiring real template files.

Changes:
- Add renderer.go with Renderer interface, TemplateRenderer, and MockRenderer
- Update Handler struct to use Renderer instead of *template.Template
- Update HTMLResponse() to accept Renderer interface
- Replace all h.templates.ExecuteTemplate() calls with h.renderer.Render()
- Update all tests to use MockRenderer, removing template file dependencies

This eliminates 15+ tests that previously skipped with "Templates not
available" and improves test isolation.

Co-Authored-By: Claude Opus 4.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Add Google Tasks integration (#43)</title>
<updated>2026-01-27T06:55:50+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-01-27T06:55:50+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=a3156a2f399ea03c645ee23b0099d9d722ce7e1e'/>
<id>urn:sha1:a3156a2f399ea03c645ee23b0099d9d722ce7e1e</id>
<content type='text'>
- New GoogleTasksClient for fetching and managing Google Tasks
- Tasks appear in Timeline view with yellow indicator dot
- Tap checkbox to complete/uncomplete tasks via Google API
- Shares credentials file with Google Calendar (GOOGLE_CREDENTIALS_FILE)
- Configure task list via GOOGLE_TASKS_LIST_ID env var (default: @default)
- Supports comma-separated list IDs for multiple lists

New files:
- internal/api/google_tasks.go - Google Tasks API client

Co-Authored-By: Claude Opus 4.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Fix all static analysis errors (golangci-lint)</title>
<updated>2026-01-26T06:55:58+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-01-26T06:55:58+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=f5b997bfc4c77ef262726d14b30d387eb7acd1c6'/>
<id>urn:sha1:f5b997bfc4c77ef262726d14b30d387eb7acd1c6</id>
<content type='text'>
- Fix errcheck: handle all error return values in production code
- Fix errcheck: handle all error return values in test files
- Fix staticcheck: replace deprecated WithCredentialsFile with WithAuthCredentialsFile
- Remove unused code: authHeaders, planToEatPlannerItem, planToEatResponse
- Use defer func() { _ = x.Close() }() pattern for ignored close errors

Co-Authored-By: Claude Opus 4.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Fix critical resilience issues from code review</title>
<updated>2026-01-24T01:55:48+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-01-24T01:55:48+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=54f091e1b920943967c6aebc9c1f3122ce52e267'/>
<id>urn:sha1:54f091e1b920943967c6aebc9c1f3122ce52e267</id>
<content type='text'>
- DB connection pool: Allow 5 connections instead of 1 for better concurrency
- JSON unmarshal: Add error handling to prevent nil slice issues
- Context cancellation: Check ctx.Done() in aggregateData goroutines
- Migration path: Make configurable via MIGRATION_DIR env var

Co-Authored-By: Claude Opus 4.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Add Google Calendar integration</title>
<updated>2026-01-23T01:31:50+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-01-23T01:28:06+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=e97a1bc259d3aa91956ec73a522421cdb621ae57'/>
<id>urn:sha1:e97a1bc259d3aa91956ec73a522421cdb621ae57</id>
<content type='text'>
- Add GoogleCalendarClient for fetching upcoming events
- Add GoogleCalendarAPI interface and CalendarEvent model
- Add config for GOOGLE_CREDENTIALS_FILE and GOOGLE_CALENDAR_ID
- Display events in Planning tab with date/time formatting
- Update handlers and tests to support optional calendar client

Config env vars:
- GOOGLE_CREDENTIALS_FILE: Path to service account JSON
- GOOGLE_CALENDAR_ID: Calendar ID (defaults to "primary")

Co-Authored-By: Claude Opus 4.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Remove Obsidian integration for public server deployment</title>
<updated>2026-01-20T21:17:19+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-01-20T21:17:19+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=07ba815e8517ee2d3a5fa531361bbd09bdfcbaa7'/>
<id>urn:sha1:07ba815e8517ee2d3a5fa531361bbd09bdfcbaa7</id>
<content type='text'>
Obsidian relied on local filesystem access which is incompatible with
public server deployment. This removes all Obsidian-related code including:

- API client and interface
- Store layer methods (SaveNotes, GetNotes, SearchNotes)
- Handler methods and routes
- UI tab and templates
- Configuration fields
- Related tests

Co-Authored-By: Claude Opus 4.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Fix tab state persistence with URL query parameters (Bug 002)</title>
<updated>2026-01-13T23:33:43+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-01-13T23:33:43+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=2fb1ed729fbd61d70b38a11903fb35eabb2bdca1'/>
<id>urn:sha1:2fb1ed729fbd61d70b38a11903fb35eabb2bdca1</id>
<content type='text'>
- Extract tab query param in HandleDashboard, default to "tasks"
- Wrap DashboardData with ActiveTab field for template access
- Update index.html with conditional tab-button-active class
- Add hx-push-url="?tab=..." to each tab button for URL persistence
- Update content div to load active tab from server state
- Update app.js to read currentTab from URL query parameters
- Add comprehensive tab_state_test.go test suite
- Tab selection now persists through page reloads
- All tests passing

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