This repo contains all the components for the cooldown app. This app aims to provide users a way to define actions that have a "cooldown" period, that notifies them when they can re-perform the action. An example would be "watering the flowers - 48 hour cooldown", it is important to note that just because the 48 hour cooldown has completed doesn't mean the user will re-attempt the action in the near future.
- Keep features simple first: implement read-only listing before mutations.
- Keep domain and presentation separate in the web app: hooks own fetching/state, components render.
- Use the Blocked UI paradigm for frontend feature composition (blocks, boundaries, and feature groups).
- Use SQLite in the API for fast local persistence and simple deployment.
- Use SQLx for database access and Axum for HTTP routing in Rust.
- Use TanStack Query + TanStack DB in the web app: Query fetches remote data, DB stores/query local collection state.
- Use Radix UI standard components for UI building blocks.
- Prefer explicit typing and helper functions over
ascasts; treat assertions as a last resort.
Blocked UI reference docs for this repo are in .codex/blocked-ui-docs/.
- Start at
.codex/blocked-ui-docs/00-index.md. - Agent-facing implementation rules are summarized in
AGENTS.md.
.
├── deploy
├── infra
├── api
├── README.md
└── web-app
Production deployment is split into:
infra/opentofu: Hetzner infrastructure as code (server, firewall, volume, SSH key)deploy: Kamal app configs for API and web services
See:
infra/opentofu/README.mddeploy/README.md