I have a graveyard of side projects. It's a beautiful, sad collection of half-built dashboards, empty databases, and commits that end with "WIP — will refactor later." We all have one. I once spent a month building a "Personal AI Assistant" that could control my calendar. I got as far as connecting it to Google Calendar before I realized I had spent zero time thinking about how the user would actually interact with it. It never saw the light of day.
But over the last two months, something clicked. I shipped three AI side projects. Not prototypes. Shipped. Live URLs. Real users giving feedback (even if that feedback was just "this is cool").
I want to share what changed, because I don't think the secret is "better frameworks" or "more time." It's a mindset shift, and a hard look at where our time actually goes when we build with AI.
Stop Trying to Host the Model Yourself
My first instinct with every AI project was "I need to run this locally." I spent three days trying to get Llama 2 running on an old Mac Mini. I learned more about llama.cpp quantization than I did about my actual product. I remember staying up until 3 AM trying to quantize a model to fit on my laptop's 8GB of RAM. The next day I was too tired to write the actual app logic. I learned a hard lesson: the market doesn't care about my quantization expertise.
For my next three projects, I made a strict rule: No self-hosted models in the MVP.
The MVP doesn't need the cheapest inference. It needs any inference that works. I swapped my "build the infra" brain for "build the integration" brain.
Look at the core logic of my latest MVP, a simple document Q&A bot:
// This is the ENTIRE "AI" part of the codebase for the MVP
import OpenAI from 'openai';
const client = new OpenAI({
baseURL: process.env.API_BASE_URL, // Where all my models live
apiKey: process.env.API_KEY,
});
export async function askDocument(question, context) {
const response = await client.chat.completions.create({
model: 'gpt-4o-mini', // Fast, cheap, great for MVPs
messages: [
{ role: 'system', content: 'Answer the question based on the provided context.' },
{ role: 'user', content: `Context: ${context}\n\nQuestion: ${question}` },
],
});
return response.choices[0].message.content;
}
That's it. The whole AI pipeline is an HTTP request. No GPU, no Docker compose file for Ollama, no vector database (yet). It just works.
The moment I accepted that the "AI part" could be a 15-line function, my shipping velocity exploded. The time I used to spend wrestling with infrastructure was now spent on the actual product logic.
The 80/20 of AI Products
We often think an AI product needs to be a full SaaS platform. Login, billing, settings, teams, a RAG pipeline, a fine-tuned model.
Here are the three things I actually built:
- The "Summarize This" Slack Bot: A slash command
/summarizethat takes the last 50 messages and pings a model. No database. No UI. Took 4 hours. - The "PR Review Buddy": A GitHub App webhook. When a PR is opened, it fetches the diff, sends it to an LLM, and posts a comment. It was just a Node.js server listening for webhooks. No database. No UI. The user installs the GitHub App and it just works. I got my first user (a friend) within an hour of deploying it. Took 6 hours.
- The "Content Repurposer": A simple web app where you paste a blog post URL, and it outputs a Twitter thread and a LinkedIn post. Took a weekend.
None of these have user authentication. None of them have beautiful landing pages. They are just functional.
The lesson: Your first user doesn't care about your architecture. They care about the output. They don't care that you don't have a login flow. They care that the summary is good.
I had to ruthlessly prioritize. What is the 20% of the feature that gives 80% of the value? For the PR Buddy, it was just posting the review. It didn't need to track previous reviews, or have a dashboard. It just needed to comment.
Infrastructure is a Solved Problem (Stop Solving It)
I used to spend 80% of my project time on infrastructure. Setting up the model, managing the API keys for different providers (OpenAI, Anthropic, Google), handling rate limits, dealing with billing dashboards.
It was tedious. It killed my motivation. I had $50 in OpenAI credits, $25 in Anthropic, and a random Google Cloud coupon. I spent more time checking my billing dashboards than checking my user feedback. The anxiety of managing multiple disparate billing systems was a real creativity killer.
I switched to a unified API endpoint. This is the single biggest productivity hack I've found for my side projects.
Why this matters for shipping:
-
No vendor lock-in: If OpenAI is down, I change the model name from
gpt-4otoclaude-3-haikuin my.envfile. That's it. The code doesn't change. - Pay as you go: I don't have to pre-purchase credits. My "Summarize This" bot costs about $2 a month to run. I can handle that. No surprise bills.
- No GPU costs: I am not paying for a dedicated GPU that sits idle 23 hours a day.
I personally consolidate everything behind tai.shadie-oneapi.com. It handles the routing, the fallbacks, and the billing. It removes the friction. The only thing left is writing the actual product code. It's the "just ship" philosophy applied to infrastructure. If you're trying to avoid the exact trap I fell into, having a single key to access everything from GPT-4 to Claude to the latest open-source models is a game-changer for the process of building.
The Real Lesson
Shifting from "I need to own the stack" to "I need to own the user's problem" was the real breakthrough.
I stopped thinking about myself as an AI engineer and started thinking about myself as a product builder who happens to use AI APIs. The infrastructure is a solved problem. The market doesn't care about your quantization level. It cares about what you build.
If you have an idea right now, don't open a browser to research the best way to host a model. Open your code editor.
Write the function that calls an API. Build the simplest possible version. Put it in front of someone.
The hard part isn't the AI. The hard part is the discipline to ship. The best AI project is the one that exists.
Go build it.
Top comments (0)