EagleAI CCTV

Stone crusher · factory · godown · petrol pump — Hinglish mein poochho

AI on the CCTV you already own.

One Windows install on a PC on your camera network. It finds your NVR by itself, records to that machine's drive in ordinary MP4 files you can open, watches the zones you draw, and puts a message on somebody's phone the moment the cameras stop.

This page fetched nothing to render itself No script · no tracker · no web font Not code-signed yet — Windows will warn you

The EagleAI desktop application on Windows. A left sidebar lists Live, Summary, Alerts and AI Assistant, and reads System Online at the bottom. The Live View pane shows a 2×2 grid of four camera tiles from a stone-crusher yard — a wheel loader on a gravel pile, a tipper truck being loaded, a conveyor over crushed stone, and a screening plant — each tile labelled LIVE CONNECTED. A readout above the grid says CPU 70.3% and RAM 78.5%.
This is the application, not a mock-up. EagleAI v2.17.8 Live view, four channels, on a Windows PC. Read the caption honestly: those four feeds come from our own virtual-NVR test rig replaying stone-crusher footage, not from a customer's site, and CPU 70.3% / RAM 78.5% is what that rig was doing at the moment the screenshot was taken. It is the only photograph on this page.
Published version
2.17.8
Installer size
183,717,074 B
Artefact built
2026-05-09
Validated on
i5 / 8 GB / 4 cams

SHA-256 73605f79c7ebc484d7f11970eaae5923946bfc089975cd76f27e79735cfd5438

certutil -hashfile EagleAI-Setup.exe SHA256

The installer is 183,717,074 bytes, and the same hash is served live at eagleai.online/api/version. Compare the two before you install; if they differ, do not install it — write to us. We re-ran that comparison against the live file on 20 Sep 2026 and it matched.

The file comes from our own S3 bucket, so the download will say amazonaws.com. That is us, not a redirect — and the hash above is how you confirm it rather than take our word for it.

The situation you have

Your DVR records everything. It tells you nothing.

Sixteen tiles on a monitor nobody sits in front of. The recorder works perfectly — you find that out afterwards, scrubbing four hours of footage to see the thing you were never told about while it was happening. EagleAI is not a camera and not a replacement recorder. It is the layer between the two.

CH 01Discovery
this PC CAM 1 CAM 2 NVR rtsp:// …/101

Works with what is on the wall

RTSP and ONVIF, plus native Hikvision ISAPI and Dahua HTTP. Mixed brands are normal, not a problem. You do not type RTSP URLs; four layers of discovery do it. No rip-and-replace.

CH 02Recording
camera FFmpeg copy …_000.mp4 300 s …_001.mp4 300 s …_002.mp4 300 s your disk · ~50 MB / hour / camera · 30 days

Runs where the cameras are

One Windows PC on the same network. Continuous recording is written to that machine's drive as ordinary MP4 files — double-clickable in VLC, copyable to a pen drive, readable after we are gone.

CH 03Escalation
zone event alert row webhook stops here cameras stop every 60s phone

Talks to a person, not only a dashboard

WhatsApp Cloud API or Telegram Bot API straight from your box — no Twilio, no reseller margin. Rate-limited and cooled down, so it stays a channel you still read in month three. What reaches the phone today is camera health, not a zone.

Both columns, at the same size

What it does, and what it does not do.

Every page in this category prints the left column. This is the only one that prints the right one, and prints it first rather than at the bottom — because a demo is a bad place to find out.

Ships today

In the installer you can download in the next two minutes.

  • Object detection YOLO11 on ONNX Runtime, tuned to the machine it finds at startup.
  • Three zone behaviours Line crossing with direction, restricted-area intrusion, loitering with measured dwell — real geometry, not a bounding-box guess.
  • Continuous recording FFmpeg, 300-second MP4 segments, one folder per camera, on your disk.
  • Camera discovery WS-Discovery, ONVIF GetStreamUri, brand APIs, then a probe table of 61 RTSP patterns across 17 brand profiles.
  • Escalation to a phone WhatsApp or Telegram, sent from your box — for cameras stopping, a site going quiet during working hours, and every camera going dark. Not for zone violations; see the right column, and the footnote under the alerts section for the one other alert that can escalate.
  • Ask it in Hinglish Answers come back with a photo and a video link attached, from your own database.
  • The stone-crusher build Vehicle journeys stitched across cameras without reading a plate, a material ledger, nine route-violation alerts.

Not shipped

No detector exists, or it is off in the build you will download.

  • Perimeter breach, and with it any zone alert that reaches a phone The behaviour is wired everywhere except the zone-type list, so it can never fire, so no zone violation is ever critical, so none of them escalates.
  • Face recognition No employee face matching, no blacklist face alerts.
  • Person re-identification across cameras The pipeline has hooks for BoxMOT and ByteTrack; neither dependency is in the installer, so what runs is a per-camera IoU tracker.
  • PPE, helmet, fire, smoke, weapon, violence, fall detection None of these detectors exist.
  • Number-plate history as a searchable register Plate hits sit inside event data; there is no populated register behind them. Both OCR paths need Tesseract, which is not in the standard install.
  • Cross-camera forensic search Journey stitching is class, colour and body-type matching, and we describe it that way.
  • On-device scene description by a vision model Off by default, weights not in the build. Without it, scene text is a template sentence from detection counts.
  • Background auto-update · SSO / SAML · self-serve checkout Off, absent, and absent. Keys come from a person.

And the numbers we will not print: customer counts, uptime percentages, detection-accuracy percentages, plate-read accuracy, theft-reduction figures, compliance certifications, uptime SLAs. We have no benchmark harness producing an accuracy number, so any percentage here would be decoration. We would rather show you the size and checksum of a file you can download in the next two minutes.

The first ten minutes

What actually happens after you double-click.

01

Install

One-click NSIS installer, per-user, into your profile. No options screen, no component tree.

02

Activate

Paste the licence key. That is the whole login — you never set a password and never type one again.

03

Its own server starts

An Electron shell around a real FastAPI backend, on 127.0.0.1:8000. Loopback only.

04

It finds the cameras

Four layers of discovery, stopping at whichever one works. You supply no IP.

05

Tiles, then recording

Live view over WebRTC; continuous recording cut into five-minute MP4 files on your disk.

The four discovery layers, and what happens when the NVR's IP changes
  • WS-Discovery — a broadcast on your LAN. ONVIF devices answer with their own address.
  • ONVIF GetStreamUri — for devices that answered, we ask the device itself for its exact RTSP URL rather than guessing one.
  • Brand APIs — Hikvision ISAPI, Dahua, CP Plus and Uniview spoken natively; these boxes will tell you their channel layout if you ask in their own dialect.
  • Pattern probe — a shipped table of 61 RTSP URL patterns across 17 brand profiles, and every candidate is opened with ffprobe before we believe it. A URL that returns a socket but no video does not count as a camera.
  • The watchdog trips after 3 consecutive failed RTSP probes, rescans the /24 subnet, rewrites the URL in the database and re-points itself. Router reboots and reshuffled DHCP leases stop being a service call.
  • A MAC OUI table often names the brand of a device before a single credential is tried — usually the moment somebody remembers the password was written on a slip that is now gone.

Licence keys are 36 characters; anything shorter is rejected before it reaches our database, and the public licence endpoints are rate-limited to 10 verify/min and 5 activate/min per IP.

One codebase, not a cut-down edition The same backend package runs in our cloud and inside your EXE — the build mirrors it into the installer, and a single deployment-mode variable decides which way it behaves at boot. There is no “lite” edition that quietly does something different on your machine.

Live view, recording, detection

Live tiles that do not fight your recorder.

Preview defaults to the camera's sub-stream so the main stream stays free for recording. That is real dual-stream separation — and the proof artefact in our tree is eight synthetic RTSP sources on the loopback interface, each carrying a distinct main and sub URL, of which ffprobe opened 8 of 8. Not a physical NVR.

  • Live view is WebRTC through a bundled go2rtc process the backend starts and supervises on port 1984. If it stops answering, the system reports itself degraded instead of showing you a frozen tile, and falls back to an FFmpeg/HLS path.
  • A tile tells you which of six states it is inLIVE CONNECTED, RECONNECTING, SNAPSHOT FALLBACK, STREAM ERROR, EVENTS ONLY, OFFLINE. Those six words are the ones in the build. A camera that has quietly stopped is the failure mode that matters, so the tile is never allowed to just sit there looking fine.
  • A watchdog every 15s restarts dead streams with exponential backoff capped at five minutes, and keeps the last 20 lines of stderr per stream — so a failure arrives with a reason attached instead of a red dot.
  • Detection is YOLO11 on ONNX Runtime, which is what ships inside the Windows installer. The pipeline also carries OpenVINO and PyTorch loaders for builds that install those stacks and picks between them at load; neither is in this bundle. A missing artefact raises an error rather than silently dropping to PyTorch and eating your CPU for a week.
  • It reads the machine at startup — RAM, GPU presence — and tunes frame size, frame skip and maximum camera count to fit. Under CPU or memory pressure it sheds load instead of dying. Designed range: a 4 GB laptop up to a GPU server.
  • Default retention is 30 days, one setting for the whole install — not a plan feature. Rough disk planning figure: about 50 MB / hour / camera in H.264 copy mode.
Our two measurements, with the machine they were not run on

Live-view transport. Eight concurrent live tiles held for ten minutes with zero snapshot fallbacks, at 28.1–64.7% CPU, backend memory 200–201 MB and go2rtc 105–113 MB — with AI off, recording off and the FFmpeg fallback path deliberately blocked. That run measured live-view transport only, not detection and not recording, and the load source was a duplicated public RTSP stream, not a physical LAN NVR.

Detection load. 4 cameras at 22.5% average CPU and 1.35 GB RAM; 8 cameras at 33.8% / 1.42 GB; 16 cameras at 37.7% / 2.07 GB — measured on a 2-physical-core cloud VM with 16 GB, not on the i5 / 8 GB / 4-camera target configuration this product is validated for, where capture is capped at 4 fps and AI processing is dropped when CPU or RAM crosses 85%.

Tests. The tree carries 132 test files under tests/. We used to print a pass count here and we have taken it down: no artefact in the repository records the run that produced it, so it was a number you could not check and neither could we. When we publish the run output next to it, the number comes back. A unit-test count would not have been evidence about your cameras anyway.

What that looks like on your disk

RECC:\Users\you\AppData\Roaming\EagleAI\data\recordings\
  1\
      2026-09-15_14-00-00_000.mp4     2026-09-15_14-00-00_001.mp4
      2026-09-15_14-00-00_002.mp4     2026-09-15_14-00-00_003.mp4    …
  2\
      2026-09-15_14-02-11_000.mp4     2026-09-15_14-02-11_001.mp4    …

One folder per camera id. The name is the UTC time FFmpeg was started, then a counter that increments every 300 seconds.

Zones, and the path to a phone in a pocket

Draw a line. Draw a box. Now the box has consequences.

Three zone behaviours fire today, and all three are real geometry — segment intersection and ray-cast point-in-polygon. None of the three reaches a phone, and that is worth knowing now rather than on the night it matters.

The three that fire, and where they stop line crossing medium restricted area high loitering medium Alert + ZoneIntrusionEvent rows live WebSocket push signed webhook alert.created no phone
The separate loop that does reach a phone — it watches camera health, not zones 3+ cameras stopped 30 min site idle 45 min every camera down escalation loop, every 60s WhatsApp / Telegram

And this is what lands, character for character — the format strings out of the escalation engine, not a marketing rewrite of them. Both of these a stock install can actually send:

🔴 Saare 6 cameras offline/stopped hain! Network ya power issue ho sakta hai. Turant check karein.Site-wide outage. Severity critical, checked around the clock, 5-minute cooldown.
⛔ 3 cameras ek saath stopped hain: Gate, Kanta, Loader Kya koi operational issue hai? Check karein.Three or more cameras stopped 30 minutes, between 7am and 9pm. 10-minute cooldown.
Read this before you plan a night shift around it A fourth behaviour, perimeter breach, is wired end to end — severity map, alert title, escalation path — except for the one part that matters: there is no perimeter zone type to attach it to. The zone types the API accepts are restricted, entry_exit, parking, loitering, intrusion and monitoring; ask for a perimeter zone and you get a 422. Nothing in the detector emits a perimeter breach, so nothing a zone can do is ever graded critical, and only critical alerts escalate.

Net effect, stated plainly: a zone violation today raises an alert, pushes it live to the dashboard and fires your signed webhook — it does not message anybody. What does message somebody is the health loop above: cameras stopping, the site going quiet, everything going dark. If you want a line crossing on a phone, take the webhook into your own handler. We would rather write that here than let you discover it on the night it matters.

One footnote, because the sentence above is otherwise not quite true: the loop escalates any unread critical alert, and there is exactly one more place in the build that writes one — a weighbridge reading over the 25-tonne legal limit. That route is not gated behind crusher mode, so the API will accept it on a stock install. Nothing in the standard UI posts to it, so in practice you will not see it. We are telling you it exists rather than rounding our own claim up.
The escalation loop, the cooldowns, and the webhook contract
  • Every 60s the loop checks four conditions: any unread critical alert from the last 90 seconds (cooldown 5 min) — in this build the only alert row written at critical severity is an over-limit weighbridge reading; three or more cameras stopped for over 30 minutes (10 min); the site idle over 45 minutes (15 min); a site-wide camera outage (5 min). The stopped-cameras and idle-site checks are both gated to working hours, 7am–9pm — a site-wide outage is the only condition watched around the clock, so cameras that die at 2am do not page anyone until 7.
  • The message is sent from your box — WhatsApp Cloud API or Telegram Bot API directly. You hold the WhatsApp Cloud API account and pay Meta; Telegram is free. Rate-limited to 30 msg/hour per channel, retried three times with 2s, 4s and 8s backoff.
  • The cooldowns are the feature. An alert system that fires two hundred times is one you have already muted. When you acknowledge an escalation, the acknowledgement is written back to an operational-feedback table — so “we knew, and it was fine” becomes a record instead of a WhatsApp reply nobody can find again.
  • Webhooks out: HMAC-SHA256 signed with an X-EagleAI-Signature header, an SSRF safety check on the destination URL, Slack and PagerDuty payload adapters, a delivery audit trail and auto-disable after repeated failure. Today production dispatches one event type: alert.created. We list one because we dispatch one.

The daily summary, and the chat

Poochho.Hinglish mein.

The four questions it offers you, verbatim from the shipped build Aaj site pe kya hua? Kal kis camera pe sabse zyada activity thi? Koi alert ya unsafe event hua? Night shift ka summary do
It detects your language — Hinglish, Hindi or English — classifies the intent, and answers from your own database. Every answer carries its proof. photo URLvideo URLevent id

The design rule underneath matters more than the feature. The locally computed, evidence-backed answer is always the baseline; a cloud model only polishes the wording of an answer already derived from your rows. It cannot invent an event that is not in your database, and no video frame is ever sent from the chat endpoint.

Which means it has to be able to say no. These two are the shipped refusal strings, not paraphrases of them — when there is nothing in your rows to answer from, this is the literal text that comes back instead of a guess:

“Evidence missing: koi enabled camera is scope me nahi mila.”

“Evidence ke hisaab se koi pending unresolved alert nahi hai.”

The Summary page carries a tile called Proof Coverage It sits in the same row as the people, vehicle and event counts, and it prints the share of the day's events that actually have a photo or a clip attached. On a site where capture is failing, that tile reads 0.0% — on the front screen, next to the big numbers. We put our own weakest measurement where you cannot miss it, because a count you cannot open is not evidence.
Site profiles, operational state, the daily PDF — and the WhatsApp bridge warning
  • Thirteen site profiles — petrol pump, factory, warehouse, hospital, restaurant, retail, office, residential, school, construction, parking, stone crusher, general — change what counts as abnormal. A hospital is marked night-activity-normal, so movement at 2am is not an incident there. In a warehouse it is.
  • Operational state and downtime are deliberately not ML. Six states (active, loading, queued, idle, stopped, unknown) computed as plain SQL over the activity log; downtime gaps of ≥20 min across a rolling 24 hours, each with a classified likely reason and the last event before and first event after as proof. Deterministic logic you can argue with beats a model you cannot.
  • Daily summary PDFs to the owner's phone over a local WhatsApp Web bridge — one QR pairing, session stored on disk, no recurring messaging cost.
Read this before you build a process on the WhatsApp bridge WhatsApp's terms do not formally permit business automation over WhatsApp Web. The bridge's own documentation says so, and it is sized for roughly five messages a day per site. The QR pairs the owner's own WhatsApp account, so if Meta acts on it, it is that number that is affected — not ours. For anything business-critical, use an official provider. The bridge sits behind a small local REST contract that a provider adapter can slot into, but we have not written that adapter yet, so today this is the only path for the daily PDF.

One hard industry, built out properly

The stone-crusher build, including the kanta.

A vehicle is followed across cameras without reading a number plate — by class, dominant colour and body type, scored against a match threshold, with a journey closing out after 45 minutes. Plates are unreliable at a dusty gate in flat light. A blue tipper truck is not. Those journeys roll into a material ledger — kacha maal in, pakka maal out — with per-vehicle-class tonnage estimates (truck 18 t, tractor 8 t by default) and a 10 AM business-day cutoff, so a night shift lands on the correct day's sheet.

None of this is switched on in the installer you download The desktop app starts its backend with CRUSHER_MODE=0 and SITE_TYPE=general, hard-set in the launcher. On a stock install no journey is stitched, no ledger row is written and none of the nine alerts can fire. It comes on with SITE_MODE=crusher in the machine's environment — a deployment step we do with you, not a toggle in the UI.
Nine route violations, the weighbridge OCR, and two honest notes
  • Nine route-violation alert types ship, with Hinglish alert copy: kanta bypass · tractor kanta bypass · reverse route · missing unload point · unauthorised night movement · rapid re-entry · route validation failed · too-fast transit · watchlist plate.
  • Weighbridge display OCR is implemented: a camera reads the 7-segment weight display, rejects anything outside 100 kg – 100 t as noise, and will not accept a number until it has seen 3 consecutive readings within 50 kg of each other. A flickering LCD does not become a ledger entry.
Two honest notes on this vertical Weight capture is the operator's entry. We flag it when it differs by more than a set percentage from the per-class tonnage estimate above; the camera's display reading is stored alongside the event but is not yet cross-checked against the operator's number, and direct serial or IP integration with the kanta is future work, not a shipped feature. And both OCR paths — number plates and the kanta display — lean on Tesseract, which is not part of the standard install: on a stock machine both return nothing. Build your process on the plate-free journey stitching, which works out of the box, and treat either reader as something you set up deliberately.

Where your data sits

Your footage is on your disk. Your chat text is not always.

Every AI CCTV vendor says “on-premise”, so the word carries no information. Here is the accounting instead — both columns, including the one that is inconvenient for us.

Stays on your machine

  • Recorded video FFmpeg MP4 segments, one folder per camera, on the drive you chose.
  • The database a local SQLite file, eagleai.db, under your app data directory.
  • Snapshots, HLS segments, keys and logs same local data directory.
  • Camera credentials encrypted at rest with Fernet, with a separate fingerprint column for lookups.
  • Detections, tracks, zone events and alerts computed on that PC, written to that database.

Leaves the box

  • AI chat text relayed through eagleai.online to a cloud language model, or sent straight to your provider if you supply your own key. Either way it leaves the box; only the route changes. Text only — the proxy accepts string content and rejects extra fields, so frames cannot travel that path.
  • Camera frames, if you switch the optional edge agent on a 640×480 JPEG at quality 85 on each motion trigger, rate-limited to one per camera per 10s. Leave the edge agent off and no image leaves.
  • A licence check your key, the PC's hostname, its Windows build, the app version and a one-way hash of its motherboard UUID, so the key can be bound to one machine. We record the public IP each check comes from and the time of it. Activation also creates an account on our servers named after the first eight characters of your key. That is the whole list.
  • Sanitised operational telemetry event counts, a version, an install id and the PC's hostname, signed with your licence key. No imagery. On by default; today it is inert only because the relay URL we shipped is an unset .example placeholder.
  • A version check, and the alert messages you asked it to send to the recipients you configured.
The claim, stated precisely enough to be checked No shipped code path uploads your recorded MP4 segments off your machine. There are two S3 video routes in the codebase, and it is worth being exact about both. One is playback: it serves the local file and only presigns a download if that file is gone. The other generates a presigned upload URL — and nothing in the backend, frontend, desktop app or edge agent calls it. Zero callers, and it is rate-limited to 30 per hour per user regardless.

If you want almost nothing to leave, there is a hard air-gap switch that skips the cloud calls the app makes on its own — licence verification and the version check — with no network attempt made. It does not reach the telemetry shipper, so switch telemetry off separately, and do not run the edge agent.
Two things you can check on your own disk, after we are gone from the conversation The uninstaller is written to leave your evidence behind. It deletes the SQLite sidecar files, the HLS scratch directory and a stale lock — and nothing else. The database, your licence key, the encryption key and settings.json are left intact, with a comment in the script saying so. Uninstall and reinstall without losing a recording or an alert.

And the backend ships as readable Python, not a frozen binary. The EXE carries an embedded CPython 3.12 and a plain source tree — there is no PyInstaller spec anywhere in the repository. Every claim on this page about what leaves your machine is greppable on your own disk after you install. That is the point: you should not have to believe our adjectives.
When our servers go down, and the hardening underneath

If our control plane is unreachable, your install keeps running. Licence verification enters a grace period on any connection error, timeout or non-200 response — signed with HMAC-SHA256 and written atomically with a backup file, so it is a real timestamp and not an editable text file. A 60-second failure backoff means a flaky line does not make every dashboard refresh wait for a timeout. Revoked and expired licences stay hard rejections: grace covers our failure, not a lapsed account.

  • Your key is time-limited and binds to one machine on first activation. A new machine can rebind without a support ticket. We can revoke a key or unbind it from our end; a revoked or expired key returns the app to the activation screen. Your recordings are unaffected either way — they are ordinary MP4 files in a folder on your disk, readable without our software.
  • No inbound firewall rule, no port forwarding. The optional edge agent connects outbound over WebSocket for remote management, and checks its own file hash against the cloud every 30 minutes.
  • Authentication is production-shaped: JWT access plus refresh tokens, TOTP two-factor, and a five-minute lockout after repeated failed logins. There is application-level row-level security on multi-user cloud tenants — but be clear about what that is worth to you: a licence-activated desktop install has one admin user, and admin sessions bypass those filters by design.
  • The desktop shell ships hardened: Electron fuses flipped — RunAsNode off, NODE_OPTIONS injection off, remote debugging off, app loads only from the packed archive, cookie encryption on.
  • On our live control plane right now, unauthenticated requests to /api/cameras, /api/alerts and /api/detections all return 401, and interactive API docs are disabled outside debug builds.

Before you install

Three things we would rather you heard from us than from Windows.

01SmartScreen

Windows will say “Unknown publisher”

The installer is not code-signed yet. SmartScreen will warn you and you will have to click through it. Verify the file against the SHA-256 above: that tells you the bytes are the bytes we shipped. It does not do what a certificate does, which is prove who we are. We are buying one; until then this is what we can give you.

02FFmpeg

We are not certain FFmpeg is inside the file

Recording needs FFmpeg, and two of our own artefacts disagree about whether the download carries it. The installer script says we do not bundle it (~80 MB) and fall back to a system copy; our own audit of a built EXE lists agent\bin\ffmpeg.exe at 101,060,096 bytes. The app handles either — it uses a bundled binary if it finds one, the PATH otherwise — and the installer writes what it found to %APPDATA%\eagleai\ffmpeg_status.txt so the first-run wizard can tell you. Until somebody opens a freshly built 2.17.8 and looks, that is the most we can honestly say. If FFmpeg is missing, recording does not work.

03VC++ runtime

The installer may pull one Microsoft component

If the Visual C++ 2015–2022 x64 runtime is missing, the installer downloads it from Microsoft and runs it. That needs internet at install time and raises a UAC prompt, because that component installs machine-wide. The EagleAI install itself is per-user and needs no admin rights.

Auto-update ships off: at the default setting the app makes no update check at all. The updater is in the build, though, and there is a switch in settings — turn it on and it downloads in the background and installs when you quit, from a feed in our S3 bucket. Nothing installs itself unless you ask for that.

Get it running

Three answers, and we can tell you whether this works on your site.

There is no checkout button on this page, because there is nothing behind one yet. A key comes from a person, and the person needs exactly these three things — which are also the three that let us tell you no, before you have spent an afternoon on it.

  1. 01How many cameras are on the site?
  2. 02What brand is the NVR or DVR?
  3. 03What is the PC that will run this — rough age, RAM, is it left on?

You can have the installer on the machine, and checked against the published hash, before anybody talks to you.