Write to me

[ The workshop / the same for every build mode ]

How I work: a well-run workshop.

  • One isolated machine per project

    Every project runs in its own virtual machine, started only while I work on it. Nothing from one client ever sits next to another's.

  • Staging first, always

    Changes run on a copy of your site before they go anywhere near production.

  • Deterministic checks on every change

    Coding standards, static analysis and tests run automatically. Same code in, same verdict out, every time.

  • Documentation you keep

    Decisions, quirks and why that odd line exists, written down and handed over. You're never locked to me.

  • Your accounts, your code

    Repository, hosting and licenses in your name. I work in them; I don't own them.

  • Signed off by a person

    Every change carries my signature. If it breaks, you know whose phone rings.

zsh, tukutoi-new
tukutoi-new % multipass launch --name tukutoi-com --cpus 2 --memory 4G --disk 20G --cloud-init .work/terminal/docker.yaml ... 48 sLaunched: tukutoi-comtukutoi-new % multipass mount .work/docker-test tukutoi-com:/mnt/scratch ... 23 sEnabling support for mountingtukutoi-new % multipass exec tukutoi-com -- bash -c 'cd /mnt/scratch/src && sudo docker compose -f compose.yml -f compose.test.yml up -d --build' ... 1 min 54 s [865 lines of build output not shown] php Built web Built Network src_default Creating Network src_default Created Container src-mock-1 Creating Container src-php-1 Creating Container src-php-1 Created Container src-web-1 Creating Container src-mock-1 Created Container src-web-1 Created Container src-mock-1 Starting Container src-php-1 Starting Container src-mock-1 Started Container src-php-1 Started Container src-web-1 Starting Container src-web-1 Startedtukutoi-new % multipass exec tukutoi-com -- sudo bash /mnt/scratch/test.sh ... 25 s== static site and headersok home 200ok CSP headerok nosniff headerok no nginx versionok /work -> /work/ok 404 pageok _astro immutableok redirect map not publicok /api/other 404== redirectsok dropped articleok kept articleok no trailing slashok old review pageok dropped softwareok generatepluginsok AI policy page is live== contact: happy pathok too fast rejectedok valid acceptedok two mails (notify + confirm)ok notify to MAIL_TOok notify reply-to senderok notify has messageok notify labels resolvedok tracking offok server token sentok confirm to senderok confirm has no messageok confirm model is name+need== contact: rulesok same address: no 2nd confirmok EU without VAT rejectedok EU with VAT acceptedok invalid option rejectedok honeypot pretends successok honeypot sends nothingok tampered token rejectedok Postmark failure -> 502ok link stripped from confirm nameok 6th per hour rate-limited== contact: without JavaScriptok no-JS success -> thanksok no-JS 2nd in 10 min -> problemok GET method allowed, PUT not== reviewok link formatok valid review acceptedok review notify only (no email given)ok review carries invite + consentok review with email -> thanks mailok bad token rejectedok review without a name acceptedok nameless thanks greets 'there'ok contact token can't post reviewsok missing consent rejectedok feedback page noindexpassed 52, failed 0tukutoi-new % VM=tukutoi-com bash .work/docker-test/refresh.shsnapshot: 9c7346e Reviews: publish the four from Trustpilot Container src-php-1 Starting Container src-php-1 Started Container src-web-1 Starting Container src-web-1 Startedsite: http://192.168.252.115:8080tukutoi-new % multipass delete --purge tukutoi-com
Recorded on 28 October 2026: a fresh machine for this very site, its code mounted, its tests run, the latest commit refreshed in, and the machine deleted. Waits shortened, long build output cut.
  • 10+ yearsPHP, WordPress and WooCommerce in production
  • Quality gatesSonarQube and coding standards check every change before it ships
  • Six Sigma Black BeltScope defined, measured and controlled
  • Lean by defaultNo page builders, no bloat: fast pages, less to break
  • Zero trackingNo analytics, no third-party CDNs
  • Signed commitsEvery change traceable to me, in your repository

[ How it's built / your choice, per project ]

You decide how it's built. I answer for the result either way.

Hand-written

No AI tools touch your code or your data. Traditional craft, line by line.

Good for
Strict company policies, sensitive data, or plain preference
Price
Quoted next to AI-assisted. You choose.

AI-assisted

AI speeds up the work. Every line is reviewed, tested and signed off by me.

Good for
Most builds and modernizations
Price
Quoted next to hand-written. Usually faster.

Build policy / summaryFull policy

ModeTools usedWhere your data goesNever
Hand-writtenEditor, compiler, linters, test runners. No AI tools; ordinary autocomplete stays on.My machines and your servers. Nowhere else.AI tools of any kind, AI code review, AI transcription of our calls.
AI-assistedThe above, plus the AI providers named in the AI policy, under the terms set out there.Code and test data reach the model. Customer records do not.Production data, passwords, keys, personal data.

[ Proof / real code, then a real report ]

Real code. Real reports.

A member search from a client's theme, as I found it. The tooling flags two lines. The other two take someone who knows what the business would lose.

1add_action("wp_ajax_nopriv_member_search", "member_search");

"nopriv" means logged out. No capability check either. Your member list is public.

2add_action('wp_ajax_member_search', 'member_search');
3
4function member_search() {
5
6 $search = $_POST['search_text'];

phpcsWordPress.Security.NonceVerification.Missing

7 global $wpdb;
8 // ... 900 lines: pages, agenda, documents ...
9 $users = $wpdb->get_results("
10 SELECT DISTINCT u.ID FROM {$wpdb->users} u
11 INNER JOIN {$wpdb->usermeta} um1 ON u.ID = um1.user_id
12 INNER JOIN {$wpdb->usermeta} um2 ON u.ID = um2.user_id
13 WHERE (um1.meta_key = 'first_name' AND um1.meta_value LIKE '%{$search}%')

phpcsWordPress.DB.PreparedSQL.InterpolatedNotPrepared

14 OR (um2.meta_key = 'last_name' AND um2.meta_value LIKE '%{$search}%')
15 ");
16 foreach ($users as $author){
17 $author_info = get_userdata($author->ID);
18 $telephone = get_user_meta($author->ID,"wpcf-telephone-number");
19 $user_email = $author_info->user_email;

Name, email and phone of every match, for anyone. Search for % and that's every member.

20 // ... builds the result HTML ...
21 echo $final_html;
22 die;
23}

functions.php, excerpt / real code from a child theme, about 2018 / function renamed, gaps marked

4 findings. 2 from tooling, 2 from reading. Live for years before the refactor.

Security review / AI-built SaaS platformclient anonymized

Files reviewed
1,200+
DB migrations
160
First-party code
108k lines
Duration
41 days
  • 0Critical
  • 14High
  • 49Medium
  • 12Low

Method: deterministic tooling built inventories of the code, one AI model analyzed each candidate finding and a separate one tried to disprove it, and I checked every finding by hand before it went into the report.

IDSeverityFindingStatus
F-037HighAnyone with the public challenge link could log activity under another participant's name and push them up the leaderboard.Fixed by client
F-007HighA customer account labeled "superadmin" was treated as one of your own staff, with power over every other customer's data.Fixed by client
F-058MediumTwo AI features worked without logging in, so a stranger could run up your AI bill.Reported

3 of 75 findings, worded for the business owner. Status as reported by the client after delivery.