Single entry-point for understanding ARNO at the system level. Diagrams are C4-style (L1 system context, L2 containers). Drill-down into individual containers via the linked package
_index.md/INTERNALS.md.Canonical source for why each piece exists:
_index.md(master spec). This doc is the what + how-they-connect map.Last reviewed: 2026-05-24
L1 — System context
Who interacts with ARNO and which external systems it depends on.
Key constraints (from master spec §0.3):
- ARNO does not own approval / CI / hosting / build / auth — it leverages GitHub, Yjs/Liveblocks, Cloudflare, Sentry.
- Source of truth split: code+TSX in git; MD specs in git (authored in ARNO); live workflow state in Yjs (Liveblocks); MD edit live state + ops metadata in Postgres.
- All entities identified by UUID (refactor-safe).
L2 — Containers
What ships and runs separately. Each box has its own deploy unit and _index.md.
Container responsibilities
| Container | Repo path | Deploys to | Owns |
|---|---|---|---|
apps/web | apps/web/ | CF Pages (arnomake.com) | UI shell, workflow canvas, MD editor, render-adapter parent, store hooks |
apps/api | apps/api/ | CF Workers Paid (arno-api.vadimpianof.workers.dev) | REST, OAuth, GitHub App, Liveblocks auth, GDPR, URL-import API |
| Render-adapter iframe | (lives in client repo, e.g. vadimpianov/-/arno.entry.tsx) | GH Pages (vadimpianov.github.io/-/arno-bundle.js) | Real React render of project's components |
Shared packages
| Package | Purpose | Used by | Has internals doc? |
|---|---|---|---|
@arno/shared | Pure domain types + immutable mutations | web, api | Pending — see TODO |
@arno/editor | MD parser + stores (no React) | web | Pending |
@arno/render-adapter | postMessage protocol — single source of truth for iframe contract | web, render iframe (external repo) | Pending |
@arno/db | Drizzle schema + Neon HTTP driver factory | api | Pending |
@arno/git-provider | Pluggable git host abstraction; today GitHub-only | api | Pending |
@arno/url-import-extractor | URL-import pipeline stages | api | Pending |
@arno/atom-poc | Atom embedding + sanitization PoC | (poc only) | Pending |
L3 — Key flows (pointers to deep-dives)
Detailed sequence diagrams should live in each INTERNALS.md. As they're written, link them from here.
Composition propagation (killer feature)
Question: Maker edits a component spec MD — how does the change reach every screen in every project that uses that component?
- MD edit →
PUT /api/v1/md/...(inapps/api/src/md.ts(opens in a new tab)) → writes new row incomponent_md_versions, updatescomponent_md_raw.current_version. LibraryStoreon connected clients invalidates cache for that spec UUID.- Every screen referencing instances of that spec re-renders via
useSyncExternalStoresubscription. - Render-adapter iframe receives new tree → re-paints.
Deep-dive owner: packages/editor/INTERNALS.md (TBD).
URL-import pipeline
Question: small-biz Maker pastes a URL — how do components arrive in the staging area?
POST /api/v1/url-imports(apps/api/src/url-imports.ts(opens in a new tab))- Pipeline (
packages/url-import-extractor/): safe-fetch → sanitize → decompose into atoms → extract candidate components → verify (completeness matrix) → reactive vision fallback if incomplete → integrate into TSX + tokens + stories - Output staged in
staged_componenttable + Modal Volume / B2 (ADR 0016) - UI lists, edits, previews, eventually promotes to a PR (V2)
Deep-dive owner: docs/url_import_spec.md (already exists, comprehensive).
Drift detection
Question: Frontend dev modifies TSX without updating the MD spec — how does ARNO surface the mismatch?
- Push to connected repo → GH Action
arno-check.ymlruns → emits Check Run with statusdrift_detectedand details - GitHub webhook (
check_runevent) →apps/api/src/webhooks.ts(opens in a new tab) → upsertcomponent_driftrow - Liveblocks broadcast
drift_detected { componentId, mismatches, status }toproject:${id}room - Web shows banner / indicator on affected screens
Deep-dive owner: apps/api/INTERNALS.md (TBD — split: webhook handling, sync replay).
Sync (session-branch → main snapshot)
Question: Maker finishes a workflow edit — when and how does it land in git?
- Yjs document quiescent → activity-based snapshot fires (§0.3 principle 5)
apps/api/src/sync.ts(opens in a new tab) reads Yjs state via Liveblocks REST- Commits to
arno/{user-handle}session-branch via GitHub App installation token - (Phase 13) Opens / updates PR to
main - Bundle CI runs; success → drift cleared; failure → blocks merge
Deep-dive owner: apps/api/INTERNALS.md + docs/runbooks/ operational side.
TODO: INTERNALS.md coverage
Each package needs an INTERNALS.md that explains lifecycle, invariants, and non-obvious behaviour — _index.md is currently a catalog, not an explainer. Priority order (largest knowledge gap first):
apps/api— 11 source files, only ~⅓ documented in_index.md. Critical because it touches auth, webhooks, GDPR, GitHub App.packages/editor—LibraryStorestate machine andCompositionStoresubscription model deserve a walkthrough.apps/web— store topology, route tree, render-adapter parent integration.packages/url-import-extractor— pipeline stages + extension points (spec exists, code map missing).packages/db— schema reference is auto-generated; migration discipline + Neon HTTP-driver caveats are not.packages/render-adapter— protocol versioning + cross-repo update procedure.packages/shared— small; an_index.mdenhancement may be enough.packages/git-provider— small; defer until second provider added.
danger.js will continue posting warnings until INTERNALS.md exists in each package.
Related docs
_index.md— master spec (canonical, 1125 lines, deep)Rules.md— operational rules for working with this repoHANDOFF.md— live deployment state, secrets map, pending actionsImplementation_Workflow.md— phase-by-phase execution plandocs/glossary.md— domain vocabularydocs/adr/— architecture decisions (18 ADRs)docs/runbooks/— on-call playbooksdocs/api/— auto-generated API reference (TypeDoc, REST, schema)