All articles
Workflow7 min read

Batch capture: where the workflow saves time

Set location and type once. Each capture becomes a queued job; upload, analysis, and cover stages continue while you photograph the next object.

OI

Open Inventory

Technical notes · MIT licensed

Three people wearing safety glasses work together on a machine in a workshop.
Real contextual photography of a workshop team. It does not show Open Inventory or the batch workflow described here. Photo: Mikhail Nilov / Pexels.

Summary

  • Shared fields are reused for every item in a batch
  • Resource, media, analysis, and cover work run as separate stages
  • Stable idempotency keys prevent duplicates during defined retries

Actual app capture

Batch capture in the running web app

Purpose-built demo data
Actual Open Inventory batch-capture screen with a photo tray and demo data
Actual capture of the photo tray with purpose-built demo content and a real object photograph.
01

The actual bottleneck

Which inputs can be reused across a batch

During a capture run, repeated context switches cost more time than entering one text field. Type and location often stay unchanged within a shelf or room. The batch workflow therefore lets you set those values once and carry them into subsequent captures.

The client creates a separate job for every item. The server creates the inventory resource first and attaches media afterwards. Analysis and cover generation are optional, independent stages. A cover failure therefore does not need to discard photos that have already been uploaded.

“Inventory in seconds, not hours” describes the target for capture work on site; it is not a published benchmark. Processing can continue afterwards. Total duration and throughput depend on network conditions, server capacity, image size, and any enabled external services.

02

Execution

The queue in five stages

  1. 01

    Set the batch context

    Choose shared values such as type “Tool” and location “Workshop · Shelf B2”. Cover generation and analysis remain optional.

  2. 02

    Prepare captures locally

    Take one primary photo and add other angles when needed. Model numbers and rating plates should be separate, sharp images.

  3. 03

    Create the resource and media

    The client creates the inventory record and then uploads its images. Both stages have their own progress and error states.

  4. 04

    Let the queue keep working

    Start the next capture while earlier jobs continue. Defined retries reuse stable operation IDs and server-side idempotency keys.

  5. 05

    Review the result

    Check the name, tracking mode, location, and images. A usable photo does not replace serial numbers or required custom fields.

03

Browser and iPhone

Comparing the web client and iOS app

The web client combines the browser camera with existing files, which works well on a laptop or tablet at a workbench. The native SwiftUI app uses AVFoundation directly and adds code scanning and RoomPlan paths.

On iOS, photos and stage status are persisted in a server-bound outbox under Application Support. After a restart, the app checks the last confirmed stage and continues there. This is not offline synchronization for the complete data model; it is a persistent upload queue.

  • Browser camera access requires HTTPS or localhost; existing photos can be uploaded instead.
  • The native app needs network access to your self-hosted server. Public connections should use HTTPS.
  • Optional AI stages leave your server: analysis uses OpenAI, covers can use OpenAI or Google, and photo counting can use Replicate.
  • Barcode recognition does not replace review when several items share one code or have no code at all.
04

After capture

Review fields and images after processing

The queue first produces an editable record. You still need to verify that location, tracking mode, quantity, and images match the physical object. Serial numbers and safety-relevant information should never be accepted from a model proposal without review.

The complete path lives in the MIT-licensed repository: web client, REST routes, and SwiftUI outbox are open source. Queue behavior and data flow can be inspected directly in code and changed where necessary.

Further reading

From the article to the implementation