“Change the hours to 9 to 5 on Saturday.”✓ Draft updated, logged
Meet Brayden
I build and run production marketing sites end to end, from content modeling and components
through deployment, performance and the tools people use to update them. Most of it runs on
Cloudflare in strict TypeScript.
For nine years I’ve worked as a maintenance technician on an injection-molding floor, where
downtime costs money by the minute. I bring the same habits to software: find the root cause,
check the fix under real load, and add a check so it stays fixed.
TS
CSS
CMS
LCP
One little portfolio.
Real projects for real businesses, most of them live today. Open any card to see what made it hard.
01Brave Lizard Tactical
Chat CMS
A range owner types what he wants changed in plain English. A Cloudflare Worker runs a Claude tool loop that turns the request into WordPress REST calls, so he never opens WP admin. It has three tabs: Chat, Activity Log and a recurring Checklist.
What made it hard
The model is never the security boundary. Every write goes through a server-side validator (scoped CSS only, no scripts or iframes, embed allowlist), deletes can only go to trash and need an explicit confirmation, and the endpoint list is structural, so pages, posts and media are the only things it can reach. The host's bot wall then blocked the Worker's rotating IPs. I proved it with a matched test (same request, only the source IP differed), routed traffic through a small static-IP proxy, and got that IP allowlisted.
Cloudflare Workers
Anthropic tool use
WordPress REST
Cloudflare Access
Airtable
02ClearPoint Aero
Counter-drone marketing site
A 7-page site for a counter-drone company, built as a small component system: shared header, nav, FAQ, breadcrumb and CTA partials, with JSON-LD generated from the same data as the markup so the two cannot drift.
What made it hard
The client's CMS strips every script, so the mega-nav, a five-step process explorer and the mobile menu work with CSS alone, using :has(), native <details> and grid-row animation, with a plain-link fallback. A flex-basis bug bit twice. When a row stacks into a column, flex-basis starts sizing height, which left image wells 0px wide. I checked it with live DOM measurements at 360 to 1440px and made sure every page cleared WCAG AA contrast.
HTML
Modern CSS
Python build
JSON-LD
Cloudflare Pages Functions
03SEO Ops
Multi-agent SEO pipeline
Five Workers stages: Collector, Analyst, Planner, Verifier and Doer. They pull DataForSEO, PageSpeed (LCP, INP, CLS) and Search Console data, write findings and severity-ranked action items to Airtable, and draft pages that publish only after a human clicks Approve on a dashboard.
What made it hard
Keeping it honest. Each action item has to link back to a finding, and the Verifier stage writes a pass or flag verdict with grounding notes before anything reaches the approve queue.
TypeScript
Cloudflare Workers
Cloudflare Pages
Airtable
DataForSEO
PageSpeed API
GSC
04Personal tool
Ops Tasks PWA
A mobile task app built in Next.js 14 and React. You type a rough idea, an agent turns it into structured tasks, and the app installs to the home screen.
What made it hard
Model output is never trusted as state. Replies end in fenced JSON blocks that the client parses, checks field by field against enums and then applies. The API key stays server side behind an edge route, and I got next-on-pages running on Cloudflare after pinning around a version mismatch.
Next.js 14
React 18
Edge runtime
PWA / service worker
Cloudflare Pages
05Kalama Silvas
Wix to Cloudflare migration
Rebuilt a hospitality design and procurement firm’s site as a static build on Cloudflare Pages, moved the domain off Wix with 301s for every old URL, and set up Search Console.
What made it hard
After launch, a duplicate preview domain was fully indexed and an iframed brochure gave Google credit to the wrong URL. I found it with URL Inspection, then fixed it with noindex headers, a proper URL for the brochure, and a verified property so the removal would stick.
Cloudflare Pages
Static HTML/CSS
Search Console
Redirects
06SEO Ops
Secrets vault + MCP server
An AES-GCM encrypted secrets vault on Workers KV with a remote MCP server in front, so AI tools can fetch a credential without me pasting it into chat.
What made it hard
Access is scoped by the password you use at the OAuth consent step. A contractor’s scope only sees secrets tagged for them (default deny, even for direct ID lookups). A new tier is one Worker secret, not a code change, and repeated bad passwords trigger an IP lockout.
Workers
KV
OAuth 2.1 / DCR
MCP
WebCrypto
07Midnight Services
Shared SMS + call inbox
Replaced a CRM’s conversations tab for a hauling company. Threads, web push, delivery status, lead assignment and one timeline of calls and texts, plus a ring chain that tries each person for 10 seconds before a voice screener picks up.
What made it hard
It exists to enforce one rule: never contact a lead twice. Whoever answers a call claims the thread without stealing an existing owner, and a banner shows who spoke to the customer and how long ago.
Workers
D1
Twilio
Web Push
ElevenLabs
08The Learner
Crew agent console
A self-hosted console for named AI agents that I can DM, pull into group chats, send off on background tasks or schedule on cron.
What made it hard
Long jobs survive failures. Each step checkpoints to D1, stale leases get requeued, and the cron pass repairs jobs that a database hiccup dropped. It has zero npm dependencies.
Workers
D1
Cron Triggers
Anthropic API
09PL Pages
plp-outbound
Outbound call dispatch with signed webhooks, calling-window and attempt-limit gating, a concurrency cap, and Airtable sync every 5 minutes.
What made it hard
The webhooks use HMAC with replay protection, so a captured request cannot be sent again, and a 40-test Vitest suite covers the gating logic.
TypeScript
Workers
D1
Vitest
10Portfolio
This site
SvelteKit on Cloudflare Pages. It has a typed content model, a small component set, a CSS-only 3D cube, and a resume route with a print stylesheet so the PDF comes from the same source.
What made it hard
The design takes cues from nexplayground.com, rebuilt from scratch on open-source fonts.
SvelteKit
Svelte 5 runes
TypeScript
Cloudflare Pages
Scope
01Find the real ask behind the request
Build
02Components, content model, then pages
Ship
03Deploy, then smoke-test production
Measure
04LCP, INP, CLS, and what editors feel
Fix
05Root cause first, then a check so it stays fixed
Quality is built right in
1. Guardrails before magic
Anything a non-engineer can trigger gets server-side validation, reversible deletes and an activity log. The model or the editor is never the security boundary.
2. Measure, don’t guess
Core Web Vitals, live DOM measurements at real breakpoints, and Search Console data decide what gets fixed next.
3. Checks that block the build
If a mistake can happen twice, a check goes into the build that fails it. Validators, copy linting and tests all block the deploy.
4. I can explain every line
I build with Claude Code every day. I read and question what it writes, and I push back when it’s wrong.
Why this matters to me
Built by a dad of two.
Screens usually pull my boys onto the couch. I’d love to spend my days on a product that gets
them off it, and on the website that makes families want to try it.