Visual planning · agentic build

Plan
visually.
Build
agentically.
Bring your
own AI.

Riva Aquarama with a laptop on the bow

You lay out your app as a node graph — Plan, Architecture, Spec, Dev Stack — where every step grounds the next. Then the agent you choose makes it real: Claude Code, OpenAI, Anthropic, or a local model. You hold the plan; the AI does the building — and you watch every diff.

Download for macOS
Windows Linux
Text File
READY
Image File
READY
Plan
READY
Architecture
READY
Dev Stack
READY
Frontend
READY
Preflight
AI ANALYZE…
Interim rendering of the Flow tab — replace with a captured app screenshot
Pillar 01 · Flow

Your app, planned as a graph  not a chat
log.

The Flow tab is a graph you build, node by node. You lay out how the app fits together — Plan feeds Architecture, which feeds Dev Stack, Frontend, Spec, and Preflight — and every downstream node is grounded in what came before, not in whatever you last typed. Tweak a node and everything below re-derives, non-destructively. You decide the shape; the agent fills it in.

Architecture · node grounded in Plan
· Next.js App Router · React 19
· Postgres · Neon serverless
· Clerk · auth + orgs
· Stripe · billing
TWEAK
The processor MUST be Stripe — every downstream node obeys.
Regenerate downstream
Accept node
CLARIFYING QUESTIONS
Which auth provider should the Security node assume — Clerk, Auth0, or roll-your-own?
Switch a node to A/B an upstream chain. Branches don't clobber — pick which one flows through, per target.
Interim rendering — replace with a captured Flow-tab screenshot
Grounded, not guessed

Each node reads its upstream nodes. Architecture knows your Plan; Spec knows your Architecture. The agent never has to reconstruct intent from a scroll of chat.

Non-destructive

Tweak, switch, or A/B any node. Nothing overwrites — downstream nodes re-derive on demand, so exploring an alternative never costs you the plan you had.

Ready for the agent

Accept freezes the plan on the Out node and hands the aggregated markdown to a build session — Claude Code, or whichever model you've wired up.

Bring your own AI. Pick your model per project, switch anytime, no lock-in.

Claude Code, OpenAI, Anthropic — or a local runtime if you don't want inference happening in anyone's cloud. The vault and the graph behave the same either way.

Claude Code
OpenAI
Anthropic
Local runtime
The problem

You're building with AI. Your keys are one prompt away from the model.

Every AI editor and cloud IDE treats secrets like source code. Your .env is just text on disk — and the moment you say "read the codebase and fix this," you've handed the agent every key inside it.

Fine for test keys. A liability the moment a real payment processor, a customer warehouse, or a production auth provider is on the other end.

.env
STRIPE_SECRET_KEY=sk_live_7Qf…
DATABASE_URL=postgres://…
OPENAI_API_KEY=sk-proj-a91…
unknown model · cloud inference
Reading your repository — including .env — to resolve the issue…
Pillar 02 · Vault

Keys and .env, used but never exposed.

Credentials live in the OS keychain — Windows Credential Manager, macOS Keychain, Linux Secret Service — not in files the agent can read. Marline injects them into your build and dev processes; the agent only ever sees a manifest of which credentials your project needs and which are set. Never the values.

WHERE A KEY GOES
You enter a key
Typed once, into the Vault tab
OS keychain
The only place the value ever lives
SQLite mirror
Presence flag + 8-char SHA-256 fingerprint. Nothing more.
Agent context
Sees { present: true } — never the value
The AI knows a key exists. It never sees the value.
Vault 4 REQUIRED · 2 SET
OPENAI_API_KEY
platform.openai.com/api-keys
validated ✓
DATABASE_URL
neon.tech · fingerprint 9f3c…
set
STRIPE_SECRET_KEY
dashboard.stripe.com/apikeys
empty
RESEND_API_KEY
resend.com/api-keys
empty
Generate env files
Run preflight
Generated on demand

.env.local, .env.example, and .env.production.template are built from the vault at build time — gitignored by default, never sitting on disk waiting to leak.

Injected, never in context

Values flow into the process environment your dev server and build see — and stop there. They're never placed in the model's context window, no matter which provider you're routing through.

Pillar 03 · Preflight

One check before you build.

Preflight walks the whole plan and confirms you're set up for success: every required credential present, env files generated, nodes accepted, dev stack resolved. If something's missing it tells you exactly what — before the agent burns a single token.

Preflight · build readiness 6 CHECKS
Plan accepted
Architecture grounded
Env files generated
OPENAI_API_KEY present
STRIPE_SECRET_KEY missingAdd in Vault →
Dev stack resolved
5 / 6 ready · resolve 1 before build Run preflight
Merge
Preflight
BUILD READINESS
Interim rendering — replace with a captured Preflight screenshot
Every credential accounted for

Preflight cross-checks the manifest every node produced against what's actually in the vault, so a missing key surfaces here — not three minutes into a build.

Fix-it links, not error codes

Each gap comes with the exact place to resolve it — the Vault row to fill, the node to accept — so you're never guessing what "not ready" means.

Pillar 04 · Terminal

A real terminal. No JavaScript in the middle.

Marline's terminal is xterm.js on the surface and ConPTY on Windows / POSIX PTYs on macOS and Linux underneath — the same combination VS Code uses, wired directly from Rust. It's fast and lightweight, runs your real pnpm dev, and every edit the agent makes lands as a reviewable git diff.

powershell · marline/app
FlowEnvLiveDev
pnpm dev
 
> app@0.1.0 dev
> vite
 
VITE v5.4.2 ready in 412 ms
 
➜ Local: http://localhost:3000
➜ Network: use --host to expose
localhost:3000 detected · click to open
Claude changed 3 files
+ src/preflight.ts +41 −6
+ src/vault/store.ts +18 −2
+ .gitignore +3 −0
Revert all
Wired the fingerprint into the metadata mirror and gitignored the generated env files.
13,204 tokens $0.083 · reported
Wired straight from Rust

xterm.js + ConPTY / POSIX PTYs, driven directly by the Rust core — no Node.js process sitting between your shell and the screen. Low latency, small footprint.

Preview-URL detection

When your dev server prints a URL, Marline dedupes it and pops a clickable pill in the chat panel.

Inline cost, every turn

Token counts and per-turn cost on every assistant message. Claude Code reports it directly; others estimate from published rates.

Pillar 05 · Craft

And it's beautiful to use.

Marline is a native app that respects your attention. A quiet dark palette, considered typography, thin borders, and motion used with restraint — every surface is built to get out of the way so the work stays in focus.

Quiet by design

A restrained near-black palette, thin 1px borders, and generous whitespace. One mint accent, used only where it means something.

Two typefaces, on purpose

Inter for the interface, JetBrains Mono for code, credentials, and paths — so structure is legible before you've read a word.

Motion with restraint

Subtle status pulses and marching-ants wires signal live state — nothing bounces or spins for decoration, and it all honors reduced-motion.

Native, not a browser tab

Real window chrome and a single-digit-MB installer — a Tauri app that opens instantly and feels like it belongs on your desktop.

Who it's for
The non-engineer founder

You have an idea and a Notion doc full of thoughts. Marline turns them into a working app — visual planning first, then an agent builds it while you watch every diff. You'll touch code, but you're never asked to chmod +x anything to feel safe.

The engineer building agentic tools

You want an IDE that treats credentials like credentials, not like source code. Get everything Claude Code gives you — plus the vault, the visual planner, and a real workspace with split panes, a terminal, and inline diffs.

Under the hood
Tauri 2 · Rust + React
SQLx + SQLite
OS keychain
React Flow
xterm.js · ConPTY
CodeMirror 6
Marline

We built Marline because we wanted a place to plan that isn't a chat box — and an IDE that treats secrets as a default, not an add-on.

Jordan Wright & Eric Liss · CTRL Colab

Plan it as a graph. Build it with any AI.

Download Marline, plan your app visually, and keep your credentials where the model can't read them.

Download for macOS Windows Linux · AppImage
Mac + Windows builds signed · checksums on the download page