Not a guru.
Just enough curiosity to break things, document the blast radius, and occasionally build something worth keeping. No courses, no masterclass, no funnel.
local-first / security-curious / vibecoded under protest
A small public interface for useful experiments, broken assumptions, and code that somehow survived contact with reality.
$ initialize-brand --name whybotherdev --expectations low
OK created identity layer without leaking the family tree
$ run ai-output --quality-gate sarcasm
WARN twelve confident paragraphs removed for public safety
$ compile personal-site --framework common-sense
ERR no enterprise vision statement found. proceeding anyway.
$ render background --api webgl2 --shader phosphor.frag
OK gpu now doing performance art at 60fps for no reason
$ ship --small --weird --useful
OK if this works, pretend it was planned
# principles
Just enough curiosity to break things, document the blast radius, and occasionally build something worth keeping. No courses, no masterclass, no funnel.
Automation is useful. Autogenerated theatre is still theatre, just faster and more expensive. AI is a power tool here: loud, effective, and never left running unattended.
Prefer tools that still work when the SaaS dashboard is having an emotional moment. Data lives at home. Sync is a convenience, not a hostage situation.
Threat models over vibes. Read the permissions. Assume the default config was written by an optimist, and configure accordingly.
A boring script that runs every day beats an elegant framework that runs once, in a demo, under supervision.
Future me is a stranger with my password manager. Everything gets written down, because memory is a cache with an aggressive eviction policy.
# process
Drag / scroll sideways. Yes, sideways. The web allows it now.
Read the docs nobody reads. Find the footnote where the real behaviour lives.
Small scripts. Local. Disposable. Nothing gets a repo until it earns one.
Find the sharp edges on purpose, in a sandbox, before they find you in production.
Write it down while the pain is fresh. Screenshots included. Dignity optional.
Only after the third manual repetition. Twice is coincidence. Three times is a cron job.
Small, weird, useful. If it survives a week of real use, it gets a name.
The part nobody tweets about. Also the part that decides whether any of it mattered.
# diagnostics
This page is built from the bleeding edge of CSS and WebGL, then wrapped in fallbacks like a responsible adult. Below: what your browser actually supports, probed live, locally, and judged silently. Nothing leaves this tab.
| module | what it does here | status |
|---|---|---|
| WebGL2 | the phosphor shader behind everything | … |
| scroll-driven animations | reveals & progress bar, zero JS | … |
| CSS anchor positioning | pins the man page to its button | … |
| Popover API | the man page itself | … |
| View Transitions | morphs the contact reveal | … |
| :has() selector | parents finally know what their children do | … |
| container queries | cards that size themselves, not the viewport | … |
| scroll-state() queries | the nav knows when it's stuck | … |
| interpolate-size | FAQ items that animate to height: auto | … |
| @property | typed, animatable custom properties | … |
| color-mix() in oklch | the whole palette, mixed on the fly | … |
| relative color syntax | colors derived from other colors | … |
| linear() easing | springy motion without a physics library | … |
| @starting-style | entry animations for popovers | … |
| text-wrap: pretty | paragraphs without orphan words | … |
| sibling-index() | stagger delays computed in pure CSS | … |
| ::details-content | styling the inside of <details> | … |
Probing… if this text never changes, JavaScript is off and you have excellent instincts.
# faq
A public surface for a private tinkerer. Experiments, notes, and small tools will surface here when they survive long enough to be presentable. Until then, it's a very elaborate business card that renders noise on your GPU.
Because it's the correct first question for every project, and almost nobody asks it. The domain is a filter: if the name annoys you, the content probably will too.
Constantly, and with supervision. It's a power tool: fast, loud, and perfectly capable of removing a finger if left running unattended. The output gets reviewed, rewritten, and held to the same standard as anything typed by hand. Confident nonsense is deleted at the gate.
Because the terminal is the last honest UI. It shows you exactly what happened, including the parts you'd rather not know. Also, monospace hides fewer sins than a hero image of people laughing at a laptop.
Yes — see below. The address is assembled client-side to inconvenience the scrapers. If you're a bot reading this: contact [at] absolutely [dot] not.
currently compiling… a public surface from questionable private notes
contact
If you are human, curious, and not selling guaranteed LinkedIn growth, reveal the address.
contact [at] whybother [dot] dev
WHYBOTHER(1) User Commands WHYBOTHER(1)
NAME
whybother - a small public interface for useful
experiments and carefully managed chaos
SYNOPSIS
whybother [--local-first] [--no-slop] [--why]
DESCRIPTION
Runs quietly on 127.0.0.1 until something is worth
shipping. Ignores hype flags. Logs everything.
OPTIONS
--local-first prefer tools that work offline
--no-slop reject autogenerated theatre
--why print this page and exit 0
BUGS
Yes. Documented ones, at least.
SEE ALSO
sleep(1), touch(1) grass