Hey everyone!
Remember the wild west days of the early internet? I'm thinking back to the GeoCities era, circa '97. I was twelve, hacking together hit counters on table-based pages with manually rounded corners on my parents' AOL account, sandwiched between homework and failed kickflips.
This was Internet 1.0, before JavaScript became ECMAScript, long before TypeScript, years ahead of modern frameworks. Chrome didn't exist, and Google wouldn't appear until late '98. We searched with Excite or HotBot, and honestly, they worked fine. The web was small, pay-per-click ads hadn't invaded, and SEO wasn't even an acronym yet. "Reading your feed" meant diving into crude, hand-crafted "I-made-this-myself"-looking pages, not consuming content from AI-targeted timelines. That looping MIDI track in the background? It wasn't just cheesy music, it was a neon welcome mat shouting, "Come on in!"
The first web was based.
New content wasn't delivered, you had to go out and find it, rummaging through guestbooks and lists of bookmark exchanges, smashing "Random Site" buttons, deliberately losing yourself through webrings. It was the raw first web: pre-AI, pre-bot, 100% human-crafted wilderness before corporate platforms swooped in to package everything into neat little boxes. Digg and Reddit bottle some of that spark, but it's a different culture now. Those early pages were pure maker-energy. Messy, personal, proudly obsessive, not prefab posts lobbying for an algorithmic score.
I wanted in. I needed something that was mine. I frequently cracked open View Source, scavenged loose scraps of code, mashed them together, fixed the breaks, then broke them worse. I could stitch a handful of HyperCard stacks on Mac OS 7, but wiring real event handlers or writing a full-blown app? Sorcery. I'd follow tutorials to use MacsBug to drop into assembly, like glitching the matrix; I could follow the recipes, but couldn't yet write my own. Variables and if-statements I could handle; everything else lacked grounding. How do people just... make all of this up and get it to run? The answer didn't land in a weekend, or even a year. It seeped in drip by drip, through tiny wins and glorious face-plants. Today's learning paths are softened with guardrails and AI lifelines, but that raw thrash, the stubborn fight to connect the dots, remains the rite of passage that rewires your brain for building anything.
My "I-know-kung-fu" moment came halfway through freshman year. New transfer student, marooned in the computer lab while counselors untangled my schedule, I ditched the worksheet and started noodling if-then-else spaghetti in Macromedia Director. Somehow, it actually ran: a janky little Frogger clone with an idea that anyone should be able to hot-swap in their own images, skins as a first-class feature, a nod to my ResEdit days. Feeling cheeky, I dropped the file on the shared drive. Minutes later, holy shit… pixel frogs were leaping across half the monitors. My stomach cratered when the teacher opened remote view. Turns out, I earned my seat in the Senior Projects room as a freshman. A year later that hack landed me a software-engineering internship at the University of Nevada, Reno.
By graduation I was neck-deep in web dev and knee-deep in Internet Explorer bullshit. The world surfed in IE, I coded on a Mac, and every clearfix hack or hasLayout hiccup felt like debugging through a carnival mirror. This was pre-Flexbox, pre-CSS Grid, light-years before Tailwind. Eventually jQuery dropped, and I wrote a mini-clone determined to learn how one-liners could tame chaos with composable, recursive logic. Suddenly I began to speak the language.
When async/await and TypeScript arrived, it finally felt like home. I branched out, exploring PHP/SQL for web backends, Python for data processing and forecasting, C# for gaming engines, Objective-C and later Swift and Dart for mobile, Go for web services, OpenGL for graphics, and eventually Solidity for blockchain. New vocabularies, same grammar. Projects leveled up: band sites became startup platforms, side apps turned venture-backed. I graduated from "just buy me lunch" to "the rate's doubled, still in?"
You don’t get a blueprint, only fragments.
Flash, Shockwave, ActionScript, fossils now, but in those Web 1.0 trenches I learned the ropes and watched code flip from mystery to possibility. Countless paradigm shifts later, I'm still chasing the same rush: vibe-coding like it's dial-up, watching screens spring to life with something I just hacked together.
I never expected those paths to loop back on themselves. A random email to Stephen Wolfram led to a summer mentorship program; years later my automata graphics appeared in the 20th anniversary edition of A New Kind of Science. Childhood tinkering with AppleScript text-to-speech paved the way for a sandbox exploit that scored an Apple security bounty payout. Vector landscapes I'd posted on obscure forums wound up at Art Basel beside Herbert Franke, then on Beeple's studio wall. XCOPY, a web3 icon, went from being collected to becoming a collector. Proof Collective, now under Yuga, asked me to build a code-generated Moonbirds Diamond Exhibit. The code I wrote just to learn keeps boomeranging back to the people who lit the flame.
The takeaway? You don't have to master every stack, just keep the circuit open. Publish, improvise, repeat. Stay curious enough to keep hitting run, and let the web do what it was born to do: share, learn, grow.
Enter "Vibe Coding"
The feedback loop is now super-charged. Modern coding agents, Cursor, Claude Code, Aider, aren't IDE plug-ins so much as jam-session bandmates: I lay down a riff, they answer, we trade solos until the track feels right. Half the time they crush it; the other half they wander off, but the improvisation takes me places I'd never reach alone. The bottleneck is no longer how to build, it's what to build.
Because agents thrive on rules, I give them a house style before they touch a key. For Cursor I pin a short manifesto at the top of every chat:
NEVER modify config files unless I explicitly type `manual override`
NEVER suggest edits to those configs
NEVER "fix" bugs by changing configs without `manual override`
NEVER create new tsconfig, eslint, or jest configs unless requested via `manual override`
Cursor pauses before touching the code: "I'd like to change X. May I override rule #1?" About half the time I wave it on through. Boundaries first, collaboration second.
Design rules get the same treatment. To keep theming painless I paste this at the top of UI threads:
ALWAYS use the CSS variables defined in `globals.css`.
NEVER hard-code hex values or use tailwind swatches; add to `globals.css` when a new color definition is needed.
By ONLY using theme variables, global style changes should cascade everywhere automatically.
The agents respect it and my dark-mode toggle works on day one.
Lately I'm feeding them prompt templates that scaffold docs and tests while I sleep. A snippet I drop into a "write tests" request looks like this:
# {{test_name}} Tests Documentation
## Overview
Explain what each test in `{{test_directory}}` is validating.
## Tests and Their Purpose
### `[FileName1].test.js`
- **Purpose:** <!-- one-liner -->
- **Covers:** <!-- component or function -->
### `[FileName2].test.js`
- **Purpose:**
- **Covers:**
## Why These Tests Matter
Summarize the risks they catch and the confidence they add.
Aider turns that into a filled-out doc, hands it to Claude: Extended Thinking for a second opinion, and Gemini cleans the diffs then patches the Typescript types. Agents assigning tasks to agents while I sip coffee and watch the branches bloom.
So what happens when the distance from concept to compile drops to near-zero? When the real work shifts from how to why? We're about to find out.
Cheers!
🍻Ryan