0001 — Multi-repository topology
Status: accepted
Context
FalCAD has an open core (the app, the engines, the SDK, the docs and the toolchain manifests) and a proprietary hosted service. The blueprint suggested a monorepo inside the public core. The founder decided against a monorepo. The public/private boundary also has to be impossible to cross by accident.
Decision
Each repository holds exactly one package:
| Repository | Visibility (intended) | Package |
|---|---|---|
falcad-format |
public | @falcad/format — the .falcad specification, schemas, loader |
falcad-library |
public | @falcad/library — symbols and footprints |
falcad-kernel |
public | @falcad/kernel — connectivity, ERC, transactions, templates, capabilities |
falcad-sim |
public | @falcad/sim — analog/digital simulation |
falcad-pcb |
public | @falcad/pcb — board engine, DRC, manufacturing exports |
falcad-hdl |
public | @falcad/hdl — HDL language services, Yosys/nextpnr, waveforms |
falcad-mcu |
public | @falcad/mcu — MCU emulation, assembler, firmware toolchains |
falcad-toolchains |
public | @falcad/toolchains — manifests, detection, safe execution, license ledger |
falcad |
public | the application (web + desktop) |
falcad-cli |
public | @falcad/cli — CLI and local MCP server |
falcad-sdk |
public | @falcad/sdk — extension API, host, packaging |
falcad-extensions |
public | example extensions |
falcad-docs |
public | this site |
falcad-cloud |
private | ASP.NET Core service |
falcad-infra |
private | deployment, edge configuration, runbooks |
falcad-product |
private | pricing, roadmap, vendor notes |
During development, all repositories are private in a GitHub organization. Visibility changes only on an explicit human decision.
Packages depend on each other through versioned package references. Locally these are file: links between sibling checkouts. Nothing public references private code. The cloud consumes only generated, published contracts: the JSON Schemas and the collaboration test vectors.
Consequences
- Each repository builds and tests on its own.
- A change that touches an engine and the app needs commits in two repositories, and CI checks out siblings.
- Generated contract files carry drift checks, so a stale copy fails CI.