neuron-explorer
Steering-first neuron explorer for Qwen3.5-4B: push every MLP neuron, keep every rollout, browse the results
Your program is a living, typed graph in a database — not text in files. Engineers review structure, teammates compose typed blocks, AI edits are inspectable. No build step, no deploy step.
Developer toolsClojure · JavaScriptGitHub @GraphdenOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Software your whole team can see — and your AI can safely change. Programs are living, typed graphs in a database — executed live, branched, diffed. AGPL.
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
Graphden makes software something your whole team can see — and your
AI can safely change. It is a functional programming environment where
the program is a typed graph in a database — not text in files — and the
runtime executes that graph directly, hot-reloads it, branches it, and
multi-tenants it.
Functions and their compositions are stored as rows (fn, slot,
binding), edited through a visual graph editor, type-checked and
effect-tracked as you build, and executed by an in-memory compiled
registry that refreshes from the database without a redeploy.Read the full README ↗Graphden makes software something your whole team can see — and your AI can safely change. It is a functional programming environment where the program is a typed graph in a database — not text in files — and the runtime executes that graph directly, hot-reloads it, branches it, and multi-tenants it.
Functions and their compositions are stored as rows (fn, slot,
binding), edited through a visual graph editor, type-checked and
effect-tracked as you build, and executed by an in-memory compiled
registry that refreshes from the database without a redeploy.
The editor showing this repo's own application root: web-server
is a fn-def over http-server, its handler slot typed
(request)→ring-response, its effect set tracked in the inspector.
Try it live — no sign-up.
Text-in-files is a great substrate for humans and a hostile one for everything else. Version control, branching, hot-reload, multi-tenancy, type/effect analysis, and safe automated editing are all bolted on top of files with external tooling. Graphden's bet is to make the program a typed graph in a database, so those become properties of the substrate instead of surrounding machinery:
db/io/network/time/…); values marked [:secret T] are tracked
through the graph and hidden at execution sinks. The editor shows you
all of it while you build.graphden-tenancy, proprietary — see
TENANCY_SEAM.md). Without it a self-hosted
instance is single-org.Why now: free-form text is a poor target for machine-authored software — a model easily emits structurally- or semantically-invalid code. A typed, effect-annotated, structurally-constrained graph is a better target, because the structure itself is the guardrail. And as models write more code while humans read less of it, reviewing a change starts to matter more than writing it. The wager: a typed, effect-annotated graph diff is easier to review than a text diff — stated plainly as a bet the project now has to test in the market, not a proven fact.
Who it's for — three tiers, and AI as one of them. The substrate
stratifies into roles that compose over the same graph: package
authors (experts) write the base-fn impls and typed fns.edn that
wrap an integration — Telegram, Google Sheets, Postgres — designing
narrow types and a clean public surface; composers (semi-technical)
install those packages and wire them by type-matching without reading
the impls; and end-user surfaces turn a graph's free arguments into
an embeddable form. The composer tier is exactly the task an LLM does
well — type-guided composition over a constrained, labelled block set —
so an AI can plausibly stand in for it while a human reviews the
resulting graph diff. See
PHILOSOPHY § The three-tier ecosystem.
Why this isn't the visual-programming graveyard: Scratch and its
lineage failed trying to render if/for/while as blocks — a forced
visual metaphor bolted onto a fundamentally textual, imperative structure.
Graphden instead visualizes a homoiconic, composition-first substrate —
Lisp, which is already close to an AST — so the graph is the natural
shape of the program, not a costume on top of it. And unlike read-only
"see your code as a graph" viewers, the graph here is the thing you
edit, diff, and merge: authorship and review share one surface.
What this is not: a claim that visual programming beats text for all work. It's a bet on a specific niche — internal tools, low-ops backends, and multi-tenant SaaS where branch-per-tenant, hot-reload, and effect-gating are the product. It's an experimental platform, not a finished one; see ROADMAP.md for what's shipped vs planned, and FAQ.md for the sharp objections and their honest answers.
Graphden separates base functions (small Clojure primitives, each wrapping ~one library call) from fn-defs (pure-data compositions of them). A running HTTP server is just a composition:
;; fn-defs are pure data — no Clojure code
(def fn-defs
[;; Constant handler: (fn [_] response)
{:name :hello-handler-fn
:parent :const
:args {:value {:status 200 :body "Hello from Graphden!"}}}
;; Build a route map. :hello-handler-fn is EXECUTED here — assoc's :value
;; slot is not :fn-typed, so the executor evaluates the ref.
{:name :hello-route-data-fn
:parent :assoc
:args {:map {}, :key "handler", :value :hello-handler-fn}}
;; A router over those routes.
{:name :router-fn
:parent :router
:args {:routes [["/" {:get :hello-route-data-fn}]]}}
;; Start the server. :router-fn is PASSED AS A FUNCTION here —
;; http-server's :handler slot IS :fn-typed, so the executor hands the
;; fn-id over instead of executing it.
{:name :web-server-fn
:parent :http-server
:args {:handler :router-fn
:port 8080}}])
One concept — the slot's type — drives both the editor's type chip
and the runtime dispatch: :fn-typed slots receive the fn-id (a
higher-order callable); every other slot gets the executed result. There
is no name-based special-casing anywhere in the executor.
Full walkthrough: ARCHITECTURE.md § Composition.
The whole stack runs in Docker (Graphden + its Postgres + a tenant Postgres + OpenBao secrets). Building the image needs the Clojure toolchain on the host — Java 21+, Clojure 1.12+, Babashka, Docker. One command builds the uberjar + image and brings the stack up:
bb rebuild
Then open the editor at http://localhost:9002.
Auth is off by default (AUTH_TOKEN is empty, so the editor is open
— fine for local evaluation). To require a token, set AUTH_TOKEN=… in
.env (copy .env.example) and bb rebuild. Full env-var reference,
the docker compose / production options, and the RLS/non-superuser DB
setup are in DEPLOYMENT.md.
Note: no prebuilt image is published yet, so
docker compose upalone won't stand up a clean clone — the executor image is built from a jar thatbb rebuild(orclojure -T:build uber && docker build …, see DEPLOYMENT.md) produces first. Themathxexternal package it pulls is a public repo, so the build needs no credentials.
bb repl # REPL with the dev profile
bb test # Run the test suite (uses testcontainers for Postgres)
bb ci # Full CI: lint (fail-fast) then unit tests; --since <ref> diff-scopes it (coverage: bb coverage)
bb check # Clojure linters only (clj-kondo / splint / cljstyle)
bb fix # Auto-fix Clojure formatting
After a backend change, bb rebuild then bb verify (per-section
frontend/packages/backend hash check against /version). Linters mostly
self-install on first run; npm install once for the JS/CSS set. See
DEPLOYMENT.md for the full toolchain and prereqs.
Three layers, each depending only on the one below:
┌────────────────────────────────────────────────────────────┐
│ EXECUTOR compile graph → in-memory registry of │
│ closures; execute; type-check; effect-track │
├────────────────────────────────────────────────────────────┤
│ STORAGE StorageCRUD / ExecutionGraph / Constraints │
│ Postgres backend · VersionedStorage decorator │
│ · RemoteStorage (BYO executor over HTTP) │
├────────────────────────────────────────────────────────────┤
│ DATA SCHEMA fn / slot / fn-slot / binding / │
│ binding-list-item · versioned (branch+version)│
└────────────────────────────────────────────────────────────┘
Execution is served entirely from the in-memory compiled registry (~microseconds/node); Postgres is touched at compile/invalidation time and for durable writes, not on the execution inner loop. See ARCHITECTURE.md and SCALING.md.
src/graphden/)| Area | Namespaces |
|---|---|
| Executor | executor/ (compile pipeline, registry, composition), executor_runtime/ (-main) |
| CRUD & API | crud/ (entities, branches, secrets, type-check, fn-execution) |
| Types | types/ (subtype/unify/narrow, checker) |
| Schema | schema/ (protocol, malli, graph, versioned, fields) |
| Storage | storage/ (protocol, postgres, remote/ for BYO) |
| Versioning | versioning/ (storage decorator, merge protection) |
| Platform | tenancy/, auth/, services/, layout/, system/, clients/ |
| Packages | packages/ (loader for resources/packages/) |
Base functions and fn-defs live under resources/packages/{pkg}/{module}/
as fns.edn (declarations) + impls.clj (Clojure impls); dependencies in
package.edn drive load order. See PACKAGES.md.
Start with the documentation index — a reader-oriented map (evaluate → learn → operate → reference). Contributors working on the codebase can also follow the per-topic engineering map in CLAUDE.md, which additionally indexes the internal design records.
| Document | For |
|---|---|
| PHILOSOPHY.md | Design principles and rationale |
| ARCHITECTURE.md | Data model, execution model, examples |
| PACKAGES.md | Writing base-fns and fn-defs |
| TYPES.md | The type system |
| VERSIONING.md | Branches, diff, merge |
| SCALING.md · DEPLOYMENT.md | Fleet, ops, deploy |
| ROADMAP.md | What's shipped vs planned |
| tutorial/ | Step-by-step lessons for new users |
GNU Affero General Public License v3.0 (AGPL-3.0) — see LICENSE and NOTICE. Copyright (c) 2026 Artem Markov.
The multi-tenant cloud policy layer (graphden-tenancy) and the cloud
control plane (graphden-cloud) are separate proprietary works and are not
part of this repository.
The open-source project is funded through its Open Collective — donations and grants, spent only on the open-source work (contributor time at a published rate; the ledger is public). The hosted cloud is a separate, self-funded activity: a donation never buys a cloud tier, and cloud revenue never flows through the collective. Russian-speaking supporters can use Boosty. How each source is used is written down in docs/PLANS.md.