One boring stack, labelled honestly.
Boring is the point. Every item below is marked as shipped, available, or not yet. The AI layer is isolated so a model can be swapped without touching the product.
| Layer | What we use | Status |
|---|---|---|
| Language | TypeScript, end to end | Shipped |
| Python for data and model work | Shipped | |
| Web and product | Astro for content sites This site. | Shipped |
| Next.js or React Router for app UIs | Available | |
| Tailwind CSS | Shipped | |
| React Native and Expo for iOS and Android Nibblio. | Shipped | |
| API and jobs | Node (Hono or Express) or FastAPI | Shipped |
| Background jobs with a queue Nibblio, on RabbitMQ. | Shipped | |
| Data | PostgreSQL | Shipped |
| Vector search in Postgres (pgvector) | Available | |
| Redis for caching and queues | Available | |
| AI layer | One model interface, swappable per task Model accounts are yours. | Shipped |
| Evaluation sets on your real data, run on every change | Shipped | |
| Review queues for low-confidence cases | Shipped | |
| Retrieval over your documents | Available | |
| Fine-tuning | Not yet shipped | |
| Auth, payments, email | Managed auth (Clerk or Auth.js) or your identity provider | Available |
| Stripe | Available | |
| Transactional email (Resend) | Shipped | |
| Cloud and operations | Cloudflare, AWS or Hetzner, on your account | Shipped |
| Infrastructure as code, CI with tests on every change | Shipped | |
| Error tracking (Sentry) and uptime monitoring | Shipped |
Questions we get on the first call.
Which AI models do you use, and are we locked in?
We choose the model per task, by quality and cost, and keep the model layer behind one interface so it can be swapped. Model accounts are yours from day one. Nothing in the build ties you to one vendor.
Can you use our stack instead?
Often, yes. If your system is TypeScript, Python or a mainstream cloud, we work inside it. If it is something else, we say so on the first call and quote accordingly or recommend someone else.
Why this stack?
Because we have shipped with it and can support it. TypeScript end to end keeps one language across the product. Postgres is boring in the right way. The AI layer is isolated so a model can be swapped without touching the product.
Book a call, or send the brief. A written price in three working days.
No NDA needed for the call. We sign one within 24 hours if you want it.