Our stack
We are opinionated about technology. These are the tools we have chosen, why we chose them, and how we use them in production.
Technologies
- Next.jsApp framework of choice. RSC, streaming, and edge-ready.
- ReactComponent model we know inside and out.
- TypeScriptStrict mode, always. No exceptions.
- Tailwind CSSDesign systems built for velocity and consistency.
- Framer MotionPolished animations without the overhead.
- Node.jsPrimary runtime for API services and serverless functions.
- GoHigh-throughput services where performance is critical.
- PythonData pipelines, ML inference, and scripting.
- tRPCEnd-to-end type safety between client and server.
- GraphQLFor complex data graphs and flexible client queries.
- PostgreSQLOur default database. Reliable, powerful, and battle-tested.
- NeonServerless Postgres with instant branching for dev/staging.
- RedisCaching, rate limiting, and pub/sub. Hosted via Upstash.
- Drizzle ORMType-safe SQL. Migrations that never surprise us.
- PrismaRapid prototyping and projects requiring a rich ecosystem.
- VercelZero-config deploys, edge network, and previews per branch.
- AWSECS, Lambda, S3, CloudFront for enterprise-grade workloads.
- DockerConsistent environments from development to production.
- GitHub ActionsCI/CD pipelines that run fast and never block shipping.
- TerraformInfrastructure as code for reproducible, auditable stacks.
- DatadogAPM, logging, and dashboards for production systems.
- SentryError tracking with full stack traces and release tracking.
- Vercel AnalyticsReal user performance metrics without hurting performance.
- PagerDutyOn-call rotation and incident management.
- OpenTelemetryVendor-neutral tracing across distributed services.
- VitestFast unit and integration tests. Vite-native.
- PlaywrightEnd-to-end testing across browsers with zero flakiness.
- Testing LibraryTests that resemble how users actually use the software.
- StorybookIsolated component development and visual regression.
- ChecklySynthetic monitoring — tests that run in production.
Engineering principles
Beyond tools — the practices that define how we build.
TypeScript everywhere
Every project runs TypeScript in strict mode. We treat type errors as build failures. Runtime surprises are not acceptable.
Test before ship
Unit tests for logic, integration tests for APIs, E2E tests for critical paths. Coverage gates are enforced in CI.
Performance is a feature
We set Lighthouse score thresholds in CI. If a PR degrades performance, it does not merge. Performance regressions are bugs.
Small PRs, fast reviews
We review code within 2 hours during working hours. PRs stay under 400 lines. Large changes are broken into incremental steps.
Trunk-based development
Short-lived feature branches, daily merges to main, and continuous deployment. Feature flags gate in-progress work.
Zero secrets in code
Environment variables only. Secret scanning runs on every commit. Secrets are rotated on every offboarding.
Curious how this applies to your project?
We use the right tool for the job — but the job always comes first.