Tech stack

Overview

Interface
Next.js 16TypeScript strictReact 19
Orchestration
LangGraphCrewAI
LLM
Claude SonnetClaude Haiku
Memory & tools
pgvectorTavilyLangfuse
Infrastructure
Scaleway fr-parDockerGitHub Actions

Interface → Orchestration → LLM → Memory/Tools → Infrastructure

Orchestration

LangGraphStateful agent graphs

Cycles, conditional branches, and cross-call state persistence. Native checkpointing: if the process crashes at 3am, it resumes from the last stable node.

vs. LangChain LCEL: LangGraph for anything requiring cycles or state. LCEL for simple linear pipelines.

Details →
CrewAICollaborative agent teams

When the problem naturally splits into distinct roles: Researcher, Writer, Validator. Higher abstraction than LangGraph, less code for cases without complex cycles.

vs. LangGraph: CrewAI for sequential role-based pipelines. LangGraph when you need cycles or precise state machines.

Details →

Memory & search

pgvector + SupabaseRAG and state persistence

PostgreSQL extension for vector search: no separate infrastructure. The same database handles application state, embeddings, and Row Level Security for tenant isolation.

vs. Pinecone: pgvector for < 10M vectors when transactional consistency matters. Pinecone for extreme volumes (> 100M vectors).

Details →
Tavily SearchReal-time web search

Search API built for LLMs: pre-cleaned snippets, domain filtering. Used in competitive intelligence and document research agents.

vs. SerpAPI: Tavily returns content directly usable by an LLM. Cost per request ~3x lower at equivalent snippet quality.

Details →
LangfuseLLM tracing & cost monitoring

Open source, self-hostable, GDPR-native. Every LLM call is traced: input, output, duration, token cost per model. Cost dashboard per agent, per tenant, per feature.

vs. LangSmith: Langfuse for data sovereignty (self-host on Scaleway). LangSmith if you want to stay 100% cloud Langchain.

Details →

Infrastructure

Scaleway Serverless ContainersSovereign European cloud

Docker-native, fr-par hosting, GDPR and HDS available, per-second billing. Preferred for clients with sovereignty constraints (health, finance, public sector).

vs. AWS/GCP: Scaleway for European sovereignty and cost. AWS for extreme scaling workloads or existing AWS ecosystem.

Details →

Frontend & APIs

Next.js 16 + React 19Web interfaces and APIs

App Router + Server Components: zero client JS on SEO pages. RSC streaming for interfaces with LLM latency.

Server Components make streaming LLM responses natural without useState or useEffect. The Route Handler manages incoming webhooks.

Details →

Model strategy

How we reason about models, not which one wins this month. Decision guides on choosing, deploying and sizing models, plus a living catalogue.

Choosing a model

Choosing a model is a process, not a pick: five steps that end in a routing strategy, not a single winner.

Details →
Deploying models

Lab API, managed open-weight, or self-hosted: where your model runs, and who pays for what.

Details →
Model tiers

Frontier, workhorse, small, edge: a capability ladder, and matching the rung to the task is the lever.

Details →
Sovereign AI

For an EU buyer, which jurisdiction governs the data is a first-class axis, not an afterthought.

Details →
Browse the model catalogue →

Adjacent landscape

Tools we map but do not run in our production core. We cover where they fit and when to graduate to something more robust.

n8n

Fair-code workflow automation: visual glue, with a Code node escape hatch.

Details →
Qdrant

pgvector is the right start. Qdrant earns its place when filtering complexity, corpus scale, or data sovereignty outgrow what a Postgres extension can deliver.

Details →
Hetzner

Fixed cost, German jurisdiction, no US CLOUD Act lever on eu-central data: EU infrastructure for self-hosted agent stacks.

Details →

Architecture principles

Stateful by default. Each agent maintains its state via LangGraph checkpointing. On timeout or network error, the pipeline resumes from the last stable node, without restarting from scratch. Critical for long pipelines (> 2 min of processing).

Explicit fallbacks. Every LLM call has a timeout (defined), a retry count (defined), and a fallback path (defined). If Sonnet times out, we retry on Haiku. If Haiku times out, we escalate to a human. Nothing is implicit.

Model != provider. The LangChain/LangGraph abstraction lets us swap Claude for GPT-4o or Mistral without touching business logic. We code against interfaces (system_message, invoke, stream), not proprietary SDKs.

Controlled cost. Model routing is an architecture decision, not a detail. Each graph node specifies its model. Langfuse calculates the real cost per run. Target: Haiku on 60-70% of calls, Sonnet on the 30-40% that need it.