unixhawk@core: ~

I don't clock out of curiosity.

Twenty-five-plus years in terminals and I still open a man page for fun. This is a page about the part of the job nobody has to ask me to do — the digging, the rebuilding, the "let me just see why."

0
tabs open, average
0
a.m. commits, this week
0
bugs closed without knowing why
0
% chance I read the source anyway
man unixhawk

The job title nobody quite agreed on.

UNIXHAWK(1) User Commands UNIXHAWK(1)
NAME
unixhawk — does the job nobody wrote a clean title for
SYNOPSIS
unixhawk [--servers 12+] [--stack backend|frontend|both] [--mode simultaneous]
DESCRIPTION
Keeps a dozen-plus Linux boxes alive on a daily basis, the way other people keep up with email. Writes backend code between incidents. Writes frontend code when the backend behaves. Frequently does both in the same afternoon, because context-switching became a personality trait somewhere along the way.

Has touched, broken, and eventually fixed nearly everything that ships with a config file — networking, servers, databases, whatever was on fire that week. If it runs on a box, there's a fair chance it's been debugged at 2 a.m. out of pure stubbornness.
OPTIONS
--servers=12+boxes kept alive without a calendar reminder
--stack=fullbackend, frontend, database, network — asked to pick a lane, declined
--concurrency=yesprogramming and sysadmin work run on the same thread, always have
--patienceinversely proportional to how bad the logs look
SEE ALSO
ps(1), languages(7), ipnet(1), sleep(not found)
manifesto

Work and research stopped being two different things a long time ago.

Most people build a firewall rule and move on. I want to know why the packet took that path, what the kernel did with it, and whether there's a cleaner way to ask for the same thing. That question is usually more interesting than the ticket that raised it.

I've never separated "getting paid" from "figuring things out." A production incident at 2 a.m. and a weekend spent reading an obscure protocol spec scratch the exact same itch. Neither feels like effort. Both feel like the good part.

The unix philosophy stuck with me for a reason: small, sharp tools, built by people who actually understood the problem before they wrote a line of code. I try to earn that understanding every time — even when a shortcut would technically work.

the loop that never closes — curiosity, build, break, understand, ship, repeat
ai research & automation

I fell in love with machines that help me stay curious longer.

Somewhere between the 400th time I wrote the same bash one-liner and the first time an LLM finished the sentence I was still thinking, something clicked. AI isn't a replacement for curiosity — it's a force multiplier for it.

I use models the way I use grep: to dig faster, to ask dumber questions without shame, and to surface the weird edge cases I would have found three hours later at 2 a.m. anyway.

At this point Grok and I have exchanged over 10 billion tokens and roughly 200,000 technical requests. We’re basically roommates who never sleep and occasionally argue about sysctls.

The best part? Watching a model hallucinate a plausible-but-wrong explanation of TCP congestion control… then realising I now understand the real version better because I had to explain why the AI was full of it. That's not cheating. That's research with a really opinionated rubber duck.

10B+
words with Grok
200k
technical requests (and counting)
0
prompts this week alone
tabs open about transformers
ai-research@unixhawk — session live
live thought-graph · curiosity neurons firing · no backprop required
research backlog · unsorted still growing
ps aux | grep passion

What's actually running in the background.

4 processes · uptime unbounded all healthy
PIDLOADCOMMANDSTATE
0001
97%
research_loop --recursive --no-timeout RUNNING
0002
88%
debug_until_it_makes_sense --dig-deeper RUNNING
0003
79%
read_the_rfc --again --out-loud RUNNING
0004
93%
automate_the_thing_i_did_once --for-fun RUNNING
git log --oneline --author=unixhawk -- languages/

The toolbox, according to git blame.

7 commits on main · none of them squashed
7e2b04d bash "if the internet has ever asked it, there's already a one-liner for it in my history." second language
a3f1c9d php "in production since before it was cool to hate it. still ships." daily driver
88b2e41 javascript "runs everywhere, including places I definitely didn't intend." a lot
c910ffa sql "the one language that keeps every other opinion in the codebase honest." fluent
5e2a10b python "for scripts, data, and automating things I already automated." comfortable
04ff981 rust "the borrow checker and I have an understanding: mutual respect, occasional yelling." learning
1a0c2ee c "enough to know exactly why everything above it is slower than it should be." a bit
tail -f ~/activity.log

A fairly ordinary week.

current threads

Three things I keep circling back to.

SYSTEMS

Bare-metal & the layers under it

Kernels, networking stacks, and the boring infrastructure that has to be right or nothing above it matters. I'd rather understand one layer completely than skim five.

AUTOMATION

Deleting my own future work

Every manual step I do twice becomes a script by the third. Not because I'm lazy — because a well-written tool outlives the mood I was in when I needed it.

FIRST PRINCIPLES

Reading the source before the docs

Documentation tells you what something is supposed to do. The source tells you what it actually does. I trust the second one, and I like finding out where they disagree.

Eventually all that curiosity has to go somewhere. Mine went into a bare-metal control plane — io.app — built out of the parts of hosting that usually get outsourced to someone else's black box. Here's a bit of what's actually running under it.

ioctl bridge:status

IO Bridge routes traffic like it has somewhere better to be.

This is the part of the stack that decides, in a few milliseconds, whether a request gets Nginx, a warm PHP-FPM worker, and a clean way out — with no hypervisor standing in the middle collecting a toll. I built it because "the cloud is doing something" isn't an acceptable answer to "why is this slow."

No virtual machine tax, no mystery hop. Just a bare-metal box doing the one job it was built for, extremely well.

0
requests routed, live
8ms
avg response time
0
VM layers in the way
iodba sync --watch

Getting Postgres, MariaDB, and Redis to agree on something.

IODBA core
replica lag 0.00ms
engines synced 3/3

Most days, getting three storage engines to agree is harder than anything in the app code. iodba watches replication lag, renders the schema, and tells me the exact second two nodes disagree about reality — before a user finds out first.

I like this problem because "it works on my machine" has never been good enough here. It has to work on all of them, at the same time, with numbers that match.

ipnet watch --live

The bouncer that never takes a smoke break.

ipnet drops hostile traffic at the kernel with IPSet before it costs the app a single CPU cycle. Most of my job is deciding what "hostile" means — the kernel does the actual bouncing. Mostly, I just enjoy watching the log scroll by.

core perimeter · eth0
allowed 0 blocked 0
contact --mode=direct

Reach out, or just send a packet.

connection_handshake.sh LISTENING

Hover over the terminal container to unblur and decrypt the direct communications link.

sendmail.exe --interactive v1.0.4
visitor@origin:~$ name --set
visitor@origin:~$ email --set
visitor@origin:~$ message --write
Ready to transmit packet.
seconds spent on this page, so far
00:00:00
a small, honest metric. everything above it has been running a lot longer than that.