My AI apps keep turning into the same seven tools
The product keeps changing... the infrastructure mostly doesn’t.
My AI stack is usually Inngest, OpenRouter, Postgres, Resend, Twilio, Next.js, and Better Auth.
The product keeps changing… the infrastructure mostly doesn’t.
Different idea. Different users. Different thing the AI is supposed to help with. Then I look at what the app actually needs to do, and there they are again. The same seven names.
At this point, a new project’s architecture diagram could probably be a copy-paste with a different title.
What each piece does
- Next.js handles the UI, API endpoints, incoming webhooks, and callbacks.
- Better Auth handles authentication and sessions.
- Postgres stores users, preferences, records, and application state.
- Inngest coordinates background workflows, scheduling, waits, and retries.
- OpenRouter gives me access to different models through one API.
- Resend handles email.
- Twilio handles text messages.
And the core runs on a VPS.
The Next.js app, including Better Auth, runs alongside Postgres and self-hosted Inngest. OpenRouter, Resend, and Twilio are external APIs the app calls. I’m not running a telecom company in a Docker container. Thankfully.
Same pieces. Different products.
Think about a meal-planning assistant. Someone enters their preferences, a workflow generates a plan, the app saves it, and an email arrives when it’s ready.
Or a cruise-alert app. Someone sets what they’re looking for, a scheduled workflow checks an available data source, and they get a notification when something matches.
Or a customer follow-up tool. An event comes in, the app pulls the relevant history, a model helps draft a message, and the workflow routes it for review or sends it when authorized.
Different products. A lot of the same plumbing.
Take the meal-planning example. A user signs in through Better Auth and submits their preferences through Next.js. The server checks their session, validates the request, and saves a pending job in Postgres.
Inngest runs the workflow: call a model through OpenRouter, check the output, and save the plan. Resend sends the opted-in email. A Next.js webhook endpoint verifies incoming delivery updates and records the status. Twilio can do the equivalent for an opted-in text.
Change the input, the checks, and the output… and you have the beginnings of something else.
There’s still real product work in that sentence. Handling bad output. Making the interface understandable. Deciding whether a notification is useful or just another thing vibrating in someone’s pocket.
But I rarely need another infrastructure service just because the idea changed.
Start small. Let the product earn the infrastructure.
I don’t need to start every app with an AWS architecture diagram that looks like a subway map.
For the kinds of apps I build, a VPS and this stack give me somewhere practical to start. Several pieces are open source, and free tiers can help during experimentation. Hosting, model calls, email and SMS still have costs. Low-cost doesn’t mean free.
But I can start without turning infrastructure into its own project.
When operating the database becomes a problem, I can evaluate moving Postgres to Neon. When the frontend or API needs a different deployment setup, I can look at Vercel or Cloudflare Workers.
Those moves take planning: runtime compatibility, database connections, and where background jobs will run. Moving a badly designed workload doesn’t magically fix it either. But I can move the part that needs help instead of redesigning everything on day one.
AWS has its place. I just don’t need to prepare every new idea for ten million users before finding out whether ten people want it.
The boring stuff still matters
Self-hosting means owning backups, security updates, monitoring, and recovery. “It’s on my VPS” doesn’t mean any of those things take care of themselves.
Sometimes a product needs additional storage, specialized search, heavier compute, or stronger availability guarantees. Add what the problem calls for.
For most of what I’m building, though, these seven tools keep giving me room to experiment without rebuilding the foundation.
The list of things I could build keeps growing.
The stack usually doesn’t.
Technical references: Next.js, Better Auth, Inngest, OpenRouter, Resend, Twilio, Neon, Cloudflare.