Web application
antitomato.com
Problem. In 1998 a group of friends put up a joke website protesting the tomato. It collected thousands of signatures and stories and then sat on a dying platform: no moderation, no protection from spam, no way to publish news, and no tests, so every change was a gamble.
What I built.
- Rebuilt the whole thing as a modern web application with a real database behind it.
- A public side: petition signing, story submissions, a guestbook, and browsing of everything ever submitted.
- An admin moderation queue, so nothing publishes without a human decision.
- Cloudflare Turnstile human verification on every public form.
- A daily automated news scan that finds and files tomato-related news.
- 86 unit tests and 9 end-to-end tests that run before anything ships.
Stack. Next.js · PostgreSQL · Cloudflare Turnstile · Cloudflare name servers · Let's Encrypt
The number. 7,836 petitions, 629 stories and a 370-entry guestbook live on one system, with a daily automated scan and 95 automated tests guarding it.
Live. antitomato.com
Infrastructure
The contact-form mail pipeline
Problem. Every one of my sites has a contact form. Sending mail from a web server normally means handing your domain's reputation to a third-party mailing service, paying per message, and watching legitimate messages land in spam.
What I built.
- A Cloudflare Worker that receives each contact-form submission on the site's own web address.
- It validates the submission, then sends the message through the Gmail sending interface on a Google Cloud account I own, so mail arrives from a real, already-trusted mailbox instead of a rented sender.
- Per-site routing: each site's messages go to the right inbox under its own subject line.
- No third-party mailing service, no per-message fee, no shared sender reputation.
Stack. Cloudflare Workers · Cloudflare name servers · Google Cloud · the Gmail sending interface
The number. Live on my own sites, including this one and gord100.nodejavascript.com, at zero cost per message.
Live. gord100.nodejavascript.com
Data pipeline
The 234,000-email document pipeline
Problem. I had 234,596 emails going back to 2003 — scanned attachments, letters, statements, receipts — and no way to find anything in them. Search only worked on the message text; the words inside the scanned pages were invisible.
What I built.
- Full archive ingest: every message and every attachment, with the original kept intact.
- Optical character recognition over the scanned attachments, so the words inside the pictures became searchable text.
- Deduplication, so the same document arriving five times is stored once.
- Everything indexed and stored across MongoDB collections, with each record carrying a link back to its original so it can be opened and printed later.
Stack. Python · MongoDB · optical character recognition
The number. 234,596 emails ingested, with the scanned attachments turned into searchable text.
Live. Runs privately — I will walk you through it live, on your own documents, in the audit.