Our stack
We choose the technology to fit the problem.
Not the other way round. Here is what we build on, and the reasoning behind each choice.
Backend
The application layer where business rules, data integrity and integrations live.
-
Laravel
A mature PHP framework with the unglamorous parts — queues, migrations, auth, testing — already solved.
How we use it -
PHP
A mature server-side language with predictable hosting, long support windows and a deep hiring pool.
How we use it -
Node.js
A JavaScript runtime suited to I/O-heavy services, real-time connections and streaming.
How we use it -
NestJS
An opinionated Node.js framework with dependency injection and modules, for services that will outlive their first author.
How we use it -
REST APIs
HTTP APIs designed to be integrated against — stable contracts, honest status codes and authentication planned from the start.
How we use it -
GraphQL
A query language for APIs where several clients need different slices of the same data without a new endpoint each time.
How we use it -
Python
Used for data processing, automation, integrations and machine-learning workloads alongside our main application stack.
How we use it -
Django
A mature Python framework with an admin, ORM and auth included — strong where the domain is data-shaped.
How we use it -
FastAPI
A modern async Python framework for high-throughput APIs and model-serving endpoints, with typed contracts and generated documentation.
How we use it -
Express
A lightweight Node framework for small, well-scoped services where a full framework would be overhead.
How we use it -
WebSockets
Real-time two-way communication for interfaces where waiting for a refresh is the wrong experience.
How we use it -
gRPC
A binary RPC protocol with typed contracts, for internal traffic between services rather than public APIs.
How we use it
Frontend
Interfaces that stay fast on real devices and real networks.
-
React
A component library for interfaces with real client-side state — editors, dashboards, builders.
How we use it -
Next.js
A React framework that lets each route choose static, server-rendered or client-rendered.
How we use it -
Vue
A progressive JavaScript framework used where an interface needs real client-side state without a heavyweight toolchain.
How we use it -
TypeScript
Static typing over JavaScript, which turns a category of runtime failures into build failures.
How we use it -
Tailwind CSS
Utility-first CSS with design tokens, used to keep interfaces consistent across years of change.
How we use it -
Livewire
Server-rendered reactive components for Laravel — full interactivity without building and maintaining an API plus an SPA.
How we use it -
Svelte
A front-end framework that compiles components away at build time, producing minimal JavaScript for the browser.
How we use it -
Nuxt
A Vue meta-framework providing server rendering, routing and conventions for content-heavy and SEO-sensitive sites.
How we use it -
Alpine.js
A small declarative library for interactivity on server-rendered pages, without a build step or a framework.
How we use it -
Inertia.js
A bridge between a Laravel backend and a React or Vue front-end, without building a separate API layer.
How we use it -
HTML & CSS
Semantic, accessible markup and modern CSS — the foundation that decides whether a site is fast and usable.
How we use it -
Vite
The bundler and dev server behind our front-end work — instant startup and near-instant hot reload.
How we use it
Mobile
Applications for iOS and Android, native or cross-platform.
-
Flutter
A cross-platform UI toolkit that compiles to native code for iOS and Android.
How we use it -
Android
Native Android applications for hardware access, background reliability and performance that cross-platform cannot reach.
How we use it -
iOS
Native iPhone and iPad applications built to platform conventions, for products where iOS is the primary experience.
How we use it -
Kotlin
Kotlin and Jetpack Compose for modern Android applications, with the null safety that removes the platform's most common crash.
How we use it -
Swift
Swift and SwiftUI for native iOS, iPadOS and macOS applications, with type safety that removes whole categories of crash.
How we use it -
React Native
Cross-platform mobile development for teams already invested in React, sharing logic between web and mobile.
How we use it -
Firebase
Authentication, real-time data, notifications and analytics as managed services — for products where speed to market matters most.
How we use it
Data
Storage chosen for the shape of the data, not by habit.
-
MySQL
A relational database with predictable behaviour, mature tooling and well-understood operations.
How we use it -
PostgreSQL
A relational database with strong constraints, rich types and genuinely powerful querying — our choice for data-heavy systems.
How we use it -
MongoDB
Used where records vary in shape and are read as whole documents rather than joined across tables.
How we use it -
Redis
The layer that absorbs load: cached reads, queued background work, session storage and rate limiting.
How we use it -
SQLite
Embedded storage for mobile applications, offline-first features and lightweight services.
How we use it -
Elasticsearch
Full-text search and analytics for large catalogues, with relevance tuning, faceting and typo tolerance.
How we use it -
Meilisearch
A lightweight search engine that delivers instant, forgiving results for most catalogues and content sites.
How we use it -
Supabase
A managed Postgres platform with authentication, storage, real-time subscriptions and generated APIs.
How we use it -
RabbitMQ
A message broker for asynchronous processing and integration, where delivery guarantees matter more than raw speed.
How we use it
Cloud & Infrastructure
Deployment that is repeatable, observable and recoverable.
-
AWS
Cloud infrastructure on AWS, defined as code and reviewed for cost as well as correctness.
How we use it -
Docker
Containers that make development, staging and production genuinely comparable.
How we use it -
Cloudflare
CDN, DNS, WAF and edge caching — global performance and protection without changing the application.
How we use it -
GitHub Actions
CI/CD pipelines where the code lives — automated testing, static analysis and deployment on every push.
How we use it -
Kubernetes
Automated deployment, scaling and recovery of containerised services, where scale and complexity justify the operational cost.
How we use it -
Terraform
Declarative infrastructure provisioning, so environments are reproducible and changes are auditable.
How we use it -
Nginx
Reverse proxying, TLS termination, static file serving and load balancing for our production deployments.
How we use it -
GitLab CI
Integrated CI/CD with testing, analysis and deployment stages defined alongside the repository.
How we use it -
DigitalOcean
Straightforward cloud infrastructure for applications that need reliable hosting rather than a hyperscaler.
How we use it -
Sentry
Error tracking and performance monitoring, with the context needed to fix a problem rather than merely notice it.
How we use it
Unsure which stack fits your project?
Describe the constraints — team, timeline, budget, existing systems — and we will recommend an approach and explain the trade-offs.