Tutorials
Contribute
How to propose changes, from issue to merged PR.
The product repo is public on GitHub. This page describes the practical path from idea to merged change.
Before you write code
- Check the ledger. Cross-repo proposals, ADRs, and tasks live in the
projectrepo (myco). If your change touches architecture or positioning, it probably belongs there first. - Read the rules.
AGENTS.mdin each repo is the contract — English everywhere, ports/adapters boundaries, generated files never hand-edited.
The loop
-
Fork and branch from
main. -
Install with
bun install— keeplinker = "hoisted"inbunfig.toml(see Dev environment). -
Change code, not generated files. Paraglide output,
routeTree.gen.ts, and drizzle migrations are regenerated by the toolchain. -
Verify locally:
bun run check # fmt + lint + typecheck bun run test # vitest (scope per package for speed) -
Open a PR describing what and why. Small, single-concern PRs merge fastest — plugins are single-concern by design.
Contribution conventions
- Domain logic goes in Effect services behind ports; adapters stay at the edge. New external capability? That's a new port + adapter, not a vendor import inside a plugin.
- UI comes from
@ktbhealth/ui— never copy components into apps. Missing component? It gets added in theuirepo and consumed via a git-tag dep. - Copy follows the positioning rule: the physician decides, KTB records. No diagnosis/treatment/recommendation language.
Docs changes
This site lives in the docs repo — content is MDX under content/docs/<locale>/,
organized by audience tabs. See Writing content.