Thank you for your interest in contributing to Ottabase! This guide will help you get started.
- Node.js ≥ 24.0.0
- pnpm ≥ 10.0.0 (install via
corepack enable pnpm) - A Cloudflare account (free tier works for development)
# 1. Fork and clone the repo
git clone https://github.com/thinkdj/ottabase.git
cd ottabase
# 2. Install dependencies
pnpm install
# 3. Build shared packages (required before running apps)
pnpm build:pkg
# 4. Start the dev server
pnpm devottabase/
├── apps/ # Application templates
├── packages/ # Shared packages (@ottabase/*)
├── docs/ # Additional documentation
└── turbo.json # Turborepo build config
See AGENTS.MD for full architecture details.
- Use the Bug Report form
- Include steps to reproduce, expected behavior, and actual behavior
- Include your environment details (OS, Node.js version, pnpm version)
- Use the Feature Request form
- Explain the use case and why existing features don't solve it
- Check existing issues to avoid duplicates
-
Fork the repo and create a branch from
main -
Make your changes — keep them focused and small
-
Add or update tests for any changed functionality
-
Update documentation (README.md, inline comments) as needed
-
Run quality checks:
pnpm lint # Lint all packages pnpm type-check # TypeScript validation pnpm --filter=@ottabase/<package> test # Run tests for your package
-
Submit a pull request using the PR template
Look for issues labeled:
good first issue— small, well-scoped tasks for newcomershelp wanted— areas where we need community help
- TypeScript only — no plain JavaScript in source code
- Prettier for formatting (run
pnpm formatbefore committing) - ESLint for linting (run
pnpm lintto check)
- Fat Models — business logic goes in OttaORM
BaseModelsubclasses, not in controllers or services - Edge-compatible — avoid Node.js-only APIs (
fs,child_process) in app and package code - Workspace protocol — use
workspace:*for internal package dependencies - Catalog dependencies — use
catalog:for shared external dependencies
- Every new package must have a
README.md - Every new package must include tests
- Use
tsupfor building (see existing packages for examples) - Export types explicitly
- Use clear, descriptive commit messages
- Reference issue numbers when applicable (e.g.,
fix: resolve RBAC cache race condition (#42))
# Build a specific package
pnpm --filter @ottabase/<package> build
# Run tests for a specific package
pnpm --filter=@ottabase/<package> test
# Type-check a specific package
pnpm --filter=@ottabase/<package> type-check- Multiple packages need it? → Add to
pnpm-workspace.yamlcatalog - Only one package needs it? → Add directly to that package's
package.json - Framework dependency in a shared package? → Add as
peerDependency
# Add to a specific package
pnpm add --filter @ottabase/<package> <dependency>
# Add to catalog (edit pnpm-workspace.yaml, then reference as catalog:)If you modify a model or schema:
- Update the schema in the appropriate file
- Export the table in
ottabase/db/schema.ts - Register the model in
worker/lib/db-utils.tsif it needs CRUD API - Test with
curl -X POST http://localhost:3004/api/ottaorm/init
This project follows the Contributor Covenant Code of Conduct. By participating, you are expected to uphold this code. Please report unacceptable behavior to the maintainers.
- Open a Discussion on GitHub
- Tag
@thinkdjfor architecture-related questions
By contributing to Ottabase, you agree that your contributions will be licensed under its MIT License.