One site for the architecture, not a wiki about it.
Every screen is built from the last import. The numbers are the code's numbers, with the file and line that produced them.
Repos are nodes; REST, queues, sockets and shared databases are the edges. Pan, zoom, expand a node in place.
Routes with callers, models, queues, env keys, dependencies, deploy and git.
What the scan could not resolve, grouped by kind, each with a suggested answer. Your click becomes a declaration.
Each import is compared with the previous one. The dashboard shows what moved.
A connection shows the file and line on both sides and is graded by the kind of proof behind it.
Know what a pull request breaks before it merges.
The check scans the branch and its base side by side and compares every call between your repos. What stops working lands on the pull request, with the file and line of each caller.
- A route removed or its method changed while something still calls it
- A new call to a route that does not exist, with the nearest ones
- A queue that loses its publisher while consumers wait
- One CI job on GitHub Actions or Bitbucket Pipelines
Measured on 14 public systems: 127 routes moved on purpose, 165 of their 169 callers named, no false alarm.
Three steps, then it keeps itself up to date.
An architecture.yaml names the repos and how each one calls the others. Paste our prompt into your AI assistant and it writes the first draft from the code.
repos:
web_app:
sinks:
- patterns: ["api.$METHOD($URL)"]
backend:
port_env: PORTOne SSH key per workspace, or the CLI on a machine that already has the code. Routes, call sites, models, queues, env keys and git history come out of the code itself.
$ kuuhaku scan architecture.yaml routes 861 in 146 files call sites 1.383 through 5 clients match 979 exact · 471 pattern review 44 items
Unmatched calls and queues nobody consumes land in an inbox with a suggested answer. Your click becomes a declaration and survives every rescan.
POST /upload/single/* no route matched nearest /upload/single/:id suggest typo in the client · 0.81
Scan where the code lives.
The CLI runs on a laptop or in CI, reads every repository in a folder and uploads only the graph: names, paths and line numbers, and three lines around each item left for review.
- One install with npm, or npx in CI
- A folder of repositories scans them all at once
- Every connected machine listed in the workspace
- Windows, macOS and Linux · Node 18 or newer
$ npm install -g kuuhaku $ kuuhaku login --token •••••••••••• ✓ ana-laptop is connected to Acme Platform $ kuuhaku scan . --push acme: 7 git repositories, scanned as one workspace web_app link clients · 3 of 3 resolved api routes · 861 in 146 files process_events queues · 8 published, 6 consumed acme: 7 repos scanned in 38.4s edges: 19 (12 rest, 5 queue, 1 websocket, 1 shared_db) call sites: 1,383 routed 1,302 · 979 exact · 323 pattern ✓ pushed to Acme Platform · import #215
Pay for repos, not for seats.
Everyone in the company should be able to read the architecture. Prices are per workspace, per month.
For one team trying it on its own repos.
- 1 workspace · up to 5 repos
- CLI scanner, local folders
- Map, repo pages, review inbox
- Last 3 imports kept
For a company with a handful of services and apps.
- Up to 30 repos
- GitHub and Bitbucket with a read-only key
- Suggested decisions in the inbox
- Import history and diffs
- Generated pages and docs in place
For many teams, many repos, and a security review to pass.
- Unlimited repos and workspaces
- Scanner on your own machines
- SSO and read-only share links
- Export to architecture.yaml and Mermaid
- Runtime traces when they ship
Each entry in architecture.yaml. Monorepos count once.
Only three-line excerpts with the CLI: it runs where the code is and uploads only the graph, which quotes three lines around each item left for review. The hosted runner clones with your read-only key into a temporary folder, scans, keeps the graph and deletes the checkout.
Anyone you invite, on every plan. Seats are never billed.
Point it at five repos. Read the map in ten minutes.
Free for one workspace and up to 5 repos. No card.
PUT /devices/:id: that path takes PATCH now src/routes/devices.js:42src/pages/devices/edit.vue:118lib/services/devices.dart:57POST /orders/cancelon api, which serves no such routesrc/store/orders.js:88POST /orders/:id/cancelGET /devices/export