Architecture from the code
Deterministic: parsers and a type-aware index, not a model drawing boxes. Every edge links to the line that creates it.
Public beta · TypeScript
semarch maps your codebase into modules, services and infrastructure, and comments on every pull request with an interactive architecture diff: what changed, what depends on it, and how the change splits into independent parts.
Free for open source · Private repositories free during the beta
On one repository or the whole organisation. Read access to code, write access to pull request comments and checks. Nothing to configure.
semarch indexes the base and the head, recovers modules from your directories and dependencies, and computes the diff on the graph, not on lines.
A short comment says which modules changed and what they touch. One click opens the interactive diff: before, after and the delta on a layout that never jumps.
15 files changed across 4 modules · 25 new and 1 removed dependencies · 26 unchanged places depend on changed code.
| Module | Added | Removed | Changed | Impacted |
|---|---|---|---|---|
| immich › src | +5 | · | ~8 | 9 |
| @immich/sdk › src | +1 | · | ~4 | · |
| immich-web › src | · | · | ~2 | · |
| immich › controllers | · | · | ~1 | 2 |
PersonRepository, updateForWritableOwners, PersonService, update +1 · impacts 20PeopleResponseSchema, PeopleUpdateSchema, PersonUpdateStrategy, PersonUpdateStrategySchema +2 · impacts 4PersonUpdateBaseSchema, PersonUpdateSchema · impacts 2PeopleResponse, PeopleUpdate, PersonUpdateStrategyperson.service.ts0074ee7 · 29 s · “Impacted” is a dependency signal, not proof of a regression.Most code in a pull request is now written by an agent. The bottleneck is understanding what it did to the system.
Deterministic: parsers and a type-aware index, not a model drawing boxes. Every edge links to the line that creates it.
Containers, modules, files and symbols. Start at the level that matters and drill down; changed parts are always visible.
docker-compose services and environment variables connect code to the databases, queues and caches it really uses.
Signature changes and removals reach every dependent; body-only changes reach callers. A signal for reviewers, not an alarm.
A pull request that does three things is shown as three threads, so you can review them one at a time.
NestJS, Fastify, Express and Next.js routes, matched to the frontend calls that use them.
Free
Public repositories, forever.
Free during the beta
Paid plans after the beta; you will be told well before.
TypeScript and JavaScript today (NestJS, Express, Fastify, Next.js, React). More stacks follow, starting with the ones beta users ask for.
No. The repository is fetched into a temporary container for the scan and deleted with it. We keep only the architecture model: paths, symbol names, dependencies and the file:line evidence behind them. Reports expire after 90 days. See security.
Only people whose own GitHub account can read that repository. They sign in with GitHub and we ask GitHub, not a list of our own.
Contents: read; pull requests: write (one comment); checks: write; metadata: read. Nothing else.
No. The graph, the diff and the comment are computed deterministically.
No. The check run is informational; if a scan fails or hits a limit it ends as neutral with the reason.
The comment your reviewers will read first
Modules changed, dependencies added and removed, the unchanged code that depends on what changed, and the pull request split into independent changes. Edited in place on every push, never a wall of bot messages.