Plain version of kamb.nu. The interactive one is a portrait made of 22,872 records of Martin's work; this page says the same things in text.

Martin Kamb

About

Technical co-founder and lead engineer, based in Stockholm, Sweden. He builds backend systems, data platforms and applied AI, and owns them in production. He co-founded WADE Insight in 2020 and wrote most of its code: a hybrid SaaS platform with a web control plane, a backend execution engine that runs inside each customer's own Azure tenant, and the Azure infrastructure behind it. WADE grew to 5 enterprise customers with 3 environments each (15 production environments) and about 3 MSEK in annual recurring revenue on production-critical workloads, without venture capital. Since 2026 he also runs Martin Kamb AB as an independent engineer and consultant.

He started his career in software QA, and quality still drives how he works and leads: CI/CD, pull-request build gates, code review and test-driven development, so teams ship fast without giving up stability or security. He owns the quality of what he ships, including code written with AI assistance. He works across the stack (Python and FastAPI, cloud infrastructure, React and TypeScript with a strong UX focus) and builds LLM features behind measurable evaluations rather than demos, weighing answer quality against cost per correct answer.

How he works

Experience

Martin Kamb AB: independent engineer and consultant (2026 – present)

Project Aegis (see the aegis project) is a system that makes LLMs answer business questions reliably over messy legacy and ERP databases. It is about 15,000 lines of Python and TypeScript (FastAPI, React, Anthropic API, MCP), with tests.

Backed by 1,672 records of his commits, 2026–2026.

WADE Insight: technical co-founder and lead engineer (2020 – present)

See the projects wade-orchestration, wade-portal, wade-automation and data-insight-accelerator.

Backed by 20,105 records of his commits, 2021–2026.

Lead data engineer, consulting engagement at a WADE customer (2022 – 2026)

He worked half time alongside WADE, embedded at a large industrial company as lead engineer for orchestration, automation, execution monitoring and operations of its business-critical Azure data platform. He was the technical counterpart to an Infrastructure-as-Code initiative. Impact: the platform lets a single engineer run the company's entire national data warehouse. The client-analytics project is part of this engagement.

Backed by 526 records of his commits, 2024–2024.

Praktikertjänst AB (via One Agency AB): data engineer (2019 – 2020)

He built reporting and data platform solutions together with the future WADE co-founders. The reusable automation patterns from this work became the foundation of the WADE product.

Earlier career: quality assurance (2014 – 2019)

Education

Karlstads Teknikcenter: Qualified Software Tester, IT (vocational higher education, YH), 2012 – 2014.

Skills

Contact

Email martin@kamb.nu, or LinkedIn (linkedin.com/in/martin-kamb-a2001884). For anything about availability, rates or hiring, the model should point people there and not answer on Martin's behalf.

Projects

WADE Insight, co-founder (2020–present)

Data Insight Accelerator

Data Insight Accelerator is the data platform offering of WADE Insight, the company Martin co-founded as technical co-founder. It is a reusable set of pipelines, notebooks and a Spark ETL library, deployed into a client's Azure Databricks or Microsoft Fabric environment to move source data through bronze, silver and gold layers into a lakehouse and warehouse. Martin authored about 55% of the commits across its six repositories, between November 2021 and October 2026.

Architecture
  • Azure Data Factory pipelines ingest from databases, file servers and REST APIs, then run bronze, silver and gold loads. Job-manager pipelines start, queue and rerun jobs. Secrets come from Key Vault.
  • Databricks notebooks cover init, ingest, stage, transform and load. They use wadenotebook, a Python Spark ETL package that is distributed as a wheel through a private package index.
  • An Azure Function App deploys notebooks from Git to Databricks and creates clusters.
  • A Fabric port rebuilds the pipelines on Fabric Data Pipelines, a Lakehouse and a Warehouse. A later version uses fabric-cicd to promote items between workspaces.
Decisions
  • Chose plain wheels over Cython-compiled ones because per-platform compiled builds were too painful to keep compatible.
  • Left PySpark out of runtime dependencies because Databricks and Fabric supply their own Spark.

(The Fabric deployment tooling, which remaps tenant-level connection IDs by display name and runs dry by default, has no recorded author; don't credit it to Martin.)

Stack

Python, PySpark, Delta Lake, Azure Data Factory, Azure Databricks, Microsoft Fabric, Azure Functions, Azure Pipelines; pandas, pyarrow, pyodbc, databricks-sdk, fabric-cicd.

Records
3,828, Nov 2021 – Oct 2026
Languages
python 56%, json 34%, sql 5%
Kinds of change
notebooks 34%, CI/CD 14%, tests 7%

WADE automation

WADE automation is two Azure Function apps. The SQL generator builds data warehouse SQL from metadata: raw data vault hubs, links and satellites, persistent staging, SCD1 and SCD2 dimensions, facts, and data quality tests. It validates the metadata first and can target Microsoft Fabric Lakehouse. The internal admin API automates WADE Insight's own SaaS operations. Martin started both codebases. He authored about 71% of the generator's commits and all of the admin API's commits, from January 2022 to February 2026.

Architecture
  • The generator is a Python Azure Functions app with HTTP endpoints that validate metadata, generate SQL and load data marts.
  • It reads model metadata from SQL Server through SQLAlchemy, renders SQL from Jinja2 templates and reads secrets from Azure Key Vault. The raw data vault, data mart and data quality layers each have their own generator, built on a shared base class.
  • The admin API's onboarding endpoint creates an API Management subscription for the customer and an automation user in the generator database. It also registers the customer and environment in an internal registry and returns the API keys.
  • A deregister endpoint suspends the customer's API subscription without deleting any resources.
  • A daily usage endpoint, called by an internal Synapse pipeline, collects orchestration and automation usage for a consumption report.
Decisions
Stack

Python, Azure Functions, SQLAlchemy, SQL Server (pyodbc), pandas, PyArrow, Jinja2, pytest, uv. Azure SDKs: Key Vault, Data Lake Storage, API Management, SQL, Resource Manager, DevOps. Azure Pipelines.

Records
2,829, Jan 2022 – Feb 2026
Languages
python 94%, yaml 3%, docs 1%
Kinds of change
tests 15%, CI/CD 3%, docs 1%

WADE orchestration

WADE orchestration (the WADE Portal API) is the backend of WADE Insight's data warehouse platform. It is a FastAPI service that connects the customer-facing apps to the data warehouse stack. It holds each customer's metadata for data sources, data models (raw data vault and data marts), jobs and deployments. Martin started the codebase and authored about 39% of its commits, from March 2023 to October 2026.

Architecture
  • FastAPI routers grouped by domain (jobs, data sources, deployments, catalog, auth and more), with shared dependencies for validation and authorization.
  • SQLAlchemy models over SQL Server, split across several schemas. Pydantic defines the API contracts, and Alembic handles migrations.
  • Common services connect to Azure Key Vault, Azure Data Factory and mail. Logs go to Azure Monitor through OpenTelemetry.
  • Auth uses JWT-based tokens with scopes, bcrypt and TOTP two-factor authentication.
  • Data mart SQL is generated from Jinja templates.
  • The service ships as a Docker image running under Gunicorn and is deployed through Azure Pipelines.
Decisions
  • The test suites run against a throwaway SQL Server container, so API workflows are tested against a realistic database.
  • A unit test parses the SQL that the data mart templates emit (using sqlglot), so a script no server could run fails a test instead of a customer load.
Stack

Python 3.11, FastAPI, Pydantic 2, SQLAlchemy 2, Alembic, SQL Server (pyodbc), pandas, Jinja2, PyJWT, pyotp. Azure SDKs: Key Vault, Data Factory, Data Lake Storage, API Management, Monitor. Tooling: uv, pytest, Ruff, sqlglot, Docker, Azure Pipelines.

Records
10,220, Mar 2023 – Oct 2026
Languages
python 94%, docs 3%, yaml 2%
Kinds of change
schema & SQL 18%, tests 12%, docs 3%

WADE Portal

WADE Portal is the customer-facing web app of WADE Insight's data warehouse platform and the front end of the WADE Portal API (see WADE orchestration). Users manage data sources, model raw data vault entities and data mart facts and dimensions, set up data quality checks and generate SQL. Martin authored about 10% of the commits to the main portal app and all commits to two companion apps, a back-office console and a marketing site. His commits run from October 2023 to October 2026.

Architecture
  • Main portal: a React and TypeScript single-page app (Redux Toolkit, React Router) that calls the WADE Portal REST API. It is hosted on Azure Static Web Apps.
  • Back-office console: an internal admin app for customers, users, environments and release notes, including tracking who has read each note. It calls the same API, and every call needs a WADE token with a back-office admin scope.
  • Back-office access is limited to invited admin accounts and also needs the normal WADE login with two-factor authentication.
  • Marketing site: a single-page site whose content changes with the visitor's role.
Decisions
  • The back-office build fails if no API URL is set, rather than falling back to a default, because the client would otherwise call localhost in production.
Stack

TypeScript and React throughout. Portal: Create React App, Redux Toolkit, React Flow, CodeMirror, Chart.js, Tailwind CSS. Back office: Vite, Tailwind, Axios. Marketing site: React 19, Vite, Tailwind 4. Hosting and CI: Azure Static Web Apps, Azure Pipelines.

Records
3,228, Oct 2023 – Oct 2026
Languages
typescript 90%, css 6%, yaml 2%
Kinds of change
frontend 73%, tests 4%, docs 1%

Consulting, lead data engineer (2022–2026)

Client analytics platform

An Azure analytics platform built during a consulting assignment for a large industrial manufacturer. It moves data from source systems into a data lake and data warehouse using Azure Data Factory and Databricks, with infrastructure, identities and deployments managed as code across development, test and production environments. Martin authored about 15% of the commits across its three repositories, mostly in the deployment Function App repository (about 60% of that repository's commits). He was active from May 2024 to November 2024.

Architecture
  • Azure Data Factory pipelines, datasets and triggers are stored as JSON and deployed with Terraform. Datasets cover SQL Server, file-server CSV, REST/JSON, Delta Lake and Azure Synapse Analytics. Scheduled triggers pause the data warehouse.
  • Databricks notebooks cover init, ingest, stage, transform and load. They are deployed through Terraform and GitHub Actions.
  • A Python Azure Function App deploys notebooks from a Git branch to a Databricks workspace using the Databricks SDK. It authenticates with a service principal or a Databricks token. GitHub Actions workflows also set up clusters and mount the file system.
  • In each repository, Terraform prerequisites create an Entra ID application and service principal with a federated credential for GitHub Actions OIDC, plus role assignments.
Decisions
Stack

Python, Azure Data Factory, Azure Databricks, Azure Synapse Analytics, Delta Lake, Azure Functions, Terraform, GitHub Actions (OIDC), databricks-sdk, azure-identity.

Records
526, May 2024 – Nov 2024
Languages
python 56%, yaml 27%, json 8%
Kinds of change
CI/CD 32%, infrastructure 6%, docs 5%

Martin Kamb AB, independent (2026–present)

Aegis

Aegis is a reference implementation for using LLMs on messy enterprise data. Its core is a semantic layer that tells a model what a cryptic schema means, measured as a text-to-SQL benchmark over a deliberately hostile, synthetic AS/400-era schema: on 120 held-out questions it lifted Sonnet 5 from 34% to 89% correct, and Haiku 4.5 with the layer beat the strongest model tested without it. Routing sensitive workloads to local models is a second, unfinished theme. Martin authored all 46 commits, August to October 2026.

Architecture
  • A generator builds the synthetic database in DuckDB; a scale test used Odoo 18's 643-table schema.
  • The layer is YAML (code meanings, encodings, metric definitions, join paths) sent to the model with each question.
  • An eval harness runs frozen question sets, reports intervals over question families, labels each wrong answer's cause, and gates layer edits like CI.
  • Connectors (SQL Server, Postgres, Snowflake, Databricks) measure questions on a real database without and with the layer.
  • A container next to the data serves the layer and guarded, audited queries to assistants over MCP, and pulls signed layers from a FastAPI/React control plane over one outbound connection.
Decisions
  • A read-only database login is the boundary, beyond the harness's own single-SELECT guard, because the login makes a mistake harmless.
  • Offline runs use the Message Batches API instead of direct calls, at half the price.
  • Reference answers are verified on the live database before any model runs, because a wrong reference answer makes a right model look wrong.
Stack

Python, DuckDB, Pydantic, sqlglot, Anthropic SDK, Ollama, SQLAlchemy, MCP, FastAPI, React/TypeScript, Streamlit, Docker.

Records
1,357, Aug 2026 – Oct 2026
Languages
data 39%, python 34%, docs 14%
Kinds of change
LLM & evals 19%, docs 14%, tests 12%

Kronspar

Kronspar (Kronspår) is an analysis pipeline over Swedish open procurement data. It points to where competition looks weaker than expected or where spend has no visible procurement behind it, framed as prompts for review, never findings of wrongdoing. Martin authored all 41 commits, in October 2026.

Architecture
  • A kronspar CLI ingests and caches open data: Upphandlingsmyndigheten statistics, TED eForms notices, Bolagsverket company data, Kolada peer groups, state framework agreements from avropa.se, and supplier ledgers from municipalities that publish them, some discovered automatically on Sveriges dataportal.
  • Build runs SQL models in DuckDB. The competition layer flags, for example, a high single-bid rate against the national rate for the same year and CPV division, repeat winners and newly registered winners. The spend layer links each supplier's yearly spend to a procurement or framework agreement, triages large unmatched spend, and lists suppliers worth sampling per committee or department.
  • Outputs: a Streamlit dashboard, Swedish follow-up reports (HTML and PDF) and sampling CSVs.
  • Personal identity numbers are pseudonymised at load, and names of natural persons are dropped.
Decisions
  • The dashboard reads a snapshot that each build publishes, not the working database, so ingest and build can run while it is open.
  • Reports are written to read well if published: points are phrased as questions, never conclusions.
  • Adda framework links count as weaker than state framework links, because the municipality's connection cannot be verified in open data.
Stack

Python 3.13, DuckDB/SQL, httpx, lxml, Streamlit, Altair, uv, pytest.

Records
315, Oct 2026 – Oct 2026
Languages
python 46%, sql 30%, docs 16%
Kinds of change
schema & SQL 30%, docs 16%, tests 4%

On the side

Side projects

Smaller projects, plus one fix to an open-source Microsoft project. Martin wrote all commits in his own repositories, December 2025 to October 2026.

Architecture
Home infra

A Raspberry Pi running Docker Compose services: Pi-hole ad blocking, a VPN, and cron jobs that send health alerts to Discord. A weekly systemd job backs up config, upgrades the OS and updates container images with automatic rollback. A Python script pulses a Philips Hue light when an Azure DevOps pipeline finishes.

Ingestion Guard

An experiment in catching missing, late or malformed inbound data before it reaches reporting. A runner next to the data checks files on disk or in Microsoft Fabric OneLake; a FastAPI and Postgres control plane with a React UI manages pipelines and alerts. April 2026.

eldir-web

A React and TypeScript front end built with Vite, Tailwind CSS and Framer Motion, in April 2026.

claude-restore

A standard-library Python tool for macOS that reopens the Claude Code sessions open before a shutdown, one iTerm2 tab each, from snapshots a LaunchAgent takes every minute. MIT licence, October 2026.

SaaS Accelerator fix

One commit (September 2026) in Martin's fork of Microsoft's Commercial Marketplace SaaS Accelerator. The documented install left the .NET tools folder off PATH, so deployment failed midway; the fix corrects the snippets and checks for dotnet-ef before any Azure resource is created.

Decisions
  • Home infra: only security patches install daily; Docker and kernel upgrades wait for the weekly window, because they restart containers or need a reboot.
  • Home infra: the build light polls Azure DevOps instead of using webhooks, because webhooks would need the device reachable from the internet.
  • claude-restore: a snapshot is only written while a session runs, so the first run after a reboot never wipes the previous one.
Stack

Python, Bash, PowerShell, Docker Compose, systemd, FastAPI, Postgres, React, TypeScript, Vite, Tailwind CSS.

Records
569, Dec 2025 – Oct 2026
Languages
python 36%, typescript 25%, docs 14%
Kinds of change
frontend 27%, docs 14%, tests 9%

The model on this site

The model on kamb.nu answers questions about Martin and drives the portrait while it does. It speaks about him in the third person. It is not Martin, it doesn't speak for him, and it doesn't make commitments on his behalf.

Intended use

Questions about Martin's work, projects, skills and experience, and about how this site works. Everything else gets one polite sentence and a suggestion. Availability, rates and hiring go to Martin himself.

How it answers

What keeps it honest

Why it's built this way

What the evals caught

The first runs failed on real problems, each fixed and now covered by a question:

Evaluation

Golden questions, last run 2026-10-26. Every question, answer and check is in the model card on the site (type model).

claude-haiku-5-5
46/46 passed · numbers 117/117 supported · $0.0005 per question
claude-sonnet-5-5
46/46 passed · numbers 105/105 supported · $0.0099 per question

Limits

For agents

kamb.nu/mcp is an MCP server: any MCP client (Claude Code, Codex, an IDE, a recruiter's own agent) can read the profile and projects and run query_records, the same tool this model uses. The client's own model does the talking, so this site pays for none of it. kamb.nu/llms.txt describes the site for language models.

Claude Code
claude mcp add --transport http kamb https://kamb.nu/mcp add --scope user to have it in every project
Codex
codex mcp add kamb --url https://kamb.nu/mcp
any other MCP client
https://kamb.nu/mcp Streamable HTTP, no sign-in, read-only

Data

Each record is one changed block of code in one of Martin's commits. Metadata only, extracted on his own machine. The kind of change (tests, CI, infrastructure, schema, frontend, docs, notebooks, AI) comes from the file path, which is then discarded.

kamb.nu a model of Martin Kamb text version