CamScripter package · Axis ARTPEC-6/7/8/9

The fastest QR and barcode reader for Axis.

Reads QR codes and barcodes on the camera itself and creates a bookmark in Genetec Security Center for every scan — no middleware server, nothing to compile.

Download the latest release How to install
18 symbologies ~20 ms decode worker thread on-video overlay MIT licensed 30-day CamScripter trial
The package's settings and status dashboard running on a camera

Everything on one page on the camera: live view of the view area being decoded, scans, decoder and Genetec status, and every setting. Follows your theme — light and dark both included.

Why this one

Camera in, bookmarks out

Straight into Security Center

Each code becomes a camera bookmark through the Genetec Web SDK — a timestamped, searchable marker on that camera's video, findable from the Security Desk timeline. No connector service, no polling script, no cloud hop.

Decoding on the camera

The barcode never travels as video to be read somewhere else. One camera captures, decodes, filters and pushes — so a checkpoint is one device, not a device plus a server.

It never blocks itself

Decoding runs in a Node.js worker thread and the VMS call is fire-and-forget, so a slow frame or an unreachable server can't stall the settings page or the next scan — the failure mode that makes naïve readers freeze exactly when they matter.

18 symbologies, each switchable

QR, Micro QR, rMQR, DataMatrix, Aztec, PDF417, MaxiCode, Code128, Code39, Code93, Codabar, ITF, EAN-13/8, UPC-A/E, DataBar and DataBar Expanded. Every family costs a detection pass, so you enable only what you scan.

Filtering that protects the VMS

A regex validation rule drops codes that don't belong, and a de-duplication window stops one code sitting in frame from flooding the VMS with the same entry twice a second.

Diagnosable by design

Live view of the exact view area being decoded, scan history, snapshot and decode timings, Genetec counters, CamOverlay update count and a rolling log. It warns you when decode is slower than your scan interval.

Speed

Fast because of what it doesn't do

Decoding is zxing-cpp compiled to WebAssembly — the engine behind most serious open-source scanning — reading the camera's JPEG directly, with no intermediate decode step in JavaScript.

Decoder benchmark

One QR code in a 1280×720 frame — same image, same machine. Lower is better.

zxing-wasm used here 20.5 ms
zbar-wasm 71.6 ms
jsQR 269.5 ms

On the camera

Measured on an AXIS Q1656 (ARTPEC-8), 720p capture, nine common symbologies enabled.

Snapshot fetch60–100 ms Decode70–120 ms Scan rate2 / s (configurable) Camera load< 5 % of one core

Decoding is a CPU workload — on Axis hardware the DLPU runs neural networks only, so no barcode decoder uses it. Framing, not compute, is what limits read range.

The platform

Runs on CamScripter

CamScripter is CamStreamer's scripting host for Axis cameras: it runs Node.js packages on the camera itself, gives each one a settings page in the camera's web UI, and keeps them alive across reboots. This project is one of those packages — which is why there is no build step, no cross-compilation per chip generation, and no server to maintain anywhere.

Upload one .zip and it runs. The same file works on ARTPEC-6, 7, 8 and 9, and it updates by uploading the next version.

CamOverlay is optional — only needed if you want the scanned text drawn on the video for operators.

Try it free

30-day trial, any ARTPEC-6/7/8/9

Every CamScripter app runs on a 30-day trial on any ARTPEC-6, 7, 8 or 9 camera — CamOverlay too. Long enough to install this package and see real scans in your VMS before spending anything. The package itself is free and MIT licensed.

Download CamScripter & CamOverlay

Install

Four steps

  1. Install CamScripter on the camera — get it from camstreamer.com/download-app and install it from the camera's Apps page. Add CamOverlay too if you want the scanned text on the video.
  2. Upload this package. CamScripter → Upload package → pick qr_barcode_genetec_<version>.zip from the latest release.
  3. Set camera credentials. CamScripter has no VAPIX service account of its own, so a camera user is required — an account allowed to read image.cgi is enough.
  4. Fill in the Genetec panel. Web SDK address, a user with the Add bookmarks privilege and the application ID — then Test connection, Load cameras, tick the cameras, save.

Saving restarts the package; it is back in a few seconds. The status panel shows the bookmark count and the last error, and the first scan appears under Last scans.

Requirements

CameraAxis, ARTPEC-6/7/8/9 RequiredCamScripter 1.5.3 or newer OptionalCamOverlay — on-video text VMSGenetec Security Center + Web SDK This packagefree, MIT licensed

Genetec side

One Web SDK user

Nothing to install on the Security Center side: the package talks to the Genetec Web SDK and calls AddCameraBookmark for each code. You need a Web SDK role, a user allowed to add bookmarks, and an SDK certificate (application ID).

POST https://<server>:<port>/WebSdk/action
     ?q=AddCameraBookmark(<camera GUID>,<2026-08-21T09:14:04.312Z>,CHECKPOINT 8404612031728)
Authorization: Basic base64("<user>;<application id>:<password>")
Accept: text/json

→ 200 {"Rsp":{"Status":"Ok"}}
The application ID belongs in the username, after a semicolon — not in a header of its own. Get that wrong and the Web SDK answers 401 with no explanation. Leave the field empty in the settings page and the CamStreamer connector ID is used, the same default the original videoCheckpoint script ships with.
The Web SDK can answer HTTP 200 on a soft failure, so this package checks Rsp.Status too, and surfaces whatever came back in the status panel instead of silently counting a bookmark that never landed.

The settings page can list every camera in Security Center and let you tick the ones a bookmark should be attached to — one code can bookmark several cameras at once. Test connection and Send test bookmark use the values currently in the form, so you can prove the path before saving.

Full Genetec Web SDK setup guide →

Getting reliable reads

Pixels on the code, not effort settings

A 1D barcode needs roughly 2 px per bar module — an EAN-13 is 95 modules, so about 200 px of code width in the captured frame. QR needs ~2–3 px per module. If a code looks crisp to your eye but won't read, it is almost always too small in the frame, and no amount of try harder will recover bars the sensor never resolved. Optical zoom or a cropped view area buys that density far more cheaply than a bigger frame does.

The zoom slider on the camera's own Stream page is viewer-side only — it never reaches a snapshot, so it does not change what this package sees. Zoom the lens or crop a view area instead.
CamOverlay graphics are composited into the camera's encoded (H.264) streams, so they show in the camera's live view and in the VMS — but never in a VAPIX snapshot or MJPEG. The settings page's live view is therefore always clean.

Free and open

MIT licensed

Use it, fork it, ship it. If it saved you a middleware server, a coffee is always welcome — never required.

☕ Buy me a coffee