Autonomous engineering platform · runs on your own GPU

Describe the problem.
Watch it get built.

Poiesis takes whatever a stakeholder already has — a requirements document, a whiteboard photo, a recorded call, three lines of text — and ten AI agents turn it into a deployed, browser-verified application. People decide at typed gates. Everything else runs on its own, with an audit trail back to the sentence that asked for it.

● No token bill: local models● Source-available: free to run in your organisation● Every screen opened in a real browser
DupeGuard · run b6c296c0 · qwen3.6 35B-A3B, local 00:00
Stage Intake—
Reviewer score —

A replay of the actual event log of the DupeGuard run — 1 h 52 min on a laptop GPU, compressed to a minute.

0stages, brief to release
0agents, each with one job
0typed human gates
0verification layers
1h 52mBRD to a working app (DupeGuard)
0tokens billed — the GPU's clock is the meter
Why it exists

The expensive part was never the typing.

An organisation with good engineers still loses most of its cycle time before anyone writes code: turning intent into something buildable, finding out what already exists, agreeing what "done" means, and getting a decision when the answer is genuinely ambiguous.

BeforeIntent to buildableA stakeholder's words become cited evidence, questions and a backlog.
BeforeWhat already existsA portfolio knowledge graph is searched before anything is designed.
BeforeWhat "done" meansAcceptance criteria, a computed verdict and a real-browser check.
PoiesisAutomates all three…and keeps a human exactly where a decision changes the outcome.

One user

The business stakeholder. There is no product-owner, scrum-master or engineer seat: if a role is needed, it is an agent, and its output is an artifact the stakeholder can read.

Reuse is enforced, not suggested

The Architect cannot design until it has asked the knowledge graph what exists — and must justify, in writing, every "build new". That rationale is stored and surfaces on the next run.

Verified, not just tested

Every increment is deployed and every screen opened — and used — in a real browser before a person sees the release decision. The release gate cannot offer "release" for an app that is not proven working.

How it works

A value stream of thirteen stages.

Click a stage. Each is a node in a LangGraph graph checkpointed in Postgres, so a run can sit paused on a gate for a week, survive a restart, and resume at the exact node.

The agents

Ten agents. One job each.

Each has one system prompt and a typed output. On local models every reply is decoded against its JSON Schema, so "the model returned malformed JSON" is not a failure mode. Hover or tap a card to see what each one refuses to do.

Governed autonomy

People at typed gates, not in every token.

A gate has a kind, a schema, a stated default and a recorded answer with an actor. Which gates stop for a person is policy in a domain pack, so the same engine runs at different levels of autonomy. Switch packs:

Repairs per story3
Automatic rework rounds1
Tester & pytestoff
Ship threshold60
Department librarynone

The verdict is arithmetic

The Reviewer scores five weighted dimensions; shipping is the score against the threshold plus a blocker check — not the model's opinion.

Verification

Nine layers between a model's code and your decision.

A story is not trusted because the model says it is done, nor because its own tests pass. Each finding goes back to the Developer as an instruction naming the file and what to do.

Architecture

Built from parts you can inspect.

Hover or tap any box. Three views: the platform, the application it generates, and the loop that makes every run better than the last.

The product

A control room for the whole value stream.

Real screenshots from a local installation — the console, and the application it built.

localhost:3000
Department libraries

A department's work, ready to compose.

What every finance or procurement application shares is written once, tested, and handed to each run: the records, two years of coherent data, the rules, the lifecycles, the dashboards and the screens people work on. A run spends its effort on what this organisation does differently. Finance and procurement is the first library; the next department is a directory with a manifest, not a change to the platform.

16standard entities, written by the platform itself
22tested rules, each with an id
31figures from one insight API
8dashboards, each a description
8work screens, each a description
27months of demonstration data

    localhost:8118

    Brought What the platform brings

    • The records: supplier, requisition, purchase order, goods receipt, invoice, payment run, contract, budget line and eight more, in the data model, the schema and the API.
    • The rules: three-way match, approval by amount, segregation of duties, budget availability, duplicate invoices, no order no pay, quotes by value, split orders.
    • The work: raise a requisition, raise and send its order, receive goods, match an invoice, propose a payment run, each through the record's lifecycle and refused with its rule.
    • An ERP connector, in its sandbox until credentials are set.
    • A guide for the people who use it: the process as a diagram, who does what, how a record moves, written by the application from what it is.

    Asked What a run adds

    • The organisation's numbers, set once: who approves up to which amount, what still matches, whether a budget warns or blocks.
    • The brief's own rules, under the brief's ids, calling the library's.
    • What each screen shows and to whom: which figures, which tabs, which actions, fixed to which team.
    • Whatever the library does not have: the organisation's own records and screens.

    What the first application taught

    ProcureDesk was built from a procurement brief on local models and sent round until it was right. Each round changed the platform, not the application. The Reviewer's score, round by round:

    Prompts are not enough

    Sent back for rework, the model repaired its own two-hundred-line screen three more times, with the one-line screen described in its prompt.

    Start from the library

    The platform shows the library's screen as the file to return, and never keeps a worse one: it stands in for a screen that fails.

    No check presses a button

    At 95, with every screen open, Approve answered 409 and "Create purchase order" created no order. Both screens were written by hand.

    Name the story

    A person who finds a button that fails says which story. That story alone is rebuilt, and the send-back is always accepted.

    What it did not do. The domain stage kept the library's starting rules, because each of the model's attempts at the brief's own scored worse. ProcureDesk therefore works to the library's approval limits and tolerances, not the brief's. Setting them is one call; getting a local model to write it reliably is the next thing to prove.

    Read how the finance library works, and how the next department is added →

    Case study

    DupeGuard: a 4,000-word BRD to a working app.

    A support desk loses a quarter of Tier 1 capacity to duplicate tickets. The BRD asked for duplicates to be detected as they arrive, the obvious ones closed with a reply naming the original, uncertain ones reviewed, outage clusters turned into known issues that deflect new reports — and every automatic action recorded and reversible.

    The run, stage by stage

    Minutes from submission, from the run's event log.

    0306090112
    90.8Reviewer score, 0 blockers
    10 / 10screens working in a real browser
    29 / 29BRD acceptance checks against the running app
    331tickets of demonstration history, 30% duplicates
    7 of 10stories right first time, no repair
    0hosted model calls

    Found What the run got wrong

    • Two red stories were the platform's fault. A screen's own confirm() was taken for the browser dialog; an endpoint that needs input was called bare and its correct 422 read as a crash. Both checks are fixed and covered by self-tests.
    • The screens worked; the rules didn't. Three stories each implemented the BRD's duplicate score differently, because each story is built in its own context. Precision was simulated.
    • The data was thin — no product areas, no customers, every ticket P3 — so the rules had nothing to show.

    Changed What was done about it

    • One duplicate engine with the BRD's 55/20/15/10 score, its reasons, and every rule — P1s never auto-closed, chains to the earliest original, known issues linking outage reports.
    • 30 days of history replayed through that engine: a Manchester outage, a billing run, chasers, known issues deflecting, six closures undone — and 22 fresh tickets for a live "Scan now".
    • Honest numbers: precision counts every undone closure; a threshold change is previewed before it is saved.

    Shared rules need one home

    The foundation stage should write the domain module the stories import.

    Checks must be fair

    A finding must name something the Developer can change.

    A working screen is not a working rule

    Acceptance criteria with numbers should run against the app.

    Replay, don't list

    Data generated by the app's own rules is consistent everywhere.

    Read the full case study →

    Local first

    Your brief never leaves the machine.

    On the local profile every agent runs on Ollama on your own GPU. Replies are constrained to each agent's schema at decode time, and one gate lets the model answer one call at a time — a build, a reseed and a code-map explanation never compete for the card.

    • No brief, document or line of generated code sent to a hosted model
    • Every model call kept with its prompt, reply and timing — a run's cost is a query
    • Hosted profiles (cloud, groq) are one setting away when quality matters more than sovereignty
    • Generated apps bind to 127.0.0.1: model-written code stays off the network

    The reference machine

    GPURTX 5070 Ti laptop · 12 GB
    Reasoning, coding, fastqwen3.6 35B-A3B (MoE, 3B active)
    Embeddingsnomic-embed-text
    Visiongemma4 12B
    Context window32k, sent with every call
    Brief to app (10 stories)1 h 52 min

    One model loaded, weights split across the card and system RAM, 1.5 GB kept free for the display driver.

    Built with

    Open, inspectable, replaceable.

    Get started

    From clone to your first run.

    Windows with Docker Desktop, WSL2 and an NVIDIA GPU is the reference setup. Expect about 55 GB of models the first time.

    1Clone and configure

    Point the sandbox at your workspaces folder as Windows sees it.

    git clone https://github.com/saurabh-oss/poiesis cd poiesis copy .env.example .env # POIESIS_WORKSPACE_HOST_ROOT

    2Start the models and the platform

    The script starts Ollama with the settings Poiesis needs.

    scripts\restart-ollama.ps1 docker compose up -d .\scripts\bootstrap.ps1 # models + portfolio index

    3Submit a brief

    Open the control room, describe the problem, attach the sample BRD.

    start http://localhost:3000 # docs/samples/BRD-SUP-2026-021_DupeGuard_v1.2.docx

    4Optional: boards in Plane

    Every idea becomes a project and board in a self-hosted tracker.

    copy infra\plane\plane.env.example infra\plane\plane.env # set the two secret keys docker compose -f infra/plane/docker-compose.yml --env-file infra/plane/plane.env -p plane up -d python scripts\plane-bootstrap.py docker compose up -d orchestrator