My Day Dashboard
A personal start-of-day page. It leads with a few suggestions for what to work on and keeps everything with a deadline in a side column, so nothing time-bound gets lost.

What it does
- Suggests three or four projects to work on, with one highlighted. Each card shows why it was picked and the next step, and has Start session, Repo, Not today (hide for a day) and Park buttons. Start session opens a prefilled prompt on claude.ai.
- Ranks projects automatically from recent GitHub commits. There are two peaks: projects worked on in the last few days, and projects that have gone quiet for somewhere between ten days and a month. Housekeeping commits such as dependency bumps are ignored.
- Takes the next step from a NEXT.md file in the repository when there is one, or from a per-repo override, and otherwise shows the last commit message.
- Shows a "Needs you soon" list that merges bills and appointments due in the next 48 hours, car reminders, parcels out for delivery and Cloudflare errors, sorted by severity and then time.
- Also shows a daily list with progress, inbox counts, an estimated cash balance, the local weather and recent project activity. Cards for sources with nothing to report collapse into a single "all clear" line.
- Records which project a session was started on, shows it as a "Doing now" banner, and counts it as recent activity for the next day's suggestions.
- There is also an Android app with the same data, a home-screen widget and reminders.
Under the hood
- A Cloudflare Worker with static assets and a D1 database. The page and the Android app both read one JSON endpoint, so the layout logic lives in one place and the clients stay thin.
- Each source is cached in D1 with its own time to live and warmed by a cron every 20 minutes, so the page loads from the cache and one slow API cannot blank it. A failing source serves its last value and is tagged stale. A source that is not configured serves example data and the card says so.
- Sources are GitHub, Google Tasks, Calendar and Gmail, Open-Meteo for weather, and three of my other apps for money, car and Cloudflare status. Those are called with Cloudflare Access service tokens, and each exposes only a small read-only summary route.
- The ranking, the attention list and the response builder are pure functions that take the current time as an argument, so they are tested without a Workers runtime.
- Behind Cloudflare Access, with the Worker checking the token as well and refusing every request until it is configured. Plain JavaScript with no framework and no inline script or style.
- The Android app is Kotlin with Jetpack Compose, a Glance widget and WorkManager. Every 30 minutes it refreshes the cache and posts a notification for a critical item once, and for dated items once when they are within three hours. Without credentials it runs on bundled sample data.
A personal tool built around my own accounts, so it is not something others can sign in to. The screenshot uses invented content.