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
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.
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.
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.
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.
Install
One-click NSIS installer, per-user, into your profile. No options screen, no component tree.
Activate
Paste the licence key. That is the whole login — you never set a password and never type one again.
Its own server starts
An Electron shell around a real FastAPI backend, on 127.0.0.1:8000. Loopback only.
It finds the cameras
Four layers of discovery, stopping at whichever one works. You supply no IP.
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.
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 in — LIVE 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
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.
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:
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 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.”
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.
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.
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.
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.
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.
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.
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.
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.
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.
- 01How many cameras are on the site?
- 02What brand is the NVR or DVR?
- 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.