Thanks for considering a contribution! comit is built to be forked, read, and extended. This guide gets you productive fast.
- Privacy is non-negotiable. No contribution may add a network request, telemetry, or anything that writes a user's messages to disk. See docs/PRIVACY.md.
- Keep the core pure. Nothing under
src/core/analyticsmay read the clock, the filesystem, or the network. Time is injected; I/O lives insrc/core/sourcesand the interfaces. - Zero runtime dependencies. Dev-only TypeScript tooling is fine; runtime packages need a very good reason.
git clone https://github.com/akhil29897/comit.git
cd comit
bun install # dev types only
bun test # should be green
bun run demo # see it workSee the Architecture guide. The short version:
src/core/— the pure engine (types, normalize, sources, analytics, pipeline)src/cli/— terminal interfacesrc/web/— local dashboardtest/—bun:testsuitefixtures/+scripts/— synthetic demo data and its generator
- Fork and branch:
git checkout -b feature/my-thing. - Make your change. Add or update tests.
- Keep it green:
bun test bun run typecheck - If you changed demo behavior, regenerate fixtures deterministically:
bun run scripts/generate-fixtures.ts
- Open a PR with a clear description of the why.
- A new importer (Telegram, Signal, iMessage). Implement the
DataSourceinterface — the analytics need no changes. - A new nudge rule in
src/core/analytics/nudges.ts. Add a test for it. - More locale date formats in the parser.
- Dashboard polish — a per-contact detail view, keyboard nav, accessibility.
- TypeScript,
strictmode. Prefer small pure functions. - Comment the why, not the what.
- Match the surrounding code's naming and density.
import type { DataSource, RawConversation } from "../sources/source.ts";
export class TelegramSource implements DataSource {
readonly name = "telegram-export";
constructor(private path: string, private me: string) {}
load(): RawConversation[] {
// 1. read the export (this is the only impure part)
// 2. map it to RawConversation[] with RawMessage[] (kind: "message" | "system")
// 3. return it — the pipeline handles the rest
}
}That's it. Normalization, scoring, debts, balance, trends, and nudges all come for free.
By participating you agree to uphold our Code of Conduct.