Thanks for taking the time to contribute! Every contribution—whether it's code, documentation, bug reports, or feedback—is appreciated.
This document matches the monorepo layout and what CI runs on pull requests.
Every contribution, no matter how small, helps improve the project.
Some great first contributions include:
- Fixing bugs
- Improving documentation
- Writing tests
- Improving accessibility
- Improving developer experience
- Reviewing documentation
Browse good first issues and help wanted on GitHub. Retention and ingest edge cases in PRODUCTION-READINESS.md are also good entry points.
Comment on an issue before opening a PR if you want to confirm scope.
- Node.js 18+ supported; 20+ recommended.
- pnpm 9 (see
package.json/ CI). - PostgreSQL 16 for local development and for API integration tests.
Install → run API & dashboard → verify → build → lint → tests
pnpm install
docker compose up -d
cp apps/api/.env.example apps/api/.env
cp apps/dashboard/.env.example apps/dashboard/.env
pnpm db:migrateIn two terminals:
pnpm dev:api # http://localhost:3001
pnpm dev:dashboard # http://localhost:3000Open http://localhost:3000 and confirm the dashboard loads (register or sign in if you want to click through the full flow).
Before opening a PR, run:
pnpm build
pnpm lint
pnpm testDefault tests run Vitest smoke/unit suites. For database-backed API integration tests (same as CI):
export RUN_DB_INTEGRATION_TESTS=true
pnpm --filter api testapps/
api/ # Fastify API, Prisma schema and migrations
dashboard/ # Next.js dashboard
packages/
telemetry-core/
telemetry-next/
telemetry-node/
telemetry-react-native/
SDKs are published as @telemetry-tracker/* on npm:
| Package | npm name |
|---|---|
packages/telemetry-core |
@telemetry-tracker/core |
packages/telemetry-next |
@telemetry-tracker/next |
packages/telemetry-node |
@telemetry-tracker/node |
packages/telemetry-react-native |
@telemetry-tracker/react-native |
packages/telemetry-vite-plugin |
@telemetry-tracker/vite-plugin |
Publish (maintainers): create the @telemetry-tracker npm org, npm login, then pnpm publish:packages. After the first publish under the new scope, deprecate the legacy @tacko/telemetry-* packages with a message pointing to @telemetry-tracker/*.
Design and entitlement rules are summarized in docs/ENTITLEMENTS.md; architecture in docs/ARCHITECTURE.md; deployment in DEPLOYMENT.md and docs/RAILWAY.md; RBAC in docs/RBAC.md.
Create migrations from apps/api context after schema changes:
pnpm db:migrateUse descriptive migration names. For production, only prisma migrate deploy is used (see DEPLOYMENT.md).
- Open PRs against
develop(integration branch; GitHub default). Releases promotedevelop→mainwhen a milestone is complete — see docs/RELEASE.md. - Prefer focused changes: one concern per PR when possible.
- Describe what changed and why in the PR body (reproduce steps for bugs).
- If you are unsure about product or security behavior (auth, ingest, billing), open an issue first.
User-facing changes must add a line under [Unreleased] in CHANGELOG.md:
- Added / Changed / Fixed / Security / Breaking / Database (if migrations or env vars)
- Skip for internal refactors, test-only, or comment-only changes
Maintainers rename [Unreleased] to a version when cutting a release, then publish a GitHub Release from docs/RELEASE_NOTES_TEMPLATE.md (see docs/RELEASE.md).
Use one branch per pull request. Base branch: develop.
Use lowercase kebab-case with a type prefix:
feature/add-slack-webhook
fix/session-memory-leak
docs/readme-improvements
Common prefixes: feature/, fix/, docs/, test/, chore/. Keep names short and descriptive.
Use the imperative mood.
Good examples:
Fix session filtering
Improve SDK docs
Add webhook retry logic
Before opening a PR, run locally:
pnpm lint
pnpm test
pnpm buildUse Postgres and RUN_DB_INTEGRATION_TESTS=true when you change API behavior covered by integration tests.
When you open the PR, confirm:
- Tests pass
- Lint passes
- Build succeeds
- Documentation updated (if needed)
- CHANGELOG.md updated under
[Unreleased](if user-facing) - New code follows the existing style
- No breaking changes (or called out clearly in the PR description)
CI runs on pull requests to develop and main (see .github/workflows/ci.yml).
Temporarily paused: the
bugbot-reviewrequired check is a no-op success (BUGBOT_REVIEW_ENABLED=false). It does not wait for Cursor Bugbot. To re-enable: set that env to"true"in the workflow, merge, and (if paused) turn the Cursor Bugbot GitHub App back on for this repo in the Cursor Bugbot dashboard. Leavebugbot-reviewin branch protection — the check still runs and passes.
This repo uses Cursor Bugbot on GitHub pull requests (when the app is enabled). Project-specific review rules live in:
| File | Scope |
|---|---|
.cursor/BUGBOT.md |
Repo-wide security, notifications, migrations |
apps/api/.cursor/BUGBOT.md |
Ingest, plan limits, alerts API |
apps/dashboard/.cursor/BUGBOT.md |
Next.js server/client split, UI |
packages/.cursor/BUGBOT.md |
SDK semver and public API |
Before you push (especially for alerts, notifications, billing, or ingest): /review-bugbot in Cursor is optional while the gate is paused; still useful for high-risk diffs.
On GitHub: when Bugbot is enabled again, comment cursor review or bugbot run on a PR to trigger a manual review. When Bugbot is wrong, resolve the thread and add an ignore rule to the relevant BUGBOT.md (or comment @cursor remember … on the PR for learned rules).
Branch protection (maintainers): On develop, require status checks build, bugbot-review, and maintainer-review (not Cursor Bugbot directly). On main, require build and maintainer-review (bugbot-review is optional). While paused, bugbot-review always succeeds. Set required human approvals to 0 on both branches — maintainer-review enforces your approval when someone else opens a PR.
Participation is governed by the Contributor Covenant. Please read it before contributing.
Do not open public issues for undisclosed vulnerabilities. See SECURITY.md.
Contributions are licensed under the project’s MIT License. Using the Telemetry Tracker name or branding for a public hosted offering is governed separately — see TRADEMARK.md.