As evidenced by several posts here, on LinkedIn, and a few other places, I’m one of the many people who find deep anxiety in the open threat and promise posed by AI. The threat is not from AI itself, but from leadership and ownership groups who would prefer not to pay money in exchange for labor and expertise. “AI took our jobs” comes from the same place as “NAFTA took our factories,” as the work “moved” elsewhere in search of people willing to do a similar task in potentially worse conditions for lower wages, because those lower wages were still an improvement on their circumstances. Or rather, the people making money on the work are looking for ways to pay less or charge more for the work.
People make decisions. Their basis for those decisions stems from what they consider important. If they have a duty to maximize shareholder returns, then they face an ethical crossroads regarding their employees and the communities they support. It is a responsibility for anyone participating in the business enterprise to see that the business’s ends are brought to market, and it is also up to that individual to determine whether it is repugnant to participate in any particular business enterprise. That’s also very much its own conversation. The point is this: decisions are being made in real time to advance AI as much as possible and reduce corporate dependence on skilled and knowledgeable workers, and that is scary for a lot of us who are skilled and knowledgeable workers.
The promise of AI, or at least the one being sold, is that AI-supported workers can produce more work on faster time scales for lower cost than a traditional workforce. Big companies are betting this means they can reduce some of their largest costs on the P&L, but I think it means something else entirely. Smaller groups of customers (or smaller addressable markets if we want to be inclusive of B2B opportunities) have more specialized needs and may not have represented the kind of “Ten-X” opportunities seed/angel investors sought out in previous rounds. If you needed to do development work, that meant months or years of time and millions in capital investment (or a founding team of completely bonkers entrepreneurial engineers who don’t need to be paid). Smaller markets, new fields, and niche activities effectively had to put up with inefficient adaptations of other technology or simply go without. If the proponents of AI are accurate with what they’re describing, creating nuanced and realm-specific products quickly and inexpensively, the cost to serve these customers shifts from prohibitively expensive to surprisingly palatable. That’s the bet, and the next vector for economic growth.
Maximizing shareholder returns is not growth. That’s extraction. It’s ultimately not sustainable. Just as there’s a maximum sustainable yield from fisheries and a maximum sustainable output from ranches and farms, every business has a maximum sustainable profit it can maintain, and AI shifts the balance of these calculations. Radically reducing the barrier to entry for market entrants (especially those with expertise and a roster of client contacts or senior buyers) and increasing the number of potential market entrants by sloughing off well-connected and knowledgeable staff seems like the perfect recipe for upheaval across nearly every market. That is, if the promise of AI is true.
Like you, I’ve seen a lot of posts about vibe coding in recent months. Candidly, I’ve done some as part of putting together tools to generate statistically viable holdout markets for incrementality testing. The process is difficult and deeply unsettling sometimes, with all the attendant hallucinations and obfuscations. Having tried a few smaller engagements, about two months ago I picked up an old project from before I went to work at Inkbox: EndsKeeper.
What Is EndsKeeper?
EndsKeeper is a mobile app that brings the Edwardian sport of lawn bowling into the 21st century. It serves as a lightweight scorekeeper, match manager, and community hub all in one. You open the app, create a game, assign four players into real bowling roles—Lead, Second, Third, and Skip—track each “end” (that’s the bowling equivalent of an inning), and then review your past games to see where you excelled or where you need work. I’m building out modules for bowling clubs to use in managing memberships, club resources like greens and rinks (you bowl on a rink, the rinks are on the green), tournament management and tabulation, and community events. Right now EndsKeeper is coalescing around the core functions because I’d like to release something people can play with.
Under the hood, it’s powered by a FastAPI backend (Python, SQLAlchemy) talking to a React Native/Expo frontend, secured with JWT authentication, and backed by a PostgreSQL database. Those are just the parts you don’t see. What you do see is a seamless flow from tapping “New Game,” to selecting your teams, to scoring ends in under ten seconds. Of those things, I was vaguely aware of Python from having used it for the higher power holdout selection tool and PostgreSQL database management because the data Digital Matter collected for clients via ETL back when I was there all flowed into one.
How I Initially Approached This Project with AI
I was fundamentally unprepared for mobile-first app development.
My background to that point had been dashboards and marketing automation through other people’s software, not TypeScript components and native modules. So I turned to AI—specifically o4-mini-high and Codex—as my pair of digital poles in this unfamiliar terrain.
When I say I was unprepared for this, what I mean is:
“Please assume I'm not a developer. Now that I have this code that you've generated, where do I store it and how do I save it to a format that we can hand to an engineer?”
That was an actual prompt. I started from very little knowledge. It’s been a long process.
I went from those kinds of prompts to these within the span of a week:
“Help me scaffold a FastAPI project that can create and retrieve matches. I’ve installed Python but don’t know how to structure folders—what files do I need?”
AI Response: Amain.py
with FastAPI initialization, amodels.py
for SQLAlchemy classes, and acrud.py
for basic create/read functions.
“Now I need an endpoint
/matches/
where I can POST match details. Show me the decorator and Pydantic schema.”
AI Response: An example using@router.post("/matches/")
plusMatchCreate
andMatchOut
schemas. I promptly hitModuleNotFoundError
because I hadn’t installed Pydantic correctly, which led to an afternoon lost to pip troubleshooting.
“Switching gears: I want a React Native screen for creating teams called
TeamSetup
. How do I wire up a simple form with Expo’sTextInput
and a submit button?”
AI Response: A functional component withuseState
,TextInput
, and aButton
. I then spent hours figuring outnpm install expo
vs.expo install react-native-paper
, each typo generating a cascade of red error messages.“Can you help me build a searchable dropdown for selecting bowlers by name? It should hit
/bowlers?search=
as I type and debounce the requests.”
AI Response: A hook-based solution usingFlatList
,TextInput
, and a debouncing pattern. But I’d never useduseEffect
with dependencies, so I learned the hard way how stale closures cause phantom list renders.
Every prompt was a hypothesis, and every response demanded vetting and correction. These early stumbles taught me that AI is more like the computer of the Starship Enterprise (NCC1701D, with Majel’s voice, nerds) rather than a fairy godmother. It’s more like a collaborator with short-term memory loss and a flair for creativity, but no domain expertise. You quickly learn to read error stacks, craft clearer prompts, and build enough technical context to catch the AI’s blind spots, but I’ve also had to re-do parts of this application several times now. Building EndsKeeper through the prototyping process felt like riding a roller coaster while laying its tracks. I kept finding out that what I had built did not adequately support what I was actively building, and my AI partner in this effort could not see far enough ahead of me to know where we were going or how to plan for it.
The first time I was able to post a bowler to the API after standing up a virtual environment on my local machine felt like magic. It was the first entry into the database, and I’ve since scrubbed that database at least twice and migrated to include new fields, but I think that’s when I finally felt it. There’s a rush from achieving a milestone, and there are hundreds of little milestones along the way to building something like EndsKeeper. The first time I solved a bug on my own in my app, I might have danced. The first time I was able to tell the AI it needed to look down another path as we were troubleshooting a bug, because what it wanted to do only would have made sense if not for the rest of the project, that felt a bit like vindication. The downs are hard, too, but somehow there’s a complete unreality to the AI that makes it easier for me to make mistakes and be honest with it in ways that would be humiliating in public. The stakes are low. My AI overlord probably has excellent blackmail material now.
Pretending vibe coding is an immediate solution to engineering the world’s problems away is foolish. There are entire legions of engineers who will (and should) punish us for pretending that AI generates airtight software because we prompted it. Humans are weird, and we’ll do weird things to demonstrate how little regard we have for people who pretend our chosen vocations don’t require skill, effort, planning, and experience. Don’t come for me, code-Bros! What vibe coding has done for me is shorten the time scale for learning a new skill while providing me with direct, tangible experiences for real-time feedback as I’ve been building EndsKeeper. I’ve also been able to enjoy the experience of getting slapped back to reality whenever I start feeling overconfident because I’ll have to ask the AI for help doing something super basic. Most recently, that was “help me figure out how to connect Github and AWS to automate code merges and update my builds.”
Half my life ago, I remember the clear promise of income and a career for the low, low price of a college education. At that point, college was on par with the cost of a mortgage, and the top schools were only rejecting 99% of applicants. The cost of retraining all of us who made that bargain, or training each successive generation to participate in our economy, is far too great for any of us to bear in terms of time and money. I dove into this project because I had to know whether this was a transition I would be able to make. Can I pick up these tools and make them do what I think they should be able to do? Can I learn how this works so I can keep doing what I know how to do as the seasons and the technology change?
As I continue to use GPT, the way the chats run out of memory and start losing context has become apparent to me. I know when the chat is tired. Using one model to help me program automations into other tools and models has enabled me to avoid creating workflows that don’t generate value for the bowlers who use my app. I’m an advertiser and analyst by trade, and I have worked as a product person in a limited capacity in the past. Making my own product from the ground up has opened the opportunity to do my branding work, to mess with copy to my heart’s content, and to get deeper into more “marketing” roles than I’ve ever been able to as a consultant, executive, advertiser, analyist, or any of the other hats I’ve had to wear.
I genuinely want EndsKeeper to work. Stepping back and getting creative about what I have to do to bring something valuable to my customer feels more like “marketing” than I’ve experienced in years.
But that’s two posts in a row about EndsKeeper, and this is the Dog&Stream substack. I’m going to put the ongoing EndsKeeper saga entirely in Endskeeper.Substack.com, starting from the next post for those of you who want to keep up with this. If you are interested, please subscribe there and let me know if you want to be involved in the beta testing. If you bowl, that’s amazing. If you don’t, I’d love for you to start bowling because it’s quite a lovely way to spend a summer afternoon. Endskeeper.com (the website!) is now actually standing up for those of you who would like to look at how this looks as I’m getting ready to move this closer to market. Yes, it’s entirely Canva, and I don’t need to be more than that right now.
Please, I’d love for you to subscribe to the EndsKeeper substack as well, but I’m not going to automatically enroll any Dog&Stream subscribers. You signed up for one thing, and I’m not going to pretend that means you subscribed to every possible thing and wouldn’t you like to send us a fiver to help with our grassroots efforts?
I’d love to have you along for that journey, and I’ll try to come back here with more traditional Dog&Stream stuff next time.