It's 2:47 AM. A conveyor has thrown E04 in a plant with one bar of signal. What the technician does not need right now is the cloud.
FixFirst Edge keeps manuals, incidents, parts, photos, and voice notes on the device. No external calls. No LLM in the diagnose path. Every answer cites a specific page.
Runs fully in your browser against the real demo corpus (30 incidents, 25 parts, 13 error codes). Full install adds dense semantic vectors.
Cloud-first maintenance copilots fail when the signal drops. LLM-generated diagnostics cannot be traced back to a specific page. For pharma, defense, utilities, and air-gapped sites, shipping equipment data to a third-party model is a disqualifier. FixFirst Edge keeps the corpus, the embeddings, the index, and the retrieval on one laptop.
|
Typical cloud CMMS Augury · MaintainX · UpKeep · Fiix |
FixFirst Edge | |
|---|---|---|
| Works offline | Degraded or read-only | Full functionality |
| Where queries run | Vendor cloud | Technician's laptop |
| Data leaves the device | Every query | Never |
| Diagnosis method | LLM-generated prose | Templated from retrieved rows |
| Answer traceability | Partial or none | Every answer cites a page |
| Pricing | $35–$200 / user / month | Free, MIT licensed |
See the full offline pipeline answer a real fault code, classify a photo of a damaged part, and transcribe a voice note — all on a laptop with WiFi off.
youtu.be/eKGRRkdDurA →Type a query against the real demo corpus right here on this page. The widget runs in your browser and reports the actual measured latency — no install, no signup.
scroll to the widget ↓Boot the full stack — Actian + backend + frontend — with a single docker compose. No Python venv, no node install, no setup beyond Docker on your machine.
Error code, machine model, or symptom in plain English. Photo of a damaged part. Voice note. Any combination — all three feed the same retrieval pipeline.
Dense ANN searches semantically across all 68 documents. A second lane applies exact-match identifier filters. Reciprocal rank fusion merges both.
Composed from rows, not written by an LLM. The relevant manual page, the closest past incident, and the likely replacement part — each with a traceable citation.
Everything judges and skeptical CTOs need to verify the claims — collapsed by default so the page stays readable.
One collection, three embedding spaces — text_vec (384d), image_vec (512d), audio_text_vec (384d). Any subset, any cross-retrieval.
vectors_config={
"text_vec": VectorParams(size=384),
"image_vec": VectorParams(size=512),
"audio_text_vec": VectorParams(size=384),
}
Six keyword-indexed fields. In-engine at Actian, not post-filtered in Python.
builder = FilterBuilder()
builder.must(Field("doc_type").eq("manual"))
builder.must(Field("model_no").eq("CX-200"))
Dense ANN and identifier-filtered ANN run in parallel. Reciprocal rank fusion merges both.
# reciprocal rank fusion
score(d) = Σ 1 / (60 + rank_i(d))
# i ∈ {dense, id-filtered}
End-to-end /api/diagnose latency, warmed, over 20 mixed queries (error codes, part numbers, symptom phrases, machine IDs) against the full demo corpus on a 16 GB consumer laptop, CPU-only, WSL2 + Docker.
9 vector ops per query — query embed, dense ANN, id-filtered ANN, three filter-scoped retrievals, merge, score, render.
Corpus: 3 PDF manuals, 30 incidents, 25 parts, 13 error codes, 6 schematics, 5 voice notes. Tight cluster across 3 consecutive runs.
Reproduce with scripts/bench_diagnose.py.
bge-small produces a 384-dim text vector on CPU.
Dense ANN across all docs + identifier-filtered ANN in parallel.
Reciprocal rank fusion, then three filter-scoped retrievals for manual, incident, part.
Template populates from retrieved rows. No LLM in this step.
9 vector ops per user query, zero network calls, every step reproducible.
MIT-licensed end to end — backend, frontend, ingestion, Docker compose. No usage reporting, no license server, no upstream the operator has to trust. The deployment is an artifact you can read in an afternoon.
./start.sh
Boots the Actian DB container, the backend, the corpus ingest on first run, and the frontend. Opens your browser. Subsequent runs skip anything already in place.
./stop.sh