• On directories. And vibe coding.

    I seem to have an obsession with directories.

    During COVID I helped build letsorder.delivery: a directory of local restaurants offer non-app delivery. Today I launched new one wpg.beer: a directory of local brewery taprooms.

    I’m not entirely sure where this obsession comes from. Maybe it’s nostalgia for the early web — before search engines and social media, when discovery meant stumbling across a hand-curated list from someone you trusted.

    What I do know is that I built wpg.beer to solve a real (albeit simple) problem, and to further my experiments in “vibe coding.”

    The Problem: What the heck is open‽

    More often than not, I find myself going out for a pint (or three) on a Monday or Tuesday. Taprooms (and beer gardens in the summer!) are my go-to. And as the directory makes painfully clear, early-week hours are chaotic!

    Typically, this means checking 3 or 4 Instagram accounts to triple check what’s actually open. IG has become the defacto way the local independent business communicate.

    In theory, the info is also on mapping apps. But maps are built around places, not questions. They’re great if you know where you’re going — not so much if you’re just asking “what’s open right now?”

    Corporate tech isn’t solving this. So I built something that does.

    Sidebar: Failure of the Modern Internet

    The original dream of the open Internet was an open web of information, where even simple facts, like a business’s opening hours, could be freely shared and universally accessed. By now, we should have a standard protocol for this. Some agreed-upon way for businesses to publish basic details, and for users to access that data however they like.

    Instead, business owners are left with a daunting task of updating two, three, four, or however many popular corporate Internet platforms their customers might use. And customers are left hoping they’ve chosen the correct platform with the most up-to-date.

    We didn’t need to end up here. But I digress…

    On Vibe Coding

    wpg.beer was is 99% coded by Claude code.

    The initial prompt was as follows:

    I would like to create a web project which is directory of Winnipeg breweries.
    
    Each brewery will have the following properties:
    - Name
    - Description
    - Location (Both street address and map coordinates)
    - Days and hours of operation
    - Links (For example, official website, social media, etc)
    
    The project should be built in Laravel With filament.
    
    Please set up the layer of project, including filament and use whatever database schema makes the most sense. For this phase of the project, we will only have a homepage that lists all the breweries.

    Claude cooked on this for at least 15 to 20 minutes. It was one of the biggest tasks that I’ve ever had Claude work on.

    The results of this prompt was a fully functional Laravel application, including a CMS via the filament to install.

    To my surprise and delight, it decided (i.e. unprompted) to use tailwindcss to create the the card based layout that you see on the site, it also created a database seed with data that vaguely resembled Winnipeg brewery data. I was blown away!

    After this initial bit of work, I had Claude build out some more features (like the “open” status), make a few layout changes, create a background image and that sort of thing.

    Aside from some configuration changes I did not touch a single line of php or css…

    I recently saw somebody suggest that “vibe coding” was kind of a silly, or reductive, or useless term. They were suggesting that it’s really more like “rapid prototyping.”

    But in reality, this is more than a prototype. It’s a fully functional version one of an application.

    Soon everything will be “vibe coded,” and that may just be a great thing for the indie web!


  • How AI Stole My Job

    The progress of technology over the course of my life has been stunning and the progress of LLMs is vastly outpacing even those previous decades of exponential progress. It’s wild!

    In the past two to three weeks, my entire approach to coding has been completely upended.

    To the point that it’s hardly even the same job. AI stole that job right out from under me.

    I have transitioned from a job meticulously crafting individual line of code to a new job, meticulously crafting instructions for an AI agent.

    Prior to my experience with agents, I was already a big fan of chat-based LLMs and less nervous about the accuracy and quality of their results than the general public; or even my peers, probably. I’ve had good success using ChatGPT as a search engine for random low stakes question, and surprising results using it for interpersonal advice.

    But even with a couple of years of experience chatting with GPTs, I have been totally blown away by what comes out of the other end of the AI black box. .

    Prompt Engineering

    So what is my new job? Am I a prompt engineer now?

    Maybe, but my current workflow feels more like I’m managing a remote teammate. That teammate just happens to be Claude Code; and we chat in a TUI rather than Slack.

    My workflow

    1. Write a short paragraph describing a high-level task based on business requirements.
    2. Feed this task a GPT that I built which asks me questions like a junior engineer and spits out a fully formed Jira story based on my answers to those questions.

      At this point, any human developer including myself would be able to work this ticket however they want.
    3. Copy & Paste the description from step № 2 into Claude Code.

      Occasionally, I may need to include additional context about related tickets. I’ll accomplish this by pointing to a git branch for that ticket, copy & pasting in that full ticket, or just summarizing it in a few words.

      But usually everything relevant is already in the story.
    4. Wait for Claude to do its thing (usually 5 – 20 minutes).
    5. Review the diff of the code it’s written.

      I’ve found that if it makes odd choices or assumptions, these mistakes are often propagated across multiple files. So the easiest way to correct them it with a subsequent prompt. Claude Code is incredibly good at search & replace for entire ideas.
    6. Once it looks good, I have Claude write a commit message and push to github.

    Results

    With this process, I’m able to complete large, fully functional features — the kind that used to take 2–3 days, maybe even a full week — in 1 day or less.

    And since a lot of this time is spent waiting for Claude to generate, it frees me up to plan the next feature, review open pull requests, attend meetings, or whatever.

    Sometimes I’ll kick off a task and step away — take a breath of fresh air, go for a quick walk, or grab lunch — and come back to a ready-made diff. That kind of asynchronous collaboration with an AI assistant isn’t just productive, it’s honestly kind of delightful.

    All things considered, it feels like a 3-4x productivity gain. Realistically? Probably closer to 2x.

    Some Fails

    My experience so far have been overwhelmingly positive but for the sake of completeness, I should mention a few of the issues I’ve been running into:

    • It’s very hard to get it to consistently follow instructions.
      • I’ve got in the habit of updating the project’s CLAUDE.md whenever something isn’t quite right. But still it will randomly disregard those instructions.
    • One time, it wrote a series of “TODO” comments rather than actually doing the work. 😆
    • It often gets into testing or code-quality loops, constantly refining code and re-running testing tools.
      • It doesn’t seem to know how to code that conforms to quality standards. The fact that it does, almost seems to be a coincidence.
      • Similarly, it doesn’t seem to know how to write tests that will pass. Sometimes it just does.
      • At the end of the process, the results are fine. But the process is quite disconcerting.

    That’s about it.

    And I fully expect these issues to be resolved in the next 3 – 6 months.

    Post.Script.

    Code is not art.

    …it’s certainly not poetry.

    Software development is unlike some of the other professions that are seeing real disruption in 2025.

    Unlike visual arts, writing, journalism, etc. my career as a software developer has always been a collaboration between me and the rest of the world.

    Web developers are expected not only to draw inspiration from the universe of open source code but also to learn by reuse — by literally copy & pasting, then tweaking and re-configuring. We’re discouraged from reinventing the wheel.

    The idea of plagiarism doesn’t really make sense in the context of code. Unlike art, copying someone else’s style is a requirement of the job.

    So what separates seasoned developers from a junior, has little do with the raw code. It’s more the ability identify problems and select the appropriate approach, anticipate edge cases; and probably most importantly communicating with non-engineers.

    Writing good clean code is only a very small fraction of the job. And I’ll admit, as I’m coming up to my 25th year writing code for money, it’s a part of the job that’s become the least interesting to me.

    If I can tell a robot to do the boring parts and focus on the other parts, I’m here for it. Personally.

    Broadly though, software engineering is uniquely positioned to be sort of immune to prospect of being replaced by AI.

    Job Security

    The way that AI is poised to disrupt writing code is more directly similar to productivity improvements of the past centuries. Pick your favourite example: the loom, internal combustion, the spreadsheet, etc.

    The same number of people currently writing code will be able to produce 2 or 3 times more; and theoretically this should increase wages.

    The Future of Writing Software

    I have more thoughts and questions about the future of software development, than I do answers.

    • Do kids coming up in school right now need to learn how to code?
      • Probably not.
    • The “junior engineer” role as we know it will probably disappear.
      • It’s likely possible that a 20-something who has grown up using AI tools will be just as capable of building software to accomplish goals as I am after all these years.
    • If junior engineers don’t really need to learn how to write code and senior engineers are talking to AI instead of writing code, do we even need programming languages?🤯🤯🤯
      • Why not just have AI write assembly directly?
      • As long as we’re confident that the AI is telling the truth about what the code does and what it’s doing to it, does it matter if a human can’t read it?
        • We’re not there yet, but I’d bet we will be in a year or less.
      • In the human reviews of my own AI-assisted code, I’m strongly encourage my teammates to take a light touch when it comes to style and specific choices.
    • We might not need teams of engineers anymore.
      • In the past week, I’ve produced the same amount of code that would have taken my previous team of the approximately the same amount of time.
        • The main productivity gain in this regard is the fact that Claude is able to work with larger chunks of code at once. Claude’s ability to “find & replace ideas” gives me the confidence to work with massive refactors across many files. With results complete in 5 or 10 minutes.
        • My biggest blocker to productivity at the moment is finding a teammate with time to review my massive PRs.

    Conclusion

    Interesting times ahead.


  • Buy Canadian Vegans

    By now, buying Canadian is a real movement.

    Reddit keeps showing me posts from r/BuyCanadian. Some of the comments in that sub remind me a lot about discussions surrounding veganism.

    A lot of posters are proposing going full vegan. If there’s any hint of US ownership, you must totally avoid the product. The means MEC – not Canadian – because it’s owned by a US-based hedge fund. Old Dutch Potato chips – not Canadian – it is a subsidiary of the US brand.

    If buying Canadian is about mitigating economic harms, then IMHO going full vegan is useless at best and maybe harmful at worst.

    If a company is solely staffed by Canadians, uses Canadian ingredients, that’s basically fine. Sure percentage of profits are sent back to the USA as royalties, licensing or franchising fees, etc. But the benefits of employing all those Canadians, paying all those taxes locally, etc. surely outweigh the cost of sending a dues back to the USA.

    So most fast food chains are “fine.” Pepsi, Coke, Budweiser, etc bottled Canadian plants, also fine.

    I guess I would draw the line at things that are merely repackaged in Canada (like many soups, sauces, etc) and things directly imported from the USA (like produce).