Thanks for your interest in contributing to Ta-Da! This guide covers what you need to get started.
- Bun v1.3+ (install) -- used as package manager and runtime
- Git
- VS Code with Dev Containers extension (recommended, not required)
git clone https://github.com/InfantLab/tada.git
cd tada/app
bun install
bun run devThe app runs at http://localhost:3000.
Alternatively, open the repo in VS Code and use the Dev Container (recommended) -- it handles all setup automatically. See docs/DEVELOPER_GUIDE.md for Docker and other setup options.
tada/
├── app/ # Nuxt 3 application
│ ├── pages/ # File-based routing (Vue components)
│ ├── components/ # Reusable Vue components
│ ├── composables/ # Shared logic (useTimer, useVoiceCapture, etc.)
│ ├── server/api/ # REST API endpoints (Nitro)
│ ├── server/db/ # Drizzle ORM schema & migrations
│ └── utils/ # Client utilities
├── design/ # Design documents (SDR, philosophy, ontology)
├── docs/ # Developer & deployment documentation
└── specs/ # Feature specifications
For full details see docs/PROJECT_STRUCTURE.md.
- Check existing issues or create one to discuss your change
- Create a branch from
main:feature/descriptionfor human-authored workcopilot/descriptionfor AI-assisted changes
- Make your changes with tests
- Run checks before committing:
cd app bun run lint:fix bun run typecheck bun run test --run
- Push and open a PR -- CI runs lint, typecheck, tests, and build automatically
- Get a review and merge (squash merge preferred)
The project uses ESLint (configured in the repo) and TypeScript strict mode. Key conventions:
- Double quotes, semicolons required
- Never use
any-- useunknownwith type guards - Vue 3 Composition API with
<script setup>syntax - Tailwind CSS for styling
- File naming: pages in
kebab-case.vue, components inPascalCase.vue, composables asuseFeatureName.ts - Typed
$fetch: always use$fetch<Type>("/api/...")to avoid CI failures - Logging: use
createLogger(), notconsole.log
Run bun run lint:fix to auto-fix most style issues.
Tests use Vitest and are co-located with source files (*.test.ts).
cd app
bun run test --run # Run all tests (non-interactive)
bun run test:ui # Visual test UI
bun run test:coverage # Coverage reportGuidelines:
- Co-locate tests next to the code they test
- Aim for 80%+ coverage on new code
- Test behavior, not implementation details
See app/tests/README.md for examples and patterns.
Use conventional commits:
feat: add emoji picker component
fix: correct timer countdown calculation
docs: update deployment guide
refactor: extract category logic to utils
test: add unit tests for streak calculation
chore: upgrade Nuxt to 3.21
Prefix types: feat, fix, docs, refactor, test, chore.
If you modify app/server/db/schema.ts:
cd app
bun run db:generate # Generate migration SQL
bun run db:migrate # Apply migration locallyAlways commit both the schema change and the generated migration files.
- Lint passes (
bun run lint) - TypeScript compiles (
bun run typecheck) - Tests pass (
bun run test --run) - New code has tests
- Docs updated if behavior changed
- One feature or fix per PR
- Developer Guide -- full setup, architecture, and common tasks
- Design Philosophy -- vision and principles
- Entry Ontology -- the unified Entry model
- Agent Instructions -- AI-assisted development conventions
Questions? Open an issue on GitHub.