See how it looks: βΆ Try the live demo (runs in your browser, no install) Β Β·Β π Project website
ArchFlow is a fork of FossFLOW by Stan Smith, which is itself a fork/rewrite of Isoflow by @markmanx β this project stands on both of their shoulders. If either project has helped you, please check them out and consider supporting their work.
ArchFlow is a powerful, open-source web app for creating beautiful isometric diagrams. Built with React and the Isoflow (forked and published to NPM as fossflow) library, it runs entirely in your browser. A native desktop version (Electron) is also available in packages/fossflow-desktop.
- π ARCHFLOW_TODO.md - Current issues and roadmap with codebase mappings, most gripes are with the isoflow library itself.
- π€ CONTRIBUTING.md - How to contribute to the project.
- Reduced frame refresh delay, should look much smoother now
- 2 Languages Supported - Full interface translation in English and Polish
- Language Selector - Easy-to-use language switcher in the app header
- Complete Translation - All menus, dialogs, settings, tooltips, and help content translated
- Locale-Aware - Automatically detects and remembers your language preference
- Click-based Creation - New default mode: click first node, then second node to connect
- Drag Mode Option - Original drag-and-drop still available via settings
- Mode Selection - Switch between click and drag modes in Settings β Connectors tab
- Better Reliability - Click mode provides more predictable connection creation
A prebuilt image is published to GitHub Container Registry on every successful build of master:
ghcr.io/cyryllo/archflow
| Tag | Meaning |
|---|---|
latest |
Latest build of master |
0.4.7 (any version) |
A specific ArchFlow version, from package.json |
sha-abc1234 |
A specific commit |
The image is currently built for linux/amd64 only.
ArchFlow listens on port 9500 in all examples below. Ports like 80 or 8080 are often already taken by other services, so 9500 is a safer default. You can change it, see Changing the port.
You don't need to clone the repository, just the compose file.
# 1. Create a folder for ArchFlow and download the compose file
mkdir archflow && cd archflow
curl -O https://raw.githubusercontent.com/cyryllo/ArchFlow/master/compose.yml
# 2. Pull the image and start the container in the background
docker compose pull
docker compose up -dOpen http://localhost:9500 in your browser. Diagrams are saved as JSON files in ./diagrams, next to compose.yml.
Everyday commands, run from the same folder:
docker compose ps # is it running?
docker compose logs -f # follow logs
docker compose stop # stop (container is kept)
docker compose start # start it again
docker compose down # stop and remove the container (diagrams stay in ./diagrams)
docker compose pull && docker compose up -d # update to the newest imageTo pin a specific version instead of latest, set ARCHFLOW_VERSION, either inline or in a .env file next to compose.yml:
ARCHFLOW_VERSION=0.4.7 docker compose up -ddocker run -d --name archflow \
-p 9500:80 \
-v "$(pwd)/diagrams:/data/diagrams" \
--restart unless-stopped \
ghcr.io/cyryllo/archflow:latestEveryday commands:
docker ps # is it running?
docker logs -f archflow # follow logs
docker stop archflow # stop the container
docker start archflow # start it again
docker rm -f archflow # remove the container (diagrams stay in ./diagrams)To update: docker pull ghcr.io/cyryllo/archflow:latest, then docker rm -f archflow and run the command above again. Your diagrams are kept in ./diagrams.
If you prefer a named Docker volume over a host folder, use -v archflow-diagrams:/data/diagrams instead. The volume survives docker rm. To list or delete it:
docker volume ls # list volumes
docker run --rm -v archflow-diagrams:/data alpine ls -la /data # see what's inside
docker volume rm archflow-diagrams # delete it, with all diagrams in itIf you have cloned the repository, you can build the image yourself instead of pulling it:
docker compose up -d --build # build from the local source and start
docker compose -f compose.dev.yml up --build # dev variant: ports 3000 (app) and 3001 (API)The port is the number before the colon in the port mapping (HOST:CONTAINER). Inside the container ArchFlow always listens on 80; only change the host side.
- Compose: edit the
portsline incompose.yml, e.g.- "9600:80", then rundocker compose up -d. docker run: change-p 9500:80to e.g.-p 9600:80.
To check whether a port is free on Linux: ss -ltn | grep :9500 (no output means it's free).
Good to know before you run it on a server:
- One container, two processes. nginx serves the web app on port
80inside the container, and a small Node.js backend (port3001) stores diagrams. nginx forwards/api/...requests to the backend, so you only need to publish port 80 (mapped to 9500 on the host). Don't publish 3001. - Where diagrams live. The backend writes each diagram as a JSON file to
/data/diagramsinside the container. The image doesn't declare a volume, so if you don't mount anything there, diagrams live only inside the container. They survivestop/start/restart, but are lost ondocker rm,docker compose down, or when updating to a new image. Always mount a folder or a named volume (the examples above do). - Host folder vs named volume.
- Host folder (
./diagrams:/data/diagrams): files are directly visible on your disk, easy to back up or copy. If the folder doesn't exist, Docker creates it for you on the first start. - Named volume (
archflow-diagrams:/data/diagrams): Docker manages the storage (under/var/lib/docker/volumes/on Linux). Not visible as a normal folder, but avoids the permission issue below.
- Host folder (
- File ownership (Linux). The container runs as
root, so the./diagramsfolder and the JSON files in it are owned byrooton the host. To edit, move or delete them by hand, usesudoor take ownership:sudo chown -R $USER: diagrams. ArchFlow itself keeps working after that. - Works offline. Everything the app needs is inside the image, so the container starts in a few seconds and doesn't need internet access, only for pulling the image.
- Restarts. Both examples use
restart: unless-stopped: the container starts again after a crash or a reboot of the machine, unless you stopped it yourself. - No logins. ArchFlow has no user accounts. Anyone who can open the address can view, change and delete diagrams in App Storage. Run it on a trusted network, or put it behind a reverse proxy with authentication (e.g. basic auth) if it's reachable from the internet.
- Backups. Everything ArchFlow stores is in
/data/diagrams(your./diagramsfolder), so backing up that folder is enough.
| Variable | Default | Description |
|---|---|---|
ARCHFLOW_VERSION |
latest |
Image tag used by compose.yml. |
ENABLE_SERVER_STORAGE |
true |
Save diagrams as files on the server (App Storage). Set to false for browser-only (session) storage. |
STORAGE_PATH |
/data/diagrams |
Where diagrams are stored inside the container. Mount a host folder or volume here. |
To disable server storage and fall back to browser-only (session) storage, set ENABLE_SERVER_STORAGE=false:
ENABLE_SERVER_STORAGE=false docker compose up -d
# or
docker run -d -p 9500:80 -e ENABLE_SERVER_STORAGE=false ghcr.io/cyryllo/archflow:latestSee Saving and Opening Diagrams for what changes in the app.
A native desktop version is also available for Windows, macOS, and Linux β it wraps the same web app in a native window, with native "Save As"/"Open" dialogs instead of browser downloads.
# Run in dev mode (opens a native window)
npm run dev:desktop
# Build installers (Windows .exe, macOS .dmg, Linux AppImage/.deb)
npm run build:desktopInstallers are written to packages/fossflow-desktop/dist/. Both commands build the library and web app internally first, so there's no separate build step needed.
Diagrams are saved as real files on disk, automatically β no location prompt, no browser storage involved. The desktop app creates an ArchFlow folder inside your OS's Documents directory (~/Documents/ArchFlow, or the localized equivalent, e.g. ~/Dokumenty/ArchFlow on a Polish system) the first time it runs, and every diagram you save through the "π App Storage" list becomes a .json file there. As with Docker, the session-only Save/Load/Quick-save buttons are hidden in the desktop app, since real persistent storage is always available.
# Clone the repository
git clone https://github.com/cyryllo/ArchFlow
cd ArchFlow
# Install dependencies
npm install
# Build the library (required first time)
npm run build:lib
# Start development server
npm run devOpen http://localhost:3000 in your browser.
This is a monorepo containing several packages:
packages/fossflow-lib- React component library for drawing network diagrams (built with Webpack)packages/fossflow-app- Progressive Web App which wraps the lib and presents it (built with RSBuild)packages/fossflow-backend- Optional backend server for persistent diagram storagepackages/fossflow-desktop- Native desktop app (Electron)
# Development
npm run dev # Start app development server
npm run dev:lib # Watch mode for library development
# Building
npm run build # Build both library and app
npm run build:lib # Build library only
npm run build:app # Build app only
# Desktop app (Electron)
npm run dev:desktop # Run desktop app in dev mode
npm run build:desktop # Build desktop installers
# Testing & Linting
npm test # Run unit tests
npm run lint # Check for linting errors
# E2E Tests (Selenium)
cd e2e-tests
./run-tests.sh # Run end-to-end tests (requires Docker & Python)
# Publishing
npm run publish:lib # Publish library to npm-
Add Items:
- Press the "+" button on the top right menu, the library of components will appear on the left
- Drag and drop components from the library onto the canvas
- Or right-click on the grid and select "Add node"
-
Connect Items:
- Select the Connector tool (press 'C' or click connector icon)
- Click mode (default): Click first node, then click second node
- Drag mode (optional): Click and drag from first to second node
- Switch modes in Settings β Connectors tab
-
Save Your Work: see Saving and Opening Diagrams below.
ArchFlow has two independent ways to keep your work. You can use both at the same time.
| πΎ Files on your computer | π / π App Storage | |
|---|---|---|
| What it is | You download a .json file and open it again later |
Diagrams are kept by ArchFlow itself, in a list |
| Where the data is | Wherever you save the downloaded file | Docker: ./diagrams on the server. Desktop app: ~/Documents/ArchFlow |
| Available | Always, everywhere | Docker with server storage enabled (default) and the desktop app |
| Good for | Backups, sending a diagram to someone, moving between ArchFlow installations | Everyday work, a shared list for the whole team |
- Export File (toolbar button) downloads the current diagram as
<name>-<date>.json. The file includes every icon the diagram uses, also custom imported ones, so it opens correctly in any other ArchFlow. - The main menu (β°, top left of the canvas) has more options:
- Open: load a diagram from a
.jsonfile. It replaces what's on the canvas. - Export as JSON / Export as Compact JSON: download the diagram as JSON (the compact variant is a smaller file).
- Export as image: save a PNG picture of the diagram.
- Clear the canvas: remove everything from the current diagram.
- Open: load a diagram from a
Export as image shows a preview and lets you choose whether to show the grid, expand item descriptions, crop to the content, the background color (or transparent), and the resolution (DPI). Use Chrome or Edge for this; Firefox has known issues with image export.
The App Storage button opens the Diagram Manager, with the list of saved diagrams:
- Save Current Diagram: saves the diagram under a name. If a diagram with that name already exists, ArchFlow asks before overwriting it. Each diagram becomes a file named after it, e.g.
./diagrams/Airport system.json. - Load: opens a saved diagram.
- Share: copies a link like
http://your-server:9500/display/<name>, which opens the diagram in read-only mode. Anyone who can reach your server can open it (Docker only). - Delete: removes the diagram (and its file) for good, after a confirmation.
Important:
- Saving is manual. Changes are written to App Storage only when you click Save Current Diagram. The toolbar shows β’ Modified when there are changes that aren't saved yet, and the browser warns you if you try to close the tab.
- In Docker, App Storage is shared. Everyone who opens the same ArchFlow address sees and edits the same list. There are no user accounts.
- The icon tells you where diagrams go: π means the Docker server, π means files on your computer (desktop app).
When App Storage isn't available (ArchFlow hosted as a plain static website, or Docker with ENABLE_SERVER_STORAGE=false), the toolbar shows Save (Session Only), Load (Session Only) and Quick Save (Session) instead. These keep diagrams in your browser's storage:
- they are only in this browser, on this computer,
- they disappear when you clear the browser's data,
- browser storage is small (a few MB), so big diagrams may not fit.
Use Export File regularly in this mode, it's the only way to keep your work safe.
Independently of the above, the browser remembers the diagram you were working on and opens it again after a page reload. This is a convenience, not a backup: it lives only in your browser and is replaced as soon as you open another diagram.
| Where ArchFlow runs | What you get |
|---|---|
| Desktop app | π App Storage (files in ~/Documents/ArchFlow) + Export/Open. No session buttons. |
| Docker, server storage enabled (default) | π App Storage (files in ./diagrams on the host) + Export/Open. No session buttons. |
| Plain web hosting / Docker with server storage disabled | Session Save/Load/Quick Save (browser only) + Export/Open |
We welcome contributions! Please see CONTRIBUTING.md for guidelines.
- ARCHFLOW_ENCYCLOPEDIA.md - Comprehensive guide to the codebase
- ARCHFLOW_TODO.md - Current issues and roadmap
- CONTRIBUTING.md - Contributing guidelines
MIT





