Powerful smart contracts in the hands of the consumer
Marlowe Run
The first consumer app for running financial smart contracts on the Cardano blockchain
Non-interactive demo showing the Marlowe Run flow: creating a wallet, setting up an escrow contract with defined roles, and stepping through the running contract to completion.
The problem
For most people, crypto does just three things: you buy it, you sell it, or you send it. The bigger promise of blockchain was always more than that. Two people could make a financial agreement that settles itself, with no bank in the middle. But that promise stayed locked behind developer tools and wallets that everyday users were never going to touch.
Marlowe Run set out to change that. The idea was simple. Let two ordinary people enter a real agreement, like a loan or an escrow, and have the smart contract hold the funds and enforce the terms on its own. No bank, no middleman, no code. The hard part was taking something genuinely complex and making it feel as simple and familiar as any app on your phone.
Meet the team
Forks in the road
Four moments Marlowe Run could have gone the wrong way. Each pivot pulled the work onto a better path for ordinary people making a real agreement.
-
Wallet-first vs agreement-first
ChallengeThe app opened on a wallet, not on the thing people came to do
- First build led with balances and a connect-wallet wall
- Users had to understand crypto before they could start an agreement
- The "make a deal with someone" job was buried two screens deep
Back on trackReframed around the agreement, not the wallet
- Home leads with "start a contract", the wallet recedes
- Demo wallet auto-generated so people can try before connecting
- Crypto mechanics deferred to the moment they actually matter
-
Blockchain language vs human language
ChallengeEarly copy spoke in protocol terms, not human ones
- Screens said "UTxO", "datum", "validator", "min-ADA"
- Loan steps were named after contract states, not user intent
- Testing showed people couldn't tell if they'd been paid
Back on trackA plain-English layer over the contract
- Every state mapped to a human sentence ("Alex has repaid you")
- Amounts in ADA with a fiat reference, fees explained inline
- Status copy written from the user's view, not the chain's
-
One generic flow vs role-aware journeys
ChallengeLender and borrower were forced through the same screens
- A single flow tried to serve both sides of the deal
- Each person saw actions that weren't theirs to take
- Confusion over "whose turn is it" stalled deals mid-flow
Back on trackSplit the journey by role and turn
- Each party sees only their next action
- A clear "waiting on the other party" state for the off-turn side
- Notifications nudge the right person at the right step
-
Real funds vs a safe demo on-ramp
ChallengeNew users had to risk real ADA to understand the product
- The only way in was a funded mainnet wallet
- High stakes for a first run of an unfamiliar concept
- Drop-off before anyone reached the self-settling "aha"
Back on trackA demo wallet to learn the loop risk-free
- One-tap demo wallet, pre-funded with test ADA
- The full happy-path loan runs before real money is involved
- The leap to a real wallet happens once trust is earned
Trade-offs
Not every problem had a clean fix. Four moments where the work meant choosing between two imperfect paths, and being honest about the cost.
-
Template library vs free-form agreements
ChallengePeople wanted any agreement, we could only safely ship a few
- Open-ended contracts meant unbounded edge cases
- Each new type multiplied states, copy and testing
- No way to guarantee safety on contracts we hadn't seen
AcceptedShipped a curated set of vetted templates
- Launched with loan and escrow only, tested end to end
- Closed off custom contracts despite clear demand
- Roadmapped a template gallery instead of an open builder
-
Honest fees vs a frictionless feel
ChallengeNetwork fees made a "free" agreement feel less clean
- Every on-chain action carried an unavoidable ADA fee
- Hiding it felt dishonest, showing it added friction
- Min-ADA rules confused people expecting exact amounts
AcceptedChose transparency over a frictionless illusion
- Fees surfaced before each confirm, with a one-line "why"
- A small buffer in balances so amounts never surprised
- A slightly heavier flow, in exchange for trust
-
On-chain speed vs the feeling of "done"
ChallengeSettlement isn't instant, but users expect app-speed
- Confirmations take real time on the chain
- A storyless spinner felt broken to app-trained users
- "Did it work?" anxiety at the high-stakes moment
AcceptedDesigned the wait instead of hiding it
- Optimistic UI shows intent immediately, then confirms
- Honest progress states narrate what the chain is doing
- "Settled" lags "submitted", and we said so plainly
-
Custodial convenience vs self-custody integrity
ChallengeHolding keys for users would have been far simpler
- Self-custody puts seed phrases and recovery on the user
- A custodial model would remove the scariest steps
- But it betrays the whole point of a trustless agreement
AcceptedKept self-custody, softened the edges
- Stayed non-custodial despite the easier path
- Invested in clearer key and recovery education in-flow
- Higher onboarding effort, in exchange for real control
Marlowe Play
The cloud-based IDE where developers author, simulate, and ship Marlowe smart contracts
Non-interactive demo showing an escrow contract being authored across the Marlowe, Blockly and Flow editor views, then simulated step by step and published to the contract library.
The problem
A smart contract is only as useful as the people who can build it. On Cardano, that meant specialist skills and a local toolchain just to get started. The gap between an idea and a working contract was a wall most people never got over.
Marlowe Play set out to lower it. It gave developers a browser-based IDE where they could author a financial contract, simulate it step by step to see exactly how it would behave, and publish it. Nothing to install, nothing to set up. Building on Cardano became something you could just open a tab and do.
Forks in the road
Four moments Marlowe Play could have gone the wrong way. Each pivot pulled the IDE onto a better path for the people meant to build on it.
-
Code-first vs visual-first authoring
ChallengeThe IDE assumed everyone wanted to write Marlowe by hand
- The first cut centred a raw Marlowe code editor
- Non-Haskell developers bounced off the syntax
- The "anyone can build a contract" promise stayed theoretical
Back on trackMultiple linked views onto one contract
- Added Blockly so logic is assembled, not typed
- Code and blocks stay in sync, edit either side
- Lowered the floor without lowering the ceiling
-
Three views vs two that earn their place
ChallengeMarlowe, Blockly and Flow each competed for the canvas
- A third "Flow" diagram sounded helpful on paper
- In testing it duplicated Blockly without adding clarity
- Three synced representations tripled the build cost
Back on trackCut Flow, doubled down on Marlowe and Blockly
- Dropped the Flow view before it shipped
- Put the effort into two views that are genuinely reliable
- A simpler model: read it, or build it
-
Deploy-to-test vs simulate-in-place
ChallengeThe only way to see behaviour was to deploy and watch
- The early flow pushed contracts on-chain just to observe them
- A slow, costly loop for something you repeat constantly
- Mistakes only surfaced after real deployment
Back on trackA step-by-step simulator inside the IDE
- Simulate the contract as the consumer would experience it
- Step through deposits, choices and payouts before publishing
- Catch logic errors in seconds, not on-chain
-
Silent failure vs teaching errors
ChallengeInvalid contracts failed without saying why
- A bad contract simply refused to run
- Errors pointed at internals, not the line you wrote
- Developers couldn't tell a typo from a logic flaw
Back on trackErrors and warnings that point at the cause
- Syntax errors surfaced inline at the offending line
- Warnings flag risky-but-valid choices before simulating
- The simulator halts loudly and explains what broke
Trade-offs
Four moments where building the IDE meant choosing between two imperfect paths, and being honest about what the choice cost.
-
Browser convenience vs local-toolchain power
ChallengeA cloud IDE can't match a full local dev setup
- Serious devs expect their own editor, plugins and shell
- The browser sandbox limits what we can offer
- Heavy contracts strain an in-tab environment
AcceptedOptimised for the first contract, not the thousandth
- Prioritised zero-setup onboarding over pro-grade depth
- Accepted a ceiling on advanced local workflows
- Bet that "open a tab and start" wins more people in
-
Guardrails vs expressive freedom
ChallengeSafer contracts meant fewer ways to write them
- Constraining the language prevents whole classes of bug
- It also blocks clever, valid patterns devs might want
- Marlowe's safety is both the point and the limitation
AcceptedKept the guardrails, made them legible
- Leaned into Marlowe's bounded, analysable design
- Explained why a pattern isn't allowed, not just that it isn't
- Less expressiveness, in exchange for provable safety
-
One simulated path vs every possible path
ChallengeA contract branches more ways than anyone can click through
- Simulating one journey proves it runs, not that it's correct
- Walking every branch is overwhelming in a UI
- False confidence if people test only the happy path
AcceptedMade the happy path easy, flagged the rest
- Designed a fast, clear single-path simulation
- Surfaced static-analysis warnings for unhandled cases
- Full verification lives beyond the simulator, and we said so
-
Polish vs shipping while the language moved
ChallengeMarlowe itself was still evolving under the IDE
- Building UI on a spec that kept changing
- Polish risked becoming rework on the next language shift
- Waiting for stability meant shipping nothing
AcceptedShipped against a moving target, kept it modular
- Released early to learn from real authors
- Kept views loosely coupled so language changes stayed contained
- Ongoing churn, accepted as the cost of being first
What didn't make the cut
Video-led onboarding
The first splash tried to onboard people with a video, written explanations and blockchain terminology. It read like a product tour, not an invitation. In testing, people skipped straight past it: nobody played the video or touched the helper text, so we stripped the onboarding back to only what they actually used.
What didn't make the cut
-
Video-led onboarding
The first splash tried to onboard people with a video, written explanations and blockchain terminology. In testing they never played the video or touched the helper elements, so we stripped the onboarding back to what they actually used.
-
A three-icon dashboard
An early dashboard used three icons in the bottom bar. People kept getting lost, so we moved every key tab into a single labelled menu rail along the bottom.
-
Both roles, one card
Early concepts cluttered the card. The status sat in a separate element that had become obsolete, and both role icons showed at once. We stripped it back to only what each person needed to see.
-
A payment drawer
The payment summary first slid in as a right-hand drawer, dense with icons. It cluttered the UI and felt intrusive, so the final design used a calmer, centred modal instead.
Retro
I'd have got Marlowe Play in front of more external developers. We only had time to properly usability-test the Marlowe Run app, so the IDE leaned on feedback from the developers on my own team.
They were the primary audience for Marlowe Play, so it was a fair enough fallback. The catch is that they already knew the product inside out, which made them biased. A few sessions with developers meeting Marlowe for the first time would have told us far more about where the authoring experience really tripped people up.