Ta-Da! is built as a set of self-contained modules that register themselves with a central registry. Each entry type, importer, exporter, and sync provider is a module — making the system extensible without touching core code.
Entry types define how an activity is recorded. Each module provides its own input UI, metadata, and optional timeline/detail components. All entry types share the same unified entries table — types define behavior, not schema.
| Module | Type | Description |
|---|---|---|
| Timeline | — | Home screen: chronological view of all entries |
| Ta-Da! Wins | tada |
Celebrate accomplishments as they happen |
| Moments | moment |
Dreams, ideas, gratitude, and reflections |
| Sessions | timed |
Timer for meditation and focused practices |
| Tally | tally |
Count-based tracking for discrete activities |
| Rhythms | — | Graceful chains that celebrate consistency |
| Module | Type | Description |
|---|---|---|
| Importers & Exporters | Various | Bring data in and get it out in multiple formats |
Every module follows the same pattern: define, register, use.
app/
types/ # Interfaces (EntryTypeDefinition, DataImporter, DataExporter, SyncProvider)
registry/ # Central registries (entry types, importers, exporters, sync providers)
modules/
entry-types/ # One directory per type (tada, timed, tally, moment, ...)
importers/ # CSV generic, Insight Timer, ...
exporters/ # JSON, CSV, Markdown, Obsidian
sync-providers/# Obsidian vault sync, ...
plugins/
modules.client.ts # Auto-imports all modules
Each module defines its metadata and calls registerEntryType() / registerImporter() / etc. on import. Zero core code changes needed to add a new module.
See MODULES.md for the step-by-step developer guide to creating new modules, and design/modularity.md for the architecture decision.
Every module serves the core philosophy:
- Count up, never down — Timers show elapsed time, not remaining time
- Identity over behavior — "You're becoming a meditator" not "You meditated 5 times"
- Graceful chains — Missing a day isn't failure; the system finds something to celebrate
- Minimize friction — One tap to start, one tap to save
- Celebration over obligation — The todo list becomes the ta-da list
Read the full philosophy: design/philosophy.md