Nxord

We started with one food distributor and one very repetitive job: retyping orders all morning

In productionnxord.com ↗  ·  demo video ↗

Nxord demo video
▶ watch on youtube

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:

  1. Read the source. PDFs, photos, audio, email, and plain text go through the same intake screen.
  2. Match the catalogue. Exact codes come first, then fuzzy text, then pgvector similarity for the awkward cases.
  3. Keep the history. The same structured records feed customer history, year-over-year trends, basket analysis, and short sales briefs.
  4. 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
FrontendReact 19, TypeScript, Vite 7, Bootstrap 5.3
BackendPython 3.12, Django 5.2, Django REST Framework
DatabasePostgreSQL 16 + pgvector
Task QueueCelery 5 + Redis 7
AIGoogle Gemini (multimodal extraction + streaming brief)
InfrastructureDocker Compose, Cloudflare Tunnel, Hetzner VPS
Qualitypre-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.