Examples & Learning

Real tools, built to solve real problems

These aren't portfolio filler — each is real software I designed and built. It leads with Lens, a cross-platform desktop app (C# / .NET) built to show the engineering underneath: a hand-written query language and a data engine that opens multi-gigabyte log files instantly. Then three published browser extensions that tackle real legal-risk problems — accessibility, tracking-consent and FTC-claim exposure — three shipping WordPress plugins, two live web tools you can try right now, and three downloadable custom CMSs, one each in Go, Python and TypeScript. Here's what each does, the problem behind it, how it's built, and the main stack — with a link to the source, a download, or the store listing on each.

A note on the code: some of these apps include full downloadable source, others link to browsable source on GitHub. You're welcome to use them as a learning resource — but this is my work, and you're not authorized to reuse it or claim it as your own.

01

Lens

Data & log explorer

Opens a multi-gigabyte log, CSV or JSONL file instantly and lets you interrogate it with a real query language — the results filtering live as you type.

Downloadable desktop appC# · .NET 10 · AvaloniaNative binary + CLI
Stack C# · .NET 10 · Avalonia · SkiaSharp
The Lens desktop app filtering a log down to only 5xx errors, with a custom colour-coded activity timeline above the results and each error row tagged in red.
Live filtering — errors only, with the custom Skia-drawn activity timeline above the rows.
The Lens app showing an aggregation table of 5xx errors grouped by page and sorted by count, produced by a stats pipeline query.
Add a stats pipeline and the same view becomes a live aggregation.
The problem

When something breaks, the answer is usually buried in a log — the file a system writes to record every event it produces, which on a busy service grows to gigabytes. General-purpose editors freeze trying to open something that big, and plain find-in-file can only match a word, not answer the question that actually matters: which requests failed, grouped by page, slowest first?

The approach

A deliberately UI-free engine does the hard parts — a hand-written query language (its own lexer, parser and evaluator, plus a filter-and-aggregate pipeline) and a memory-mapped index that opens enormous files without ever loading them into memory. The desktop app and a native command-line tool are two thin front ends over that same engine, which was built and proven green before a single pixel of interface existed.

What it does
  • A query language of its own — filter with real expressions (comparisons, contains / matches, and / or / not, in […]), then pipe into stats, sort, head and field selection. Written from scratch, with no parser library.
  • Live, as-you-type filtering — narrow millions of lines instantly, and turn the same view into a live aggregation (“count errors by page, worst first”) just by adding a stats stage.
  • Opens files bigger than memory — a memory-mapped line index means a huge file opens in a single pass, and only the rows on screen are ever built, so scrolling stays smooth even on files far larger than RAM.
  • A custom-rendered activity timeline — a severity heatmap painted pixel-by-pixel with SkiaSharp, showing at a glance where in the file the errors cluster.
  • Proven, not promised — 68 automated tests (including a 200,000-line scale test and headless UI render checks), and it publishes to a roughly 3 MB self-contained native binary. The sample data is generated, so it is honest about being a showcase.
02

WCAGcheckr

WCAG audit + court-grade proof

Audits any site against WCAG 2.1 AA the way a plaintiff's scanner would — no overlay, no widget — and produces court-verifiable proof of exactly what it found.

Browser extensionChrome & EdgeFree tier + paid
Stack TypeScript · React · Vite (CRXJS) · Chrome & Edge · MV3
WCAGcheckr's audit view — an overall accessibility grade with 32 findings, each mapped to its WCAG criterion.
The audit view: a lawsuit-exposure grade and every finding, mapped to its WCAG rule.
The problem

Accessibility-lawsuit demand letters target real WCAG failures, but the overlay widgets sold as a fix don't fix them (and have themselves drawn FTC action), while a manual audit is slow and costly. Owners need to know their actual exposure — and be able to prove, later, what the site looked like on a given date.

The approach

Built deliberately without the overlay approach it is meant to replace: it inspects the real DOM across many interaction states client-side, maps each finding to the exact WCAG criterion and a fix, and seals the result as tamper-evident, independently verifiable evidence.

What it does
  • Tests real pages across 30+ interactive states — hover, focus, keyboard, dark mode — to catch the failures a single-pass scanner misses.
  • Plain-language fix recipes for every issue, plus a lawsuit-exposure grade so you know what a plaintiff would flag.
  • Court-grade forensic evidence — RFC-3161 timestamped, independently verifiable records of exactly what the page contained when you tested it.
  • Also audits PDF/UA, and adds AI assessment for the criteria automation genuinely cannot judge (bring your own key).
  • Runs in the browser with no overlay injected into the site; a free tier covers exposure grading and multi-page crawls.
03

ForensicConsent

Pre-consent tracking auditor

Proves whether a site fired trackers, pixels, or chat and session-replay tools before the visitor consented — and seals that proof as court-grade evidence.

Browser extensionChrome & EdgeForensic evidence
Stack JavaScript · Chrome & Edge · MV3 · RFC-3161 timestamps · Client-side
A ForensicConsent forensic capture report — an anchored, RFC-3161 timestamped and signed record of pre-consent tracking.
A forensic capture report: an anchored, signed, timestamped record.
The problem

Wiretapping and privacy class actions — CIPA, GDPR, the wave of live-chat and session-replay suits — all turn on one factual question: did data leave the visitor's browser before they agreed? Most businesses can't answer it, and can't prove their answer.

The approach

Instruments the page's network and script activity in the browser, classifies each request against a catalog of known trackers, and pins the finding to a signed, timestamped record that stands up as evidence rather than a screenshot.

What it does
  • Detects Google Analytics, Meta Pixel, Hotjar, session-replay and chat platforms that transmit data before consent.
  • A “chat gotcha” test that reproduces the exact discovery method plaintiffs use.
  • An A–F risk score per page, with the specific pre-consent transmissions listed out.
  • Court-grade proof — RFC-3161 timestamped, cryptographically signed, independently verifiable records.
  • Runs locally in the browser, with scheduled re-audits for continuous monitoring.
04

HonestSiteAudit

FTC-risk copy scanner

Scans your marketing copy for the kinds of claims the FTC has actually penalized — and shows you the enforcement case behind each flag.

Browser extensionChrome & EdgeClient-side scan
Stack JavaScript · Chrome & Edge · MV3 · Client-side · Claude (optional)
HonestSiteAudit's report, listing each flagged marketing claim beside the real FTC enforcement case behind it.
Every flagged claim, with the real enforcement case behind it.
The problem

The riskiest words on a site are often in the marketing copy — “guaranteed,” fake urgency, an unsubstantiated “made in USA,” buried fees — and the FTC has levied eight- and nine-figure penalties over exactly these. Most owners have no idea which of their phrases are landmines.

The approach

A client-side scanner matches page copy against a curated catalog of FTC-enforced claim patterns, each tied to its own case and penalty; the only optional network call is to your own Claude key for rewrites, so the audit itself stays private.

What it does
  • Flags risky marketing phrases on any page, each matched to the regulatory pattern behind it.
  • Shows the real enforcement case and penalty for every flag, so the risk is concrete, not abstract.
  • Suggests more defensible wording for each flagged claim.
  • The mechanical scan runs entirely in your browser — page content is never sent to a server.
  • Optional AI rewrites, via your own Claude account, generate tailored and safer alternatives.
05

Preflight

Deploy Readiness

Answers one question before you ship: will THIS code run on THAT host?

WordPress pluginPHP 7.4+v0.5.0
Stack PHP · WordPress · PHP tokenizer
The Preflight WordPress admin screen showing a NOT READY verdict above a PHP-compatibility scan against the target host.
The go/no-go verdict, with the environment diff and code scan behind it.
The problem

You build on your own machine, it works perfectly, you hand it over — and it fills the client's screen with errors, because their host runs an older PHP than yours. WordPress's own Site Health only inspects a single environment; PHP compatibility checkers only lint code in isolation. Neither answers the question that actually matters before you deploy.

The approach

Two tools that normally live apart — Site Health inspects one environment, PHP-compat linters check code in isolation — fused into one go/no-go answer. The scanner is a from-scratch, dependency-free tokenizer so it runs on any host, and it escalates automatically to PHP_CodeSniffer with the PHPCompatibility standard when a host can support it.

What it does
  • Environment parity diff — compares PHP, database, web server, memory and time limits, HTTPS and WordPress version between your site and the target, colour-coded match / risk / unknown with a plain-English consequence for each row.
  • Dependency-free code scanner — a tokenizer engine flags version-sensitive syntax and functions across PHP 7.4 through 8.4 that the target can't run, down to the file and line.
  • A single verdict — READY, CAUTION or NOT READY. Code that would fatal on the target turns the whole verdict red.
  • Progressive target detection — an authenticated companion probe, passive HTTP auto-detect, a pasted Site Health export, or a manual host profile, whichever access you happen to have.
  • Exportable readiness report — a self-contained, printable HTML document you can hand a client as proof you checked their environment before shipping.
06

Evergreen Recycler

Honest content resurfacing

Keeps your best older content working — honestly, without faking dates.

WordPress pluginPHP 7.4+v0.4.0
Stack PHP · WordPress · IndexNow · Claude (optional)
The Evergreen Recycler settings screen in the WordPress admin, configuring how stale posts are honestly resurfaced.
Configuring honest resurfacing — never faked dates.
The problem

You're sitting on years of genuinely good posts buried on page 14 of the archive, invisible to new readers and long abandoned by search crawlers. The common 'fix' is to fake publish dates so old posts look new — which does nothing for Google and can backfire. The honest play is to resurface what's still worth reading and be straight about when it changed.

The approach

Built honesty-first: it refuses the date-faking dark pattern by default, disables re-floating automatically on date-based permalinks so it can never break your URLs, and keeps the AI strictly advisory behind your own key. Every automated pass is logged, so you can go back and do a real content pass on the ones worth it.

What it does
  • Stale-content radar and Refresh Queue — scores every post by real reasons to refresh (dead links, dead images, years that have aged out) and surfaces the worst first.
  • Honest freshness signals — bumps the modified date, sitemap lastmod, a 'Last updated' label and schema dateModified while preserving the true original publish date. It never fakes 'new'.
  • Native IndexNow with virtual key hosting — notifies Bing, Yandex and the AI-search engines that ride Bing’s index within moments of an update, serving the key file dynamically so nothing is written to your web root.
  • Optional Google Search Console connection — targets the posts actually losing traffic and measures the before and after.
  • Optional AI refresh — Claude drafts specific, honest update suggestions using your own API key; it only suggests, and never edits or publishes your posts.
07

Failsafe

Verified restore points

Restore points proven to restore — before the day you actually need them.

WordPress pluginPHP 7.4+v0.1.0
Stack PHP · WordPress · MySQL · ZipArchive / PclZip
The Failsafe WordPress admin showing backup-scope settings and a list of verified restore points.
Verified restore points and the update gate that depends on them.
The problem

Every backup plugin makes a backup. Almost none of them ever check that the backup actually restores — you find that out on the worst possible day, when the zip is corrupt or the database dump won't import. 'I have a backup' and 'I have a backup I've proven restores' are completely different things.

The approach

The whole design is about making the undo real: it test-restores databases and integrity-checks archives rather than trusting them, is honest about which strength of 'verified' applies to each point, and ships a ZipArchive / PclZip archive layer so it runs even on hosts without the PHP zip extension.

What it does
  • Verified restore points — the database is genuinely test-restored into throwaway scratch tables and every file in the archive is read back and checked. A point isn't trusted until it's proven.
  • Update gate — before any core, plugin or theme update it creates and verifies a restore point, and stops the update if it can't be verified.
  • Automatic rollback — if an update breaks the front page, it restores the proven point on its own and tells you what happened.
  • Two scopes, one toggle — Standard (database plus the files an update is about to change) or Whole-site (the entire install).
  • Stays warm — keeps a freshly-verified restore point on a schedule, so there's always a tested undo ready.
08

Custom Authentic

Site authenticity analyzer

Tells you — honestly — whether a website is genuinely custom-built or an off-the-shelf template dressed up to look bespoke.

Live web toolPHP + Claude visionFree
Stack PHP · React · Claude (vision) · headless Chrome
The Custom Authentic live tool — a form where you enter a URL for an honest custom-vs-template site assessment.
The live analyzer — enter any URL for an honest read.
The problem

Plenty of shops charge custom-build prices for a lightly-reskinned template, and most business owners have no way to tell the difference. There was no quick, honest way to ask 'is this site actually custom, and is it any good under the hood?' without hiring someone to audit it.

The approach

A small PHP endpoint on the same host as the site — no separate server to babysit. It fetches and fingerprints the page, captures a screenshot with headless Chrome, and hands both to Claude for an honest visual and structural assessment. It degrades gracefully: with no screenshot capability it simply runs screenshot-free rather than faking visual scores.

What it does
  • Real capture and vision — it screenshots the live site and an AI model actually looks at it, scoring design quality, professionalism and originality from what it can see.
  • Template-vs-custom verdict — platform fingerprinting plus the visual read produce an honest authenticity score, not a sales pitch.
  • Technical foundation — load speed, security headers, SEO health and the detected tech stack, each graded.
  • Honest by design — when it can't assess something it says so, and it never fabricates a score for what it couldn't see.
  • Free and self-serve — enter any URL and get a full report you can print or save as PDF.
09

MailCheckr

Email spoofing & deliverability

Shows whether your domain can be impersonated — and whether your own email reaches the inbox — then hands you the exact DNS records to fix it.

Live web toolClient-side · DNS-over-HTTPSFree
Stack Vanilla JS · DNS-over-HTTPS · no backend
The MailCheckr live tool asking "Can your email be spoofed?", with a domain input for an SPF, DKIM and DMARC check.
The live checker — grade any domain's SPF, DKIM and DMARC.
The problem

Most small businesses have broken or missing email authentication, and it quietly costs them twice: anyone can send email that looks like it comes from their domain (fake invoices, phishing aimed at their customers), and their own legitimate mail is more likely to land in spam. The existing checkers are either enterprise-technical or make you hand over your email data just to see the results.

The approach

Deliberately backend-free: every lookup runs in the visitor's browser via public DNS-over-HTTPS (Google and Cloudflare, with fallback), so there is no server to run and nothing to log — which is also the honest privacy story. The grading and report-parsing logic is split into dependency-free modules that are unit-tested in Node against real domains and real reports.

What it does
  • Instant SPF, DKIM and DMARC grade — enter a domain and get an A–F verdict in plain English, with the exact copy-paste DNS records to close each gap.
  • Honest about its limits — DKIM selectors can't be fully enumerated, so a miss is flagged as provisional rather than a false failure; it reports exposure, never “compliance.”
  • Handles non-sending domains too — it detects a parked domain and tells you to lock it down (deny-all SPF plus a reject DMARC policy) so it can't be forged either.
  • A companion DMARC report analyzer — drag in the compressed XML reports providers email you and see who is sending as you, identified by network owner, with exact per-provider fix steps and an honest read on whether it is safe to enforce.
  • Nothing leaves your browser — DNS is read directly over DNS-over-HTTPS and report files are parsed locally. No account, no server, no data stored.
10

Luxury Swap

Cross-asset swap marketplace

A marketplace CMS where owners of luxury RVs, boats, and riverboat cabins swap or rent to each other — matched two ways, on the criteria that actually matter.

Downloadable custom CMSSingle self-contained binary
Stack Go · SQLite (pure-Go) · stdlib net/http · html/template
The Luxury Swap marketplace home — "Trade a few weeks in your rig for time on the water" — with featured listings.
The public marketplace, served by the single Go binary.
The problem

Rental marketplaces exist, but nobody serves the cross-asset swap — “I'll lend you my Class A diesel pusher while I take your riverboat cabin.” And the hard part isn't the listings; it's the matching, when each side has strict, opposite requirements (must be a diesel pusher, off-grid; must be over 40, no pets) on overlapping dates.

The approach

Built to compile to a single self-contained executable: a pure-Go SQLite driver (no C compiler) plus go:embed for every asset, and Go 1.22 pattern routing instead of a framework. The matching logic is isolated and was proven on seed data before any UI existed.

What it does
  • Two-directional mutual-match engine — a pair matches only when EACH side fits the other (asset type, features, party rules) AND their availability overlaps. More than a one-way search.
  • A real admin CMS — moderate new listings, edit any listing, and manage the asset-type taxonomy as data, not hard-coded.
  • Public marketplace — browse and filter listings, submit your own with what you offer and what you require, and see your mutual matches inline.
  • Ships as ONE dependency-free binary — pure-Go SQLite and every template and stylesheet embedded, so it runs with no runtime, no database server, and no build step.
  • One third-party dependency; everything else is the Go standard library — routing, HTML templating, and PBKDF2 auth.
11

Good Standing

Compliance & renewal CMS

Keeps a small business in good standing — every license, permit, insurance policy and filing tracked, with the ones about to lapse (and what they’d cost) surfaced first.

Downloadable custom CMSTyped JSON API + docs
Stack Python · FastAPI · SQLite · Jinja2
The Good Standing dashboard showing two businesses with compliance-health scores and the dollar exposure of what is about to lapse.
The compliance dashboard — health score and dollar exposure per business.
The problem

A plain calendar reminder doesn't know that a food truck in Texas and a salon in Ohio have completely different obligations, and enterprise compliance software is priced for whales. Small operators miss renewals and get fined, lapsed, or shut down — with nothing built for their end of the market.

The approach

FastAPI serving both a server-rendered Jinja2 UI and a typed API from one codebase; the pure recurrence/exposure engine has no I/O and was verified on seed data first. Standard-library sqlite3 and PBKDF2 mean the only dependencies are the web stack itself.

What it does
  • A recurrence + exposure engine — turns each obligation into a due date, an overdue / due-soon / upcoming status, a dollar exposure, and a per-business compliance-health score.
  • An editable obligation-template library — the compliance knowledge base is content you manage by industry and jurisdiction; each business builds its calendar from it.
  • A documented JSON API — the same data as typed REST endpoints with interactive OpenAPI docs at /docs, alongside the human dashboard.
  • Admin CMS — manage the library, the businesses, and each business's obligations; mark items done and watch them roll to the next cycle.
  • Honest by design — it's a demo, not legal advice; it reports exposure, and the sample catalog is illustrative rather than exhaustive.
12

OpenFloor

Real-time Q&A + polling

Live audience Q&A and polling — attendees ask, upvote, and vote, and every screen in the room updates instantly, with no refresh.

Downloadable custom CMSReal-time · WebSockets
Stack TypeScript · Node · Socket.IO · SQLite
The OpenFloor presenter view for an all-hands, showing a live poll with results and audience questions ranked by vote.
The presenter big-screen — live poll results and top questions.
The problem

Town halls and all-hands need a way to surface the questions the room actually cares about and read it live. The hard part isn't the form — it's keeping every attendee's phone and the presenter's screen in sync in real time.

The approach

Express for HTTP and Socket.IO for the real-time layer, with room-based broadcast so each event is its own channel. The engine that matters — multi-client broadcast and de-duplicated voting — was verified headlessly first, then the audience and presenter clients were built on top.

What it does
  • Real-time everything — a question, an upvote, a poll vote, or a moderator action is broadcast over WebSockets and applied to every connected screen instantly.
  • Three views — an audience view (ask, upvote, vote), a presenter big-screen view (questions by votes, run polls, moderate), and an admin CMS (manage events, questions, and polls).
  • Live polls with animated results — votes move the bars on every screen as they land.
  • Strict TypeScript throughout, on a typed Node backend; the real-time core was proven with two socket clients before any UI.
  • One command to run — a prebuilt-binary SQLite driver (no compile) and no front-end build step.
Let's build yours

Have a problem worth solving?

These started as itches I decided to scratch properly. If you've got one of your own — a workflow that's fighting you, a tool that doesn't exist yet — that's exactly the work I do.

Let's talk