Go · SQLite · Claude vision · privacy automation
What it does: Started as a simple
attempt to remove my own data from data brokers. Building the tool
showed how much effort that takes: sites that block automation, dead
or seized domains, and confirmation emails that say nothing about
whether anything was removed.
The real decision: The tool
deliberately does not defeat CAPTCHAs, so blocked sites are handed
to a human and recorded as such.
Current state: It became a
documented record of how impractical the process is, in one
person's experience. Two of six strategies are built, one is retired
on evidence, and the rest are planned. Go, SQLite, Claude vision,
real-time dashboard. Built solo.
Next.js · Prisma · Auth.js · self-hosted
What it does: A live, invite-only
beta fitness accountability app (Next.js, Prisma, Auth.js) that I
build and operate with full infrastructure ownership: a
network-segmented LXC host, a Cloudflare Tunnel with zero inbound
port-forwarding, and a separate staging environment. Google OAuth
and CI/CD on a self-hosted production deployment.
The real decision: A documented,
reversed access-control decision. I added Cloudflare Access in
front of the app, then removed it once app-level auth proved
sufficient, verified live rather than assumed. Separately, building
the wagers feature surfaced a data-scoping bug in tables that had
no per-user isolation, caught by checking the real database instead
of trusting a clean build.
Current state: Real Google OAuth
with an allowlist gate, CI on every PR, production deployment behind
the Cloudflare Tunnel with a separate staging environment. A
GDPR/CCPA-style data export and deletion flow backs an authored
Privacy Policy. Actively developed.
skyrise
chezmoi · fish · tmux · infrastructure
Supporting project. The repeatable
dev-environment bootstrap the two projects above are built and
deployed on: git/GitHub identity, tmux, fish, Bitwarden, and
chezmoi-managed dotfiles, applied identically across a Linux server
and a MacBook from one source of truth. chezmoi specifically
because it reconciles real Linux/macOS differences from one config
rather than maintaining two.