Summary
One verdict for the procedure, with the blockers ranked by severity underneath and a readiness score labelled as indicative, not as a promise.
Corthea ingests public procurement documentation, specifications, draft contracts, bills of quantities and qualification forms, and turns it into a structured answer: what the procedure requires, what the company is missing, and what the contract does to its cash flow before the first invoice is paid. Built by one person, with AI assistance, over seven months.
A Romanian construction firm deciding whether to bid reads several hundred pages under a two week deadline: eligibility criteria, evidence requirements, penalty clauses, payment schedules, guarantee obligations, technical specifications. The work falls to the most senior people in the company, it is done by hand, and the failure modes are ordinary rather than exotic. A qualification document nobody noticed was required. A payment term that quietly makes the project cash flow negative from month one. A penalty clause that turns a two week delay into a loss.
82% of Romanian public contracts are awarded on lowest price, against a European average of 54%. Every incentive pushes the offer down; the risk sits in signing something the company cannot fund. Corthea exists to make that risk visible before submission instead of after.
The platform is not a chat window over a pile of PDFs. It is a sequence a bidding team can actually follow, where each step produces something the next step consumes, and every conclusion stays attached to the paragraph that produced it.
One verdict for the procedure, with the blockers ranked by severity underneath and a readiness score labelled as indicative, not as a promise.
Every requirement in the documentation, linked to the evidence the company can produce and to the document being prepared for the bid file.
Working capital, guarantees, the month the balance turns negative, penalties, financing cost. Deterministic engines, not generated numbers.
Coverage, gaps and open questions, with detected status and human confirmed status stored separately.
Submission checklist and a European Single Procurement Document skeleton, parsed from the authority's own request file.
Draft questions to the contracting authority, each one carrying the source paragraph that made it necessary.
The interface is in Romanian because the users are Romanian contractors and the source documents are Romanian public procurement files. What matters in each screenshot is not the layout, it is the discipline visible in the numbers.
Anyone can put a language model behind an upload button. What takes seven months is everything that has to be true before a company will let that thing near a procurement file: isolation that holds, money that cannot run away, an answer to the question of who did what, and a way back when something breaks.
Isolation is enforced by PostgreSQL, not by remembering to add a filter in application code. Every request runs inside a tenant context; a query that forgets its tenant returns nothing rather than someone else's documents.
What a plan allows is decided on the server every time, in three cooperating layers, so a limit cannot be lifted by editing anything the browser can reach.
entitlements for the product surface a tenant has boughtrotix-server-entitlements for platform level ceilingsofferiq-server-entitlements for module specific gatesIngestion handles what real companies actually send: scans, legacy Office formats, archives, mixed quality PDFs. Everything is validated before it is opened.
Every number that touches money is computed in ordinary code, reproducibly, and can be recalculated by hand. No financial figure in this product is generated by a language model.
Model spend is metered per tenant and checked before the call is made, not reconciled afterwards. At the ceiling the system refuses work and says so.
Access control was built at the start rather than added before launch, which is the only time it is cheap.
The obligations a European customer will ask about in the first call, implemented rather than promised.
The part that decides whether a system survives its first bad day.
| Measure | Value | How it was counted |
|---|---|---|
| Application code | 118,590 lines | TypeScript and TSX in app/ and lib/ |
| Source files | 473 | Same two directories |
| API endpoints | 187 | Route handlers under app/api/ |
| Pages and components | 98 | TSX files outside the API layer |
| Database tables | 59 | Schema, with 52 carrying row-level security policies |
| Schema migrations | 17 files | Versioned SQL, applied in order |
| Commits | 242 | February to September 2026 |
| Build time | 7 months | One person, part time, with AI assistance |
This section exists because it is the part a serious buyer actually needs, and because a vendor who cannot tell you where their system is weak has not looked.
Which is exactly why every project I deliver includes a scored evaluation on the client's own documents, before launch, instead of a promise of accuracy afterwards.
If you are a software company, an agency or a product team with a document problem, the relevant fact is not that this platform exists. It is that one person took an unstructured, high stakes document domain and delivered a working system with real access control, cost governance and an audit trail, then wrote down honestly what it does not prove.
The reusable half of it, ingestion, indexing, page level citations, the human review screen, per tenant metering, is the library every client project starts from. That is why a document pipeline from me takes weeks rather than months, and why the boring parts are already solved when we start.
Figures are counted from the repository and the database schema on 10 September 2026, not estimated. Screenshots come from the running system and are unretouched. The 82% and 54% procurement figures are European Commission Single Market Scoreboard data for 2024.
Rotix AI Systems. Document intelligence, web applications and internal tools, built in TypeScript and delivered with tests, documentation and a handover call.