All selected work

OpenManual

My iPhone app that reads the label on a device with Apple's Vision framework and goes and finds its manual. If it's a medical device, you can scan its UDI barcode and it pulls up its FDA record and any recalls.

There's no OpenManual server, no account and no API key, and what the camera sees and the PDFs you import stay on your phone.

SwiftUIFoundation ModelsVision OCRVisionKitPDFKitOn-Device RetrievalAccessGUDIDopenFDAStoreKitSwift 6

Screen recording

A UDI scan to the manual, with the search sped up 3x

Scroll to play. Scroll back to rewind.

Screens

Screens from version 1.7. Scroll sideways.

  • OpenManual iPhone screenshot 1
  • OpenManual iPhone screenshot 2
  • OpenManual iPhone screenshot 3
  • OpenManual iPhone screenshot 4
  • OpenManual iPhone screenshot 5
  • OpenManual iPhone screenshot 6
  • OpenManual iPhone screenshot 7
  • OpenManual iPad screenshot 1
  • OpenManual iPad screenshot 2
  • OpenManual iPad screenshot 3

How it works

It goes from the thing in front of you to exactly what it is, then to the right document, then to an answer quoted from that document. The full UDI never leaves your phone, and only the part that names the model, not its lot or serial number, goes to AccessGUDID.

On devicePublic registryPublic web3 of 6 steps stay on the device
  1. On device

    Parse the label

    The UDI is read right on the phone, with no internet. Without one, it reads the text on the label, ranks the likely matches and asks the one question that narrows it down the most.

  2. Public registry

    Verify identity

    AccessGUDID matches the part of the UDI that names the model to the exact device, and the full UDI never leaves the phone.

  3. Public registry

    Check recalls

    openFDA has the recalls and the FDA's paperwork on the device, and it doesn't need a key.

  4. Public web

    Find the document

    There's no key for a search service inside the app, so it searches the maker's own site, the Internet Archive and public search engines itself, and when that finds nothing, a web search in Safari is one tap away. And when you share a PDF, Open in OpenManual shows up, so a manual you open yourself behind a manufacturer's login gets in too, which no crawler could ever do. Up to 1.6 a search could also check a list of manuals other people kept, and 1.7 took that out. Nothing you keep has been sent anywhere since 1.3.

  5. On device

    Bind and read

    You look over a possible match before it's saved to that device. PDFKit reads it, and it's split up and searched right on the phone.

  6. On device

    Answer, within bounds

    A safety check with fixed rules runs first. A question the manual covers gets answered with quotes and the page they're on, and diagnosis, treatment and settings for a specific person get refused.

The story

Why it exists and what building it taught me. Written for the homepage card, kept here in full.

Why: The reason is simple, I have this thing where I keep the manual to basically everything I buy, like if it’s a medical device or a household appliance, they typically come with a manual I save because I know at some point I’m gonna have a question about it and I want the actual document.

Identity first: If there’s a UDI on the label, AccessGUDID tells it the exact device. If there isn’t, it reads the plate, ranks the likely matches and asks you one question to narrow it down. The full UDI never leaves the phone, only the part that names the model does.

Finding the manual without a server: There’s no key for a search service inside the app, so it searches the maker’s own site, the Internet Archive and public search engines itself and falls back to a web search in Safari. And because it shows up as Open in OpenManual when you share a PDF, a manual you open yourself behind a manufacturer’s login can get in too, which no crawler ever could.

On-device from there: PDFKit reads the manual, it’s split up and searched right on the phone, and the answer is quoted from the manual with the page it’s on. A PDF it finds might be the one and might not, so you say yes before it’s saved to that device.

Medical boundary: It finds and quotes documentation. It doesn’t diagnose, recommend treatment or pick settings for a specific person. Medical devices got the strictest rules first, and it does the same job for appliances, tools and cars.

What I learned: I built a Python backend and a Cloudflare search proxy for this, then deleted both on purpose, because I didn’t want a server to keep running or a key inside the app. Reading a label all the way to the exact device works against the FDA’s live databases, and answering from a manual you kept was working before the first public build.

Shipping

Every commit, week by week, with the moments that mattered marked on it.

Commits
455
Active weeks
8
  1. First commit
  2. App Store release
  3. v1.2
  4. v1.7

Milestones

8 releases since September 6, 2026.

  1. 1.7

    1.7 is about finding the manual, and honestly it's because I caught the app missing ones I could find myself.

  2. 1.6

    After 1.5 went out I checked every sentence the app says about your data against what the code actually does, and where the two disagreed I fixed the code or the words.

  3. 1.5

    1.5 is a cleanup, and honestly it's the one I wanted before anything else, because I wanted this thing bulletproof.

  4. 1.4

    And it shows you the manual a lot sooner now.

  5. 1.3

    Nothing you keep leaves your phone anymore.

  6. 1.2

    1.2 is a cleanup release, mostly stuff I found going back through the app screen by screen like I was seeing it for the first time.

  7. 1.1

    1.1 is mostly about labels that used to fool it, and about not making you tap things.

  8. 1.0

    I hoard all of my manuals in an iCloud folder and have to tap through numerous subfolders to get to the right product. I got sick of it, so I created a solution.

All 8 releases with their notes, on gunzino.me