JT Digital · our own sales system · since March 2026
Kataster
The sales engine JT Digital built for itself reads the websites of 59,551 Slovenian companies on servers we run and drafts first emails that a person approves.
59,551
Slovenian companies in the knowledge base, each website read by our crawler
~103,000
Lines of TypeScript, about 48,000 of them tests
478
Finished emails from the first version, in 16 sessions run by two people
One app, seven stages
Kataster is JT Digital's own sales system. It keeps a knowledge base of 59,551 Slovenian companies and works through it in seven stages: discover, crawl, profile, classify, evaluate, draft and grade. A person reviews every drafted email.
It is one web app in TypeScript on Fastify and Postgres, rendered on the server with fluent-html and HTMX. It has about 103,000 lines of code, about 48,000 of them tests.
The crawler, on infrastructure we control
The crawler is a separate worker on servers we run in Germany, with no access to the database. It takes a company's domain from a message queue, opens the home page in a real browser, fetches the other pages directly and leaves the text in file storage. It asks a site for one page at a time, two seconds apart, and obeys robots.txt. From every site it extracts contact addresses, links, the technology the site runs on and its language.
Profiles and classification by a language model we host
Five of the seven stages use a language model. All five run on Qwen3 14B, an open-weight model, on infrastructure we control, and no company's website text goes to an outside AI provider.
The model writes a profile of each company and sorts it along ten dimensions, among them Slovenia's 12 statistical regions, 10 kinds of organisation and 7 sales channels. Every fact in a profile must share a number, a name or a word with the company's website, or it is dropped. The stages share four requests at a time and queue behind other JT Digital apps whose users are waiting.
Funnels and email
A funnel is one offer, with its own customer criteria, language, sending hours and daily caps. Every company is scored separately for every active funnel.
For a good match the model drafts an email, code checks it, the model grades it, and a person approves, edits or rejects it. Approved emails leave every five minutes through the funnel's own SMTP mailbox. Replies and bounces are read over IMAP every ten minutes, opens and clicks are tracked, and one suppression list covers every funnel.
The first version sent real email, 478 finished emails in 16 sessions between March and May 2026. The rebuilt sending path is finished and tested.
Email genomes
An email can be assembled from a genome, which holds one choice for each dimension of the email. A genome earns a fitness score from its emails' opens, clicks, replies and won deals, and loses score on bounces and unsubscribes. After every 100 emails a genetic algorithm breeds the next generation of 40 genomes. The first version drafted its emails this way, and the rebuilt drafting stage does not feed the genomes yet.
A CRM and an operator's dashboard
The same app is a CRM for contacts, companies, deals, tasks and calls. Companies can be filtered on all ten classification dimensions, saved as segments and exported as CSV. A Pipeline screen shows every stage with the reason it is waiting, and every paid service has an hourly and a daily spending ceiling.
More work

GZS Inovacije
Slovenia's national innovation awards, from the regional round in thirteen chambers to the national ceremony, on one platform we built and still run.
Every one of the 235 entries got a branded 35-second video for the ceremonies, made from the text of its own entry with a Slovenian voiceover. Nobody edited any of them. Technical terms are checked against Slovenia's official lexical database, and the narration is fitted to each video's length without a change anyone can hear.
Planet Positive Sport
The platform FIVB uses to measure, review and certify the environmental footprint of volleyball events, with reports rendered by the server and AI run on our own GPU.
One click freezes an event's numbers, and three things are built from that snapshot: the public web page, a PDF and a single HTML file with every photo inside. The server draws all nine charts, so the PDF, which runs no script, always prints complete. Photos per page view fell from 140.5 MB to about 19 MB.

Olimpijski Kviz
A quiz played on ten thousand phones at once, in step with a live Winter Olympics broadcast, every night for sixteen nights.
Every phone asks the server what it should show, about once a second, over ordinary HTTP. There are no WebSockets anywhere. A single clock drives the quiz through lobby, question, sponsor break and standings, and the answers come from a cache prepared for the phase about to start.
Want something like this?
Tell us what you need and we build a working prototype first, so you see it before you pay for it.