Skip to content
KSKirill Sokolov

AI platform

tm.hub

An AI platform for business automation: modules that solve a specific task on a company's documents and data

The problem first. Then AI

Role
Platform from zero: architecture, engine, cabinet, infrastructure, launch
Period
August 2026, ongoing
Team
Solo, with AI
Status
In production, modules being added
tm.hub
The tm.hub bot in Telegram: the module description, commands and a button into the cabinet

How it works

  1. 01Choosing a module

    A catalogue by area: design, construction, procurement, marketplaces.

  2. 02Upload

    The module knows which documents it needs and checks them before the run.

  3. 03The check

    Parsing, matching and rule checks — minutes instead of hours of reading.

  4. 04The ledger

    Findings by severity and amount, each with its file, page and row.

  5. 05Verdicts

    The customer marks what is disputed; those marks feed back into the rules.

What it is

tm.hub is a platform on which modules are assembled for specific working tasks: checking a design brief, reconciling completion certificates against an estimate, reading a marketplace settlement report, structuring an inbox.

What the modules share is not a subject but a structure: a cabinet, tenant isolation, one document engine and one shape of result. A new module is described by configuration rather than written from scratch.

Problem

Discrepancies in a set of documents are found by eye. An engineer reconciles a certificate against an estimate line by line, a buyer compares supplier quotes, a designer reads a brief for completeness. The work is mechanical and attention runs out before the document does.

Checking with a neural network does not close this: the answer looks convincing, yet a second run can differ, and it cannot be put in front of a counterparty — there is no telling where a figure came from.

How it is built

One engine serves every module: intake, normalisation, field extraction against a schema, the operation, the report. Each step stores its result, so a failed job restarts where it broke rather than from the beginning.

A module is a configuration: which documents are accepted, how rows are matched, which rules are checked, what reaches the report. There is no code for a specific module. If one becomes necessary, the contract has been broken — a reason to look into it rather than work around it.

Where the AI is, and where it is not

The rules are ordinary code. The same set of documents gives the same result today and in a year — otherwise the report cannot be used in a dispute. There are no confidence percentages in it: either a discrepancy exists and here is its source, or the row is not there.

The model comes in where structure does not exist — scans, free-form wording. It extracts fields; it does not pass judgement. The split is deliberate: the less model there is in the pipeline, the lower the cost, the more stable the result, and the easier it is to deploy inside a customer's closed perimeter.

The customer's data

The first objection to any document check is where the contents go. Tenant isolation is enforced by the database rather than by application code: a query physically cannot see another tenant's rows.

The retention period is the customer's choice, down to deletion immediately after the report. It is a mechanism with a background sweeper, not a line in the terms. For those whose rules rule out the cloud, the same system deploys inside their perimeter: one codebase, no rewrite to move.

How it works

  1. 01Choosing a module

    A catalogue by area: design, construction, procurement, marketplaces.

  2. 02Upload

    The module knows which documents it needs and checks them before the run.

  3. 03The check

    Parsing, matching and rule checks — minutes instead of hours of reading.

  4. 04The ledger

    Findings by severity and amount, each with its file, page and row.

  5. 05Verdicts

    The customer marks what is disputed; those marks feed back into the rules.

  6. 06Export

    An xlsx on three sheets: summary, discrepancies, verdicts.

What already works

A module as configuration
A new area is a set of rules in JSON, not a separate program.
Cross-document checks
Contradictions that are invisible in either document on its own.
A source for every finding
File, page and row in both documents — verifiable in a minute.
Restart from the failure
Each step's result is stored, so extraction is not paid for twice.
Retention on your terms
Down to deleting files right after the report, with a background sweeper.
Isolation in the database
Not in application code: another tenant's rows are physically out of reach.
Cloud or closed perimeter
One codebase; moving does not mean rewriting.

Interface

The tm.hub bot in Telegram: the module description, commands and a button into the cabinet

Checking from Telegram

The file goes straight to the bot and the result comes back as figures. The full ledger with sources and the export live in the cabinet.

The tm.hub landing: the result of a real check and a report fragment with a finding

The landing

A real check is put on the front page: 54 requirements, 17 findings, six critical — with a fragment of the report showing exactly where in the document the problem sits.

The tm.hub module catalogue: design, construction, marketplace sellers — with price and status

Module catalogue

Each module is one task and one set of rules. Document modules work on files; conversational ones live in a messenger.

The tm.hub account screen: organisation, file retention mode, sign-in email and notification channels

File retention

Retention is the customer's choice, down to deletion right after the report. The promise sits in the interface rather than in the terms.

My role

Designed and built the platform end to end: the layer architecture, the document engine, the module contract, the cabinet, database-level tenant isolation, the infrastructure and the deployment.

Separately, the domain half of the first module: the rules for checking a design brief, including the ones that only surface when two documents are compared against each other.

Stack

Application
  • Python
  • FastAPI
  • Jinja
  • HTMX
Data
  • PostgreSQL
  • Row Level Security
  • Redis
Engine
  • openpyxl
  • python-docx
  • очередь задач
Infrastructure
  • Docker Compose
  • Traefik
  • self-hosted

Current status

The platform runs in production: a cabinet, Telegram sign-in, tenant isolation, plans and payments, observability with alerts.

The first module was tested on a real set — a technical brief and a functional assignment for a data-centre design. Out of 54 parsed requirement rows it produced 17 findings, six of them critical: missing sections of the design documentation and contradictions between the two documents that reading either one alone would not reveal. Every finding was produced deterministically, with no language-model calls.

Results

54

requirement rows parsed from two documents

17

findings, six of them critical

0

language-model calls per check

What I took away

Separating extraction from judgement mattered more than the choice of model. Once the rules were computed by code, the report became reproducible — and could be presented rather than merely read.

The constraint that a customer's data must not leave shaped the architecture before any feature requirement did. It also turned out to be the strongest argument in a sale, and it was worth building in from the start rather than bolting on.

Substring matching is a poor basis for a rule: “section 7” lives inside “subsection 7”. Every cross-document rule had to move to regular expressions, and the quality threshold had to be measured by the share of false positives rather than judged by eye.

The problem first. Then AI

We take the process apart, settle where AI is genuinely needed, and I design a system that works.