Status: Proof of Concept
The visual explorer is an experimental tool for browsing semantic registries. It's useful for understanding and exploring your architecture, but is not production-ready.
Note: The UI automatically detects the current browser's hostname and uses it for API requests. This means you can access the UI from any machine (localhost, IP address, hostname) and the API calls will use the same host.
Graph visualization showing entities (colored by type) and aspect nodes
Lens system filtering to a specific domain
Entity details sidebar with aspects, data flow, and dependencies
Atlas UI provides interactive visualization of your semantic registry in two versions:
Both versions let you explore entities, filter by aspects, trace dependencies, and understand architectural relationships. Choose the one that fits your mental model.
(require '[atlas.atlas-ui.server :as ui])
;; Start with global registry (opens browser automatically)
(ui/start!)
;; Or specify version and options
(ui/start! {:ui-version :v2 :port 8082 :open-browser? true})
;; Load sample data for exploration
(ui/start! {:load-sample? true})
;; Check status of all running servers
(ui/status)
;; Stop a server
(ui/stop! 8082)
;; Restart (useful after registry changes)
(ui/restart! {:ui-version :v2})
Default: v1 on http://localhost:8082
Note: The UI automatically detects the browser's hostname (localhost, a LAN or VPN address, etc.) and uses it for API requests. No additional configuration needed for remote access.
Click aspects to build boolean queries:
| Mode | Key | Description |
|---|---|---|
| AND | 1 | Entities must have ALL selected aspects |
| OR | 2 | Entities must have ANY selected aspect |
| COUNT | 3 | Rank entities by number of matching aspects |
Lenses filter the graph to focus on specific views. Press L to open the lens selector.
Available Lenses:
| Lens Type | Description |
|---|---|
| Domain | Show only entities in a specific domain (e.g., :domain/auth) |
| Tier | Show only entities in a tier (e.g., :tier/service) |
| Protocol | Show entities implementing a protocol |
| Constraint | Show entities with a constraint aspect |
| Dependency Flow | Trace dependencies from a specific entity |
| Impact Analysis | See what's affected if an entity changes |
| Combination | Combine multiple lenses (AND logic) |
When a lens is active:
| Key | Action |
|---|---|
ESC | Clear selections / clear lens |
L | Toggle lens selector |
P | Toggle presets panel |
[ | Go back in lens history |
] | Go forward in lens history |
1 | AND query mode |
2 | OR query mode |
3 | COUNT query mode |
Ctrl/Cmd+S | Save current lens as preset |
Ctrl/Cmd+C | Copy lens URL to clipboard |
Click an entity node to see details in the sidebar:
When a lens is active, the URL updates to include lens parameters. Share the URL to give others the same filtered view:
http://localhost:8082/?lens=domain&value=domain/auth
Save frequently-used lens configurations:
P or click "Presets"Presets are stored in browser memory (not persisted across sessions in this PoC).
┌─────────────────────────────────────────────────────────────────┐
│ Browser (ClojureScript) │
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Reagent Components │ │
│ │ - Graph (Cytoscape.js) │ │
│ │ - Lens selector │ │
│ │ - Sidebar │ │
│ │ - Controls │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │ │
│ │ HTTP GET /api/atlas/registry │
│ ▼ │
└─────────────────────────────────────────────────────────────────┘
│
│ EDN or Transit+JSON
▼
┌─────────────────────────────────────────────────────────────────┐
│ Server (Clojure/Ring) │
│ │
│ atlas.atlas-ui.server │
│ - Serves static files (compiled UI) │
│ - /api/atlas/registry endpoint │
│ - Watches registry atom for changes │
└─────────────────────────────────────────────────────────────────┘
│
│ @registry-atom
▼
┌─────────────────────────────────────────────────────────────────┐
│ atlas.registry │
│ │
│ Global registry atom containing all semantic entities │
└─────────────────────────────────────────────────────────────────┘
The UI fetches the registry on load and whenever you click "Refresh". Changes to the registry atom trigger a console message prompting browser refresh.
The Atlas UI has two versions available:
Graph visualization with multi-aspect query builder and lens system.
Development:
cd ui
npx shadow-cljs watch atlas-ui
# Hot-reload at http://localhost:8081
From REPL:
(require '[atlas.atlas-ui.server :as ui])
(ui/start! {:ui-version :v1}) ; Default port 8082
Source files: src/atlas_ui/:
core.cljs - Main app, state managementgraph.cljs - Cytoscape.js graph renderinglenses.cljs - Lens filtering logicsidebar.cljs - Entity detail panelselection_controls.cljs - Query mode controlsAspect-centric and entity-centric dual map visualization.
Development:
cd ui
npx shadow-cljs watch atlas-ui-v2
# Hot-reload at http://localhost:8083
From REPL:
(require '[atlas.atlas-ui.server :as ui])
(ui/start! {:ui-version :v2}) ; Default port 8082
Source files: src/atlas_ui_v2/:
core.cljs - App state and component treeapi.cljs - Registry fetchingThis is a proof-of-concept with known limitations:
The UI server exposes one endpoint:
GET /api/atlas/registry
Accept: application/edn → Returns EDN
Accept: application/transit+json → Returns Transit+JSON
Response:
{:atlas-ui.api.response/registry {...}
:timestamp 1234567890
:count 42}
(ui/start! registry-atom
{:port 8082 ; HTTP port (default 8082)
:open-browser? true ; Auto-open browser (default true)
:load-sample? false}) ; Load sample registry (default false)
The shadow-cljs configuration serves both versions:
:dev-http {8081 "resources/public" ; v1 on port 8081
8083 "resources/public-v2"} ; v2 on port 8083
Access:
http://localhost:8081 (or http://<server-ip>:8081)http://localhost:8083 (or http://<server-ip>:8083)The Atlas UI backend server (REPL) defaults to port 8082. When using shadow-cljs watch on a different machine:
Browser URL: http://<server-ip>:8081/?port=8082
↓
Requests API from: http://<server-ip>:8082/api/atlas/registry
The UI automatically uses the current browser's hostname, so requests work from any IP/hostname.
(atlas.atlas-ui.server/status)(count @atlas.registry/registry)?port=XXXX, ensure that port's server is actually running(ont/register-entity-types!)(ui/status)(ui/start! {:port 8085})npx shadow-cljs watch atlas-uinpx shadow-cljs watch atlas-ui-v2Can you improve this documentation?Edit on GitHub
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |