• Suriya released this 2026-09-30 12:50:44 +00:00 | 1 commits to main since this release

    Use this computer's own camera, and a straight answer when a camera is unreachable

    Two changes, both about the moment somebody is standing in front of the
    software wondering why it is not working.

    "This computer's own camera" is now an option

    Adding a camera now offers This computer's own camera alongside the makes.
    Pick it, give it a name, save — the laptop's built-in camera becomes a
    Behavision camera and recognition runs on it.

    The engine has always been able to do this; no screen had ever offered it.

    It is the best way to show the product to somebody: real faces, in the room,
    instantly, depending on no network at all. Pointing a demo machine at a camera
    in another building depends on two internet connections staying up while you
    are mid-sentence.

    The address, stream path and camera password disappear when you choose it,
    because none of them mean anything for a camera that is plugged into the
    machine. Camera number 0 is the built-in one; try 1 if something else is
    plugged in.

    "Cannot reach 192.168.1.121" now says why

    Camera addresses like 192.168.1.121 only exist inside the shop's own
    network. From mobile internet, a hotel or head office there is nothing at that
    address — and there must not be, because a camera reachable from the open
    internet is how a shop's cameras end up being watched by strangers.

    The old message was cannot reach 192.168.1.121:554 - Operation timed out,
    which reads like a broken camera and sends you to re-type an address and
    password that were always correct. It now distinguishes the two cases, because
    they need opposite actions:

    • This computer is on that network → check the camera is powered on and
      that the address is right.
    • This computer is somewhere else → the computer is in the wrong place.
      No setting here fixes it; recognition has to run on a machine in the shop.

    Nothing has changed about what works from away: Live, Cameras, Customers and
    Watch live all work from anywhere
    , because the shop computer sends its
    pictures out rather than anything connecting in.

    Everything since v0.5.4, in one place

    • The engine actually updates. Every release used to build the engine
      under the same version number, so setup did nothing on a computer that had
      run it once. Each release now stamps its own version, setup forces a
      replace, and /api/health reports the engine version.
    • Model downloads work on a python.org Mac, which ships with no list of
      trusted certificate authorities.
    • Setup works with Python 3.14, refuses a too-new one in one line, and
      rebuilds a half-built environment left by a failed run.
    • Signing in on a second computer no longer knocks a shop offline.
    • "Run setup" instead of a 200-character file path, and it detects macOS
      running the app from a temporary read-only copy.

    Installing

    1. Unzip.
    2. Move Behavision to your Applications folder and open it from there.
    3. Run behavision-setup and wait — the first run downloads about 300 MB of
      recognition models.
    4. Open Behavision.

    To try it straight away with no CCTV camera: Cameras → Add camera → make:
    This computer's own camera
    .

    On a computer that will not watch cameras — a laptop, an office machine — skip
    setup entirely and just sign in.

    Downloads

    • Behavision-v0.5.8-demo-windows-x64.zip — Windows 10/11, 64-bit
    • Behavision-v0.5.8-demo-macos-arm64.zip — Apple Silicon
    Downloads
  • Suriya released this 2026-09-30 12:07:29 +00:00 | 3 commits to main since this release

    The certificate fallback now actually fires

    v0.5.6 made the engine update properly — and that immediately revealed that
    the certificate fix inside it had never worked.

    Python's urllib does not report a certificate failure as a certificate
    failure: it catches it and re-raises a generic network error with the real
    cause tucked inside. The fallback was written to catch the first kind, so it
    matched nothing and never ran. It is now written to catch what urllib actually
    raises.

    The unit test passed the whole time, because the stub it used raised the error
    in the form that seemed obvious rather than the form Python really produces. So
    this release also adds a real test: it puts Python into the exact state a
    Mac is in with no certificate list, over the real network, and downloads a real
    model through the fallback. Putting the old code back makes it fail; the new
    code makes it pass.

    What this means on a Mac

    Model downloads work on a python.org Python, which ships with no list of
    trusted certificate authorities unless you find and double-click
    Install Certificates.command. Behavision carries its own list and falls back
    to it — while still preferring the machine's own where there is one, so a shop
    behind a corporate proxy is unaffected. A genuine network failure is still
    reported as a network failure, not retried as a certificate problem.

    Everything since v0.5.4, and all of it now installs

    • The engine updates again. Every release built the engine package under
      the same version, so pip install --upgrade did nothing on a computer that
      had run setup once — while the app and agent beside it updated normally. Each
      release now stamps its own version, setup forces the engine to be replaced,
      and /api/health reports the engine version so a stale one is visible.
    • Setup works with Python 3.14, and refuses a too-new one in a single line
      instead of trying to compile numpy from source.
    • A half-built environment from a failed run is rebuilt.
    • Signing in on a second computer no longer knocks a shop offline — every
      installation now has its own name on the message broker.
    • "Run setup" instead of a 200-character file path, and it detects macOS
      running the app from a temporary read-only copy.

    Installing

    1. Unzip.
    2. Move Behavision to your Applications folder and open it from there.
    3. Run behavision-setup and wait — the first run downloads about 300 MB of
      recognition models.
    4. Open Behavision.

    Upgrading over an earlier install is the same steps.

    On a computer that will not watch cameras — a laptop, an office machine — skip
    setup entirely and just sign in. You get Live and Cameras across all your
    shops, including Watch live on any camera.

    Downloads

    • Behavision-v0.5.7-demo-windows-x64.zip — Windows 10/11, 64-bit
    • Behavision-v0.5.7-demo-macos-arm64.zip — Apple Silicon
    Downloads
  • Suriya released this 2026-09-30 12:00:53 +00:00 | 4 commits to main since this release

    The engine now actually updates

    v0.5.5 fixed the certificate problem that stopped model downloads on macOS.
    That fix never reached anyone, and the reason is the more important bug.

    Every release built the engine package under the same version number, and the
    installer used pip install --upgrade — which does nothing when the version is
    already there. It even printed the reason, one line above a green tick:

    behavision is already installed with the same version as the provided wheel.
    Use --force-reinstall to force an installation of the wheel.
     [ok] Engine and dependencies installed
    

    So on any computer that had run setup once, the recognition engine stopped
    updating
    while the app, the agent and the setup tool beside it kept updating
    normally. A current app supervising a months-old engine, with nothing anywhere
    saying so.

    Three changes:

    • Setup now forces the engine package to be replaced, so "installed" means the
      code in the folder. Your libraries are not re-downloaded — only the engine
      itself, which is small.
    • Every release stamps its own version into the engine, so the numbers move.
    • /api/health now reports the engine version. Without it there was no way
      to tell a computer three releases behind from a current one, which is exactly
      how this survived several releases.

    Everything in v0.5.5 is included and now actually installs:

    • Model downloads work on a python.org Mac. That Python ships with no list
      of trusted certificate authorities unless you find and double-click
      Install Certificates.command. Behavision now carries its own and falls back
      to it, while still preferring the machine's own list where there is one — so
      a shop behind a corporate proxy is unaffected.
    • Setup works with Python 3.14, picks a version it knows, and refuses a
      too-new one in a single line rather than compiling numpy from source.
    • A half-built environment from a failed run is rebuilt.
    • Signing in on a second computer no longer knocks a shop offline — every
      installation now has its own name on the message broker.
    • "Run setup" instead of a 200-character file path, and it detects macOS
      running the app from a temporary read-only copy.

    Installing

    1. Unzip.
    2. Move Behavision to your Applications folder and open it from there.
    3. Run behavision-setup and wait — the first run downloads about 300 MB of
      recognition models.
    4. Open Behavision.

    Upgrading over an earlier install is the same steps; setup replaces what needs
    replacing.

    On a computer that will not watch cameras — a laptop, an office machine — skip
    setup entirely and just sign in. You get Live and Cameras across all your
    shops, including Watch live on any camera.

    Downloads

    • Behavision-v0.5.6-demo-windows-x64.zip — Windows 10/11, 64-bit
    • Behavision-v0.5.6-demo-macos-arm64.zip — Apple Silicon
    Downloads
  • Suriya released this 2026-09-30 11:52:10 +00:00 | 5 commits to main since this release

    Setup now finishes on a clean Mac

    v0.5.4 got the install itself working on a current Mac. It then stopped on the
    very last step — downloading the recognition models — with forty lines of
    traceback ending in CERTIFICATE_VERIFY_FAILED.

    That is a quirk of Python installed from python.org on macOS: it ships its own
    security library with no list of trusted certificate authorities, and only
    gets one if you find and double-click Install Certificates.command inside the
    Python folder. Nobody installing this software has any reason to know that.

    Behavision now carries its own trusted-authority list and falls back to it when
    the machine has none. It still prefers the machine's own list where there is
    one, so a shop behind a corporate proxy is unaffected.

    Use this rather than v0.5.3 or v0.5.4.

    Everything from v0.5.4, in one place

    • Setup could not finish on a Mac with Python 3.14. It picked the newest
      Python on the machine, which is the one least likely to have ready-built
      libraries, and ended up trying to compile numpy from source. It now picks a
      version it knows works, and says so in one line — before downloading
      anything — if the only Python present is too new.
    • A half-built environment from a failed run is rebuilt, rather than reused
      and failing the same way.
    • Signing in on a second computer could stop a shop working. Every computer
      linked to one shop used the same name on the message broker, so two of them
      took turns disconnecting each other — and the shop's own till was the other
      half of that loop. Each installation now has its own name; existing installs
      pick one up on their next start.
    • "no such file or directory" instead of "run setup". Pressing Start before
      setup had run reported a 200-character file path. It now names the setup
      tool, on the button, the status panel and at startup. It also detects macOS
      running the app from a temporary read-only copy — which happens whenever the
      app is opened straight from Downloads, and which re-running setup cannot fix.

    Installing

    1. Unzip.
    2. Move Behavision to your Applications folder and open it from there.
    3. Run behavision-setup and wait — the first run downloads about 300 MB of
      recognition models.
    4. Open Behavision.

    On a computer that will not watch cameras — a laptop, an office machine — skip
    setup entirely and just sign in. You get Live and Cameras across all your
    shops, including Watch live on any camera.

    Downloads

    • Behavision-v0.5.5-demo-windows-x64.zip — Windows 10/11, 64-bit
    • Behavision-v0.5.5-demo-macos-arm64.zip — Apple Silicon
    Downloads
  • Suriya released this 2026-09-30 11:43:00 +00:00 | 6 commits to main since this release

    Setup works on a current Mac, and one laptop no longer knocks a shop offline

    Five fixes, all found by installing on a colleague's Mac. Every one of them
    failed in a way that looked like something else. Use this rather than
    v0.5.3
    , which fixed four of the five.

    Setup could not finish on a Mac with Python 3.14

    It picked the newest Python on the machine — which is the one least likely to
    have ready-built libraries. Installing then tried to compile numpy from
    source and ended in two screens of C compiler errors.

    Setup now picks a version it knows works, and if the only Python on the
    machine is newer than Behavision supports it says so in one line, before
    downloading anything
    , and names the version to install. "Too new" and "too
    old" are different messages, because they need opposite actions.

    If a failed run left a half-built environment behind, setup now notices that
    it was made by the wrong Python and rebuilds it. Without that, the fix above
    would have looked like it did nothing on the very machine that needed it.

    Behavision also now works with numpy 2, which is what lets it install on
    current Python versions at all. Verified on Python 3.12 with numpy 2.5.3: the
    whole engine test suite passes, four runs out of four.

    Signing in on a second computer could stop a shop working

    Every computer linked to one shop introduced itself to the message broker
    under the same name. Brokers require that name to be unique and enforce it by
    disconnecting whoever had it first — so two computers on one shop took turns
    kicking each other off, over and over.

    The damage was not limited to the new computer: the shop's own till was the
    other half of that loop
    , so opening the app on a laptop to look at the
    product stopped that shop delivering visits, and from either end it looked
    like a bad network connection.

    Each installation now has its own name. Nothing to do — existing installs pick
    one up on their next start.

    "no such file or directory" instead of "run setup"

    Pressing Start before setup had run reported a 200-character file path and
    nothing about what to do. It now says the engine is not installed yet and
    names the setup tool — on the button, on the status panel and at startup, so
    all three agree.

    It also detects the case where macOS is running Behavision from a temporary
    read-only copy, which happens whenever the app is opened straight from
    Downloads. That one is invisible otherwise, and no amount of re-running setup
    fixes it: move Behavision to your Applications folder and open it from
    there
    , then run setup.

    Also fixed

    A test that deliberately provoked an unsafe condition could crash the whole
    test run on newer OpenCV. It runs in its own process now. This never affected
    recognition — the running product has always kept one detector per camera.

    Downloads

    • Behavision-v0.5.4-demo-windows-x64.zip — Windows 10/11, 64-bit
    • Behavision-v0.5.4-demo-macos-arm64.zip — Apple Silicon

    Unzip, move the app to Applications, run behavision-setup, then open
    Behavision. INSTALL.txt has the steps. On a computer that will not watch
    cameras you can skip setup and just sign in.

    Downloads
  • Suriya released this 2026-09-30 11:39:55 +00:00 | 7 commits to main since this release

    Setup works on a current Mac, and one laptop no longer knocks a shop offline

    Four fixes, all found by installing v0.5.2 on a colleague's Mac. Every one of
    them failed in a way that looked like something else.

    Setup could not finish on a Mac with Python 3.14

    It picked the newest Python on the machine — which is the one least likely to
    have ready-built libraries. Installing then tried to compile numpy from
    source and ended in two screens of C compiler errors.

    Setup now picks a version it knows works, and if the only Python on the
    machine is newer than Behavision supports it says so in one line, before
    downloading anything
    , and names the version to install. "Too new" and "too
    old" are different messages, because they need opposite actions.

    Behavision also now works with numpy 2, which is what lets it install on
    current Python versions at all.

    Signing in on a second computer could stop a shop working

    Every computer linked to one shop introduced itself to the message broker
    under the same name. Brokers require that name to be unique and enforce it by
    disconnecting whoever had it first — so two computers on one shop took turns
    kicking each other off, over and over.

    The damage was not limited to the new computer: the shop's own till was the
    other half of that loop
    , so opening the app on a laptop to look at the
    product stopped that shop delivering visits, and from either end it looked
    like a bad network connection.

    Each installation now has its own name. Nothing to do — existing installs pick
    one up on their next start.

    "no such file or directory" instead of "run setup"

    Pressing Start before setup had run reported a 200-character file path and
    nothing about what to do. It now says the engine is not installed yet and
    names the setup tool — on the button, on the status panel and at startup, so
    all three agree.

    It also detects the case where macOS is running Behavision from a temporary
    read-only copy, which happens whenever the app is opened straight from
    Downloads. That one is invisible otherwise, and no amount of re-running setup
    fixes it: move Behavision to your Applications folder and open it from
    there
    , then run setup.

    Also fixed

    A test that deliberately provoked an unsafe condition could crash the whole
    test run on newer OpenCV. It runs in its own process now. This never affected
    recognition — the running product has always kept one detector per camera.

    Downloads

    • Behavision-v0.5.3-demo-windows-x64.zip — Windows 10/11, 64-bit
    • Behavision-v0.5.3-demo-macos-arm64.zip — Apple Silicon

    Unzip, move the app to Applications, run behavision-setup, then open
    Behavision. INSTALL.txt has the steps. On a computer that will not watch
    cameras you can skip setup and just sign in.

    Downloads
  • Suriya released this 2026-09-30 11:20:20 +00:00 | 8 commits to main since this release

    Watch any camera live, from anywhere

    Builds on v0.5.1, which made the app usable on a computer that is not watching
    any cameras itself. That showed each camera's most recent picture. This shows
    you the camera now, from any network, on Mac and Windows.

    Open Cameras, press Watch live on a tile. The shop computer starts
    sending video and stops the moment you stop watching — nothing is uploaded
    while nobody is looking, which is why one camera plays at a time rather than a
    whole grid going live because you opened the page.

    There is no port to open and no VPN to set up. The shop computer pushes the
    picture out to head office; nothing ever connects in to the shop.

    A camera could say "Connected" long after it had stopped

    Found while testing the above, on the real system: two cameras showing
    Connected in green, thirty-four minutes after their shop computer had
    stopped being able to see either of them.

    The shop computer correctly reports nothing when it cannot reach its own
    recognition engine — but the last thing it had said stayed on screen looking
    current. So a computer that was switched off, or had Behavision closed, left
    green lights behind it.

    A camera now says one of four things, and they need different responses:

    Connected working
    Not connecting the shop computer can see the camera and cannot open it — check the address, password and cabling
    Waiting for the shop computer just added, the shop computer has not picked it up yet
    Not reporting the shop computer has stopped — check it is on and Behavision is running

    The last one is new, and it is the one that was quietly reading as
    Connected. "Not connecting" would have been the wrong word: it sends
    somebody to check cabling on a camera that was working fine the last time
    anyone could ask.

    Downloads

    • Behavision-v0.5.2-demo-windows-x64.zip — Windows 10/11, 64-bit
    • Behavision-v0.5.2-demo-macos-arm64.zip — Apple Silicon

    Unzip, run behavision-setup, then open Behavision. INSTALL.txt has the
    steps. On a computer that will not watch cameras you can skip setup and just
    sign in.

    Downloads
  • Suriya released this 2026-09-30 11:04:07 +00:00 | 9 commits to main since this release

    The app works on a computer that is not watching any cameras

    Sign in on a second Mac or PC and it now shows your shops. Before this it
    showed engine not reachable at http://127.0.0.1:8010 and 0 of 0 cameras,
    on an account whose shops were running and recognising people the whole time.

    Nothing had been broken. The Live and Cameras screens read only the recognition
    engine on that computer's own loopback, so a laptop with no engine answered as
    though nobody had signed in — and the camera list comes through the engine,
    which is why the count was zero rather than merely stale.

    Having no engine is a normal state. A shop PC watches cameras; an owner's
    laptop, a manager's machine and a till still being set up do not, and all three
    sign in to the same estate.

    What you get on a computer with no engine

    • Live — arrivals from every shop, with the customer reference, the camera
      and the shop, plus cameras up and the recognition-health figure across the
      estate. A banner says you are viewing your shops from here rather than
      watching cameras on this computer.
    • Cameras — every camera in every shop, with its connection state and the
      most recent picture the shop computer sent. Edit, Remove and Check placement
      are not offered: those talk to a camera on a network this computer cannot
      reach, and a button that cannot work is worse than one that is absent.
    • Customers — unchanged; it always came from head office.

    A shop PC is unaffected. Loopback is still tried first, so a computer that is
    watching cameras shows its own live numbers, never a minute-old summary.

    Details worth knowing

    • The recognition-health figure is the worst shop, not an average. 0.10
      against 0.73 averages to 0.42 and hides the only shop anyone needs to visit.
    • A camera nobody has reported on yet says Waiting for the shop computer,
      which is a different thing from Not connecting and needs a different
      response.
    • The camera picture is the last frame the shop computer sent, not live
      video. Live video from another network is a separate piece of work — the
      shop PC sits behind a router with no way in, and head office's relay is what
      answers that.

    Downloads

    • Behavision-v0.5.1-demo-windows-x64.zip — Windows 10/11, 64-bit
    • Behavision-v0.5.1-demo-macos-arm64.zip — Apple Silicon

    Both are source installs: unzip, run behavision-setup, then open Behavision.
    INSTALL.txt in the zip has the steps. On a computer that will not watch
    cameras you can skip setup entirely — open the app, choose to run without a
    shop computer link if asked, and sign in.

    Downloads
  • Suriya released this 2026-09-30 10:14:55 +00:00 | 10 commits to main since this release

    The macOS install actually works now

    v0.4.9-demo shipped a macOS package that had never been installed from.
    It was — on a clean state directory, the way a second machine does it — and it
    failed at the first step. This is that fixed, verified end to end.

    Fixed

    • Setup told a Mac with Python 3.12 on it to go and install Python. It
      searched python3 and python only, and on macOS /usr/bin/python3 is
      always the Command Line Tools build — 3.9, below the 3.10 floor. Anything
      newer installs as python3.12, under Homebrew, as a framework, or somewhere
      a GUI app's PATH never reaches. It now tries versioned names newest-first,
      then the plain ones, then the directories macOS actually uses.
    • The finishing message described the wrong computer. It said "Start
      Behavision from the Start menu" and "it appears in the system tray;
      right-click there to stop it" — on a platform with neither. It now says to
      right-click the app the first time (unsigned build) and that closing the
      window stops recognition.
    • Stop() could hang forever. stopGrace = 10s was declared and wired to
      nothing; with no WaitDelay, cmd.Wait() waits for every writer of the
      engine's stdout to close, so one lingering grandchild hangs Stop — and on
      the desktop app that is the tray's Quit never returning.
    • Dead code and a doubled import in the agent; go.mod marking direct
      dependencies as indirect. All three Go modules are now staticcheck-clean.

    Verified on a Mac, not assumed

    [ok] Python                    3.12 (found where PATH could not see it)
    [ok] Virtual environment       298 MB runtime
    [ok] Engine and dependencies   installed
    [ok] Recognition models        downloaded
    [ok] Engine starts and answers verified
    EXIT=0
    

    Install

    macOS — unzip, ./behavision-setup, then right-click Behavision.app →
    Open. Needs Python 3.10+; setup says where to get it if you have none. Apple
    silicon only, and not notarised — macOS blocks an unsigned download rather
    than warning, so the first launch must be right-click → Open.

    Windows — unzip, behavision-setup.exe, then Behavision.exe.

    Still true of the Windows package: it is built but never run. That remains
    the one thing nobody has proved.

    Downloads
  • Suriya released this 2026-09-30 09:23:07 +00:00 | 14 commits to main since this release

    Windows and macOS, and a tray that opens the window

    First release with a macOS package. Same shape as the Windows one — a
    pure-Python wheel and a setup tool that builds a venv on the machine — so it
    costs no frozen engine and no second packaging story.

    macOS, read this first

    • Not notarised. macOS blocks an unsigned download rather than warning
      like SmartScreen. First launch: right-click → Open, then Open again.
      Notarising needs an Apple Developer account.
    • Apple silicon only (arm64).
    • No tray icon. macOS gives Wails its one main run loop and systray wants the
      same one; two attempts both crashed on launch. The window is in the Dock,
      and closing it quits and stops recognition — with no tray there would be
      nothing to get the window back from.

    Fixed

    • The tray's "Open dashboard" did nothing reliable on Windows. Three
      faults: an unlocked Win32 call from the systray goroutine, no un-minimise,
      and no foreground request — a tray click is by definition a moment when the
      app is not in front. Double-clicking the desktop icon while already running
      had the same bug.
    • The engine inherited whatever directory launched the app, which for a
      double-clicked bundle is /. Nothing ever set it.
    • The macOS window could not be maximised — Wails disables the green
      button unless a Mac options block exists, and there was none.
    • build.ps1 would have shipped a stale UI silently. A failed npm ci
      did not stop the script, and a built frontend is committed, so go build
      embedded the old one and produced an installer that worked and was wrong.
    • The setup tool told Mac users to tick "Add python.exe to PATH".

    Since v0.4.8-demo

    • Engine CPU 214% → 16% of a core: a motion gate and one detector thread.
      Detection skipped on 92% of frames with no face lost — the gate only runs
      while no track is open, forces a look every second regardless, and compares
      against the last frame searched.
    • Three states that looked like health from outside: a gallery the running
      encoder cannot read, a camera connected and sending nothing, and an RTSP
      timeout that never existed.
    • Admin console drill-down, sales you can read rather than only sum, a
      dashboard summary, self-service password change, and creating a customer
      before a camera has seen them — with the merge that makes that safe.
    • A wrong URL answered 500, and five endpoints answered 500 to a platform
      admin. Both fixed at the chokepoint.

    Install

    Windows — unzip, run behavision-setup.exe, then Behavision.exe.
    macOS — unzip, right-click Behavision.app → Open, then run
    ./behavision-setup in the same folder to build the engine venv.

    Downloads