Selected work
Everything below runs in my own business today. The numbers are from my own logs, not an outside audit.
01Running four businesses alone
I run a content site, a paid membership community, a travel advisory practice and a lead-generation site, by myself. That only works because of this:
- About 60 Claude Code skills. Each one is a job I used to do by hand: writing a draft, looking up prices, answering an inquiry, sending renewal reminders.
- 100+ scheduled tasks run those skills with nobody watching. Results, failures and anything that needs my approval show up in Slack.
- Not every job needs the expensive model. Opus gets the hard reasoning, Sonnet the routine work, OpenAI Codex the read-only research, and a good share of it is plain Python with no model at all.
Claude CodePythonPowerShellTask SchedulerMCPSlack
02Closing a paid-content leak in a RAG assistant
My membership site has an AI assistant that answers questions from 4,300+ articles (about 14,000 vector chunks) and five community chat archives. What it will answer depends on the member's tier.
While testing it I found a problem. The paywall only existed on the web page. The assistant searched the vector index directly, and the index had no idea which articles were paid, so anyone could read paid content just by asking the assistant.
What I changed:
- Every chunk carries a permission tag, and search results are filtered on it before any text is sent to the model.
- Tags are re-applied after each content refresh. If an article can't be fetched, ingestion fails closed instead of treating it as public.
- A regression test asks the same questions as each member tier and checks what comes back.
After the fix: 0 unprotected chunks across 84 paid articles. I also brought average response time down from 14.3s to 11.1s (22%) and added streaming.
FastAPIQdrantOpenAI embeddingsClaudeWordPress pluginHMAC sessionsCloudflare Tunnel
03Live travel pricing
Travel prices sit behind trade portals that need a login, and they change every day. I couldn't keep up by hand, and the price pages I had published kept going out of date.
- Browser automation runs in my own authorized accounts, and slowly. When a portal has its own internal endpoints, the script calls them from inside the logged-in page instead of clicking through screens.
- This keeps several price lists current: 600+ cruise sailings, 20 flight routes, all-inclusive packages and resort deals. Whatever was checked longest ago gets checked next, so request volume stays low.
- A price from search isn't trusted until the script has taken it all the way to the payment page. Some prices show up in search but can't actually be booked.
Rewriting one portal flow took a 20-hotel search from over a minute to about 26 seconds. Bookings always stop at the payment page and wait for me.
Chrome DevTools ProtocolPlaywrightPythonStatic site generation
04Watching for changes
- Credit-card offers: every day it checks 20 issuer pages against what my articles say, drafts the edit and posts the diff to Slack. If it can't read a page reliably, it asks me instead of guessing.
- Industry news: every 3 hours it reads 7 RSS feeds, looking for promotions that change an existing article.
- Award seats: a daily report built on a third-party API capped at 1,000 calls a day. Queries are batched, and later features reuse data already pulled, so they cost no extra calls.
PythonRSSREST APIsSlack
05Membership and community
- Renewals: a Google Sheet is the source of truth. Each member gets one reminder, sent through an email API with SMTP as backup, and the status is written back to the sheet.
- Community mining: every day an LLM reads five member chat groups (316K messages archived so far) and flags what might be worth writing about. I decide what gets published.
- Knowledge archive: 722 data points reported by members, organized so they can be searched. New ones are added every two weeks.
Google Sheets APIResendLLM classification
06Other experiments
- cpptool.ca: a CPP retirement calculator in 6 languages. It's a static site, so there's no backend to pay for.
- Also a Manifest V3 Chrome extension, and a text-to-image-to-video test with FLUX and Kling.