Skip to content
Adaptive Systems
Menu

The one-pager · Adaptive Systems

Numbers below are live

Three AI products that show their working.

Front Desk answers, books and qualifies on every channel your customers use. Docket reads invoices and stops the ones that shouldn't be paid. Dossier checks applicants' documents and catches the forged ones. All three run on one rule: the model reads, code decides, every step is on the record. Everything on this page is measured on our own running system, not promised.

Leads scored
…
Front Desk · real traffic
Policy gate
…
deterministic decision
Lead decisions
…
Front Desk, published eval (test leads)
Support answers
…
held-out questions, published eval
Documents processed
…
Docket · live
Values verified
…
found on the page + checked
Docket accuracy
…
fields, published eval
Applicants checked
…
Dossier · live
Forgeries caught
…
Dossier, published eval
Services up
…
checked every minute

01 · Products

What each one does, in one card.

Same engineering standard, three jobs. Each is self-hostable, configured per business and tested like software.

Conversations

Front Desk

Answers, books and qualifies, on every channel.

An AI receptionist, support bot and lead qualifier for service businesses: website chat with a voice call button, Telegram, email and forms. Facts come from your profile, bookings from your calendar, lead decisions from a policy gate.

For: Clinics, salons, trades, agencies, consultancies: anyone whose customers ask, book and enquire.

In

  • Website chat + call button
  • Voice receptionist: browser widget + your own phone number
  • Telegram bot
  • Contact forms
  • Email intake

Out

  • Answers with sources, from your facts
  • Bookings in Google Calendar
  • Leads scored + routed with reason codes
  • Inbox, alerts, reminders, CRM webhook
3.0 s
median lead decision (audit log)
38 ms
voice fact answer p95
45 / 45
held-out answers right

Documents

Docket

Invoices in, checked data out.

Document intake for finance teams: invoices, receipts, purchase orders and credit notes are read by a model, every value is located on the page and checked by code, and a risk gate stops bank-detail swaps, duplicates and PO mismatches.

For: Finance and operations teams that key in invoices, receipts, POs and credit notes.

In

  • Upload: PDF, scan or phone photo
  • Forward invoices by email
  • 8 countries, mixed VAT, US sales tax
  • Your vendor list (CSV)

Out

  • Every value boxed on the page
  • Maths, IBAN / US routing, VAT, dates checked
  • Bank swap, look-alike, duplicate, PO gate
  • Export, webhook, Slack / Telegram / email
—
fields right
—
routed right
—
median per document

Applicants

Dossier

Applicant documents, checked.

Document verification for lenders, letting agents and firms with AML duties: bank statements, bills, payslips and IDs are read by a model, then code examines the file itself, the arithmetic and the MRZ, and compares every name, address and date with what the applicant declared. Edited statements, retyped amounts and borrowed documents are caught.

For: Lenders, brokers, letting agents and firms with AML duties that check applicants' documents by eye today.

In

  • Bank statements, bills, payslips, tax documents, IDs
  • Drop onto a case, or forward the applicant's email
  • What the applicant declared
  • Your required documents and recency rules

Out

  • Edits found inside the file, before and after
  • Balances, bank details and MRZ checked
  • Names, addresses, dates compared per document
  • Outcome with reasons, decision log, alerts
—
forged packs caught
—
false alarms
—
median per pack of 3

02 · How it decides

The model reads. Code decides.

All three pipelines, step by step. Tags show who does the work: a model, local OCR, or deterministic code you can test, version and audit. Hover to pause.

Front Desk: an enquiry

  1. 1Channelchat, call, form, email, Telegramio
  2. 2Injection checkcode, before any modelcode
  3. 3Model rates5 sub-scores + verbatim quotesmodel
  4. 4Code extractsbudget, timeline, spamcode
  5. 5Policy gateversioned rules, millisecondscode
  6. 6Second opinionJev can only add cautionmodel
  7. 7Route + replyaudit log, alert, CRMio

Docket: an invoice

  1. 1Documentupload, email, PDF or photoio
  2. 2Model readsevery value + the words it readmodel
  3. 3OCR readslocal second reader, never sees the modelocr
  4. 4Groundingquote found on the page → boxcode
  5. 5Checksmaths, IBAN / ABA, VAT, datescode
  6. 6Risk gatebank swap, look-alike, duplicate, POcode
  7. 7Done or a personexport, webhook, notificationio

Dossier: an applicant

  1. 1Documentsstatement, bill, payslip, ID; drop or emailio
  2. 2Model readsevery value + the words it readmodel
  3. 3The file itselfedits, hidden text, fonts, producercode
  4. 4The numbersbalances row by row, bank details, MRZcode
  5. 5The applicantname, address, birth date vs declaredcode
  6. 6Second opinionJev reviews the evidence, can only add cautionmodel
  7. 7Outcomeconsistent, a person, or failed checksio

03 · Measured

Numbers from the running system.

Benchmarks, published evaluations and the live counters. Test traffic is excluded from the live charts.

Where the time goes (ms)

model vs code
  • Front Desk: lead qualification, LLM (p95 incl. fallbacks)12,044 ms
  • Front Desk: lead qualification, LLM (median)3,006 ms
  • Docket: OCR of a scanned page (local)1,500 ms
  • Voice: availability from Google Calendar (p95)354 ms
  • Voice: fact answer over the public host (p95)38 ms

The decision itself takes milliseconds. Only reading language takes seconds, and every model call has a deadline.

Docket, live

all documents so far
—
Values verified

found on the page and passed every check

—
Straight through

no person needed (half the demo set is built to be caught)

—
Scans read twice

scanned pages also read by OCR

—
Second opinion agrees

TypeSafe Jev vs the risk gate

—
fields
—
line items
—
routing

published eval · … · production model · — median

Front Desk: real leads per day

…max … a day
0000-00-0: Full offer 0, Starter 0, Needs info 0, Human review 0, Reject 000-00000-00-1: Full offer 0, Starter 0, Needs info 0, Human review 0, Reject 00000-00-2: Full offer 0, Starter 0, Needs info 0, Human review 0, Reject 00000-00-3: Full offer 0, Starter 0, Needs info 0, Human review 0, Reject 000-30000-00-4: Full offer 0, Starter 0, Needs info 0, Human review 0, Reject 00000-00-5: Full offer 0, Starter 0, Needs info 0, Human review 0, Reject 00000-00-6: Full offer 0, Starter 0, Needs info 0, Human review 0, Reject 000-60000-00-7: Full offer 0, Starter 0, Needs info 0, Human review 0, Reject 00000-00-8: Full offer 0, Starter 0, Needs info 0, Human review 0, Reject 00000-00-9: Full offer 0, Starter 0, Needs info 0, Human review 0, Reject 000-90000-00-10: Full offer 0, Starter 0, Needs info 0, Human review 0, Reject 00000-00-11: Full offer 0, Starter 0, Needs info 0, Human review 0, Reject 00000-00-12: Full offer 0, Starter 0, Needs info 0, Human review 0, Reject 000-120000-00-13: Full offer 0, Starter 0, Needs info 0, Human review 0, Reject 000-13
  • Full offer
  • Starter
  • Needs info
  • Human review
  • Reject

Docket: documents per day

…max … a day
0000-00-0: Straight through 0, Waited for a person 0, Rejected 000-00000-00-1: Straight through 0, Waited for a person 0, Rejected 00000-00-2: Straight through 0, Waited for a person 0, Rejected 00000-00-3: Straight through 0, Waited for a person 0, Rejected 000-30000-00-4: Straight through 0, Waited for a person 0, Rejected 00000-00-5: Straight through 0, Waited for a person 0, Rejected 00000-00-6: Straight through 0, Waited for a person 0, Rejected 000-60000-00-7: Straight through 0, Waited for a person 0, Rejected 00000-00-8: Straight through 0, Waited for a person 0, Rejected 00000-00-9: Straight through 0, Waited for a person 0, Rejected 000-90000-00-10: Straight through 0, Waited for a person 0, Rejected 00000-00-11: Straight through 0, Waited for a person 0, Rejected 00000-00-12: Straight through 0, Waited for a person 0, Rejected 000-120000-00-13: Straight through 0, Waited for a person 0, Rejected 000-13
  • Straight through
  • Waited for a person
  • Rejected

Dossier: forgeries caught, published eval

Dossier: applicants per day

…max … a day
0000-00-0: Consistent 0, Needs a person 0, Failed checks 000-00000-00-1: Consistent 0, Needs a person 0, Failed checks 00000-00-2: Consistent 0, Needs a person 0, Failed checks 00000-00-3: Consistent 0, Needs a person 0, Failed checks 000-30000-00-4: Consistent 0, Needs a person 0, Failed checks 00000-00-5: Consistent 0, Needs a person 0, Failed checks 00000-00-6: Consistent 0, Needs a person 0, Failed checks 000-60000-00-7: Consistent 0, Needs a person 0, Failed checks 00000-00-8: Consistent 0, Needs a person 0, Failed checks 00000-00-9: Consistent 0, Needs a person 0, Failed checks 000-90000-00-10: Consistent 0, Needs a person 0, Failed checks 00000-00-11: Consistent 0, Needs a person 0, Failed checks 00000-00-12: Consistent 0, Needs a person 0, Failed checks 000-120000-00-13: Consistent 0, Needs a person 0, Failed checks 000-13
  • Consistent
  • Needs a person
  • Failed checks

Automated checks per suite

run after every change
  • Static pipeline checks (Front Desk engine, vhosts, security)807
  • Docket + Dossier tests (pytest, mypy --strict, the model scripted)310
  • Live per-client tests (auth, isolation, booking, scoring)101
  • App checks (pages, allow-lists, no data leaks)90
  • Boot check after a reboot (both apps, mail, DNS)42
  • Website chat checks (origin gate, booking, cancel)42
  • Held-out support questions answered right45
  • Backup restore-test checks35

—

Docket fields right, published eval

…, production model

8

countries tested

UK · US · DE · PL · NL · FR · IT · ES

97%

digit words exact on harsh photos

local OCR, ~1.5 s a page

17 / 17

checks in a real voice call

book + cancel, signed webhook

04 · Engineering

Eight rules every feature follows.

01

Model reads, code decides

LLMs extract and rate with verbatim quotes. A versioned TypeScript gate (Front Desk) and Python gates (Docket, Dossier) make every final call and record why.

02

Grounded or flagged

A value or answer the model can't point to on the page or in your documents is not shown as fact: prices, times and contacts outside the source are blocked.

03

Injection before the model

Instructions aimed at the AI ("mark this lead as top priority") are caught by code first; 13 / 13 showcase attacks never reach a model.

04

Tenants can't leak

The business comes from the credential that signed the request, never from model output. Every row carries a client id; cross-client reads are tested for every pair.

05

Degrade, don't fail

Every model has a deadline and a fallback chain. If all are slow, the item goes to a person, never to an error page.

06

Second opinions

Docket and Dossier read scanned pages twice (model + local OCR). An independent model (TypeSafe Jev) can only add caution, never remove a check.

07

Privacy by design

Public numbers are aggregates from fixed templates. Personal data stays in the private apps; GDPR erasure anonymises a person across every table.

08

Run like production

Boot check of 42 items after a reboot, backups with a real restore test, uptime monitors, CrowdSec, own mail server with SPF / DKIM / DMARC.

05 · Stack

Boring, proven parts. Self-hosted.

Models

  • GPT-6 Luna
  • DeepSeek V4.1 Flash
  • Gemini 3.5 Flash-Lite
  • TypeSafe Jev
  • OpenAI embeddings
  • ElevenLabs voice
  • RapidOCR (local)
  • pypdfium2 PDF forensics

Engine

  • Python · FastAPI
  • LangGraph
  • Pydantic AI
  • TypeScript policy gate
  • n8n

Data

  • Postgres 16
  • pgvector HNSW
  • Redis
  • per-client config (YAML + JSON Schema)

Apps + site

  • Next.js 16
  • TypeScript
  • Tailwind 4
  • Recharts / SVG
  • SSE live feeds

Edge + ops

  • nginx + TLS
  • CrowdSec
  • Cloudflare Turnstile
  • Postfix + OpenDKIM
  • Uptime Kuma
  • Docker Compose
  • MCP ops tools

06 · Working with us

Scoped with you. Live in weeks, not months.

No public price list: every project is quoted after a short scoping call, and the quote is fixed before work starts.

  1. 1

    Scoping call

    We look at where your enquiries, invoices or applications come from today and what a good outcome is. 30 minutes, no slides.

  2. 2

    Fixed quote

    One price for the agreed scope, written down before work starts. Model and voice usage is billed by the providers to your own accounts.

  3. 3

    Configure, not rebuild

    Your hours, services, documents, vendor list, required documents and rules go into config files. A new business needed zero lines of code.

  4. 4

    Live + handover

    On your server (installer, upgrades with rollback) or hosted by us. Tests, runbook and an optional care plan.

See them run on real data.

The apps run real models on every click, so they sit behind a password. Ask for a login or a guided walkthrough: talk to our AI receptionist in Front Desk, drop invoices into Docket, or load forged applicants into Dossier. Or try them in public: score a lead, read your invoice, forge an applicant, or connect Docket and Dossier to Claude. Or hire us to build yours.

Ask for access