v0 · pre-seed · studio open to select engagements
Infrastructure as craft.
Protoworks is a one-person engineering studio. The work is backend systems, devops tooling, build systems, and the architectural scaffolding other engineering teams stand on.
Three ventures in build, no outside capital yet. The studio takes a small number of engagements alongside them.
12 yr
shipped systems
3 ventures
in build
Typed core
ports & adapters
Pre-seed
stage
In build
What the studio is building.
- Pre-seedIn build
Strand
Studio memory for hairstylists — client history, colour formulas and pricing captured by voice note between appointments, so the admin never needs a desk.
strand.style
(opens in a new tab)expo · react native · typescript
- Pre-seedLive
Ice Cream Boets
Storefront and back office for an ice-cream company: a server-rendered public site over a headless CMS, with the pricing and opening-hours logic shared between them.
icecreamboets.com
(opens in a new tab)astro · payload · postgres
- Pre-seedLive
Protoworks Defence
Live-ops capability for defence and security operators — ISR, GeoINT, force management and sensor fusion, presented as a command surface rather than a brochure.
defence.protoworks.dev
(opens in a new tab)next · cloud run · terraform
Capability
What the studio builds.
Backend systems
Event-sourced services with clean cores. Pure logic at the centre, adapters at the edges, illegal states designed out.
services · apis · data
Devops & landing zones
Reproducible cloud foundations. Environment isolation, composable modules, changes applied in dependency order.
terraform · cloud · iac
Build & monorepo tooling
Task graphs that survive large multi-language monorepos without ceremony. Remote cache, hermetic builds, the smallest useful seam.
moonrepo · remote cache
Developer tooling
Internal CLIs, platform surfaces, and the tooling that pays back its build cost in the first quarter.
clis · platforms
Fragment
A small piece of the work.
core/src/decision.rs
rust · 22 lines
// Pure decider: (state, command) -> events.
// No IO. No clock. Adapters run the loop at the seams.
pub enum Command {
Open(AccountId),
Post(Posting),
Reverse(EntryId, Reason),
}
pub enum Decision {
Accepted(Vec<Event>),
Rejected { because: RejectReason },
}
pub fn decide(state: &Ledger, cmd: Command) -> Decision {
use Command::*;
match (state.is_open(), cmd) {
(false, Post(_)) => Decision::Rejected { because: RejectReason::Closed },
(true, Post(p)) => Decision::Accepted(vec![Event::Posted(p)]),
(_, Open(id)) => Decision::Accepted(vec![Event::Opened(id)]),
(true, Reverse(e, r)) => Decision::Accepted(vec![Event::Reversed(e, r)]),
_ => Decision::Rejected { because: RejectReason::Illegal },
}
}Writing
Notes from the workshop.
2026 · draft
soonOn accidental coupling at the build-graph layer.
Why a build graph that knows everything tends to know it twice, and what to put behind the seam.
notes / build-graph-coupling.md
2026 · draft
soonHexagonal cores in a single-binary service.
A service shaped like a hexagon: pure logic in the centre, adapters at the rim, one binary out the door.
notes / hexagonal-cores.md
2026 · draft
soonLanding zones that compose.
Primitive, service, blueprint — a three-tier composition that survives the third environment without rewrites.
notes / landing-zones-compose.md
Studio
A one-person workshop.
Protoworks is a one-person engineering studio. Twelve years of shipped systems behind it: control planes, ledger cores, and build infrastructure that other teams keep using after the engagement ends.
Most of that capacity currently points at the studio’s own ventures — Strand, Ice Cream Boets, and Protoworks Defence — all pre-seed. The remaining time goes to a small number of outside engagements, usually multi-quarter, usually on the load-bearing layer other teams build on.
2 engagements
capacity
~3 per year
cadence
12 yr
shipping
Get notified
A note when something ships.
occasional notes when something ships · unsubscribe in one click
Contact
Reach the studio.
notes
protoworks.dev/notessoon