Skip to content

Case Studies

Selected projects

Examples of recent client work, ranging from architecture studies to production services.

Work management software · Production service · 2026

Turning ticket text into standardized skills

A work item, such as a ticket in a project management system, describes a task in free text. The service we built reads that description and extracts the skills needed to do the task, so the system can identify who could work on it. The skills come from a standardized taxonomy, the European ESCO classification, so they can be matched across work items and against the skills recorded for each employee.

The challenge

Asked simply to name the skills, an LLM produces plausible but ad hoc labels: the same skill is worded differently from one work item to the next, so the results cannot be compared. Mapping to a fixed taxonomy avoids that, but then the service has to find the right entries among around 13,900 ESCO skills, whose formal names rarely match the wording of a ticket.

What we did

  • Discovery and requirements with the product team
  • Architecture of an agentic extraction loop
  • Prototyping of prompt and tool strategy
  • Production-grade API service with automated tests
  • Containerized delivery with CI, plus handover documentation

How it works

  • A LangGraph agent works with four tools: search the taxonomy, browse its hierarchy, verify a skill, and submit. Every skill is checked against a local full-text index before it is returned, so the service never returns a skill it cannot verify.
  • The prompt translates tech jargon into formal taxonomy terms, scores relevance, isolates untrusted input against prompt injection, and runs deterministically for reproducible results.
  • Guardrails cap tool turns and total time and detect loops.
  • An asynchronous job API supports submitting, polling, retrieving, and rating results. Webhook callbacks use token auth, retries with backoff, and SSRF protection.
  • Hardening covers token authentication, rate limiting, security headers, non-root containers, and least-privilege database roles. LiteLLM keeps the service provider-agnostic across OpenAI, Gemini, and Anthropic models.

Result

A secure, observable service that turns unstructured work descriptions into consistent, machine-readable skill profiles, with a taxonomy link, hierarchy path, and relevance score for every skill.

Work management software · Production service · 2026

Spotting duplicate work across teams

A second service for the same work management software. In the organizations using it, one team would often start on something another team had already done or tried, sometimes months earlier. The earlier team might have built exactly what was needed, or found that the approach didn't work, but nobody on the new team knew. The service checks a work item against the tens of thousands already in the system and flags likely duplicates, so earlier work and its outcome are found before the same effort is spent again.

The challenge

Duplicates rarely share their wording: one ticket might say “Dashboard for customer churn”, another, months later, “Report on which clients cancel their contracts”. String matching misses pairs like that. An LLM recognizes them, but asking it about every pair is far too slow and expensive: checking one work item means tens of thousands of comparisons, and checking a whole backlog means hundreds of millions.

What we did

  • Method survey of the entity-resolution literature
  • Architecture of a three-stage detection cascade
  • Prototyping and threshold tuning
  • Production-grade API service with automated tests
  • Containerized delivery with CI, plus handover documentation

How it works

  • Stage 1 narrows the search. Five quick lookups run in parallel and return at most 50 candidates: identical text, keyword search, similar spelling, neighbors in the project hierarchy, and items with similar meaning (embeddings). The meaning-based lookup also finds duplicates that share no words at all.
  • Stage 2 scores each candidate. Title similarity, shared key terms, similarity in meaning and position in the project hierarchy are combined into one score. Clear matches are accepted and clear non-matches dropped, at no further cost.
  • Stage 3 passes only the uncertain cases to an LLM, which reviews them all in a single call and can read an item's full text when it needs more detail. Its verdict is combined with the stage 2 score.
  • Every partial score is stored, so thresholds can be adjusted later without running detection again.

Result

A production service that finds duplicates even when they are worded differently, at a cost of at most one LLM call per work item checked.

Event marketplace · Architecture study · 2026

Event search that knows which limits are hard

An online marketplace for events and activities, with a catalogue of a few thousand offers. Customers should be able to describe what they want in their own words, for example a team event for 21 people, no more than 100 km from the office, ideally outdoors, and get offers that fit. A first prototype and the obvious off-the-shelf approaches fell short, so the platform asked us how this search should be built. We designed three architectures and compared them in enough detail for the team to choose one and build it.

The challenge

The classic answer is a filter form with dozens of fields, such as maximum group size or distance from a city, each queried directly in the database. It is precise, but it is not how people describe what they want, and the platform did not want one. The usual LLM approach, retrieval-augmented generation (RAG), understands free text but treats facts as similarities: for a group of 21, an activity for up to 20 people looks like a close match, when in fact it is ruled out. Strict filters fail the other way: an event 101 km from the office is a close match for “no more than 100 km”, yet a filter drops it. The search has to tell hard limits from approximate ones without the user spelling out which is which. The design also had to work without a vector database or a rewrite, with the existing relational database as the source of truth and structured data as output.

What we did

  • Stakeholder discovery and constraints analysis
  • Three architectures designed and compared in detail
  • API contracts, security analysis, and model selection
  • Token budgets, success criteria, and candidate tech stacks
  • A recommended starting point. No prototype or production code was part of this engagement.

How it works

  • All three designs have the LLM turn the request into database filters for the hard facts, then rank the remaining offers by how well they match the wishes. Because the LLM reads the request in context, it can tell which limits rule an offer out and which are approximate.
  • Open-text agent: a single free-text query, an LLM with a typed search tool that runs a direct SQL query, and a two-stage re-rank that skims titles and tags, then reads the full descriptions of the best candidates.
  • Guided step-by-step flow: click or type at each step, the LLM turns answers into structured filters, a live count updates after every step, and re-ranking runs only on the final set.
  • Stateless frontend-driven flow: the same user experience with the frontend holding the state and three pure backend endpoints. It removes the risk of state tampering and roughly halves token use.
  • Each design came with request lifecycles, JSON response schemas, prompt-injection mitigations, rate limiting, and a model choice for every call.
  • Recommendation: start with the guided flow, the closest to the existing experience and the lowest risk.

Result

The team could pick an approach and build it on their existing stack, with no vector store and a clear security and cost profile for each option.