Booking from October 2026Two projects at a time—that's the whole shop

Comfusion, a one-person shop

Get off WordPress. Keep your site.

I'm Josh. I move WordPress sites onto EmDash, an Astro-native CMS that runs on Cloudflare's edge. Your content, your URLs and your theme's look come with you. The plugin update treadmill does not. Seventeen years of shipping, most recently as a principal engineer, and you talk to me, because I'm the one writing the code.

No discovery call, no sales deck. A real reply from me, within one business day.

  • Your repo, your accounts
  • Prices on the page
  • No cookies, no analytics
What changes

Fewer moving parts, and a stack you can read.

What actually changes when you move off WordPress, and what it costs you to find out I am wrong.

0plugins to keep patched after migration

Nothing to update on a Tuesday

WordPress sites rot because every plugin is someone else's release schedule and someone else's CVE. EmDash is one dependency tree you own, deployed from your repo, so the patching you inherit is yours and small.

Live in production: chicagoganghistory.com

~190 msTTFB to bravada.comfus.io, warm, measured from Singapore

Served from the edge, priced like static

Static where it can be, dynamic where it must be, running on Cloudflare's network instead of a PHP host in one region. Fast from everywhere, and cheap enough that hosting stops being a line item worth discussing.

Measured on bravada.comfus.io

GPL-3.0on the Bravada port, because the theme it came from is GPL and a port inherits that

Your repo, your accounts, your licence

Open source top to bottom, committed to your repository, deployed to your Cloudflare account. No proprietary CMS licence, no per-seat pricing, no vendor who can raise your rent. If you fire me on a Friday, it still deploys on Monday.

github.com/vhscom/emdash-theme-bravada

17 yrsshipping software; 123 tutorials published in public

One person, and it's the one you emailed

No account manager relaying your requirements into a ticket, no junior learning TypeScript on your budget, no handoff between the person who sold it and the person who builds it. Ten years at senior, then principal, and the same pair of hands does your migration. The trade-off is capacity, which is why the availability date at the top of this page is real.

vhs.codeberg.page
The work

Everything here opens in a browser.

Links, not adjectives. They come this early because they are the part worth reading.

123
tutorials published in public
1,000+
GitHub stars earned across projects
17
years shipping software
1
person you will ever talk to
Live siteIn production

chicagoganghistory.com

A WordPress site I used to run on hardened Kubernetes, now migrated onto EmDash and serving from the edge. Same content, same URLs, no wp-admin. I maintained the WordPress build before I replaced it, so the before-and-after is one person's work.

Live siteGPL-3.0 · open source

bravada.comfus.io

The Bravada WordPress theme, ported to Astro and EmDash. GPL-3.0, inherited from the original, which is how theme ports work. This is what one looks like finished: same design language, none of the PHP.

Source80 ★

vhscom/private-landing

An auth reference implementation for Cloudflare Workers—Hono, Turso, PBKDF2, dual-token JWT sessions. Written to be read. It's the repo people star, which tells you where my head is on security.

Source431 ★

fetch-inject

A 2017 loader that inlines CSS and JS with fetch, in about a kilobyte. Hyperdrive, the WordPress plugin that wraps it, is mine too: I tuned WordPress from the inside before I started moving people off it. The star count is Libraries.io's record, not my own tally.

Source51 ★

vhscom/svelte-headlessui-starter

A Svelte + Headless UI starter that other people build on. Boring, maintained, and still getting stars years after I wrote it.

Writing123 posts

vhs.codeberg.page

123 published tutorials on engineering, security and tooling, going back years. The fastest way to find out how I think before you pay me to think.

SourceThe before picture

vhscom/chicagoganghistory-helm

The Helm chart and Ansible that ran the hardened WordPress before the migration. Proof that "get off WordPress" is advice from someone who operated it in production, not someone who never learned it.

No client quotes here yet. I could write four of them and sign each one "CTO, SaaS company"—you would know, and so would I.

So instead: the work is above, the code is public, and my name is on all of it. If you want to talk to someone who has hired me, ask in the form and I will put you in touch directly, before you commit to anything.

Counts checked 15 August 2026. The star totals above span seventeen years and two forges: most of the older work was published under a GitHub account that no longer exists, and the mirrors at github.com/vhscom hold only what was republished after the move to Codeberg. Every card here links to something you can open today.

Before you write to me

The half of this you won't get from a pitch deck.

I would rather lose the enquiry today than lose your third month. The second list matters more than the first.

Worth writing to me about

  • You have a content site on WordPress that has become a chore

    Blog, publication, documentation, portfolio, brochure site. Posts, pages, media, categories, redirects. This is the case I have done end to end and can quote with confidence.

  • You want the code in your repo, under a licence you can read

    Everything ships to your GitHub and your Cloudflare account. You can read every line, fork it, or hand it to someone else. That is the default, not an upgrade.

  • You can make a decision without a committee

    Founders, solo operators, small teams, one technical person with a budget. My whole cost advantage comes from not attending your steering meetings.

  • You'd rather read a written scope than sit on a call

    I work from UTC+7, mostly async, in writing. Calls happen when they are genuinely faster, which is not as often as it is made out to be.

Don't hire me for this

  • You need WooCommerce, memberships, or forty plugins ported one-for-one

    EmDash isn't there and I won't pretend otherwise to win the job. If your revenue runs through WordPress checkout or gated membership tiers, staying put is the correct answer and I'll say so in the first reply.

  • You need five people starting Monday

    I'm one person taking two projects at a time. If the deadline needs a team, an agency is the right call, and I'm happy to name a couple I'd trust.

  • You want someone to own your marketing

    I do engineering. I'll build the thing, make it fast, and wire the analytics if you want them. I won't run your funnel, write your ad copy, or promise you rankings.

  • The lowest quote wins

    There will be cheaper quotes, and some of them will be fine. If price is the deciding variable, we'll both save time by finding that out today.

What it costs

Prices on the page, like a menu.

You shouldn't have to sit through a call to find out whether you can afford me. Every band below is a starting point; the fixed number lands in your written scope.

Fixed-fee where the work can be specified, day rate where it can't. No retainers you can't cancel, no minimum term, no invoice for the time it takes to write your scope.

How the work runs

From signed scope to your keys.

None of it should surprise you. That is the point.

  1. 01

    The scope is written down first

    What I'll do, what it costs, what I won't do, and what could make the number move. You read it before you pay anything, and you keep it either way.

    Days 1–4
  2. 02

    Work lands in your repo from day one

    Your GitHub, your Cloudflare account, a preview URL you can open any morning. Commits you can read. No big reveal at the end, because a big reveal is where budgets go to die.

    Weeks 1–4
  3. 03

    Cutover is boring on purpose

    The old site stays live until the new one passes: redirects mapped, feeds intact, nothing 404ing. We flip DNS when it's dull, not when it's due.

    Launch day
  4. 04

    You get the keys and the manual

    Everything on your accounts, a written runbook, and a walkthrough recorded so the next person doesn't have to ask me. Keep me on, or don't—both are normal.

    At launch
After you hit send

Exactly what happens next.

The most common reason a good enquiry never gets sent is not knowing what it sets off. So here is the whole sequence, before you type anything.

  1. Instantly
    You get a reference code

    Something like CF-4B21A9E0. Your message is written to a database I run, not posted to a form service. Quote the code in any follow-up and I can find the thread immediately.

  2. Within 1 business day
    A reply from me, written by me

    Written by me, from my own mailbox. josh@comfus.io only forwards, so watch for a reply from an address you won't recognise. Not an autoresponder, not a calendar link, not "a member of the team will be in touch". Usually questions, sometimes an immediate "this isn't a fit, here's who I'd ask".

  3. Days 2–4, if it looks like a fit
    A written scope, free, and yours to keep

    What I'd build, what it costs, what I'd leave alone. It's a real deliverable and it takes me most of a day. Take it to another developer if you want a second quote. That's a legitimate use of it.

  4. Then it's your move
    No sequence, no nurture, no chasing

    You are not added to a list. If you go quiet, I send exactly one note two weeks later, and then nothing ever again. Silence from you is an answer and I'll treat it as one.

Haven't heard from me in two business days? Something ate it. Email josh@comfus.io directly and quote your reference code.

Start here

Tell me what you're running.

Three required fields. No account, no funnel, no obligation. Just a direct line to the person who would do the work. "Our WordPress site is slow and I'm scared of the update button" is a complete and useful first message.

Saves us both a round trip. Leaving it blank is fine and costs you nothing.

Only if you'd rather talk than type. I won't ring you out of the blue.

Reply within one business day, written by me. It won't come from josh@comfus.io, so watch for an unfamiliar sender.