What was costing QualityChecker
- · 3 to 5 days between inspection and certificate. Inspectors left for the field with a paper folder, printed forms, and a separate camera, returned to the office, transcribed everything into a spreadsheet, and assembled the certificate in Word. The customer waited days for something that could be delivered in hours.
- · Unverifiable certificates, fraud risk. A signed piece of paper with no QR code and no validation endpoint is trivially forgeable. Companies acquiring used tanks or commissioning third-party inspections had no way to confirm the certificate was authentic.
- · Inspectors stranded with no signal. Inspections happened on farms, in industrial facilities, in rural areas. Without connectivity, there was no way to look up the tank's history or validate information against the central database. Decisions were made on the spot, with no context.
What the app changed
- · Certificate on the spot, at the customer's premises. What used to take 3–5 days now wraps up in minutes. The inspection closes with the signed PDF and QR generated, before the inspector leaves the visit.
- · Public QR verification, fraud off the table. Anyone with the QR can scan it and see the tank data, inspection date, inspector, and issuing company. The question of legitimacy is settled before it gets asked.
- · Offline sync with zero data loss. Inspectors work an entire shift with no signal. Back in coverage, the app syncs forms, photos, and results automatically. Nothing is lost, nothing is retyped.
Offline sync was not a feature — it was the whole project
If an inspector filled out a form and lost it on sync, the entire system collapsed. An inspector's trust in the app depends on the data always being there, regardless of signal. We designed the flow this way:
- 1 UUID generated on the device. Each inspection has its own identity the moment it is created in the app, before it ever touches the server.
- 2 Photos queued and uploaded in the background. They are stored with their UUID on the device and sync the moment connectivity returns, without blocking the inspector.
- 3 Merge by UUID, not by autoincrement ID. If the same inspection is uploaded twice because of a network retry, the backend recognizes it and does not duplicate it.
- 4 Clear feedback to the inspector. "Synced", "pending", "upload error". No ambiguity about what happened to the work.
┌─────────────────┐
│ Flutter app │ ◄── Generates local UUID, captures photos, syncs offline
│ (Android) │
└────────┬────────┘
│ REST + JSON
│ (syncs when online)
▼
┌─────────────────┐
│ Django REST │ ◄── Auth, UUID-based merge, PDF generation, QR
│ Framework │
└────────┬────────┘
│
▼
┌─────────────────┐ ┌──────────────────┐
│ PostgreSQL │ ◄──┤ Web admin panel │ (office, supervisors)
│ │ │ + email reports │
└─────────────────┘ └──────────────────┘ What we took away from the project
- 01
Offline-first is an architecture, not a "save and upload later" patch
If you treat it as a final detail, you lose data. Design it from the first wireframe, not after the MVP is functional.
- 02
QR verification is the heart of trust, not a decorative feature
In industries with physical risk (gas, electricity, food), a unique-code verification is what holds end-customer trust together. Without it, the app was just a "PDF with Wi-Fi".
- 03
Field feedback is noisy: instrument everything
Inspectors do not say "the app crashed." They say "it doesn't work" or "I lost a report." Invest in logs and tracking (Sentry) so you can reconstruct what happened when an inspector comes back to the office with a problem.
We went from waiting days to delivering the certificate on-site. And the certainty that every certificate is verifiable changed our relationship with customers — nobody asks if the paper is real anymore.
Paraphrased testimonial.
Got a field process still running on paper?
20 minutes on a call about your operation. We walk through scope, offline-first architecture, and the work plan together. No commitment.