summaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2026-06-29feat: reschedule tasks from widget bottom sheetPeter Stone
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 <noreply@anthropic.com>
2026-06-29feat: make Todoist optional, guard nil client callsPeter Stone
TODOIST_API_KEY is no longer required — native task management works without it. Guards nil todoistClient in handleAtomToggle. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-29feat: native task management + Todoist migrationPeter Stone
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 <noreply@anthropic.com>
2026-06-29feat: native bottom sheet for widget task detailPeter Stone
Replaces browser deep-link with a transparent TaskDetailActivity that shows a Material3 ModalBottomSheet (20-40% screen height). The launcher shows through the transparent window behind the dark scrim. Sheet shows source color dot, task title, and Mark Complete button for Todoist tasks. Tapping outside or swiping down dismisses. No browser involved. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-29feat: add standalone task detail page for Android widget deep-linksPeter Stone
Adds GET /task?id=xxx&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 <noreply@anthropic.com>
2026-06-29fix: more padding, larger text, past tasks float before untimed tasksPeter Stone
2026-06-29fix: widget doubling (hourEnd), transparent bg, tomorrow items, larger textPeter Stone
2026-06-29feat: add release signing config for Android widget APKPeter Stone
2026-06-29Revert "feat: ship debug APK at /static/doot-widget.apk"Peter Stone
This reverts commit 4d332a89e503fb1568a6208d1ed5518e17131d55.
2026-06-29feat: ship debug APK at /static/doot-widget.apkPeter Stone
2026-06-29ci: add GitHub Actions workflow to build and test Android widget APKPeter Stone
2026-06-29chore: gitignore android build outputPeter Stone
2026-06-29fix: resolve Glance ColorProvider import, Box content lambdas, OkHttp Call ↵Peter Stone
import in tests
2026-06-29feat: Android widget — SlotPacker, WidgetRepository, Workers, Glance UI, ↵Peter Stone
SettingsActivity
2026-06-29feat: add WidgetItem data class and DataStore keysPeter Stone
2026-06-29chore: remove .gradle cache from trackingPeter Stone
2026-06-29chore: add Gradle wrapper and fix kotlin plugin to 2.0.0Peter Stone
2026-06-29fix: add package attribute to AndroidManifest.xmlPeter Stone
2026-06-29feat: scaffold Android widget project (Kotlin + Glance)Peter Stone
2026-06-29feat: register /api/widget routes behind WIDGET_TOKEN bearer authPeter Stone
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 <noreply@anthropic.com>
2026-06-29fix: widget handler timezone, auth guard, and type switch clarityPeter Stone
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-29feat: add widget HTTP handlers with bearer token authPeter Stone
Implements WidgetAuthMiddleware (static bearer token), TimelineItemToWidgetItem (conversion helper), HandleWidgetGet (today's items as JSON), and HandleWidgetComplete (proxies task completion to Todoist). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-29feat: add WidgetToken config + WidgetItem model for Android widget APIPeter Stone
- Add WidgetToken field to Config struct to store bearer token for /api/widget endpoint - Load WidgetToken from WIDGET_TOKEN environment variable (optional) - Create WidgetItem and WidgetResponse models for widget API responses - Widget token authentication is optional; endpoint won't authenticate if token is empty Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-20feat: add Scout nav button to gateway tab barPeter Stone
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-18fix: add cdn.jsdelivr.net to CSP style-src for scout's Tailwind CSSPeter Stone
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-18feat: add scout service mount to gatewayPeter Stone
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 <noreply@anthropic.com>
2026-06-16feat: add playground/web/server.py (missed in c86abd2)Peter Stone
Stdlib Python status page on port 9090 referenced in the service gateway commit but not included. Serves system info at / and a JSON health check at /health. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15feat: service gateway framework + playground demoPeter Stone
Formalizes doot as an authenticated reverse proxy for arbitrary upstream services. Any local HTTP service can now be registered behind doot's existing auth + SSL layer with 3 lines of config. - Rename NewClaudomatorProxy → NewServiceProxy (generic) - Replace hard-coded claudomator proxy block with serviceMount slice loop - Add PlaygroundURL config (PLAYGROUND_URL env var) - Add playground/web/server.py: stdlib Python status page on port 9090 - Document pattern in .agent/design.md; update .env.example To add a new service: set its URL env var, add a config field, append one mount entry in main.go. Claudomator's GitHub webhook bypass is expressed as webhookPaths on its mount. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-03fix: add CSRF and WebSocket origin protection to Claudomator proxyPeter Stone
Token-based CSRF is impractical for a reverse proxy whose UI doesn't know Doot's session tokens, so state-changing requests to /claudomator/* are now validated against the configured WebAuthn origin via Origin/Referer header. WebSocket upgrades reject mismatched or missing Origin headers before hijacking the connection. Both checks are no-ops when WebAuthnOrigin is unset (local dev). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-03fix: update Kilauea volcano cam YouTube stream IDs and linksPeter Stone
V1cam and V2cam embed IDs updated to current live streams. Thumbnail links now point to YouTube live pages instead of USGS static webcam pages. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-03feat: synchronize background image rotation across sessionsPeter Stone
Server seeds bg URL from a 5-minute time bucket so all open sessions show the same image simultaneously. Client-side JS rotates in sync and prefetches the next image on the same interval. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26docs: ADR-006 — add Seam 1 first partial decision (stories, in Doot)Peter Stone
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26docs: add ADR-006 Claudomator integration — seams, decisions, roadmapPeter Stone
Captures: auth gating, WS proxy, visual unification, and the Seam 1 (HTMX partials) → Seam 2 (single binary) architectural migration path. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26fix: add ws:// ProxyPass for /claudomator/api/ws; track Apache vhost in repoPeter Stone
Apache's catch-all ProxyPass / uses plain HTTP — mod_proxy_wstunnel only activates on explicit ws:// rules. Without this, the Upgrade header was dropped for Claudomator WebSocket connections. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25feat: add Claudomator stories as atom source in Doot tasks tabClaude Agent
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25feat: gate Claudomator UI behind Doot session auth via reverse proxyDoot Agent
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-23fix: support multiple enabled Google Task lists and CalendarsPeter Stone
- Update Google API interfaces with setters for list/calendar IDs - Update fetchCalendarEvents and fetchGoogleTasks to use enabled IDs from source_configs - Update timeline logic tests to reflect interface changes and seed config data - Ensure dashboard respects user-selected lists from settings
2026-03-23fix: remove orphaned HandleRefreshTab routePeter Stone
2026-03-23feat: unify Google Tasks with main system via caching and integrated UIPeter Stone
- Implement SQLite caching layer for Google Tasks - Integrate Google Tasks into unified Atoms loop (showing in Tasks tab) - Update Planning tab to include cached Google Tasks - Enhance Quick Add form with Todoist project selector - Remove orphaned HandleTasksTab/HandleRefreshTab methods - Update tests to reflect new BuildTimeline signature and data structures
2026-03-23feat: complete Agent Context API Phase 2 & 3 (Write/Create/Management)Peter Stone
- Implement write operations (complete, uncomplete, update due date, update task) - Implement create operations (create task, add shopping item) - Add Trusted Agents management UI in Settings with revocation support - Fix SQLite timestamp scanning bug for completed tasks - Add comprehensive unit tests for all new agent endpoints - Update worklog and feature documentation
2026-03-23fix: restore background image using CSS custom property on bodyPeter Stone
Replace z-index:-1 overlay div (hidden behind body background) with a CSS custom property --bg-url set inline on body, consumed by .bg-body as a layered background-image with a dark gradient overlay. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-23fix: parse Todoist local datetimes, show near-future tasks, add undated ↵Peter Stone
tasks to timeline - parseDueDate: handle date field containing "YYYY-MM-DDTHH:MM:SS" (local time, no tz offset) — Todoist REST API v1 uses this format for recurring tasks with a set time, causing due dates to silently parse as nil - IsFuture threshold: widen from tomorrow to 7 days out so tasks due this week show in the main tasks section with dates visible (not collapsed) - BuildTimeline: include undated Todoist tasks in the Today section (mirrors existing Google Tasks behavior) - GetUndatedTasks: new store method for tasks with due_date IS NULL Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-22chore: unify and centralize agent configuration in .agent/Peter Stone
2026-03-22style: modernize UI with dark glass theme and 40% bg opacityPeter Stone
2026-03-22feat: color clock based on build version hashPeter Stone
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 <noreply@anthropic.com>
2026-03-22fix: cd to repo root in deploy scriptPeter Stone
Script uses relative paths (npm, go build, rsync) so it must run from the repo root regardless of the caller's working directory. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-21chore: gitignore .claude/Peter Stone
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-21feat: Phase 1 — remove bug feature and dead codePeter Stone
- Delete Bug struct, BugToAtom, SourceBug, TypeBug, TypeNote - Remove bug store methods (SaveBug, GetBugs, ResolveBug, etc.) - Remove HandleGetBugs, HandleReportBug, bug branches in handlers - Remove bug routes, bugs.html template, bug UI from index.html - Remove AddMealToPlanner stub + interface method - Migration 018: DROP TABLE IF EXISTS bugs Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-19refactor: RF-04/08 migrate inline HTML to templates, standardize form parsingClaude Agent
RF-04: Already complete in codebase (handlers use HTMLResponse + partials). RF-08: Migrate single-required-field handlers from Pattern A/B to Pattern C (requireFormValue). Affected: HandleCompleteTask, HandleCompleteCard, HandleReportBug, HandleCreateTask in handlers.go; HandleToggleFeature, HandleCreateFeature in settings.go. Reduces 6-8 lines of boilerplate to 2. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-19test: add coverage for planning tab, meals, Google Tasks, bug handlers, ↵Agent
completed task parsing - HandleTabPlanning: happy-path test verifying tasks/cards land in correct sections (scheduled/unscheduled/upcoming); boundary test confirming a task due exactly at midnight of tomorrow lands in Upcoming, not Scheduled - HandleTabMeals: grouping test verifying two meals sharing date+mealType produce one CombinedMeal with both recipe names merged - Google Tasks GetTasksByDateRange: four boundary tests (start inclusive, end exclusive, no-due-date always included, out-of-range excluded) using redirectingTransport mock server pattern - HandleGetBugs: data assertions verifying bug list and empty-list cases - HandleReportBug: success test verifying bug is saved and bugs template is re-rendered - GetCompletedTasks: timestamp parsing test ensuring CompletedAt is not zero when inserted with a known "2006-01-02 15:04:05" string Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>