← All work

OkenDesk.
The website a small business can actually run.

A managed platform for service businesses: a bespoke site, an AI concierge that answers visitors and takes the booking, an owner panel that edits the site by conversation, and a content engine that writes the blog and the social posts in the brand’s own voice.

Role
Sole engineer
Delivery
Production one command deploys
Codebase
13,449 lines of JavaScript · 45 modules
Architecture
Multi-tenant one container · one volume
The OkenDesk blog panel in dark mode, showing the idea generator with a rough-direction field and photo tray, and a list of published and draft posts

The blog panel · what to write next, then the posts themselvesFig. 01

The data in every screenshot here is a demonstration set. The bakery, its pages, its posts and its enquiries were invented for these captures, and none of them is a real client.

Overview01

Small service businesses buy a website and then cannot touch it. The person who built it has moved on, the CMS is a filing cabinet nobody opens, and the blog stops three posts in. Meanwhile the phone rings while they are up a ladder or under a sink, and the enquiry goes to whoever answered first.

OkenDesk is one platform behind all of it. Each client gets a bespoke site, not a template recolour, plus an owner panel: an AI concierge that answers visitors in the brand’s voice and books the job, field-by-field editing of every page, a blog that proposes what is worth writing and drafts it, and a studio that produces social graphics in the brand’s own typeface and palette.

Every client configuration runs in production from one container, with one volume behind all of them. The heavy model work happens once, at setup, and the assistant a visitor actually talks to is kept small and fast.

The calls I made02
01

Facts may be asserted. Material may not.

Everything the AI knows about a client is split in two. A fact is a claim the business will stand behind being told to a stranger; it is confirmed by a human and it is short. Material is raw: notes, transcripts, what was visible in a set of photos. The concierge reads facts only; the writing tools read both. Without that line an accumulating brain becomes a fabrication engine that grows more confident over time, and one stray sentence in one note turns into a promise made to a customer. Only one fact per subject is ever live, so a contradiction is raised to the owner instead of quietly overwriting the old answer.

02

Show the model the artwork, never the name

Asked for a brand’s typeface by name, an image model draws whatever “a grotesque” means to it. Shown a specimen sheet rendered from the client’s real font file, it matches the letterforms. The same holds for a logo: passed as text it comes back re-lettered in a face nobody chose; passed as pixels it is reproduced. Both now reach the model as images, which is what moved the output from close enough to the client’s actual brand.

03

When the output is wrong, find the instruction that disagrees

Every bad result in the image pipeline turned out to be two instructions arguing, not one instruction being too soft. Posters invented festival laurels because the prompt said to carry over every structural device and never said that a credential is a claim. Brand marks went missing because a saved look carried six reference images that crowded the logo out. Type sat meekly beside the picture because a rule written to stop the model spelling badly also said “never a poster”. The fix each time was to delete or reconcile the competing line, never to write a firmer one.

04

Never auto-publish

The content engine drafts; a person publishes. Scaled AI content is the single thing search engines penalise hardest, and a local trades site has less domain trust to spend than almost anyone. So the owner finds a finished draft waiting and still presses the button, every post carries a human’s own take as its point of view, and a week with nothing worth saying publishes nothing.

05

Two kinds of site, one seam

Some clients have a themed site whose content is structured data; others have a bespoke hand-built page later mapped into editable fields. Those are genuinely different things underneath and always will be. What matters is that the difference stops at one module: everything above it asks for list, save and remove, and that module knows which store it means. Before the seam existed the blog editor only worked on one of the two, so most clients had no way to reach their own blog at all.

Editing03

A bespoke page, made editable field by field.

A hand-built site has no CMS behind it. A model reads each page once and identifies what a business owner would want to change (a headline, a price, a photograph) and the page becomes a template with named slots. One client’s site resolves to 1,102 editable fields across 104 pages; another to 478 across seven.

The owner can also just describe the change. “Make the hero headline warmer” is rewritten in their brand voice and shown to them before anything goes live.

The OkenDesk site editor in dark mode, showing the conversational edit bar, a page picker, and the fields for the selected page

The site editor · one page at a time, with a search across all of themFig. 02

That editor used to render every page at once. On the largest site it stood forty-seven thousand pixels tall: sixty-five screens, 69 cards and 473 inputs in a single column, with four headings called “Footer” and nothing to say which page you were on. A site is pages, so the editor is pages: one screen, and a search that matches both a field’s name and the words currently in it, because someone hunting for a line remembers what it says rather than what it was called.

The rest of the platform04

Concierge

Answers in the brand voice
Reads confirmed facts only
Takes the booking
Email and SMS alerts

Brand brain

Facts, confirmed one at a time
Material for texture
Contradictions raised, not merged
Nothing is ever deleted

Content engine

Proposes what is worth writing
Drafts from photos and notes
Links only to pages that exist
A person publishes

Studio

Social graphics on brand
Real logo, real typeface
The client’s own material in frame
Credentials never invented

Availability

Working days and hours
Lead time and blocked dates
The visitor sees real slots

Storage

Client assets in object storage
Not bound to one host account
A lost disk rebuilds from the bucket

Built with05

Server

Node, no framework
Plain HTTP handlers
45 modules · 13,449 lines

Models

Claude for text and vision
gpt-image-2 for artwork
A small model on the hot path

Rendering

Headless Chromium for type
sharp for compositing
The brand’s real font file

Front end

One hand-written HTML file
Vanilla JavaScript
Nothing to build

Deployment

Docker on Railway
One volume for all state
Cloudflare R2 for client assets

Built solo. The design decisions above are written up in the repository as they were made, including the ones that were wrong first: the prompt rules that argued with each other, the crop nobody needed, and the editor that grew to sixty-five screens before anyone said so out loud.

On a phone06

The whole panel, on the device it gets used on.

The owner of a bakery is not at a desk. The same panel, every tab, the full editor, the concierge settings, the enquiries, all run on a phone in dark mode, because the moment someone actually wants to answer an enquiry is the moment they are standing somewhere else.

The OkenDesk blog panel on a phone in dark mode, showing the idea generator and the post list

The blog panel on a phoneFig. 03