~/whybother.dev
~/whybother.dev exit code: allegedly 0

local-first / security-curious / vibecoded under protest

why bother

A small public interface for useful experiments, broken assumptions, and code that somehow survived contact with reality.

runtime.log tail -f, forever

$ 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

Opinions, held loosely.
Backups, held tightly.

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.

Slop-resistant.

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.

Local-first.

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.

Security-curious.

Threat models over vibes. Read the permissions. Assume the default config was written by an optimist, and configure accordingly.

Small > clever.

A boring script that runs every day beats an elegant framework that runs once, in a demo, under supervision.

Notes or it didn't happen.

Future me is a stranger with my password manager. Everything gets written down, because memory is a cache with an aggressive eviction policy.

# process

The pipeline, uncensored.

Drag / scroll sideways. Yes, sideways. The web allows it now.

0x01

observe

Read the docs nobody reads. Find the footnote where the real behaviour lives.

0x02

poke

Small scripts. Local. Disposable. Nothing gets a repo until it earns one.

0x03

break

Find the sharp edges on purpose, in a sandbox, before they find you in production.

0x04

document

Write it down while the pain is fresh. Screenshots included. Dignity optional.

0x05

automate

Only after the third manual repetition. Twice is coincidence. Three times is a cron job.

0x06

ship

Small, weird, useful. If it survives a week of real use, it gets a name.

0x07

maintain

The part nobody tweets about. Also the part that decides whether any of it mattered.

./probe --target you

# diagnostics

Your browser, inspected.

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.

modulewhat it does herestatus
WebGL2the phosphor shader behind everything
scroll-driven animationsreveals & progress bar, zero JS
CSS anchor positioningpins the man page to its button
Popover APIthe man page itself
View Transitionsmorphs the contact reveal
:has() selectorparents finally know what their children do
container queriescards that size themselves, not the viewport
scroll-state() queriesthe nav knows when it's stuck
interpolate-sizeFAQ items that animate to height: auto
@propertytyped, animatable custom properties
color-mix() in oklchthe whole palette, mixed on the fly
relative color syntaxcolors derived from other colors
linear() easingspringy motion without a physics library
@starting-styleentry animations for popovers
text-wrap: prettyparagraphs without orphan words
sibling-index()stagger delays computed in pure CSS
::details-contentstyling the inside of <details>

Probing… if this text never changes, JavaScript is off and you have excellent instincts.

# faq

Frequently anticipated questions.

What is this site?

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.

Why "why bother"?

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.

Do you use AI?

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.

Why is everything a terminal?

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.

Can I contact a human?

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

Human-readable. Bot-annoying.

If you are human, curious, and not selling guaranteed LinkedIn growth, reveal the address.

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