The stack we build on, and what each part is actually for
Every technology here comes with a line saying where we use it, because a wall of logos tells you nothing. If something you rely on is missing, ask. The list below is what comes up often enough to be worth writing down.
Core
Used on our own products and client work, day in and day out.
Regular
Shipped on client projects when the job calls for it.
Capable
We take this on, most often to maintain or migrate something that already exists.
Mobile
Native and cross-platform apps for iOS and Android.
Flutter
Our default for cross-platform. One codebase, both stores.
React Native
Cross-platform apps where the team already lives in React.
Swift
Native iOS where performance or deep platform access matters.
Kotlin
Native Android, including Jetpack Compose interfaces.
iOS
App Store submission, review, and staged rollouts.
Android
Play Console setup, release tracks, and device fragmentation.
Dart
The language behind our Flutter work.
Expo
Faster React Native delivery and over-the-air updates.
.NET MAUI
The supported successor to Xamarin for .NET shops.
Ionic
Web-tech mobile apps where an existing web team owns the code.
Objective-C
Maintaining and migrating older iOS codebases.
Web front end
Interfaces that stay fast on real devices and readable to search engines.
Next.js
Our default web framework. This site runs on it.
React
The component layer under almost everything we ship.
TypeScript
Types end to end, so a large codebase stays safe to change.
JavaScript
Where a build step is not worth it.
HTML5
Semantic markup, which is also what accessibility rests on.
CSS3
Modern layout without dragging in a framework by reflex.
Sass
On codebases that already standardised on it.
Tailwind CSS
Fast, consistent styling when a team prefers utilities.
Vite
Build tooling for single-page apps behind a login.
Redux
Predictable state on genuinely complex screens.
Angular
Maintaining and extending existing enterprise front ends.
Vue.js
Client teams already invested in Vue.
Nuxt
Server-rendered Vue applications.
Svelte
Lightweight interfaces where bundle size is the constraint.
Astro
Content-heavy sites that should ship almost no JavaScript.
Webpack
Legacy build pipelines that still need care.
Back end and APIs
The services behind the interface, and the languages we write them in.
Node.js
One language across the front end and the API.
Python
Data work, automation, and AI services.
Express
Small, direct HTTP services.
NestJS
Structured TypeScript APIs on larger teams.
FastAPI
Typed Python services, especially around models.
Django
Python applications that need an admin out of the box.
Flask
Focused Python services and internal tools.
GraphQL
When many clients need different shapes of the same data.
WebSockets
Live dashboards, chat, and presence.
PHP
Maintaining and modernising existing PHP systems.
Laravel
PHP applications with an established structure.
Symfony
Enterprise PHP codebases.
.NET
C# services, often alongside existing Microsoft infrastructure.
Spring
Java services in enterprise environments.
Go
Small, fast services where concurrency matters.
Rust
Performance-critical components.
Ruby on Rails
Inheriting and maintaining Rails applications.
Deno
Edge and isolated runtimes.
Bun
Faster JavaScript tooling and runtimes.
Data and storage
Systems of record, caches, search, and the layer that talks to them.
PostgreSQL
Our default database, including row-level security for tenant isolation.
Prisma
Typed data access with reviewable, reversible migrations.
SQLite
Embedded and on-device storage, and small production workloads.
Firebase
Auth, push, and realtime sync on mobile products.
MongoDB
Document storage where the shape genuinely varies.
MySQL
Existing systems and most CMS-backed platforms.
Redis
Caching, rate limiting, and job queues.
Supabase
Postgres with batteries included, for fast starts.
Elasticsearch
Full-text search across large catalogues.
Algolia
Hosted search when speed to launch beats control.
Kafka
Event streaming between services at volume.
RabbitMQ
Message queues and background job distribution.
SQL Server
Microsoft-stack data platforms.
DynamoDB
Key-value workloads on AWS.
Cloud, infrastructure and DevOps
Where the software runs, and how it gets there without drama.
AWS
Primary hosting, plus S3 storage and SES for transactional email.
Docker
Identical environments from a laptop through to production.
GitHub Actions
Build, test, and deploy on merge. Our own CD runs on it.
Nginx
Reverse proxy, TLS termination, and static serving.
Cloudflare
DNS, CDN, WAF, and origin certificates.
Ubuntu
The server operating system we deploy onto.
Git
Version control on every engagement, in a repository you own.
Linux
Server administration, hardening, and diagnosis.
Vercel
Managed hosting for Next.js when a team wants zero ops.
Kubernetes
Orchestration where the scale genuinely calls for it.
Terraform
Infrastructure as code, so environments are reproducible.
Ansible
Configuration management across fleets of servers.
Google Cloud
GCP hosting and managed services.
Azure
Microsoft-stack cloud deployments.
Jenkins
Existing CI pipelines we inherit and maintain.
GitLab
Repositories and CI where the client already standardised there.
Sentry
Error tracking, so we hear about failures before your users call.
AI and machine learning
Model-agnostic on purpose, with evaluation and cost control built in.
OpenAI API
Language features behind a provider-agnostic interface.
Anthropic Claude
Long-context reasoning and document work.
pgvector
Vector search inside the Postgres you already run.
LangChain
Orchestrating retrieval and tool use.
Hugging Face
Open models, including self-hosted where data cannot leave.
PyTorch
Custom and fine-tuned models where they genuinely earn their place.
TensorFlow
Existing ML pipelines and on-device inference.
OpenCV
Computer vision and image processing.
pandas
Data cleaning and analysis, usually the real work in an AI project.
NumPy
Numerical work underneath the analysis.
Jupyter
Exploration and shared analysis with your team.
Payments and platform services
The third-party systems a real product ends up depending on.
Stripe
Subscriptions, proration, dunning, and idempotent webhooks.
Twilio
SMS, phone verification, and reminders.
Auth0
Managed identity and single sign-on where procurement requires it.
Mapbox
Maps, geocoding, and live tracking interfaces.
LiveKit
Live video and screen sharing. Our meetings feature runs on it.
WebRTC
Peer-to-peer audio, video, and data.
CMS and commerce
When a platform is the right answer and a custom build is not.
WordPress
Content sites where editors need to work without us.
Shopify
Storefronts, themes, and custom apps.
WooCommerce
Commerce on an existing WordPress estate.
Strapi
Headless content for an app and a website at once.
Sanity
Structured content with a strong editing experience.
Contentful
Enterprise headless CMS.
Drupal
Large content estates with complex permissions.
Magento
Adobe Commerce storefronts.
Webflow
Marketing sites a client wants to edit visually.
Squarespace
Small sites where a platform beats a build.
Wix
Migrations off it, more often than onto it.
Design and quality
How it gets designed, and how we know it still works.
Figma
Design, prototypes, and handoff. Where the interface is decided.
Framer
Motion studies and interactive prototypes.
Sketch
Existing design systems that still live there.
Blender
3D and product visuals.
Jest
Unit tests on the logic that would hurt to get wrong.
Cypress
End-to-end tests through the interface a user actually touches.
Selenium
Browser automation on established suites.
Storybook
Component libraries a client team can browse and reuse.
Questions about our stack
What if the technology we use is not on this list?
Ask. The list is what comes up often enough to be worth writing down, not a boundary. Most stacks are variations on the same handful of ideas, and a team that knows one relational database or one component framework well is rarely helpless in front of another. Where something genuinely is outside what we can support responsibly, we will tell you that on the first call rather than learn it on your budget.
Do we have to use your preferred stack?
No. If you already have a team, an existing codebase or a company standard, the right technology is usually the one your people can maintain after we leave. We will say when we think a choice will cost you later, and then we will build in what you have chosen. The exception is a decision that is genuinely unsafe rather than merely different, and that is rare enough to be worth arguing about properly when it happens.
How do you choose what to build something in?
Working backwards from constraints rather than forwards from preferences. Who maintains it after launch, how easily you can hire for it, whether the job is mostly interface or mostly data, whether anything runs away from a network, and how long it has to keep working. Those answers usually narrow it to two reasonable options, and at that point the difference between them matters far less than picking one and being consistent.
What do core, regular and capable actually mean?
They record how much of our own work sits on a technology, so breadth is never mistaken for equal depth. Core is what we use daily on our own products and client work. Regular is shipped on client projects when the job calls for it. Capable is work we take on, most often to maintain or migrate something that already exists. All three are real. They are not equally deep, and we would rather say so than imply otherwise across a hundred logos.
Some of our stack is old. Is that a problem?
It depends entirely on whether it is old or unsupported, which are different things. Mature and stable is usually good. Past end of life is a different matter: it means security patches have stopped, app stores may eventually refuse the build, and the pool of people willing to work on it shrinks every year. If you are not sure which side you are on, that is exactly what a software audit answers.
Can you work alongside our existing developers?
Often that is the best arrangement. We can take a subsystem while your team keeps the rest, pair with them on an unfamiliar part of the stack, or build something and hand it over for them to own. We write the code, documentation and deployment pipeline with that handover assumed, because software your own team cannot maintain is a liability no matter how well it runs today.
The list matters less than the choosing
Any agency can publish a hundred logos. What decides whether your project goes well is picking the right handful for your problem and being honest about the tradeoffs, including when the answer is a platform you can buy instead of anything on this page. That conversation is free, and we will give you a straight recommendation even when it costs us the work.
Let's build something worth shipping
Tell us about your idea. With a track record of success and a commitment to client satisfaction, we'll help bring your product to life.