A calm habit tracker focused on simplicity and privacy. Track daily/weekly/monthly habits, streaks, and milestones. Earn tokens to unlock cosmetic collectibles — all stored locally in your browser.
- Create, edit, archive, and delete habits
- Frequencies: daily, weekly, monthly
- Modes: Build (do the habit) and Break (avoid the habit)
- Weekly/monthly habits support numeric targets (e.g., 3× per week)
- Fast logging via a weekday strip (Mon–Sun) and one‑tap “done” actions
- Streaks and completion counts
- Year grid view of each habit for completion history
- Year grid view for emoji history
- Earn points from completions and consistency bonuses
- Spend them in the Collectibles Store (cosmetic only)
- Quote packs
- Accent themes
- Animations
- Unlock trophies for milestones (streaks, consistency, totals, etc.)
- Curated “emoji of the day” + emoji picker
- Emoji history view for playful journaling context
- Export / import your data as JSON (with merge/dedup summaries)
- Clear local data from Settings
- Theme: system / light / dark
- Date format: MM/DD or DD/MM
- Week start day: Sunday or Monday
- No login, no accounts
- No cloud sync
- No analytics
- Data is stored locally in your browser via a persisted Zustand store (
localStorage)
Note on storage: Ritus persists data in your browser via
localStorage. It’s private (stays on your device) but not encrypted. Use Export to keep backups.
- React 18 + TypeScript
- Vite
- Tailwind CSS
- Zustand (with
persist) - Framer Motion
- date-fns
- Lucide-react
pnpm install
pnpm run devTo serve the dev server over HTTPS with trusted local certs, use mkcert (recommended):
- Install mkcert (macOS):
brew install mkcert nssand runmkcert -install - Generate certs in the project:
mkdir -p certs
pnpm run gen:certs- Start the dev server using the host flag so the certs match the host:
pnpm run dev:hostIf cert files are missing, the dev server will fall back to Vite's built-in (untrusted) HTTPS mode and print a warning: HTTPS certs not found in ./certs — falling back to untrusted self-signed HTTPS. Run \pnpm run gen:certs` to create trusted certs.`
Build + preview production:
pnpm run build
pnpm run previewHigh-level layout:
src/App.tsx,main.tsx— app bootstrap and routingfeatures/— feature pages and page-level componentshome/— habit list, add/edit flows, quick completion actionsinsight/— stats + history viewsprofile/— progression, trophies, collectibles storeinspiration/— inspiration/quote-related UI (feature page)compass/— compass feature page
shared/store/— Zustand store + persisted state (store.ts,theme.ts, defaults)types/— canonical app typesconstants/— collectibles, trophies, progression, emoji pools, suggestionsutils/— scoring, dates, data transfer (import/export), quotes, confetticomponents/— reusable UI (header, modals, week strip, picker, etc.)theme/— accent theme logic
public/— icons, fonts, manifest, README screenshotsdev-dist/— service worker artifacts (PWA)
The app persists a partial snapshot of the Zustand store to localStorage under a single key. If you change persisted shapes, update the partialize configuration in src/shared/store/store.ts and consider adding migrations.
PRs are welcome.
- Keep changes small and focused
- Prefer adding or adjusting logic via store actions (single source of truth)
- If you touch reward rules or scoring, consider adding unit tests around the relevant utilities
- For quotes, ensure sources are public domain or properly licensed
Original work by Kyle Brooks. See LICENSE and NOTICE.









