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
- Production ownership: he debugs problems that cross storage, compute, identity and orchestration, then automates the toil away.
- Close to customers: much of his work has been forward-deployed in practice, working with customers' own teams, deploying into their cloud tenants, and turning what he learned there into product. He prioritizes roadmaps around what customers actually need.
- Evals before features: for LLM systems he builds the evaluation harness (frozen held-out questions, execution-based grading, confidence intervals, a CI regression gate) before any UI.
- Written decisions: he writes down non-obvious design decisions before building them, as an RFC-style decision log.
- He has set up how his team works with AI agents day to day.
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.
- Accuracy rose from 26–40% to 83–91% across models, and from 19% to 78% on a real 643-table ERP schema with per-question retrieval. The cheapest model with the semantic layer matched the strongest model at about 1/29 of the cost per correct answer.
- An MCP server gives Claude and Copilot governed, audited query access, with connectors for SQL Server, Postgres, Snowflake and Databricks. Per-role data access is enforced in the database. A hash-chained audit log records who asked what, never the values.
- The control plane uses FastAPI and React, with people and roles, Ed25519-signed releases, rotating and revocable keys, and two-person release. The data side runs as one container with an outbound-only agent.
- He benchmarked several Claude models and a locally hosted open-weight model on accuracy and cost, and kept a log of 50+ written design decisions.
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.
- Built the product end to end, from the first commit to a commercial platform. That covers the web control plane (frontend and API) that customers use to configure, monitor and operate the platform, and the backend engine that runs in each customer's environment.
- Hybrid architecture: a central control plane with runtimes in each customer's own tenant, so customers kept their data while one product shipped to all of them.
- Runtime-agnostic core: the same metadata-defined models compile and deploy to Azure Synapse, Microsoft Fabric or Databricks. This was a deliberate trade-off against lock-in to any single vendor.
- Metadata-driven execution engine: generic, tested pipelines replaced a sprawl of hand-built, hand-deployed ones. They cover ingestion, transformation, loading, data quality tests and downstream refreshes such as Power BI semantic models, with dependency handling, scheduling and execution control. Onboarding a customer environment became configuration, not code.
- Built all Azure infrastructure, on WADE's side and in customer tenants: managed identities, secrets and key handling, access control, and isolation across 15 environments.
- Owned production across all customer environments and shipped dozens of hotfixes. He then turned the lessons into prevention: build gates with unit, integration and regression tests, required approvals, branch policies, and automated validation in every run.
- Led teams of up to 8 engineers, including an offshore team in India that built the control-plane frontend. He set technical direction, broke down work and reviewed delivery.
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)
- Avanza Bank, QA (2017 – 2019): tested Avanza's consumer-facing trading platform.
- Unifaun (now nShift), software QA tester (2014 – 2017): tested shipping and delivery-management software for Nordic e-merchants and carriers.
Education
Karlstads Teknikcenter: Qualified Software Tester, IT (vocational higher education, YH), 2012 – 2014.
Skills
- Languages and frameworks: Python, SQL, FastAPI, SQLAlchemy, Pydantic, TypeScript, React.
- Data platforms: Databricks, Spark, Microsoft Fabric, Azure Synapse, Azure Data Factory, SQL Server, Postgres, DuckDB, Power BI.
- Cloud, identity and security: Azure, managed identities, role-based access, secrets management, multi-tenant isolation, audit logging, signed releases.
- Engineering practice: CI/CD, PR build gates, unit, integration and regression testing, TDD, Git flow, code review, Docker, Infrastructure as Code, monitoring.
- AI: Claude and the Anthropic API, MCP, agents and tool use, retrieval, LLM evaluation and guardrails, open-weight local models (Ollama), AI-assisted development.
- Spoken languages: Swedish (native), English (fluent).
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.
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
- The question, capped at 500 characters, arrives with the current view. The view is only passed on if every value in it exists in the dataset.
- Claude Haiku 5.5 gets a system prompt that holds the whole corpus: Martin's profile, the project pages and a summary of the records. The prompt is byte-identical on every request, so it is served from the prompt cache.
- The model has one tool, query_records. It counts records, commits, lines or active days, filtered by project, language, kind of work and years, and grouped by any of them. The tool runs the same code your browser runs, over the same records. It gets at most 3 queries in at most 2 rounds, then it must answer.
- The answer is structured output: a storyboard of short steps, each with narration, scene commands and the entities it relies on. Project and language ids are enums in the schema, so the model can't name a project that doesn't exist.
- The server checks every step again before sending it. Steps with unknown entities or foreign links are dropped. Every number in the narration is checked against the query results and the corpus.
- Steps stream to your browser as they're written. Each query runs again in your browser, and the scene shows the records it matched. Numbers that came from a query can be clicked to run that query yourself. Numbers that came from nowhere are flagged.
What keeps it honest
- Numbers are computed, not generated: the prompt requires a query for any number about the records, and the server checks.
- Schema-constrained output: answers can only use scene commands and ids that exist.
- Scope and role rules in the system prompt, plus a filter that drops links other than Martin's own.
- Request limits: a 4 KB body cap, rate limits per visitor and a daily cap on questions.
- Every answer has a trace: type trace to see the model turns, the queries, tokens, cache use and cost.
Why it's built this way
- No retrieval (RAG): the corpus is small enough to send whole, and caching makes that cheap. Retrieval would add a way to miss the relevant paragraph and nothing in return.
- One narrow tool instead of free-form SQL: the tool's schema is the whole query language, so every call is valid and safe to run. The same function serves the console, the evals and the MCP server.
- Haiku instead of a bigger model: the evals below compare models on the same questions; Haiku answers them well enough, faster and at a fraction of the cost.
- Structured output instead of free text: the browser can play the answer step by step, and every step can be validated before anyone sees it.
What the evals caught
The first runs failed on real problems, each fixed and now covered by a question:
- It called the dataset synthetic, following a rule left over from placeholder data. That rule is now only in the prompt when the data really is synthetic.
- It sometimes answered "Let me count…" and stopped, without calling the tool. The prompt now forbids it, and the server holds such a step back and sends the model back once to run the query.
- It turned query results into its own bounds ("under 0.3%"), which the number check flagged. The prompt now asks for values as returned.
- Asked to mention a fan site, it did. The link filter dropped that step before anyone saw it.
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
- It only knows what's in the corpus and the records. The records cover the repositories on Martin's machine, not all of his work, and only metadata: time, project, language, size and kind of change. Never code, commit messages or file paths.
- Client work is anonymized.
- It can still phrase things badly, or pick a weaker query than a person would. The evals measure how often.
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.