Back to the site
Architecture and technology

Technical decisions that support your product.

Early decisions affect maintenance, security, and evolution. These are the technologies we operate in production — and the reasoning behind each choice.

19
Production technologies
8
Layers covered
Clear code
Ready to evolve
Integrations
Chosen for the context
Layer by layer

Frontend & Web

Interfaces that load quickly on any device and remain clear for the people who will evolve them later.

Next.js

Full-stack React framework with native App Router, Server Components, and streaming.

Why we use it

Keeps pages, server components, and application routes together when that makes maintenance simpler.

React

Declarative component-based UI library with Virtual DOM and concurrent rendering.

Why we use it

Reusable components keep behavior and visual quality consistent across screens.

TypeScript

Strongly typed JavaScript superset with static analysis and advanced inference.

Why we use it

Static checks catch incompatible contracts before deployment and document the code.

Tailwind CSS

Utility-first CSS framework with native design tokens through CSS variables.

Why we use it

Utilities and CSS variables apply the design system without duplicating style sheets.

Mobile

Native iOS and Android apps from one codebase, without duplicating teams and maintenance.

React Native

Framework for native iOS and Android apps using React components and native APIs.

Why we use it

Shares part of the product model and React experience between web and mobile.

Expo

Managed React Native platform with a unified SDK, EAS Build, and over-the-air updates.

Why we use it

Organizes React Native builds and distribution through a documented workflow.

NativeWind

Tailwind CSS conventions for React Native through optimized StyleSheet output.

Why we use it

Keeps the styling language close to the one used in web projects.

Backend & APIs

End-to-end typed APIs whose client-server contract is checked before production.

Hono

Compact web framework compatible with multiple JavaScript runtimes.

Why we use it

Fits small APIs where runtime portability matters more than a full framework.

Node.js

Asynchronous JavaScript runtime for background services and integrations.

Why we use it

A strong fit for integrations, scripts, and services that need the JavaScript ecosystem.

Databases

Relational integrity, typed access, and versioned migrations instead of manual production changes.

Supabase

Managed PostgreSQL with integrated Auth, Storage, Realtime, and Edge Functions.

Why we use it

Combines managed PostgreSQL with authentication, storage, and events when the scope needs them.

Drizzle ORM

TypeScript ORM with a SQL-like API and migration support.

Why we use it

Keeps schemas and queries close to TypeScript without hiding how SQL works.

CMS

Client-editable content with a structure that stays versioned alongside the code.

Sanity

Headless CMS with Content Lake, Portable Text, and a customizable React Studio.

Why we use it

Fits projects that genuinely need a structured content editing panel.

Payments

Online payments with PCI security delegated to the provider, so card data never crosses the app.

Stripe

Payments platform with Checkout, Billing, Connect, and Radar fraud prevention.

Why we use it

Provides proven flows for payments, subscriptions, and platforms when needed.

DevOps & Deployment

Automated releases with checks before delivery and reproducible environments.

Vercel

Deployment platform with a global CDN, preview environments, and integrated analytics.

Why we use it

Makes per-change previews and compatible application releases straightforward.

TurboRepo

Build orchestrator with incremental caching and parallel task execution.

Why we use it

Reuses unchanged work and avoids repeating a full build unnecessarily.

Docker

Workload containerization with optimized images and local environment composition.

Why we use it

Reproduces local services with declared versions and configuration.

GitHub Actions

Repository-native CI/CD with build matrices, dependency caching, and automated deployment.

Why we use it

Runs the automated checks defined alongside the project source.

Design & UI System

Accessible components and shared rules that preserve visual consistency as the product grows.

shadcn/ui

Accessible React components built with Radix UI and Tailwind CSS.

Why we use it

Components remain in the project and can be adapted without a closed visual layer.

Figma

Collaborative design tool with components, variables, and advanced prototyping.

Why we use it

Variables, components, and inspection record interface decisions before implementation.