Skip to content
DOiNhub

Real work, filed by the job.

Open the drawer that looks like yours. Every entry is a system we built and run: what it does, the hard part, and the numbers behind it.

Apps

Products people sign up for, use every day and pay in.

Kertor: an AI interviewer that runs the whole interview

Our own product · Live at kertor.com · Next.js, Gemini Live, PostgreSQL

What it does
A hiring platform we designed, built and run. Juno, the interviewer, holds a real spoken interview over voice or video in 53 languages and returns a scorecard tied to transcript timestamps. Resume scoring pins every rating to a quote the code has verified against the resume itself, so a citation cannot be faked. Every candidate gets written feedback and a one-click human appeal.
The hard part
A live interview has two connections that can drop, the candidate's browser and the model's, and neither is allowed to end it. The session lives on a relay independent of any socket: a dropped browser gets 90 seconds to come back, a dropped model reconnects with a stored handle, and a redeploy mid-interview rebuilds the session from the database and carries on.
  • 53interview languages
  • 90 sgrace after a drop
  • 3services, one server
  • 10reconnect attempts, then it stops

trocals.com: a booking site that cannot oversell a seat

Travel experiences · Live at trocals.com · NestJS, Next.js, Razorpay, Docker

What it does
A guided-tour company's whole business online: the site, customer accounts, live seat inventory, card payments and refunds, and a back office the owner runs alone. 33 admin screens and 342 editable fields, each with a built-in default, so the site still renders complete copy if the settings table is empty.
The hard part
Two travelers can pay for the last seat at the same instant, and payment confirmation arrives twice, from the browser and from the provider's webhook. Checkout takes a 15-minute hold inside a serializable transaction that locks the departure first, and both confirmations funnel into one idempotent step, so a late webhook can never revive a booking the sweep already canceled.
  • 15 minseat hold, auto-released
  • 33admin screens
  • 342fields the owner edits
  • 8 weeksfirst commit to live

AI

Answers with their sources attached, and reports that write themselves.

ARTICLESTALKS · VIDEOPDF REPORTSDECKSAUDIOONE INDEX800-TOKEN CHUNKSYOURPERMISSIONSANSWERSOURCE ON EVERY CLAIM

Twenty years of articles and talks, answerable in plain English

Sustainability media company · Live since June 2026 · FastAPI, pgvector, React

What it does
Thousands of articles, hundreds of recorded sessions and reports going back to 2007, with no useful way to search any of it. Now members ask a question and get an answer with a clickable source on every claim, and an honest 'the archive does not cover this' when it does not. Ask for a five-slide deck and it writes the answer, then builds the branded file.
The hard part
Trust in front of a live audience. The first audience was a conference room, so every answer is generated and checked in full before a word reaches the screen, four models across two vendors stand behind each other, and each member's permissions are compiled into the search itself, so restricted material never reaches the model.
  • 5sources, one schema
  • 4models backing each other
  • 12 sstall before a second model runs
  • 800tokens per chunk
COMPUTED CHARTCLASSICAL TEXTS, INDEXEDTHE ENGINESECTION BY SECTIONPLAIN-ENGLISH FILTERPDF · EMAIL · READERMAP IN THE RIGHT FRAME

A report engine that turned one writer's craft into a product

Wellness brand · Live on AWS · NestJS, MongoDB, Python, Next.js

What it does
The brand wrote long personal reports by hand, one at a time. Now a customer enters their details, a real astronomical chart is computed, a pipeline grounded in a library of classical texts writes the report section by section, and it arrives as a PDF, an email and an interactive reader. Around it: Stripe billing with coupons, a free tier that cannot be farmed, an admin console and ten email sequences that run themselves.
The hard part
Getting the astronomy exactly right in plain English. The report maps where each planet was rising or overhead at the moment of birth; the chart arrives in one zodiac frame and the map math lives in another, and skipping the correction puts every line about 1,600 miles off while looking perfectly plausible. We wrote that layer with its own self-test, and every section passes a plain-English filter before it ships.
  • 12 monthslead engineer
  • 10email sequences
  • 11tools in the chat assistant
  • 7deployable pieces, one monorepo

Business systems

The software a company runs its day on, built to its own workflow.

CHATSMSEMAILVOICEWEBSAME PERSON?REVIEWONE THREADPER CUSTOMERTRANSLATED BOTH WAYS16 STAGES

Five channels into one thread, for a studio that ran on WhatsApp

Voiceover and ad-production studio · Live since summer 2026 · Next.js, TypeScript, PostgreSQL

What it does
Customers arrived on five channels, often in another language, and every job went to an outside specialist. One application replaced the inboxes, the spreadsheet and the payment tool: one thread per customer whichever channel they write on, translated both ways with the original one click away, a 16-stage project pipeline, and finished audio handed to delivery without anyone dragging a file.
The hard part
Identity. The same customer turns up on a different channel under a different handle, sometimes in a different script. Each channel has its own adapter feeding one message type, a resolver matches senders on whatever that channel exposes, and anything ambiguous waits in a review queue instead of being guessed.
  • 5 → 1channels into one thread
  • 16pipeline stages
  • 73entities in the schema
  • 5 monthsschema to production, solo
THE WALL, ENFORCED IN THE QUERYONE SCHEMACUSTOMER PORTALREVIEW · APPROVE · PAYVENDOR PORTALBRIEF · UPLOAD · CHATDRAFTSENTVIEWEDPARTIALPAIDDEPOSIT GATE

Customers and vendors in one system, with a wall between them

Same studio · Stripe, PostgreSQL, Prisma

What it does
The commercial half of the same system. Customers review scripts, approve deliverables and pay; outside specialists get the brief, upload work and talk to the studio. Both live on one schema, and invoicing is wired to the order itself: five payment methods on one ledger, deposits that hold production until they clear, recurring invoices, refunds with a cap, and overdue balances chased automatically.
The hard part
Neither side may ever see the other's data, and a screen remembering to hide something is not a safeguard. Every query behind a vendor's portal is filtered to that vendor's own jobs before a row is read, internal-only lines are stripped by a function under test, and that test runs on every change: internal lines never reach a client or a vendor.
  • 2portals, one schema
  • 5payment methods, one ledger
  • 7invoice states, draft to refunded

Open source

The parts of client work that were general enough to give away. Both installable, both readable in an afternoon.

123123123VECTOR ONLYKEYWORD ONLYRANK FUSIONRRFFIRST ON NEITHER SIGNAL“RENEWAL NOTICE PERIOD?”

pghybrid: hybrid search on the Postgres you already have

Ours, MIT · pypi.org/project/pghybrid and npm · Python and TypeScript, zero runtime dependencies

What it does
Vector similarity and full-text search, combined by Reciprocal Rank Fusion, on plain pgvector. It generates SQL and hands it to the driver you already use, so it never opens a connection of its own and never calls an embedding provider. Published to PyPI and npm from one repository.
The hard part
Hybrid search on Postgres is solved if you can install a C extension, and on managed Postgres you usually cannot. pg_search is unavailable on RDS, Aurora, Cloud SQL, Azure, Supabase, Neon and Heroku; pgvector is on all of them. So the pitch is not better search than the BM25 extensions, it is search you can actually install. The demo image in the README is generated from a live query and refuses to draw itself if fusion stops surfacing the right clause.
  • 7managed hosts with no BM25 extension
  • 0runtime dependencies
  • 2package registries, one repo
  • 12+Postgres versions supported
FIXED SIZECUTS MID-SENTENCEAT SPEAKER TURNSNEVER SPLITS A TURNABABABAB

turnchunk: chunking that understands who is speaking

Ours, MIT · pypi.org/project/turnchunk · Python 3.9+, zero runtime dependencies

What it does
Parses a transcript and chunks it without ever splitting a speaker turn, so a returned excerpt never cuts a sentence in half. It came straight out of the system that made 2,600 recorded client calls searchable, where an excerpt that stops mid-sentence is worse than no excerpt at all.
The hard part
A chunker that counts characters will happily cut between a question and its answer, and nobody files a bug about it because the output still looks like text. The boundary has to follow the conversation rather than the byte count, across the several transcript formats real recordings arrive in.
  • 0runtime dependencies
  • 2,600calls it was built for
  • 3.9+Python versions
  • 1rule: never split a turn

Integrations

Tools that talk to each other, so nobody retypes anything.

INTAKE FORMFILLED IN ONCEEXACTLY ONCEKEYED PER SYSTEMCHECKS EVERY 15 SCRM + PIPELINEDOCUMENT VAULTPLANNING TOOLSTAFF TASKSENCRYPTED AUDIT LOG

Client onboarding across four systems, exactly once

Independent wealth advisory firm · Live in production · TypeScript, Fastify, Prisma

What it does
A prospect fills in one intake form and becomes a fully onboarded client everywhere: CRM record and pipeline, a twelve-folder document tree with a fourteen-day upload link, staff tasks with business-day deadlines, a flag on the planning tool, and follow-ups that chase quiet prospects at three, seven and fourteen days. Every call lands in an encrypted audit log.
The hard part
The intake platform has no webhooks, the CRM rejects updates that repeat what it already holds, and the vault refuses to remove its own admin group. A poller checks every fifteen seconds and skips anything completed before it started, so a restart can never replay history into a live CRM, and every record is keyed per system so a poll and a webhook for the same event collapse into one.
  • 4systems, no middleware
  • 15 sbetween intake checks
  • 0fields retyped by staff
  • 12folders in every client tree
CLAUDE DESKTOP00:14:32 · SPEAKERASK IN PLAIN LANGUAGEMCP SERVERFIVE TOOLS2,600 CALLSPGVECTORNEW RECORDINGSIGNED · ONCEMAC OR WINDOWS

2,600 client calls, searchable from inside Claude

Consulting operator, 15+ accounts · Python, PostgreSQL, pgvector · MCP

What it does
Every recorded call, answerable in plain language from Claude Desktop: the exact excerpt, who said it, the timestamp and the meeting to open. Five tools, search by meaning or by exact words, filters by client and date. New calls index themselves through a signed webhook minutes after the recording ends. Installs from one config block on a Mac or a Windows machine.
The hard part
Titles lie: most meetings are called 'Impromptu Meeting'. Each one resolves to its client from three independent signals, the filename, the title and who spoke, and the winning signal is stored so a mis-tag is traceable. Transcripts are cut only at speaker turns, so no excerpt ever splits a sentence, and a replayed webhook can never index a meeting twice.
  • ~2,600calls, 15+ accounts
  • 5tools inside Claude
  • 2ways to install
  • 3signals decide the client

Clients are named where they have said yes. Everyone else is described by sector, which is what an NDA allows and what we would tell your engineer on a call. Every figure comes from the project's own code.