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.

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.

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

    Details →
  • 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 →
  • 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.