Inspiration

My girlfriend runs a small bakery that mainly advertises and takes orders through Instagram. It's the same for a huge number of micro-businesses, the orders arrive as ordinary messages, scattered across Instagram DMs, Messenger, Zalo, SMS and email. There's no order form, no checkout, no system. Just prose: "hi can I get 2 cheese cakes and a garlic bread for next Thursday around 3, name's Alex."

What happens next is the actual problem. Someone re-types that into a notebook or a spreadsheet, and things get lost, a pickup time, an allergy note, the third item in a three-item order. The tools that solve this properly are CRMs built for companies with a sales team and a budget. Nobody builds software for a one-person bakery. We wanted to see if on-device AI could close that gap without the business having to change how it already sells.

What it does

You copy a customer's message and press one shortcut. The app reads it on-device with Apple Intelligence and turns it into a structured order: every line item with its own quantity, the pickup date and time, the customer's name, and any special instructions like writing on the cake or an allergy.

It handles the messy parts of real messages. Multi-item orders get split into separate lines rather than lumped into one. Relative dates like "next Thursday at 3pm" resolve to actual timestamps. Numeric dates are read day-then-month, so "2/9" is 2 September, not 9 February.

Crucially, it also knows what isn't an order. A classification pass runs first, so "thanks!", "let me confirm, might go from Lalor", and recipe links get rejected with a reason instead of silently creating junk records.

Capture works from wherever you already are: Siri ("Hey Siri, take this to Cake Orders"), a global hotkey, the macOS Services menu on selected text, the iOS share sheet, or a screenshot run through OCR. Everything stays on the device, no server, no API bill per order, and no customer messages handed to a third party.

How we built it

SwiftUI and SwiftData on macOS 26 and iOS 26, sharing one codebase across both.

The parsing uses Apple's on-device Foundation Models API. Rather than prompting for text and parsing the reply, we declared the output as Swift types annotated with @Generable and @Guide, so the model fills in a typed structure directly, quantities constrained to 1...99, months to 0...12, at least one line item and at most twenty. Guided generation does the schema enforcement that would otherwise be brittle string handling.

We split it into two passes deliberately. The first classifies the message as an order or not; only if it passes does the second extract the line items and date. Date assembly is then pulled out of the model entirely — the model reports raw day/month/year/hour fields, and a separate FulfillmentDateAssembler turns those into a real Date, rolling forward to next year when the date has already passed. That split matters because it makes the fiddliest logic pure, deterministic and unit-testable rather than dependent on a model's output.

Capture surfaces are all thin wrappers over the same ingest path: App Intents with App Shortcuts for Siri and Spotlight, an NSServices provider on macOS, a Carbon hotkey monitor, and an iOS share extension that runs Vision OCR on shared images. A WidgetKit Live Activity reports staged progress, checking, extracting, saving.

Testing is Swift Testing, 23 tests covering the deterministic layers: date assembly, order-line summarising, and SwiftData insert and cascade-delete against an in-memory container.

Challenges we ran into

Our original design leaned on Siri's on-screen awareness reading a customer's name straight from their Instagram profile when they message. It's still in beta, so we lost it, and with it the ability to capture names the customer doesn't type. That gap is why the CRM half is still ahead of us.

Apple Intelligence is also strongly English-first. Our prompt says so outright, and it isn't stylistic: quality drops on other languages and mixed-language messages are worse. For a Vietnamese bakery's DMs, that narrows who this works for today.

It's slow, too. The on-device model lags cloud models, and we run two passes per message. We answered that with staged progress and a Live Activity optimising the experience because we couldn't optimise the latency.

Accomplishments that we're proud of

Everything runs on-device. For a business handling customers' names, phone numbers and addresses, that's not a nice-to-have it means the data never leaves the machine, there's no per-order API cost, and it works with no connection.

The reject path is the part we're most pleased with, because it's the unglamorous thing that makes the feature usable. An assistant that turns every "thanks!" into an order is worse than no assistant.

We also kept the hard logic out of the model. Date assembly and order summarising are pure functions with tests, so the parts most likely to be subtly wrong are the parts we can actually verify.

What we learned

We have gained great knowledge of developing applications for Apple devices and framwork. How to collaborate with friends to come up with a great idea and work together on Github. Also we have gain the ability to speak in public and express our ideas.

What's next for Micro-enterprise CRM

Built With

  • apple-intelligent
  • switf
  • xcode
Share this project:

Updates

Submission history