<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Suraj Raj Bhandari</title>
    <description>The latest articles on DEV Community by Suraj Raj Bhandari (@surajrb).</description>
    <link>https://dev.to/surajrb</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4144114%2F4ea585c7-eec1-4496-84bc-9104b507d0fd.png</url>
      <title>DEV Community: Suraj Raj Bhandari</title>
      <link>https://dev.to/surajrb</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/surajrb"/>
    <language>en</language>
    <item>
      <title>Ten years after Mirai, can you name your riskiest camera?</title>
      <dc:creator>Suraj Raj Bhandari</dc:creator>
      <pubDate>Mon, 12 Oct 2026 01:52:19 +0000</pubDate>
      <link>https://dev.to/surajrb/ten-years-after-mirai-can-you-name-your-riskiest-camera-m98</link>
      <guid>https://dev.to/surajrb/ten-years-after-mirai-can-you-name-your-riskiest-camera-m98</guid>
      <description>&lt;p&gt;In September 2016, a botnet called Mirai took over hundreds of thousands of IP cameras and DVRs. It didn't need a zero-day. It logged in with a list of about 60 factory-default usernames and passwords, then used those devices to knock large parts of the internet offline.&lt;/p&gt;

&lt;p&gt;That was ten years ago. So here's a question for anyone who runs a network with cameras on it:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which of your cameras is the biggest risk right now?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most organisations can't answer that. Usually it isn't negligence. Cameras just fall between teams. Facilities bought them, an installer set them up, IT routes their traffic, and security assumes someone else is looking after them. Nobody owns the full list.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why cameras are still the soft target
&lt;/h2&gt;

&lt;p&gt;Treat a camera as what it really is: a small Linux computer with a network port, a web server, a video streaming server and a vendor SDK port. It usually runs firmware nobody has updated since the day it went in, and it sits in a ceiling for 7–10 years.&lt;/p&gt;

&lt;p&gt;The same problems turn up on almost every site:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Internet exposure.&lt;/strong&gt; A port forward for "remote viewing", or UPnP opening one quietly. Search engines like Shodan index these devices continuously.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Default or weak credentials.&lt;/strong&gt; Still the number one way in. It's exactly what Mirai used.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plaintext RTSP.&lt;/strong&gt; Most cameras stream video over RTSP on port 554 with no encryption. If someone can see the traffic, they can see the video, and often the credentials too.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;End-of-life firmware.&lt;/strong&gt; Vendors stop shipping patches, but the camera keeps working, so nobody replaces it. Its known CVEs stay open for good.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hardware you may not be allowed to run any more.&lt;/strong&gt; Section 889 of the US NDAA bans federal agencies and their contractors from using video surveillance equipment from certain vendors. The catch is that this hardware is widely &lt;strong&gt;OEM-rebranded&lt;/strong&gt;, so the name on the label often isn't the company that made it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this is exotic. The hard part is seeing all of it, across every camera, at once.&lt;/p&gt;

&lt;h2&gt;
  
  
  The discovery problem: ONVIF isn't enough
&lt;/h2&gt;

&lt;p&gt;The obvious way to find cameras is ONVIF WS-Discovery: send a multicast probe and list whatever replies. It's a good start, but it misses a lot:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multicast usually stops at the subnet or VLAN boundary, so cameras on other segments never hear the probe.&lt;/li&gt;
&lt;li&gt;Many cameras ship with ONVIF disabled, or the installer turned it off.&lt;/li&gt;
&lt;li&gt;Older and cheaper devices may not support ONVIF at all.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A camera that ignores ONVIF still has to expose &lt;em&gt;something&lt;/em&gt; to be useful: RTSP (554, 8554), HTTP/HTTPS for its web UI, and often a vendor SDK port such as 8000, 37777 or 34567. Those open ports, together with what the services report when you connect, identify a camera far more reliably than waiting for it to answer a multicast probe.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you can check yourself this afternoon
&lt;/h2&gt;

&lt;p&gt;You don't need any product for a first pass. &lt;strong&gt;Only scan networks you own or are authorised to test.&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Find what's listening on camera ports&lt;/strong&gt; on your own subnet:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   nmap &lt;span class="nt"&gt;-sV&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 80,443,554,8000,8554,37777,34567 192.168.1.0/24
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every host with 554 open deserves a closer look.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Check your public IP on Shodan&lt;/strong&gt; (or a similar service). If a camera or NVR web page shows up, you have an exposure problem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Turn off UPnP&lt;/strong&gt; on the router or firewall that sits in front of the camera network.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Put cameras on their own VLAN&lt;/strong&gt; with no internet egress by default. Cameras rarely need to call out, and blocking egress also cuts off a lot of botnet traffic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write down the make, model and firmware version&lt;/strong&gt; of each camera and look up its end-of-support date. The first time you do this, it's usually a surprise.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That covers the basics for a home lab or a small office. For an estate of hundreds or thousands of cameras across many sites, doing it by hand doesn't scale. You also need output an auditor will accept.&lt;/p&gt;

&lt;h2&gt;
  
  
  So we built OpenNVR Scout
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://opennvr.org" rel="noopener noreferrer"&gt;OpenNVR Scout&lt;/a&gt; is a read-only security assessment for a whole camera estate. It works in four stages:&lt;/p&gt;

&lt;h3&gt;
  
  
  🔍 Discover
&lt;/h3&gt;

&lt;p&gt;It finds cameras by their open ports and service fingerprints, not only the ones that answer ONVIF. Cameras on other segments, cameras with ONVIF switched off, and old devices all end up in the inventory.&lt;/p&gt;

&lt;h3&gt;
  
  
  📊 Grade
&lt;/h3&gt;

&lt;p&gt;It runs &lt;strong&gt;50 checks across 14 risk categories&lt;/strong&gt;, including exposure, credentials, transport encryption, firmware age and known CVEs. Each camera gets an &lt;strong&gt;A–F grade&lt;/strong&gt;, and so does the estate as a whole. A letter grade is blunt on purpose: everyone, including people outside security, understands it in a meeting.&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚖️ Comply
&lt;/h3&gt;

&lt;p&gt;Each finding is mapped to the relevant &lt;strong&gt;US, EU, UK and India&lt;/strong&gt; regulations. When Scout finds NDAA §889-covered hardware, including OEM-rebranded units, it produces the evidence a procurement or compliance team needs.&lt;/p&gt;

&lt;h3&gt;
  
  
  🛠️ Fix
&lt;/h3&gt;

&lt;p&gt;It produces a &lt;strong&gt;prioritised migration plan&lt;/strong&gt;, not another flat list of patches. Some cameras need a firmware update. Some need a firewall rule. Some will never be safe and should be replaced first. The plan says which is which and in what order.&lt;/p&gt;

&lt;p&gt;The output is a posture report in &lt;strong&gt;HTML and PDF&lt;/strong&gt; that you can hand straight to your security team or auditor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read-only by design
&lt;/h2&gt;

&lt;p&gt;A security tool that can break the thing it checks is a hard sell in production, particularly on a 10-year-old camera that falls over if you look at it the wrong way. So Scout is &lt;strong&gt;passive and read-only by default&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It doesn't exploit anything.&lt;/li&gt;
&lt;li&gt;It doesn't change any configuration on the cameras.&lt;/li&gt;
&lt;li&gt;It only tests credentials when you &lt;strong&gt;explicitly authorise&lt;/strong&gt; it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point matters. Credential checks give the most useful results, and they're also the ones that need clear permission. Scout makes that an explicit opt-in, never a default.&lt;/p&gt;

&lt;h2&gt;
  
  
  See it in action
&lt;/h2&gt;

&lt;p&gt;Here's a two-minute walkthrough:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://www.youtube.com/watch?v=RVPSaiNYGlg" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=RVPSaiNYGlg&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Over to you
&lt;/h2&gt;

&lt;p&gt;How does your organisation track camera security today? A spreadsheet, the VMS inventory, or nobody at all? I'd like to hear in the comments, especially from anyone who has tried to answer the §889 question for real.&lt;/p&gt;

&lt;p&gt;If you'd like to know how your cameras would score, you can book a camera security assessment at &lt;a href="https://opennvr.org" rel="noopener noreferrer"&gt;opennvr.org&lt;/a&gt; or email &lt;a href="mailto:contact@opennvr.org"&gt;contact@opennvr.org&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>security</category>
      <category>cybersecurity</category>
      <category>cct</category>
      <category>networking</category>
    </item>
    <item>
      <title>OpenNVR 0.1.6 Is Out: Search Your Camera Footage in Plain English</title>
      <dc:creator>Suraj Raj Bhandari</dc:creator>
      <pubDate>Sun, 11 Oct 2026 16:32:15 +0000</pubDate>
      <link>https://dev.to/surajrb/opennvr-016-is-out-search-your-camera-footage-in-plain-english-5ajl</link>
      <guid>https://dev.to/surajrb/opennvr-016-is-out-search-your-camera-footage-in-plain-english-5ajl</guid>
      <description>&lt;p&gt;What if you could search hours of CCTV footage by simply describing what you're looking for?&lt;/p&gt;

&lt;p&gt;Instead of manually scrubbing through recordings, imagine searching for &lt;em&gt;"red truck at the dock yesterday"&lt;/em&gt; and finding the relevant footage in seconds.&lt;/p&gt;

&lt;p&gt;That's the idea behind &lt;strong&gt;OpenNVR 0.1.6&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;OpenNVR is an open-source platform for AI-powered video surveillance that brings intelligent video analytics to your own hardware.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's New in OpenNVR 0.1.6?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔎 1. Search Video Footage Using Natural Language
&lt;/h3&gt;

&lt;p&gt;Search recorded camera activity using plain-language descriptions. Captions, colours, vehicle types, and license plates become searchable, making it easier to find the footage you need.&lt;/p&gt;

&lt;h3&gt;
  
  
  🎯 2. More AI Applications
&lt;/h3&gt;

&lt;p&gt;The application catalog has evolved into dedicated products, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Intrusion detection&lt;/li&gt;
&lt;li&gt;Loitering detection&lt;/li&gt;
&lt;li&gt;Line crossing&lt;/li&gt;
&lt;li&gt;Abandoned object detection&lt;/li&gt;
&lt;li&gt;Package delivery&lt;/li&gt;
&lt;li&gt;Gate control&lt;/li&gt;
&lt;li&gt;Smart doorbell&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Guard Scan Compliance&lt;/strong&gt; is also introduced in this release.&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚡ 3. Smarter AI Resource Allocation
&lt;/h3&gt;

&lt;p&gt;Each camera runs the AI applications assigned to it. This helps avoid spending compute resources on applications that aren't needed for a particular camera.&lt;/p&gt;

&lt;h3&gt;
  
  
  🏠 4. Home Assistant Integration
&lt;/h3&gt;

&lt;p&gt;OpenNVR now supports Home Assistant through MQTT discovery, with API-token scoping and audit logging.&lt;/p&gt;

&lt;h3&gt;
  
  
  🛡️ 5. Security Fixes
&lt;/h3&gt;

&lt;p&gt;This release includes security fixes. Upgrading existing installations is recommended.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧑‍💻 6. SDKs Available on PyPI
&lt;/h3&gt;

&lt;p&gt;Both OpenNVR SDKs are available on PyPI, making it easier for developers to build applications with a single function or integrate their own AI models through adapters.&lt;/p&gt;

&lt;p&gt;Developers can also distribute their applications under their preferred licences.&lt;/p&gt;

&lt;h2&gt;
  
  
  Built in the Open
&lt;/h2&gt;

&lt;p&gt;This release includes &lt;strong&gt;147 merged changes&lt;/strong&gt; since the previous release.&lt;/p&gt;

&lt;p&gt;Our goal is straightforward: make AI-powered video surveillance more accessible, extensible, and practical without requiring specialised hardware for every new capability.&lt;/p&gt;

&lt;p&gt;With OpenNVR, new capabilities can arrive through software rather than requiring you to replace your camera infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try OpenNVR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🌐 Website: &lt;a href="https://opennvr.org" rel="noopener noreferrer"&gt;https://opennvr.org&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💻 GitHub: &lt;a href="https://github.com/open-nvr/open-nvr" rel="noopener noreferrer"&gt;https://github.com/open-nvr/open-nvr&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📋 Release notes: &lt;a href="https://lnkd.in/gSCEP2EQ" rel="noopener noreferrer"&gt;https://lnkd.in/gSCEP2EQ&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;✨ What's new: &lt;a href="https://lnkd.in/gmxA--bM" rel="noopener noreferrer"&gt;https://lnkd.in/gmxA--bM&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're working on computer vision, edge AI, video surveillance, or open-source infrastructure, we'd love to hear your thoughts and contributions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What would you build on top of OpenNVR?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>computervision</category>
      <category>ai</category>
      <category>edgeai</category>
    </item>
    <item>
      <title>Okay, I've been sitting on this post for a while and I'm finally writing it. 😄</title>
      <dc:creator>Suraj Raj Bhandari</dc:creator>
      <pubDate>Sat, 26 Sep 2026 10:23:17 +0000</pubDate>
      <link>https://dev.to/surajrb/okay-ive-been-sitting-on-this-post-for-a-while-and-im-finally-writing-it-437f</link>
      <guid>https://dev.to/surajrb/okay-ive-been-sitting-on-this-post-for-a-while-and-im-finally-writing-it-437f</guid>
      <description>&lt;p&gt;For months now I've been working on &lt;strong&gt;OpenNVR&lt;/strong&gt;, an open-source NVR (network video recorder) for IP cameras. And the part I'm most excited about: you can literally ask your cameras questions, and the AI answering you runs on your own machine. Not some vendor's cloud. Yours.&lt;/p&gt;

&lt;p&gt;This is what it looks like:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fatqdigu4tj8a9j9fhqfo.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fatqdigu4tj8a9j9fhqfo.gif" alt="Asking the OpenNVR camera agent a question. It runs YOLOv8 on a live frame and answers locally" width="640" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every time I see that work I still smile a little.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I care about this so much
&lt;/h2&gt;

&lt;p&gt;Think about how most cameras work today. You buy one, it connects to the manufacturer's cloud, and your footage goes... somewhere. They hold the keys. They run the AI. If they get breached, you get breached.&lt;/p&gt;

&lt;p&gt;And this isn't hypothetical. In 2016 the Mirai botnet took over hundreds of thousands of IP cameras and used them for one of the biggest DDoS attacks ever. In 2021 someone got into a camera vendor's cloud and could watch around 150,000 cameras, in hospitals, schools, prisons.&lt;/p&gt;

&lt;p&gt;That always bothered me. A camera in your house should work for you. So OpenNVR is built the other way round: your cameras, your hardware, your AI, and nothing leaves the box unless you decide it should.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting it running
&lt;/h2&gt;

&lt;p&gt;I really wanted this to be easy, so it's two commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/open-nvr/open-nvr.git &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;open-nvr
./start.sh          &lt;span class="c"&gt;# Windows: .\start.ps1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You get a small setup wizard. Every question already has a default, so honestly you can just keep pressing Enter. At the end it gives you a URL and a one-time token. Open it, set a password, add a camera, and in about 30 seconds you'll see detection boxes on your live feed.&lt;/p&gt;

&lt;p&gt;I'll be honest though: the first run takes 8 to 15 minutes because it's downloading Docker images. Go get a chai. ☕ After that it starts in seconds.&lt;/p&gt;

&lt;p&gt;Don't have an IP camera? No problem. The camera agent can use your laptop webcam, or you can install the OpenNVR Cam app on an old Android phone and it becomes a real ONVIF camera.&lt;/p&gt;

&lt;h2&gt;
  
  
  You can talk to your cameras (my favourite part)
&lt;/h2&gt;

&lt;p&gt;This is the thing I show everyone first. There's a camera agent: a small local LLM (Ollama, &lt;code&gt;qwen2.5:1.5b&lt;/code&gt; by default) that can call vision tools on your live cameras. So you can ask things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Is anyone in the kitchen?" and it runs YOLOv8 on the current frame&lt;/li&gt;
&lt;li&gt;"What's at the back gate?" and it describes the scene&lt;/li&gt;
&lt;li&gt;"Did anyone walk past in the last ten minutes?" and it checks recent events&lt;/li&gt;
&lt;li&gt;"Did a red truck come by earlier?" and it searches the history&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can use it by voice (Whisper listens, Piper talks back) or just type with &lt;code&gt;--chat&lt;/code&gt;. Both run on a normal CPU. No API keys, no account.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;examples/camera-agent/quickstart.sh &lt;span class="nt"&gt;--chat&lt;/span&gt;
&lt;span class="c"&gt;# then open http://localhost:9100/demo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How it works under the hood
&lt;/h2&gt;

&lt;p&gt;Some design decisions I'm really happy with:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recording never depends on the AI.&lt;/strong&gt; Video gets recorded in one-minute chunks no matter what. If every model crashes, your footage is still there. This part has to be boring, and it is.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A cheap detector decides when the expensive stuff runs.&lt;/strong&gt; A small model watches a low frame rate copy of each stream. Only when it sees something interesting does it wake up the heavy models like face recognition or plate reading. That's how the whole thing fits on a mini PC.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Models and rules are separate.&lt;/strong&gt; Models answer "what is this?". Apps answer "should I care?" (this zone, these hours, this plate list). So you can swap a model without rewriting your rules.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One place for history.&lt;/strong&gt; Everything worth remembering goes into one event store, so "was a red van here on Tuesday?" gives the same answer from the search page, the agent, or an app you install next month.&lt;/p&gt;

&lt;h2&gt;
  
  
  Plug in your own model
&lt;/h2&gt;

&lt;p&gt;This is the developer part I love. If your model sits behind a REST or WebSocket endpoint, it can plug into OpenNVR. A trimmed down version looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;opennvr_adapter_sdk&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AdapterApp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;AdapterService&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;BodyShape&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;BODY_BYTES_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;InferResponse&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyDetector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AdapterService&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="p"&gt;...&lt;/span&gt;  &lt;span class="c1"&gt;# load your weights
&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;infer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;InferResponse&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;frame_bytes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;BODY_BYTES_KEY&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="c1"&gt;# ... run your model ...
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;InferResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;detections&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[...]})&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;AdapterApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;MyDetector&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;my-detector&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1.0.0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vendor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;me&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;license&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MIT&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tasks_advertised&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;object_detection&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;body_shape&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;BodyShape&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IMAGE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;fastapi_app&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it with &lt;code&gt;uvicorn&lt;/code&gt;, register the URL, done. The SDK is Apache-2.0, so your adapter can use whatever license you want. Full version is in the &lt;a href="https://github.com/open-nvr/ai-adapter/blob/main/opennvr_adapter_sdk/README.md" rel="noopener noreferrer"&gt;SDK README&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  An app store instead of YAML files
&lt;/h2&gt;

&lt;p&gt;Once it's running there's an App Catalog with thirteen one-click apps: number plate recognition, a doorbell that recognises faces, intrusion zones, loitering, people counting, line crossing, abandoned objects, package delivery, gate control, "find the red truck" footage search, alert routing, a Home Assistant bridge, and more.&lt;/p&gt;

&lt;p&gt;Each app has to say up front which cameras and network hosts it needs, and an admin approves that before install. No app can quietly get access it never asked for.&lt;/p&gt;

&lt;p&gt;Want to write your own? &lt;code&gt;pip install opennvr-app-sdk &amp;amp;&amp;amp; opennvr-app new my-app&lt;/code&gt; gives you a starter where you fill in one method: your rule.&lt;/p&gt;

&lt;h2&gt;
  
  
  Private by default
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Cloud access and AI calls to the internet are blocked (HTTP 403) until you explicitly turn them on.&lt;/li&gt;
&lt;li&gt;Camera passwords are encrypted at rest.&lt;/li&gt;
&lt;li&gt;Every AI decision is logged with an ID that traces the alert back to the exact model that made it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you like reading architecture papers, we wrote one: &lt;a href="https://doi.org/10.5281/zenodo.22804254" rel="noopener noreferrer"&gt;here it is&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What hardware do you need?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Raspberry Pi 4/5 (4 GB):&lt;/strong&gt; recording, streaming, detection, zone and line apps&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mini PC / NUC (8 to 16 GB):&lt;/strong&gt; all of that plus plate and face recognition and the text agent&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Something with an NVIDIA GPU:&lt;/strong&gt; everything, including scene descriptions and the voice agent&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  I'd love your help
&lt;/h2&gt;

&lt;p&gt;We're still early, and honestly every bit of feedback helps a lot right now. If this sounds interesting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⭐ &lt;a href="https://github.com/open-nvr/open-nvr" rel="noopener noreferrer"&gt;Star the repo on GitHub&lt;/a&gt;. It really helps other self-hosters find it.&lt;/li&gt;
&lt;li&gt;Try it on your own machine and &lt;a href="https://github.com/open-nvr/open-nvr/issues" rel="noopener noreferrer"&gt;open an issue&lt;/a&gt; for anything that breaks or confuses you. I read all of them.&lt;/li&gt;
&lt;li&gt;Tell me in the comments: &lt;strong&gt;what would you ask your cameras?&lt;/strong&gt; I'm genuinely curious.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks for reading! 🙏&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/open-nvr/open-nvr" rel="noopener noreferrer"&gt;https://github.com/open-nvr/open-nvr&lt;/a&gt;&lt;br&gt;
Website: &lt;a href="https://opennvr.org" rel="noopener noreferrer"&gt;https://opennvr.org&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>security</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
