Docs

Radical.Tools, explained

One model of your architecture; every diagram, table and wiki page derived from it. This guide walks through modelling, the six view kinds, milestones, presentations, files, the metamodel editor, the Concept Hub and the AI assistant.

Screenshots follow the theme you pick in the top bar — toggle it to see the other look.

Getting started

Radical.Tools runs in the browser at studio.radical.tools — no account, nothing uploaded — or as a desktop app (see local install). On first launch you land on the Welcome screen:

  • New model — pick the metamodel first: C4, C4 + DDD (adds Domains) or C4 + DDD + Governance (adds ADRs, fitness functions, requirements and blueprints). You can change it later in the metamodel editor.
  • Open file — a .radical / .json model from disk.
  • Load the sample — the Fintech Banking Platform used throughout this guide: 62 elements — architecture, ADRs and fitness functions, EARS requirements, Gherkin scenarios and 13 UI mockups with wireframes in three screen flows — 15 views of every kind, four sequences, four milestones and a ready-made presentation.
  • Recent — models you already have in this browser.
Welcome screen: New model with metamodel picker, Open file, Load sample, recent models Welcome screen: New model with metamodel picker, Open file, Load sample, recent models
The Welcome screen. Loading the sample is the fastest way to see every feature in this guide.
Tip: a deep link such as studio.radical.tools/#/m/designer/v/canvas skips the Welcome screen and opens the last active model directly. See Deep links.

The workspace

Designer perspective: element palette and views on the left, canvas in the centre, model tree on the right, toolbar on top Designer perspective: element palette and views on the left, canvas in the centre, model tree on the right, toolbar on top
Designer perspective with the System Context view of the sample model active.

Toolbar

  • Radical menu (logo, top-left) — Manage models…, Import from Hub…, Metamodel editor…, light/dark theme, Smart Fit, the connect key, AI providers… and export (PNG, SVG, copy to clipboard).
  • Fit All, zoom out / in, Smart Layout (or Tree Layout when the view asks for it), Undo / Redo.
  • Quick Search (⌘/Ctrl+P) — find any element, relation or view; doubles as the AI prompt.
  • Perspective switch — Designer edits, Viewer explores read-only, Presenter builds and plays slide decks.

Left panel

Three collapsible sections: Elements (the palette — drag onto the canvas), Views (one card per view, with node count and kind) and Milestones. In Viewer and Presenter the palette disappears and Views takes the top.

Canvas

The chip in the top-left corner names the active view (Structure: System Context) or, when time-travelling, the active milestone. Nodes can be dragged, nested, collapsed and connected here; the other view kinds replace the canvas with their own surface.

Right panel

Nodes is the model tree — every element, whether or not the current view shows it; the eye icon toggles visibility in the active view and dimmed rows are outside it. Relations and Sequences follow. Selecting anything slides the panel to its properties.

Models & files

A model is a document. Open Radical menu → Manage models… to see them grouped by where they live:

  • Local storage — kept in this browser. Create with + New local model (choose the metamodel), rename, delete, or convert with Save as file… / Save as folder….
  • Files — a single .radical JSON file on disk (desktop app).
  • Folders — a Markdown folder: one .md per element with YAML front-matter, nested directories for containment, JSON sidecars for layout, views and relations. Diff-friendly and readable without the app. Works in the desktop app and, in Chromium browsers, via the File System Access API (you may be asked to Reconnect a folder after a reload).

Every change is autosaved (a few hundred milliseconds after you stop editing) to wherever the document lives. Import Structurizr DSL… converts a .dsl workspace into a new local model.

Models dialog listing local, file and folder backed models with Rename, Save as file, Save as folder and Delete actions Models dialog listing local, file and folder backed models with Rename, Save as file, Save as folder and Delete actions
The Models dialog. The badge on each row tells you where the model is stored.
Desktop: launch with radical --file path/to/model.radical (or the RADICAL_FILE environment variable) and the app reloads whenever that file changes on disk — handy next to a text editor or a Git checkout.

Elements

  1. Drag from the palette onto the canvas. Drop it on top of a container-type node (a system, domain, group…) to make it a child — the parent highlights while you hover.
  2. Double-click an empty spot on the canvas to create a Software System right there.
  3. Import from the Hub — see Concept Hub.

The metamodel decides what is allowed. Dropping a Component directly on the canvas, a Person inside a System, or a fourth element of a type limited to three is refused with a message rather than silently drawn — so the model stays valid.

Containment

Change a parent any time with the Parent field in properties, or by dragging the node into another container. Collapse a container with the toggle in its header or in the model tree; children fold away and relations re-attach to the parent. In a named view, collapsing is per view — the same system can be open in one view and folded in another.

Visibility per view

Elements exist once in the model and appear in as many views as you like. Use the eye icon in the model tree (or Hide from view in the selection bar) to add or remove an element from the active view. Ancestors of a visible element are included automatically.

Relations

  1. Hold the connect key — Alt by default; change it under Radical menu → Connect key.
  2. Press on the source node, drag to the target, release. A preview line follows the pointer; Esc cancels.

The relation type is inferred from the metamodel (e.g. Interacts between C4 elements, Constrains from an ADR). Pairs the metamodel does not allow are refused. Select an edge to edit its label, technology and relation type in the right panel; the edge action bar under it lets you re-route the source or the target, hide the relation from the active view, or delete it.

Properties & governance

A container selected on the canvas; the right panel shows its type badge, label, description, technology, external flag and parent A container selected on the canvas; the right panel shows its type badge, label, description, technology, external flag and parent
Properties of a Container. Fields come from the metamodel, so custom types get their own forms.

Every element has a label, description and parent; C4 runtime elements add technology and an external flag. Everything else is defined by the metamodel: text, long text, number, boolean and enum fields, optionally shown only when another field has a given value.

Requirements (EARS)

A Requirement is edited as a sentence. Pick the EARS pattern — ubiquitous, event-driven (When …), state-driven (While …), unwanted behaviour (If …, then …), optional (Where …) or complex — and click the highlighted slots to fill trigger, condition and action. Or just type the whole thing into the quick-entry box:

When the user clicks save, the system shall persist the document

…and it is parsed into type, trigger and action. The subject (“the system”) is taken from the element the requirement constrains, when there is one. Status and priority (MoSCoW) are enums.

ADRs and fitness functions

ADRs carry status (proposed → accepted → deprecated / superseded), date, context, decision, consequences and alternatives. Fitness functions carry category, trigger (on deploy / continuous / periodic), an automated flag, threshold and status. Both are ordinary elements: link them with Constrains, Supersedes, Implements, Satisfies, Derives and Traces-to relations to the parts of the architecture they govern, and they show up in the Table, Matrix and Wiki views like anything else.

Wizards

Creating an ADR, fitness function, requirement, scenario or mockup — dropped on the canvas or a table, or added from a wiki page — opens a wizard that walks through its fields one step at a time, with a prompt for each, and ends with the relations that give it meaning (which elements an ADR constrains, which earlier ADR it supersedes…). The element is only created when you press Create (⌘/Ctrl+Enter from any step); Esc discards it. Fill in with wizard… in the properties panel reopens it for an existing element, and Wizard on create in the app menu turns the automatic wizard off. Wizards are part of the metamodel (wizard on a node type), so custom metamodels can define their own.

Mockups & screen flows

The Shopper journey screen flow from the E-commerce blueprint: mockups with low-fi wireframes linked by labelled navigates-to relations; the right panel shows the selected Checkout mockup with its wireframe The Shopper journey screen flow from the E-commerce blueprint: mockups with low-fi wireframes linked by labelled navigates-to relations; the right panel shows the selected Checkout mockup with its wireframe
A screen flow: each mockup carries a low-fi wireframe, and Navigates to relations are labelled with the action that moves the user on.

A Mockup (palette group UX) is one screen of the product. Beside label and description it has a Screen / route and an optional Design link to an external design (Figma, Penpot, …). Link it to the rest of the model with three relations:

  • Illustrates — mockup → the requirements and scenarios the screen shows.
  • Presented by — mockup → the web app or container that renders it.
  • Navigates to — mockup → mockup, labelled with the triggering action (Pay, Add to cart). Chains of these are screen flows.

Wireframes

The Wireframe section of a mockup's properties (and of its Wiki page) shows a low-fi wireframe. With AI enabled, Generate wireframe drafts one from the model around the screen: its description and route, the EARS requirements and Gherkin scenarios it illustrates, the container that presents it and the screens it navigates to. Regenerate and Remove do what they say; Open design follows the design link. Wireframes appear as thumbnails on the canvas and on Wiki overview cards.

A wireframe is plain SVG stored on the element. Scripts, event handlers and external references are stripped, and it is only ever displayed as an image, so it can never run code or load anything.

Screen flows

Group the mockups of one actor's journey in a Group (“Shopper journey”) and link the steps with Navigates to, including branches and returns (Payment → Payment declined → try again). Record the steps as a sequence to replay the flow screen by screen in a Flow view or in Presenter.

Working with selections

Click selects one element; Shift, ⌘/Ctrl or Alt-click adds more. With several nodes selected the selection bar appears above the canvas:

  • Wrap into… — create a new container of an allowed type around the selection.
  • Move to… — re-parent the selection into another container.
  • Unwrap — remove a container but keep its children and their relations.
  • Hide from view — take the elements out of the active view without touching the model.
  • Delete — remove from the model (with children); Delete does the same. Everything is undoable with ⌘/Ctrl+Z.

Views

A view is a named, saved reading of the model: which elements it shows, how they are laid out, where the camera was, and how it renders them. Nothing in a view changes the model; deleting a view deletes no elements.

Views section open in the left panel listing Structure, Flow, Hierarchy, Matrix, Table and Wiki views of the sample model Views section open in the left panel listing Structure, Flow, Hierarchy, Matrix, Table and Wiki views of the sample model
Every view card shows its node count and kind. Structure view at the top is the unnamed default that always shows the whole model.
  • Create with + New view in the left panel; it starts with the elements currently on screen.
  • Open properties (the pencil on the active card) to rename it, change its kind, pick a layout mode (Auto or Tree), link a sequence for Flow views, or tune the treemap.
  • Positions, camera and collapse state are per view. Arrange a container map one way and a context diagram another — switching back restores each exactly.
  • Hidden relations — a relation can be hidden in one view (edge action bar) while staying in the model and in every other view.
KindWhat it showsBest for
StructureNode-and-link diagram with nestingSystem context, container and component maps
FlowNumbered steps of a sequence between participantsRuntime scenarios, “what happens when…”
HierarchyDrillable treemap of containmentPortfolio overviews, size and ownership
TableEditable spreadsheet with governance tabsBulk editing, ADR and requirement registers
MatrixDependency structure matrixCoupling, cycles, who-depends-on-whom
WikiOne document page per elementReading, reviewing, editing prose

Structure views

The classic diagram. Relations between elements hidden inside a collapsed container are drawn to the container instead, so a system-level view stays readable while the detail is one click away. Set the view's layout mode to Tree for deep containment hierarchies; the Smart Layout button then runs a top-down tree layout instead of the graph ensemble.

Flow views & sequences

Flow view: participants across the top, numbered arrows for each step of the Payment Processing sequence Flow view: participants across the top, numbered arrows for each step of the Payment Processing sequence
The Payment Flow view renders the Payment Processing sequence — seven relations from the model, in order, with per-step notes.

A sequence is an ordered list of existing relations. Open Sequences in the right panel, click + New sequence, then click relations on the canvas to append them as steps. Reorder with the arrows, add a note per step (shown on the arrow instead of the relation label), remove steps, or Create a Flow view for the sequence in one click. A Flow view is linked to exactly one sequence; participants are the elements involved, in order of first appearance. Zoom with ⌘/Ctrl++/−, 0 fits.

Sequences are stored with milestones, so a Flow view can show how a scenario changed over time, and Presenter replays them step by step.

Hierarchy views

Hierarchy view: nested coloured rectangles for systems, domains and containers with a breadcrumb and size and levels controls Hierarchy view: nested coloured rectangles for systems, domains and containers with a breadcrumb and size and levels controls
Containment as a treemap. Click a rectangle to drill in; the breadcrumb takes you back.
  • Size — Leaves (area ∝ number of descendants), Uniform (siblings equal) or Relations (area ∝ connectivity).
  • Levels — how many levels below the focus to render; expand a single branch inline without changing the limit.
  • Drill — click to focus a subtree; Esc or Backspace goes up. Focus and depth are remembered per view.

Table views

Table view with tabs All Nodes, ADRs, Fitness Functions, Requirements and Relations, showing type badges, names, descriptions, technology and parent Table view with tabs All Nodes, ADRs, Fitness Functions, Requirements and Relations, showing type badges, names, descriptions, technology and parent
The Governance table. Each tab has the columns that matter for that kind of element.

All nodes shows the containment tree as indented rows; ADRs, Fitness Functions and Requirements expose their governance fields (status, priority, EARS pattern and slots…) as columns; Relations lists every edge with source, target, label, technology and type. Click a cell to edit it in place — enums become dropdowns, and columns that depend on another value (an EARS trigger only exists for event-driven requirements) grey out when they do not apply. Drop a palette item onto a row to add a child of that element.

Matrix views

Dependency structure matrix with elements on rows and columns and coloured cells where relations exist Dependency structure matrix with elements on rows and columns and coloured cells where relations exist
The Dependency Matrix: rows depend on columns. Symmetric pairs reveal cycles at a glance.

A design structure matrix of the view's elements. A filled cell means at least one relation from the row element to the column element; click it to see which. Because the matrix is just another view, it stays in sync with every diagram — add a relation on a Structure view and the cell lights up.

Wiki views

Wiki view: a document page for Core Banking Platform with breadcrumb, description, facts box, children and relations Wiki view: a document page for Core Banking Platform with breadcrumb, description, facts box, children and relations
The Architecture Wiki view. Every element is a page; every field on it is editable inline.

The overview page lists the view's elements as a table of contents; each element page shows its description as prose, short facts (status, technology, priority…) in an infobox, long fields as sections, children, and incoming and outgoing relations as links. Requirements show their EARS sentence with editable slots. You can add child elements and relations directly from a page. The page you are on is saved with the view, so a deep link lands on it.

Layout & navigation

Smart Layout

One button, several algorithms: a layered layout (ELK), a force-directed layout and a simulated-annealing pass are run as candidates, scored for edge crossings, overlaps and compactness, and the best one is applied — with edge routing cleaned up afterwards. It respects containment, so children are arranged inside their parents. A view with Tree layout mode gets a hierarchical tree layout instead.

Live physics

While you drag, a light force simulation nudges neighbours out of the way and keeps containers hugging their children. It never fights you: the node you hold stays where you put it.

Fit & Smart Fit

Fit All frames the visible elements. Smart Fit (Radical menu) keeps the camera fitted as the diagram changes — useful while importing or laying out, less so while hand-arranging. Scroll to zoom, drag the background to pan.

Quick Search

Quick Search open with the query Payment, listing matching views, nodes and relations with the views they appear in Quick Search open with the query Payment, listing matching views, nodes and relations with the views they appear in
⌘/Ctrl+P searches elements, relations and views. Each hit lists the views it appears in — pick one to jump straight there.

Results are ranked across labels, descriptions and technology. ↑/↓ to move, Enter to select and centre the camera on the element, Esc to close. With an AI provider configured the same box becomes the assistant (see AI assistant).

Milestones

Milestone v2 active: the canvas shows the model as it was, the chip at the top names the milestone with a diff toggle, and the Milestones list shows Current (live), v3, v2, v1 Milestone v2 active: the canvas shows the model as it was, the chip at the top names the milestone with a diff toggle, and the Milestones list shows Current (live), v3, v2, v1
Time travel: the v2 – Payments & Events milestone of the sample. Current (live) brings you back.

A milestone is a named, dated snapshot of the whole model — elements, relations and sequences. Click + New milestone in the left panel to capture the current state. Click any milestone to step back in time: the canvas shows the model as it was, the chip at the top names it, and every view still works.

  • Diff — the toggle on the chip colours what changed since the previous milestone: added, changed, and removed elements drawn as ghosts. Flow views show removed steps the same way.
  • Editing in the past — if you change something while a milestone is active you are asked what you meant: propagate the change to that milestone and every later one, save as a new milestone right after it, or discard.
  • Slides can be pinned to a milestone, so a presentation can tell the story in order.

Viewer & Presenter

Viewer perspective: views list on the left, read-only canvas, model tree on the right Viewer perspective: views list on the left, read-only canvas, model tree on the right
Viewer: everything you can do in Designer to look, nothing that changes the saved model.

Viewer is a sandbox. Drag, collapse, re-layout, switch views and milestones — all of it is thrown away when you return to Designer, so you can explore freely in front of others. It is also the perspective the Hub uses to show concepts.

Presenter perspective: the slide dock along the bottom lists the Architecture Walkthrough slides with Present and Add slide buttons Presenter perspective: the slide dock along the bottom lists the Architecture Walkthrough slides with Present and Add slide buttons
Presenter: build a deck from views, then play it.

Presenter adds the slide dock. Pick or create a presentation, then Add slide to capture what is on screen: the view, the camera, the layout and collapse state, and the model at that moment. Slides can be renamed, reordered, re-captured, and linked to a view or a milestone. Present (or F5 from anywhere) goes full-screen: → ↓ Space advance, ← ↑ go back, Esc exits. A Flow-view slide replays its sequence one step at a time. The URL updates as you present, so a listener can open the same slide.

Metamodel editor

Metamodel editor listing node types with colour, icon, allowed parents and properties, and relation types with allowed pairs Metamodel editor listing node types with colour, icon, allowed parents and properties, and relation types with allowed pairs
The metamodel travels with the model. Change it here and every form, palette entry and validation rule follows.

Radical menu → Metamodel editor…. Start from a preset — C4, C4 + DDD or C4 + DDD + Governance — then shape it:

  • Node types — label, icon, colour, default and collapsed size, allowed parents, whether it may sit at the root, min/max cardinality, and properties (text, long text, number, boolean, enum with options and a default; a property can be visible only when another one has certain values).
  • Relation types — label, colour, the allowed pairs of source and target types, and their own properties.
  • Built-in types can be extended but not deleted; add as many of your own as you need.

Validation is live: the palette, the parent drop-down, drag-and-drop and connection previews all consult the metamodel, and the AI assistant's patches are checked against it too.

Concept Hub

hub.radical.tools: catalogue of concepts on the left and the Analytical Data Platform blueprint rendered on the canvas on the right hub.radical.tools: catalogue of concepts on the left and the Analytical Data Platform blueprint rendered on the canvas on the right
hub.radical.tools — the catalogue beside the real viewer.

The Hub is a curated library of requirements, ADRs, fitness functions, patterns (C4 fragments) and blueprints (whole solution skeletons). It is rendered by the same engine as Studio, so you can open any concept as a diagram, wiki page or table before importing it. Select several and Add to Studio.

Import from Hub dialog in Studio listing three concepts with tags, template parameters and Add to Model buttons Import from Hub dialog in Studio listing three concepts with tags, template parameters and Add to Model buttons
Inside Studio: Radical menu → Import from Hub…, or arrive from the Hub with your selection pre-loaded.
  • Templates — concepts with parameters (a latency budget, an endpoint, a data class) ask for values on import; the Hub template section in the element's properties lets you change them later.
  • Blueprints — pick which elements and which referenced concepts to bring in. Every blueprint ships one screen flow per actor (mockups with wireframes) and named views: on the canvas System context, Containers, Governance map, Mockups (every screen flow with its wireframes), its technical flow and one Flow view per screen flow; in the wiki Governance and Requirements. In the Hub, the view selector next to Canvas / Wiki / Table lists the views of the current mode; on import they arrive as views of your model, limited to the elements you picked.
  • Drop target — with a compatible container selected, imported elements become its children.

AI assistant

AI providers dialog with a master switch and tabs for Ollama, OpenAI, Anthropic and Google Gemini, each with model, base URL and API key fields and a Test connection button AI providers dialog with a master switch and tabs for Ollama, OpenAI, Anthropic and Google Gemini, each with model, base URL and API key fields and a Test connection button
Radical menu → AI providers…. Keys stay in this browser and calls go straight to the provider.

Bring your own model: Ollama (local, no key), OpenAI, Anthropic Claude or Google Gemini. Enable AI, pick the active provider, paste a key, Test connection. Nothing is proxied through radical.tools.

Then open Quick Search (⌘/Ctrl+P) and switch to ✨ AI mode — Tab on an empty box, the ✨ button, or ⌘/Ctrl+Enter to send the current text. The assistant sees the model and its metamodel and can:

  • Answer questions — “what depends on the Event Bus?”, “which containers have no owner?”. It queries the model with a small query language (LIST NODES WHERE …, GET NEIGHBORS, STATS MODEL) rather than guessing.
  • Change the model — “add a Redis cache between the API gateway and the accounts service”. The answer is a patch (add / update / delete nodes and relations, add views) that is validated against the metamodel, applied atomically and undoable like any other edit.
  • Draft governance — turn a paragraph into EARS requirements or an ADR with the right fields filled.

Radical Forge

Radical Forge (Start with Radical Forge on the welcome screen, or Radical menu → Radical Forge…) turns a plain-language description of a system into a model, one reviewable stage at a time: Requirements (EARS) → Fitness functions → Gherkin scenarios → Mockups → C4 model. Each stage may first ask a few clarifying questions, suggests matching Hub concepts, and can be regenerated before you continue.

  • Mockups come before C4: the stage creates the user-facing screens with Illustrates and Navigates to links, then Generate wireframes draws a wireframe for every mockup that has none. The C4 stage then designs the front-ends the screens need and links each mockup to its container with Presented by.
  • Finish here ends the run at any stage and keeps what has been generated. The final step summarises every stage (what was added, what was skipped) and exports the scenarios as .feature files; ← Back resumes where you stopped.

File formats

.radical (JSON)

One file: nodes, relations, sequences, views (with per-view positions and camera), snapshots (milestones), presentations, the metamodel and Hub template records. Older .c4.json files open unchanged.

Markdown folder

my-model/
├─ radical.md                 # manifest
├─ nodes/
│  ├─ retail-customer.md      # one element = one file
│  └─ core-banking-platform/  # containers become directories
│     ├─ _index.md            # the container itself
│     └─ payments-service/
│        ├─ _index.md
│        └─ fx-engine.md
├─ relations.json
├─ views.json · sequences.json · snapshots.json · presentations.json
├─ metamodel.json · hubTemplates.json
└─ _layout.json               # positions & camera — the only noisy file

Each .md has YAML front-matter (id, type, label, then the element's properties, sorted) and the description as body. Hierarchy is the directory tree. Output is deterministic — sorted keys, stable file names — so Git diffs show what changed and nothing else. Edit the files by hand; the app picks them up.

Keyboard shortcuts

KeysAction
⌘/Ctrl+PQuick Search (and AI prompt)
Tab / ⌘/Ctrl+EnterIn Quick Search: switch to AI mode / send to AI
⌘/Ctrl+Z · ⌘/Ctrl+⇧+Z or YUndo · Redo
Alt + drag (configurable)Connect two elements
Shift / ⌘/Ctrl / Alt + clickAdd to selection
DeleteDelete selected elements or relation
Double-click canvasNew Software System at the pointer
EscCancel connection, close dialogs, leave edit mode; in Hierarchy views go up a level
F5Start / stop the presentation
→ ↓ Space · ← ↑Next · previous slide while presenting
⌘/Ctrl++ / − / 0Zoom in / out / fit (Flow views)
EnterConfirm inline edits (names, notes, table cells)

VS Code & local install

VS Code extension

The Radical extension opens .radical files in a Radical.Tools editor inside VS Code, keeps the file and the editor in sync in both directions, follows the editor's light or dark theme, and offers Radical: Open file and Radical: Open app commands. It ships with the web build embedded.

Desktop app

# Node.js ≥ 18
git clone https://github.com/radicaltools/radical.tools.git
cd radical.tools
npm install
npm run dev              # Electron, hot reload
npm run build && npm start
npm run dev:web          # browser build of Studio
npm run dev:hub          # Architecture Hub

The desktop app adds native file dialogs, Markdown folders without browser permissions and --file watching. Everything else is identical to the browser build.