daily focus from Exist.io and Asana tasks, very customised to me
Find a file
Kate ec93ec3c21 Rework onto Asana + Exist.io; rename to Daily Focus
Tana is retired as the data source (kate-personal-task-system.md is the
migration spec, included here). Tasks now come from Asana via PAT — the
search endpoint with a My Tasks fallback for the free tier — with tiering
mirroring the morning brief (Critical = P1 notes + due <= today, Overdue,
Due-today, a separate Undated bucket, future hidden), all dated in
Europe/Amsterdam. Checkboxes complete the task in Asana with a verified
read-back; quick capture creates Asana tasks with an enumerated project
picker, due-date chips, and a P1 chip. Focus/success criteria are read
from Exist.io and editable via a new dialog on the widget header, which
acquires the attributes before writing when needed.

The Tana client, daily-note parser, and VPN-era config are gone, and the
app/package is renamed net.deprekated.tana.widget -> net.deprekated.dailyfocus
("Daily Focus"), so it installs as a separate app.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0185inixqEN2k9Nzc1y6uaJK
2026-07-12 00:43:21 +02:00
.claude Refresh at local midnight so the day rolls over promptly 2026-06-10 19:35:44 +02:00
app Rework onto Asana + Exist.io; rename to Daily Focus 2026-07-12 00:43:21 +02:00
gradle/wrapper Implement Daily Focus widget (Direction A) with Jetpack Glance 2026-06-10 15:51:38 +02:00
.gitignore Implement Daily Focus widget (Direction A) with Jetpack Glance 2026-06-10 15:51:38 +02:00
build.gradle.kts Hook up real data sources via the Tana local API 2026-06-10 16:26:41 +02:00
gradle.properties Implement Daily Focus widget (Direction A) with Jetpack Glance 2026-06-10 15:51:38 +02:00
gradlew Implement Daily Focus widget (Direction A) with Jetpack Glance 2026-06-10 15:51:38 +02:00
kate-personal-task-system.md Rework onto Asana + Exist.io; rename to Daily Focus 2026-07-12 00:43:21 +02:00
README.md Rework onto Asana + Exist.io; rename to Daily Focus 2026-07-12 00:43:21 +02:00
settings.gradle.kts Rework onto Asana + Exist.io; rename to Daily Focus 2026-07-12 00:43:21 +02:00

Daily Focus Widget

Android home-screen widget implementing Direction A · "Stack" from the Claude Design hand-off (dense/utilitarian, compact density, accent #C08BF5): today's focus, success criteria, the task list with critical/overdue tasks pinned under colored accent rails, and a single-line quick-capture bar.

Built with Jetpack Glance (androidx.glance:glance-appwidget).

Data sources (post Tana→Asana migration)

Per kate-personal-task-system.md:

  • Tasks — Asana (personal workspace, PAT). Fetched via the task-search endpoint, falling back to the My Tasks list on the free tier. Tiering mirrors the morning brief: Critical (P1 in notes + due ≤ today), Overdue, Due-today, Undated (own bucket below), future-dated hidden. All "today" math is Europe/Amsterdam. Checking a box completes the task in Asana (verified read-back); recurring tasks respawn natively.
  • Focus / Success criteria — Exist.io (focus and success_criteria string attributes, date-keyed). Tapping the header opens an editor that writes today's values back (acquiring the attributes for this client first if needed).
  • Quick capture creates an Asana task assigned to Kate, in the picked project (enumerated live; defaults to Personal), with optional due date and a P1 chip that stamps Priority: P1 into the notes.

Setup: open the app and paste an Asana personal access token and an Exist.io token, then Save & sync.

Layout

  • app/src/main/java/.../glance/DailyFocusWidget.kt — the widget UI, receiver, and checkbox action. Design tokens (colors, spacing) at the top.
  • app/src/main/java/.../data/AsanaApi / ExistApi clients, Tiering (pure bucketing logic, unit-tested), FocusRepository (cache + refresh + actions), MidnightRefresh (Amsterdam-midnight rollover alarm).
  • app/src/main/java/.../CaptureActivity.kt — quick-capture dialog (widget bar, QS tile); FocusEditActivity.kt — focus/success editor; MainActivity.kt — capture + connection settings.
  • app/src/main/res/drawable/ — glass surface, pinned-row backgrounds with baked-in accent rails, project pill, capture bar, checkbox states, icons.

Known fidelity gaps vs. the prototype

  • No backdrop blur — RemoteViews can't blur the wallpaper, so the frosted glass is approximated with a 52% translucent #12101A surface.
  • System fonts — the prototype's Hanken Grotesk / JetBrains Mono are approximated with the system sans-serif and monospace families (custom fonts aren't supported in Glance text).
  • Letter-spacing on the uppercase section labels isn't supported by Glance.

Build

./gradlew :app:assembleDebug
adb install app/build/outputs/apk/debug/app-debug.apk

Then long-press the home screen → Widgets → Daily Focus.

The 2026-07 Asana rework renamed the applicationId from net.deprekated.tana.widget to net.deprekated.dailyfocus, so it installs as a new app — the old Tana widget/app can be removed and the widget re-added once.