Case study · SAUERESSIG Group · 2023 → 2026

Rebuilding Matches

From a prototype that couldn’t ship to a secure AI platform that customers rely on. Matches lets a print company search years of artwork by picture, and answers one question in seconds: have we made something like this before?

AWS cost
−90%
Uptime
>99.9%
Services
4→20
Concurrency
none→parallel
Surface check / sheet
7.5 s→0.6 s
Automated tests
0→600+
Install and update
by hand→1 command

Before → after

From lab tool to product

Where it started

  • No login: anyone on the network could add or delete data
  • One task at a time, so a single upload blocked everything
  • The whole archive had to fit in memory, so cost grew with every image
  • Built and installed by hand, with no automated tests

Where it is today

  • Secure login, three user roles, and each customer’s data fully separated
  • 20 services working in parallel, so a big upload never slows down a quick search
  • The archive lives on disk, and the AWS bill dropped by 90%
  • Set up or updated with one command, with 600+ tests guarding every release

Highlights

What I delivered

01

Cut the cloud bill by 90%

Moved search from an expensive in-memory vector database to PostgreSQL. The archive can now grow far beyond the server’s memory, and each image’s data takes a third of the space it used to.

  • PostgreSQL
  • pgvector
  • DiskANN
02

Taught the system to understand artwork

It finds the actual design on a crowded print sheet, splits a layout into logos, illustrations and text, and reads text and barcodes. A cut-out of a single logo is enough to find every file that contains it.

  • PyTorch
  • CLIP
  • Grounding DINO
  • OCR
03

Replaced an AI model with something 10× faster

For checking wood and stone surfaces, custom computer-vision rules beat the AI model: 7.5 s → 0.6 s per sheet, with no GPU needed. Every flaw also comes back with a name, such as knot, crack or dark mark. Sometimes the best AI decision is to not use AI.

  • OpenCV
  • Classical CV
04

Finds a one-pixel difference in seconds

It spots designs that differ by one tiny mark, across the whole archive. Comparing every file pixel by pixel would take hours to days.

See how it works ↓
  • Computer vision
  • Image search
05

Made it safe for real customers

It went from an open port with no login to secure accounts, three user roles and a separate database for every customer. One customer’s search can never reach another customer’s data.

See how it works ↓
  • JWT
  • Role-based access
  • Multi-tenancy
06

Made it easy to ship

Setting up a customer system used to mean a long manual checklist. Now it takes one command. Every release builds automatically, and 600+ tests check every endpoint before anything goes out.

  • Docker
  • GitHub Actions
  • Bash

Architecture

Four containers, then twenty

At the start, one container ran almost everything, and tasks waited in line one after another. Today every layer is split into parts that scale, restart and deploy on their own, and the AI models run in their own GPU services.

Starting point 4 containers · one of them ran everything Today 20 containers · one job type each CLIENT ENTRY DISPATCH COMPUTE STORAGE Scripts and test tools no login, open port FastAPI same container as the workers Redis queue also held job status and settings Celery workers, CPU only CLIP model loaded per worker Weaviate vectors and all metadata in one place read and write Web app and customer systems token login, one tenant per account API gateway checks the token, the role and the rate limit RabbitMQ seven queues: four for workers, three for the AI services Fast workers search, text Long workers uploads, images AI services GPU · CLIP, DINO and classifiers PostgreSQL records + vectors per tenant Solr full text per tenant Redis job status revoked tokens jobs workers call, AI answers write and read
The same five layers, before and after. Only the workers talk to the AI services: they send model work through its own queues, get the results back and then write to the databases. An AI machine can be added, restarted or moved without touching anything else.

Image understanding

What happens to one uploaded image

An upload isn’t just stored. The system works out what the image contains: where the design is, which text and barcodes are on it, and how it looks as numbers a computer can compare. None of these steps existed at the start.

Image or PDF arrives by API Checks format, size, already known? Region of interest which part is the design and how often it repeats Text, by OCR Tesseract, rotation aware, per region Barcodes ZBar, all common 1D and 2D codes CLIP vectors AI service, graphics card, one vector per region PostgreSQL record, fields, text and vectors Solr full text index Caller told status endpoint or webhook crops vectors text and codes done
The upload path. The three magenta steps are the image-understanding modules; the region-of-interest step runs first because the other steps work on the regions it finds.

Pixel-exact search

Finding the smallest difference

Two versions of a packaging design can be almost identical: one is missing a tiny technical mark, the other has one extra logo. Matches finds the closest design in the archive and shows exactly what differs, down to a single pixel.

It works across the whole archive and answers in seconds. Comparing every file by hand, or even pixel by pixel by computer, would take hours to days.

QUERY ARCHIVE RESULT one design the whole archive, searched in seconds + logo 1 px − mark closest match, 3 differences Matches seconds Every file, pixel by pixel hours to days
One design in, the closest match out, with every difference marked: what was removed, what was added and what changed.

Users and access

From an open port to separated customers

At the start there was no login: anyone who could reach the server could add, search and delete. Access was built up step by step, from a simple login to secure tokens on every endpoint, then user management with three roles (super admin, tenant admin, user), and finally full separation of customer data.

Tenant admins manage their own users and decide who may edit entries. Every customer gets their own database and search index, so one customer’s query can never reach another customer’s data.

API gateway token → user → tenant → connection TENANT A Database own rows own vectors Text index own collection TENANT B Database Text index TENANT C Database Text index one tenant per user super admin only: ask every tenant, combine the answers
Separation by connection, not by a filter in a query. Only a super admin crosses the line, and only by asking each tenant in turn.

Module map

What the system is made of today

22 modules in four groups. Pick a group to see what’s inside.

Click a group to open it.


Toolkit

Built with

Want the full story? I’m happy to walk you through it.

Get in touch →