OptiArms

AI workflow

The behaviour a camera can see, on the cameras a shop already has.

Reaching, concealing, crouching, and lingering, scored as body movement. It opens a card for a person to look at. It never names anybody.

A shopfront lit from inside at night

The problem

What this is for

Most shrink is ordinary concealment and after-hours entry, which is the part a camera can see. The recordings usually exist. They get watched after the stock count, which is weeks after the person walked out.

US inventory shrink, 2025
About $90 billion

National Retail Federation, read 2026-08-12

Share of that which is theft
About 65%, external and internal

National Retail Federation, read 2026-08-12

Organized retail crime
Touched 67% of surveyed retailers, roughly a tenth of shrink

National Retail Federation, read 2026-08-12

Figures are the publisher's, read on the date shown. Check the source before you plan around one.

The workflow

9 stages, and what runs where

Each stage names the module behind it. The chip says whether it runs on your network or ours.

  1. On the camera

    The same cameras, a second job

    Behaviour runs on cameras you have already installed and already rated. Arming is per camera, so an aisle can be watched and a stockroom left alone.

    cameras.behaviorArmed. Arming is configuration, and the kill switch is a separate column.

  2. On the appliance

    A sidecar, never the weapons process

    Behaviour runs beside firearm analysis in its own process, with its own lane. A firearm batch never waits behind a shoplifting one.

    behavior_run.py and supervisor/behavior-lane.ts. The behaviour lane is droppable and flushes last.

  3. On the appliance

    Bodies, not faces

    A pose model reads joints: shoulders, hips, elbows, wrists. Nothing about a face is computed, stored, or sent.

    behavior/pose.py, the only module here that touches pixels. Its checkpoint is sha256 verified before it loads.

  4. On the appliance

    Five cues, measured in torso units

    Reaching, concealing, crouching, dwelling, and presence. Every threshold is a fraction of that person's own torso, so distance from the lens does not change the answer.

    behavior/features.py. A body with no measurable torso is refused rather than guessed at.

  5. On the appliance

    A score that converges rather than climbs

    Cues accumulate with the same repetition discount the firearm side uses. One clean concealment gesture lands over review and well under urgent.

    behavior/scoring.py. Repeated concealment alone converges to 0.846, still under the urgent floor of 0.85.

  6. In the cloud

    A floor this camera measured for itself

    Each lens proposes a floor from its own weeks of traffic. An administrator applies it, and declining is recorded so it stops asking.

    behavior/calibration.ts proposes. Two actions in theft-actions.ts are the only writers of the column.

  7. In the cloud

    Below the floor is still written down

    A raised floor hides a card, never the event. The next measurement reads those rows, so a quiet camera and a silenced one are different things.

    The same rule the firearm engine follows when it records a below-threshold detection.

  8. In the cloud

    A card, not an alarm

    Noted, review, or urgent. These grade how much a look is worth interrupting for. None of them wears the colour an open firearm incident wears.

    behavior/severity.ts. check:theft reads the appliance scoring off disk and asserts the two agree.

  9. With a person

    A queue somebody works when they can

    Cards land in a loss prevention queue with the frame attached. An urgent card messages your own staff, and any call to police is yours to make.

    /app/theft. A card ages out on its own if nobody gets to it.

An operator seated in front of a wall of monitors, seen from behind

What it runs on

A business, church, clinic, or venue, running the Business configuration. Segments are settings over one codebase, never separate products.

Cameras you already rated

The estate the firearm workflow already measured. Behaviour is armed per camera, so you choose which aisles are watched.

The appliance already on site

The sidecar runs on the same box. It is a per-camera monthly add-on, counted separately from analysed cameras.

A queue and a reviewer

One screen, one card per event, with the frame and the cues that opened it. Worked when somebody has a minute.

A kill switch

One press stops behaviour analysis site-wide without losing which cameras were armed. Honoured at the box and again at intake.

Why this shape

What the design buys

One box, two jobs

The appliance bought for the worst day earns its rent on the ordinary ones. Nobody else sells weapons and theft on one box.

Body movement only

No face, no gait, no watchlist, no re-identification across visits. What the model reads is joint geometry, and the rule is enforced in the cue module.

Each camera sets its own floor

A busy doorway and a quiet aisle produce different traffic. Each lens measures its own weeks and proposes a floor for a person to apply.

Limits

What it refuses

Stated here rather than found later. Each of these is enforced somewhere in the code, not only written on a page.

Each visit stands alone

A card holds a few seconds of movement and no identity. Two visits by one person read as two strangers.

A card is a suspicion

Concealment geometry is somebody putting something out of sight. That is a phone in a pocket as often as it is stock, and a person decides which.

The response is yours

A card lands in your queue and stays with your staff. Any call, to police or anybody else, is one of yours.

Cameras, not tills

This is camera behaviour. Sweethearting, refund fraud, and stock counts are questions your point of sale answers.