Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
103 changes: 103 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
name: Release Desktop App

# Triggers:
# • Push a tag matching "v*" (e.g. npm version 1.1.0 && git push --follow-tags)
# → builds macOS / Windows / Linux installers and drafts a GitHub Release
# • Pull requests touching packaging → builds only, to catch breakage early
# • Manual run from the GitHub UI → builds only; installers land in the run's artifacts
on:
push:
tags:
- 'v*'
pull_request:
paths:
- electron-builder.yml
- .github/workflows/release.yml
- build/**
workflow_dispatch:

permissions:
contents: read

jobs:
# ── Quality gate ──────────────────────────────────────────────────────────
verify:
name: Type-check & Test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 24
cache: npm
- run: npm ci
- run: npm run typecheck
- run: npm test

- name: Tag matches package.json version
if: startsWith(github.ref, 'refs/tags/v')
run: |
PKG="v$(node -p "require('./package.json').version")"
if [ "$PKG" != "$GITHUB_REF_NAME" ]; then
echo "::error::Tag $GITHUB_REF_NAME does not match package.json version $PKG"
exit 1
fi

# ── Installers (one runner per OS; targets come from electron-builder.yml) ─
build:
name: Build (${{ matrix.os }})
needs: verify
strategy:
fail-fast: false
matrix:
os: [macos-latest, windows-latest, ubuntu-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 24
cache: npm
- run: npm ci

- name: Build installers
run: npm run dist
env:
# Unsigned builds for now — see README "Install" for the Gatekeeper /
# SmartScreen workaround. Add CSC_LINK / APPLE_ID secrets to sign.
CSC_IDENTITY_AUTO_DISCOVERY: false

- uses: actions/upload-artifact@v4
with:
name: installers-${{ runner.os }}
path: |
dist/*.dmg
dist/*.exe
dist/*.AppImage
if-no-files-found: error
retention-days: 14

# ── Draft release (tags only) — review the notes, then click Publish ─────
release:
name: Draft GitHub Release
needs: build
if: startsWith(github.ref, 'refs/tags/v')
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/download-artifact@v4
with:
pattern: installers-*
path: installers
merge-multiple: true

- name: Create draft release
env:
GH_TOKEN: ${{ github.token }}
run: |
gh release create "$GITHUB_REF_NAME" installers/* \
--repo "$GITHUB_REPOSITORY" \
--title "radical.studio $GITHUB_REF_NAME" \
--generate-notes \
--draft
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Mockup relations: Illustrates (→ requirement / scenario), Presented by (→ web app / container), Navigates to (→ mockup) for screen flows
- Radical Forge: Mockups stage before C4 with batch wireframe generation, "Finish here" at every stage with a summary step, and a single footer action bar
- Hub blueprints: per-actor screen flows (79 mockups in 19 flows) and named views — canvas: System context, Containers, Governance map, Mockups, technical flow, one per screen flow; wiki: Governance, Requirements; a per-mode view selector and `/cv/<viewId>` deep links in the Hub; views are imported with the concept
- Desktop installers for macOS (dmg, Apple Silicon + Intel), Windows (NSIS) and Linux (AppImage), built by electron-builder and drafted as a GitHub Release when a `v*` tag is pushed
- App icon for the desktop builds

### Changed
- The Studio app is named radical.studio (installers, window and page title); radical.tools names the family of apps
- Radical Hub uses its own emerald palette (accent, background, borders) in both themes so it reads apart from radical.tools; Studio keeps its blue

### Fixed
- Production desktop build showed a blank window: the CSP header handler dropped every other response header (including `Content-Type`), so the renderer's module scripts were refused
- Hub concept files' `views` were ignored by the viewer and on import
- Importing from the Hub no longer stacks one "Imported …" notification per concept over the template-parameter form

Expand Down
113 changes: 94 additions & 19 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,25 +1,80 @@
<div align="center">

# radical.tools

> **Live app:** [studio.radical.tools](https://studio.radical.tools) &nbsp;|&nbsp; **Architecture Hub:** [hub.radical.tools](https://hub.radical.tools) &nbsp;|&nbsp; **Manual:** [radical.tools/manual.html](https://radical.tools/manual.html)
**Open-source architecture studio: C4 models, ADRs, fitness functions and requirements in one living model, with an AI co-architect.**

[![CI](https://github.com/radicaltools/radical.tools/actions/workflows/ci.yml/badge.svg)](https://github.com/radicaltools/radical.tools/actions/workflows/ci.yml)
[![Release](https://img.shields.io/github/v/release/radicaltools/radical.tools?label=desktop%20app)](https://github.com/radicaltools/radical.tools/releases/latest)
[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
[![Try it in the browser](https://img.shields.io/badge/try%20it-studio.radical.tools-387bf3)](https://studio.radical.tools)

[**Try it in the browser**](https://studio.radical.tools) · [**Download the desktop app**](https://github.com/radicaltools/radical.tools/releases/latest) · [Architecture Hub](https://hub.radical.tools) · [Manual](https://radical.tools/manual.html)

<picture>
<source media="(prefers-color-scheme: dark)" srcset="website/screenshots/views-dark.png">
<img alt="Radical Studio showing a Core Banking container view: domains, containers, databases and the relations between them, with the list of views on the left and the model tree on the right" src="website/screenshots/views-light.png" width="900">
</picture>

</div>

## Why radical.tools?

Architecture diagrams go stale because they are pictures. In radical.tools they are **views of one model**. Every element lives once, and the canvas, dependency matrix, sequence diagram, table and wiki all read from it. The decisions, requirements and fitness functions that explain the architecture live in the same model, linked to the elements they govern.

- **No account, no server.** Runs in the browser or as a desktop app. Your model stays in local storage or plain files you can commit.
- **C4 without the busywork.** Smart Layout places nodes, minimises crossings and fits groups for you.
- **From a paragraph to a model.** Radical Forge turns a system description into requirements, fitness functions, Gherkin scenarios, UI mockups and a C4 model, one reviewable stage at a time.
- **Bring your own AI.** OpenAI, Anthropic, Gemini, or a local model through Ollama.
- **Don't start from zero.** Import from 120+ curated patterns, ADRs, fitness functions and blueprints in the [Architecture Hub](https://hub.radical.tools).

<table>
<tr>
<td width="50%"><img alt="Screen-flow of low-fi UI mockups linked by navigation relations" src="website/screenshots/mockups-light.png"><br><sub><b>UI mockups & screen flows</b>, AI-generated wireframes linked to requirements</sub></td>
<td width="50%"><img alt="Architecture Hub catalogue of patterns, ADRs and blueprints" src="website/screenshots/hub-catalogue-light.png"><br><sub><b>Architecture Hub</b>, curated concepts you can import in one click</sub></td>
</tr>
<tr>
<td width="50%"><img alt="Dependency matrix view of containers" src="website/screenshots/matrix-light.png"><br><sub><b>Dependency matrix</b>, one of six views over the same model</sub></td>
<td width="50%"><img alt="Generated architecture wiki page" src="website/screenshots/wiki-light.png"><br><sub><b>Architecture wiki</b>, documentation generated from the model</sub></td>
</tr>
</table>

## Install

**Browser:** open [studio.radical.tools](https://studio.radical.tools). Nothing to install.

**Desktop:** grab the installer for your platform from the [latest release](https://github.com/radicaltools/radical.tools/releases/latest):

| Platform | File |
|---|---|
| macOS (Apple Silicon) | `radical-studio-<version>-mac-arm64.dmg` |
| macOS (Intel) | `radical-studio-<version>-mac-x64.dmg` |
| Windows | `radical-studio-<version>-win-x64.exe` |
| Linux | `radical-studio-<version>-linux-x86_64.AppImage` |

> [!NOTE]
> The installers are not code-signed yet.
> **macOS:** if the app "is damaged" or "can't be opened", run `xattr -cr /Applications/radical.studio.app` once.
> **Windows:** SmartScreen may warn about an unknown publisher. Choose *More info → Run anyway*.

An open-source software architecture design studio — diagram, document, and evolve architecture using C4, domain models, governance concepts, and AI assistance. Electron + React desktop app (also runs in the browser).
**VS Code:** an extension that opens `.radical` files right in the editor lives in [tools/vscode-radical](tools/vscode-radical).

## Features

- **C4 model** — Person, Software System, Container, Component, Database, Web App, Queue, Relation
- **Domain & Governance elements** — Domain, ADR, Fitness Function, Requirement, Blueprint
- **UI mockups** — Mockup element with a design link or an AI-generated low-fi wireframe, linked to requirements and scenarios (*illustrates*), to the container that renders it (*presented by*) and to other screens (*navigates to*) to model screen flows
- **Smart Layout** — SA-based auto-layout with crossing minimisation, edge-length optimisation, aspect-ratio penalty, and compound parent fitting
- **Multiple layout engines** — ELK (hierarchical/layered/force), webcola (live physics), custom Smart Layout pipeline
- **AI assistant** — chat with OpenAI / Anthropic / Gemini / Ollama to generate and modify diagrams
- **Radical Forge** — turn a system description into requirements, fitness functions, Gherkin scenarios, UI mockups and a C4 model, one reviewable stage at a time
- **Architecture Hub** — browse and import 120+ curated architecture concepts (patterns, fitness functions, ADRs, requirements, blueprints) from [hub.radical.tools](https://hub.radical.tools); blueprints include per-actor screen flows and named views
- **Multiple views** — Canvas, Matrix, Sequence, Treemap, Table, Wiki per diagram
- **Presentation mode** — fullscreen slides with navigation bar
- **Metamodel editor** — customise node types, relation types, and constraints
- **Time travel** — milestone-based snapshots with named undo/redo
- **Document manager** — multiple diagrams, localStorage + file-system backed
- **Export** — PNG/SVG export, JSON save/load, Electron file dialogs
- **C4 model**: Person, Software System, Container, Component, Database, Web App, Queue, Relation
- **Domain & Governance elements**: Domain, ADR, Fitness Function, Requirement, Blueprint
- **UI mockups**: Mockup element with a design link or an AI-generated low-fi wireframe, linked to requirements and scenarios (*illustrates*), to the container that renders it (*presented by*) and to other screens (*navigates to*) to model screen flows
- **Smart Layout**: SA-based auto-layout with crossing minimisation, edge-length optimisation, aspect-ratio penalty, and compound parent fitting
- **Multiple layout engines**: ELK (hierarchical/layered/force), webcola (live physics), custom Smart Layout pipeline
- **AI assistant**: chat with OpenAI / Anthropic / Gemini / Ollama to generate and modify diagrams
- **Radical Forge**: turn a system description into requirements, fitness functions, Gherkin scenarios, UI mockups and a C4 model, one reviewable stage at a time
- **Architecture Hub**: browse and import 120+ curated architecture concepts (patterns, fitness functions, ADRs, requirements, blueprints) from [hub.radical.tools](https://hub.radical.tools); blueprints include per-actor screen flows and named views
- **Multiple views**: Canvas, Matrix, Sequence, Treemap, Table, Wiki per diagram
- **Presentation mode**: fullscreen slides with navigation bar
- **Metamodel editor**: customise node types, relation types, and constraints
- **Time travel**: milestone-based snapshots with named undo/redo
- **Document manager**: multiple diagrams, localStorage + file-system backed
- **Export**: PNG/SVG export, JSON save/load, Electron file dialogs

## Tech stack

Expand All @@ -41,7 +96,7 @@ An open-source software architecture design studio — diagram, document, and ev
npm install

# Start in development mode (Electron, hot-reload)
npm run dev
npm run dev

# Type-check
npm run typecheck
Expand All @@ -55,10 +110,24 @@ npm run build
# Run built Electron app
npm start

# Desktop installers for the current OS (outputs to dist/)
npm run dist

# Build web-only renderer (for deployment to studio.radical.tools)
npm run build:web
```

### Releasing

Bump the version and push the tag:

```bash
npm version 1.1.0 # updates package.json and creates the v1.1.0 tag
git push --follow-tags
```

The [Release Desktop App](.github/workflows/release.yml) workflow builds the macOS, Windows and Linux installers and drafts a GitHub Release with them. Review the notes, then publish.

## Project structure

```
Expand All @@ -78,6 +147,7 @@ hub/ The concept catalogue — one Radical Studio document per
block); content, kept at the repo root next to website/
rather than under src/. hub/index.json is generated at
build time
build/ Desktop app icon used by electron-builder
website/ Marketing site (radical.tools)
infra/ Terraform — AWS S3 + CloudFront + Route53 + IAM (OIDC)
tools/
Expand All @@ -98,7 +168,12 @@ npm test
npm run test:watch
```

## License
## Contributing

MIT
Contributions are welcome: code, docs, bug reports, and new patterns for the [Architecture Hub](https://hub.radical.tools). Start with [CONTRIBUTING.md](CONTRIBUTING.md) and look for issues labelled [`good first issue`](https://github.com/radicaltools/radical.tools/labels/good%20first%20issue).

If radical.tools is useful to you, a ⭐ on GitHub helps others find it.

## License

[MIT](LICENSE)
Binary file added build/icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
36 changes: 36 additions & 0 deletions electron-builder.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Desktop installers — `npm run dist` locally, or push a `v*` tag to let
# .github/workflows/release.yml build every platform and draft a GitHub Release.
appId: com.radical.diagram # must match setAppUserModelId in src/main/index.ts
productName: radical.studio
copyright: Copyright © 2024 radical.tools contributors
artifactName: radical-studio-${version}-${os}-${arch}.${ext}

directories:
buildResources: build # icon.png (512×512) — node tools/generate-icon.js --size 512 --out build/icon.png
output: dist

# electron-vite bundles everything into out/; runtime deps come from package.json.
files:
- out/**
- package.json

mac:
category: public.app-category.developer-tools
target:
- target: dmg
arch: [arm64, x64]

win:
target:
- target: nsis
arch: [x64]

nsis:
oneClick: false
allowToChangeInstallationDirectory: true

linux:
category: Development
target:
- target: AppImage
arch: [x64]
Loading
Loading