Case study — 2026-10-15

Five agents, three sites, one afternoon

Three production websites for one owner, built in a single afternoon by role-specialised agents driving the opencode CLI.

A project log — including what broke

01

The job

Three production websites, one owner, three domains, one afternoon.

The brief was to build three sites for a single owner across three domains. Each was to be delivered as a single self-contained HTML file: no framework, no build step.

deucelenon.com
Global hub, technical positioning.
deucelenon.it
Italian agency page for local hospitality businesses.
deucelenon.info
A public engineering lab and build log.
Delivery format
One self-contained HTML file per site — no framework, no build step.
02

The method

An orchestrator decomposed the work, then spawned role-specialised agents.

Each agent drove the opencode CLI (model: deepseek-chat) to generate its artifact. Agents were split into three lanes — copy, visual and technical — and each lane wrote to its own file so lanes never collided.

The parent agent then merged the slices by hand: one lane's <head>, one lane's CSS, one lane's text.

Orchestrator
Decomposed the work and spawned role-specialised agents.
Runner
opencode CLI, model deepseek-chat.
Lanes
Copy, visual, technical — each wrote to its own file.
Merge
Parent merged one lane's head, one lane's CSS, one lane's text.
03

Design exploration

Five distinct visual directions were generated for the same content.

The owner chose the directions; three were taken forward as the final doors.

  1. A1 Dark technical
  2. A2 Bold editorial
  3. A3 Terminal / IDE
  4. A4 Swiss minimalTaken forward as one of the final doors.
  5. A5 Creative 3D

Five directions, three doors. The other two directions were not taken forward.

04

The measured result

Three finished sites, about 96 KB in total.

Measured — on the day
3 Finished sites
~96 KB Total, all three
6 Hostnames serving
0 External deps
deucelenon.com
~30 KB.
deucelenon.it
~44 KB.
deucelenon.info
~21 KB.
Total
About 96 KB for all three — no frameworks, no external fonts, no images.
Serving
All deployed behind Caddy with automatic HTTPS; six hostnames serving (three apex + three www).
Production platform
The owner's existing production platform on the same VPS was left untouched and stayed healthy.

The stack: multi-agent runtime on a self-hosted, isolated arm64 Android chroot; opencode CLI driving DeepSeek; static single-file output; Caddy with automatic TLS on a 1-core / 1.8 GB VPS.

05

What went wrong

Five real failures. This section is the point of the piece, not a footnote.

Every one of these happened on the day. Each is listed with what it cost and what it taught, because the failures are where the useful information lives.

01

Shared SQLite lock

Five opencode runs were started concurrently on one host. One agent's first attempt failed with “database is locked” because a sibling run held opencode's shared database.

After the lock cleared, the retry succeeded first try.

Lesson opencode is not safely parallel across multiple instances on one machine.
02

A stuck process

One opencode run hung for roughly an hour and produced no output at all. It had to be killed manually.

Lesson Always bound a generation run with a timeout.
03

A missing dig binary gave a false negative

A DNS check reported nothing resolving, which nearly caused a wrong conclusion. The real cause: the dig binary was not installed on the host, so every lookup silently failed.

Lesson A negative result from a missing tool is not evidence.
04

A visible skip link

An accessibility skip-to-content link was visible to every visitor, because the CSS hid .skip while the element used class="skip-link" — the rule never matched.

Lesson Verify that your hiding rule actually applies.
05

A no-JS reveal defect

Sections used an IntersectionObserver reveal that defaulted to opacity:0 with no fallback, so content stayed invisible when JavaScript was disabled.

Lesson Progressive enhancement is not optional.
06

What was verified

What was checked, as opposed to what was claimed.

Per site
Every site checked for a closing </html>, no invented facts, no external dependencies.
Live check
From the server, all three apex + www hostnames returned HTTP 200.
Regression check
The pre-existing production site still returned 200 and its admin redirect still returned 302.

The regression check matters most: the new work had to prove it had not disturbed what was already running on the same VPS.