Skip to content

Chosen for the work, not the other way round.

We start from what the software needs to do, then choose the languages, frameworks and infrastructure that fit. This page lists the options we choose from and what each is for.

These are representative options, not a claim that we have shipped a project in each. Every choice is made, and its version checked, during the project.

Languages

The languages a product can be written in, each suited to different work.

NameWhat it isUsed for
JavaScriptProgramming languageBehaviour in the browser, and server code in compatible runtimes.
TypeScriptProgramming language, a superset of JavaScriptAdds static types; types do not replace checking the input a program receives.
PythonProgramming languageAI orchestration, data processing, automation and backend APIs.
RustProgramming languagePerformance-sensitive services, native cores, command-line tools and selected WebAssembly modules.
GoProgramming languageNetwork services, infrastructure tooling and concurrent backend work.
C#Programming languageEnterprise APIs and desktop services on the .NET platform.
JavaProgramming languageBusiness applications and services, commonly with Spring.
KotlinProgramming languageAndroid applications and JVM backend services.
SwiftProgramming languageNative applications and integrations on Apple platforms.
DartProgramming languageApplications built with Flutter.
C / C++Programming languagesNative libraries, hardware-facing software and specialized performance work.
PHPProgramming languageCustom server applications, for example with Laravel or Symfony; not the same thing as WordPress.
ElixirProgramming languageConcurrent and real-time services, often with Phoenix.
RubyProgramming languageBusiness web applications, commonly with Rails.
SQLDatabase query languageQuery and change relational data.
HTMLMarkup languageThe structure and meaning of web documents.
CSSStyle-sheet languageLayout, typography, responsiveness and visual presentation.
Shell / PowerShellScripting languagesDeployment, local tooling and operating-system automation.
WGSL / GLSLShader languagesSpecialized GPU and graphics workloads.

Web interfaces

A custom website can combine these: Astro can include React components, and a React application can use Tailwind without Next.js.

NameWhat it isUsed for
ReactUI libraryInteractive interfaces built from components; routing, data and backend are chosen alongside it.
Next.jsReact web frameworkIntegrated web products with server and client rendering and application routes.
AstroWeb frameworkContent-led sites with interactivity only where it is needed; server rendering is available too.
Vue + NuxtUI framework and web frameworkReactive interfaces and integrated Vue applications.
Svelte + SvelteKitUI compiler and application frameworkReactive interfaces and routed full-stack web products.
AngularWeb application frameworkStructured application development, often for large internal interfaces.
React RouterRouting and React framework toolingClient-side routing, or the architecture of a framework-based React application.
ViteDevelopment and build toolingBuilds frontend applications; it does not supply a production backend by itself.
Tailwind CSSCSS frameworkUtility classes for composing custom styling; optional alongside any framework.
CSS Modules / SassStyling toolsScoped CSS or stylesheet preprocessing.
Radix / React Aria / shadcn/uiUI primitives and component resourcesAccessible building blocks, customized to the product.
Three.js / React Three Fiber3D library and React rendererInteractive 3D in the browser; GPU and device limits still apply.
WebGL / WebGPUBrowser graphics APIsGPU rendering and supported compute, after checking the target browsers and devices.
Headless CMSContent-service architectureAn editing interface kept separate from a custom frontend.

Backends and data

The interface framework does not decide the whole system. Transactions, permissions, background work and recovery are designed explicitly.

NameWhat it isUsed for
Node.js / Bun / DenoJavaScript runtimesRun JavaScript and TypeScript server code, after checking library compatibility.
Fastify / Express / HonoServer frameworksTypeScript and JavaScript APIs with different conventions and deployment targets.
NestJSNode.js application frameworkStructured services and modular business APIs.
FastAPI / DjangoPython frameworksAPIs, or integrated backend applications with admin workflows.
Axum / Actix WebRust web frameworksRust services, when native performance or integration needs justify them.
Go net/http / Chi / GinGo HTTP toolingNetwork services and APIs.
ASP.NET Core / Spring BootC# and Java frameworksEnterprise services and business-system integrations.
Laravel / Symfony / Rails / PhoenixPHP, Ruby and Elixir frameworksOther custom backend ecosystems, chosen when the requirements favour them.
PostgreSQL / MySQLRelational databasesStructured transactional data, relationships and constraints.
SQLiteEmbedded relational databaseLocal apps or suitable bounded workloads; concurrent writing needs review.
MongoDBDocument databaseDocument-shaped data, where its model suits the queries and consistency needs.
Redis / ValkeyIn-memory data storesCaching, short-lived state and suitable messaging; not storage that lasts by default.
OpenSearch / Meilisearch / TypesenseSearch systemsIndexed text search, when database search is not enough.
pgvector / QdrantVector extension and vector databaseSearch by meaning; the quality depends on the data and on evaluation.
Object storageStorage serviceUploads, documents, media and backup copies.
Prisma / Drizzle / SQLAlchemyData-access toolsSchemas and data access; migrations and query correctness still need checking.
REST / GraphQL / gRPCAPI styles and protocolsConnect clients and services through a suitable contract.
WebSockets / SSE / webhooksCommunication mechanismsLive connections, events from the server or notifications between systems.
Queues and durable workflowsBackground execution toolingBackground jobs and retries that survive restarts.

Mobile, desktop and AI

Platform access, installation, offline needs and data boundaries are settled before a toolkit is chosen.

NameWhat it isUsed for
React Native + ExpoMobile framework and toolingiOS and Android apps built with React, with native modules where needed.
Flutter + DartUI framework and languageOne codebase across supported mobile, web and desktop targets.
Swift + SwiftUI / UIKitLanguage and Apple UI frameworksApple-native experiences and deep platform integration.
Kotlin + Jetpack ComposeLanguage and Android UI toolkitAndroid-native interfaces and platform integration.
Kotlin MultiplatformCode-sharing technologyShare selected logic across platforms; the interface is a separate choice.
Tauri + Rust + web UIApplication toolkitA native core with the system's own webview; platform capabilities are checked first.
Electron + JS/TSDesktop frameworkDesktop apps on Chromium and Node.js, trading runtime size and memory for reach.
Qt + C++ / PythonApplication frameworkCross-platform desktop interfaces and native technical integration.
.NET + WinUI / WPF / AvaloniaRuntime and UI frameworksWindows-native or selected cross-platform desktop products.
Godot / Unity / UnrealGame and simulation enginesInteractive games or simulations; licensing, tooling and platform fit vary.
WebAssemblyPortable compilation formatRun suitable compiled modules in compatible hosts; not a speed guarantee on its own.
ONNX Runtime / llama.cppInference runtimesRun supported models locally, within the model's and the hardware's limits.
PyTorch / scikit-learnMachine-learning librariesTraining or adapting models, or conventional machine-learning workflows.
Model APIs / agent SDKsHosted interfaces and librariesModel inference and tools, with authentication and cost controls.
MCPTool integration protocolGive compatible AI clients controlled access to tools and resources.
OpenCV / FFmpeg / OCR toolsProcessing libraries and toolsComputer vision, media conversion and text extraction.

Operations and verification

Hosting supports the product; it does not replace backups, release checks, access controls or someone responsible for maintenance.

NameWhat it isUsed for
Cloud infrastructureCompute and storage from infrastructure providersServers, storage and managed services, with the region and recovery strategy chosen for the project.
LinuxOperating system familyThe usual server environment; administration and patching remain our responsibility.
ContainersPackaging and local orchestrationPackage services and define bounded multi-service deployments.
Container orchestrationCluster platformUsed where the operational needs justify it; not a default.
Web servers and reverse proxiesTraffic handlingRouting, TLS and serving or proxying traffic.
DNS and content deliveryEdge and delivery servicesCache and route traffic with suitable access and security settings.
Infrastructure as codeInfrastructure automationProvision and configure repeatable infrastructure.
Continuous integration and deliveryDelivery automationBuild, check and deploy agreed versions.
Metrics, traces and dashboardsObservabilityFollow how systems behave and investigate problems.
Error tracking and structured logsDiagnosticsTrack failures, with care over what data is recorded.
Automated testsTest toolsCheck business rules and how the code behaves.
Browser and device testingJourney checksWalk through real journeys, permissions, saved data and compatibility.
OAuth, OIDC and passkeysIdentity standardsSign-in done properly; what each person may do is still decided on the server.
Accessibility checks (WCAG)Design and testing practiceKeyboard access, meaning, contrast and conformance testing.

Terms kept straight

React is a UI library. Next.js and Astro are web frameworks. Tailwind CSS is a CSS framework. Node.js is a runtime. PostgreSQL is a database. Rust and TypeScript are programming languages. WebAssembly is a compilation format, not a programming language.

Quality comes from the work

Rust's memory safety does not make business logic secure. TypeScript types do not check untrusted requests. A database does not come with tested backups. A framework does not guarantee accessibility, search visibility or speed. That engineering and checking is part of the scope.

Choosing a web stack

Astro, Next.js and React, chosen by the work.

Our starting points for common needs. They are engineering recommendations, not rankings.

What the site needsWhere we startWhy
Mostly public content: company, tourism, articles, documentationAstro + TypeScriptHTML first, with interactive parts only where needed; server rendering is available too.
Accounts, transactions and personalized pagesNext.js + React + TypeScriptIts server and client conventions suit many integrated products.
An internal dashboard with a separate APIReact + Vite or React RouterKeeps the browser interface and the server apart, with sign-in and deployment defined explicitly.
A public site plus a complex customer portalAn Astro site with a separate app, or one Next.js appDecided by shared state, deployment complexity and who maintains it.
A storefront on an external commerce backendAstro or Next.jsAstro can suit content-heavy storefronts; Next.js can suit tightly integrated interactions.
Highly interactive sections inside a content siteAstro with React, Vue or Svelte componentsOnly the sections that need it become interactive, instead of every page being an app.
A team or existing code that favours another ecosystemNuxt, SvelteKit, Angular or another suitable stackExisting architecture and maintainability can outweigh a default preference.

Common mix-ups

Next.js is not automatically faster or better for search. Astro is not limited to static pages. React can be used inside either, so React against Astro is not a like-for-like comparison. Tailwind works at the styling layer. Rust usually serves a backend, a native core or a compiled module rather than replacing the browser interface.

What decides it

Content or application behaviour; editorial workflow; sign-in and permissions; how fresh the data must be; transactions; offline needs; platform APIs; existing integrations; hosting constraints; measured performance; accessibility; maintenance; licensing and total running cost.

Example architectures

Starting points, family by family.

Plausible first designs for common situations. No project combines every technology on this page.

SituationA plausible architectureWhy
W Website for a service businessAstro + TypeScript + CSS or Tailwind + a forms API; optionally a headless CMSContent-led public pages with limited interaction.
W Integrated online storeNext.js + React + a commerce API + a payment providerAccounts, cart and checkout on a supported commerce backend.
A Booking portalNext.js + TypeScript + PostgreSQL + a queue + an identity providerAvailability, reservations, permissions and notifications sent in the background.
A Mobile companion appReact Native with Expo, or Flutter, on a shared signed-in APIA mobile experience with its platform and offline needs stated up front.
B Internal operations dashboardReact + Vite + FastAPI or .NET + PostgreSQLA separate interface and business API, with access by role and audit records.
I Document assistantA Python or TypeScript API + ingestion jobs + document storage + retrieval + a modelAnswers that can be traced to their source, with access control and quality evaluation.
M Incident review systemA React dashboard + an API + a database + a queue + a platform connectorEvidence that can be reviewed, and moderation actions under control.
D Local file-processing toolTauri + a React and TypeScript interface + Rust + SQLiteProcessing that stays on the machine, in an installed product.
D Apple-specific native productSwift and SwiftUI + suitable local storage and APIsWhen native Apple integration is central to the experience.
O Managed deploymentLinux servers + a reverse proxy + CI + backups + monitoringInfrastructure that is operated, with release and recovery procedures.
S Visibility and measurementA properly rendered site + analytics + reporting in Python or TypeScriptDiscovery and conversion measured from evidence.

Migrations and integrations

A modern rebuild keeps the agreed content, important URLs, business data and working integrations, with a written migration plan and the results read back after the move. Existing systems do not need rewriting just because another stack is preferred.

Official documentation

The descriptions of the main frameworks were checked against their official documentation on 30 September 2026.

Start

Tell us what you are building.

A short description is enough. You get a straight read on scope, cost, and our honest take on the best approach, before anyone commits.

Write to [email protected] · New projects and general questions

  • Built from zero, no templates
  • Hosted and maintained by the same team
  • Scope and cost agreed before we start
  • Updates, monitoring and support after launch
  • Findable in search and AI answers