Nxord
We started with one food distributor and one very repetitive job: retyping orders all morning
In production — nxord.com ↗ · demo video ↗
Overview
I co-founded Nxord after seeing how a food and beverage distributor actually receives orders: a PDF here, a photo from WhatsApp there, then an email or voice message written in somebody else's shorthand. Nxord reads those inputs, matches them against the distributor's catalogue, and gives the operator a checked order instead of another transcription task.
It is now used every day by a wholesale distributor and still fits around the ERP they already depend on.
What the distributor was dealing with
Each order lived in a different inbox or chat. Operators read it, decoded product nicknames, looked up catalogue codes, and typed the same information into an AS400 system. The work was slow, but the bigger loss was the trail it left behind: there was no single history of what each customer bought or how those habits were changing.
What we changed
The operator now has one place to drop an order and one place to correct it:
- Read the source. PDFs, photos, audio, email, and plain text go through the same intake screen.
- Match the catalogue. Exact codes come first, then fuzzy text, then pgvector similarity for the awkward cases.
- Keep the history. The same structured records feed customer history, year-over-year trends, basket analysis, and short sales briefs.
- Return to the old system. Checked orders leave in the fixed-width AS400 format over SFTP, with an audit trail.
The useful parts
Multimodal AI Extraction
- Accepts PDF, images (JPG, PNG), audio, and plain text
- Google Gemini processes files asynchronously via Celery workers
- Handles WhatsApp photos of receipts, scanned faxes, informal messages
3-Stage Semantic Product Matching
- Stage 1: exact code lookup
- Stage 2: fuzzy string matching
- Stage 3: cosine similarity over pgvector embeddings
- Confidence score per item; uncertain matches flagged for review
Choices I would make again
Offline vs online computation. The analytics pipeline is split: a batch job processes the
sales history CSV in pure Python and stores pre-computed JSON reports in PostgreSQL. At request time,
the API does a single SELECT — no computation, no ORM joins.
pgvector for semantic matching. Every product name is embedded at upload time. Order items are matched by cosine similarity. The 3-stage pipeline (exact → fuzzy → semantic) keeps precision high.
Session auth, no JWT. Django session cookies with credentials: include.
The right choice for a B2B internal tool where server-side invalidation matters.
SSE streaming for AI briefs. Gemini takes 5–15s to produce a brief. Server-Sent Events stream the response word-by-word to eliminate the perception of waiting.
Tech Stack
| Layer | Technology |
|---|---|
| Frontend | React 19, TypeScript, Vite 7, Bootstrap 5.3 |
| Backend | Python 3.12, Django 5.2, Django REST Framework |
| Database | PostgreSQL 16 + pgvector |
| Task Queue | Celery 5 + Redis 7 |
| AI | Google Gemini (multimodal extraction + streaming brief) |
| Infrastructure | Docker Compose, Cloudflare Tunnel, Hetzner VPS |
| Quality | pre-commit (black, mypy, ESLint, tsc, bandit), GitHub Actions CI |
What I worked on
I co-founded Nxord and built most of the product path: the Django API, Celery jobs, pgvector matching, SFTP export, React interface, Docker setup, and CI. I worked on the analytics layer with my colleagues; my part there was the data contract and its Django/API integration.
In production. First client: active daily use since early 2026. Pre-revenue — expanding to additional distributors in Q2/Q3 2026.