<?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: Varun Pratap Singh</title>
    <description>The latest articles on DEV Community by Varun Pratap Singh (@varun_pratapsingh_d70428).</description>
    <link>https://dev.to/varun_pratapsingh_d70428</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%2F4138065%2Fc8233c4a-8b1d-4f83-bb41-b55b63df735a.png</url>
      <title>DEV Community: Varun Pratap Singh</title>
      <link>https://dev.to/varun_pratapsingh_d70428</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/varun_pratapsingh_d70428"/>
    <language>en</language>
    <item>
      <title>OpenNVR 0.1.10: running an open-source NVR's AI on the Qualcomm Hexagon NPU</title>
      <dc:creator>Varun Pratap Singh</dc:creator>
      <pubDate>Sat, 31 Oct 2026 10:15:25 +0000</pubDate>
      <link>https://dev.to/varun_pratapsingh_d70428/opennvr-0110-running-an-open-source-nvrs-ai-on-the-qualcomm-hexagon-npu-5199</link>
      <guid>https://dev.to/varun_pratapsingh_d70428/opennvr-0110-running-an-open-source-nvrs-ai-on-the-qualcomm-hexagon-npu-5199</guid>
      <description>&lt;p&gt;OpenNVR is an open-source (AGPL) NVR that records and streams from any ONVIF or RTSP camera and runs the AI model you choose behind them: YOLO detection, pose, face recognition, plate OCR, open-vocabulary detection, and a vision-language agent that can look at a scene and reason about it. It runs on hardware you own, air-gapped if you need, with every inference audited.&lt;/p&gt;

&lt;p&gt;Version 0.1.10 is the first release with hardware acceleration flavours, and this post is about the one I have numbers for: Qualcomm's Hexagon NPU.&lt;/p&gt;

&lt;h2&gt;
  
  
  The board
&lt;/h2&gt;

&lt;p&gt;Arduino Ventuno Q: Qualcomm Dragonwing IQ-8275 (QCS8275), eight ARM cores, a Hexagon NPU, Ubuntu 24.04. Small, fanless, the kind of thing that sits behind a few cameras in a shop or a plant.&lt;/p&gt;

&lt;h2&gt;
  
  
  The numbers
&lt;/h2&gt;

&lt;p&gt;All measured on that board with the published container images. Full windows, settle times and caveats are in the &lt;a href="https://github.com/open-nvr/open-nvr/blob/main/bench/ventuno-q-benchmark-2026-10-30.md" rel="noopener noreferrer"&gt;benchmark doc&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Tier-0 detector (YOLO, one frame):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Device&lt;/th&gt;
&lt;th&gt;ms per frame&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CPU, 8 threads&lt;/td&gt;
&lt;td&gt;164&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hexagon NPU, fp16&lt;/td&gt;
&lt;td&gt;8.6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In the full stack (streams, decode, tracking, the API, all on the same box):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Device&lt;/th&gt;
&lt;th&gt;Cameras at 2 fps, no drops&lt;/th&gt;
&lt;th&gt;Host idle&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CPU&lt;/td&gt;
&lt;td&gt;4 (10 cameras drop half their frames)&lt;/td&gt;
&lt;td&gt;~4 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NPU&lt;/td&gt;
&lt;td&gt;16, 0 dropped&lt;/td&gt;
&lt;td&gt;46 %&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The adapters that sit behind the detector, end-to-end on one 1080p JPEG:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Adapter&lt;/th&gt;
&lt;th&gt;CPU&lt;/th&gt;
&lt;th&gt;NPU&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;YOLO&lt;/td&gt;
&lt;td&gt;141 ms&lt;/td&gt;
&lt;td&gt;77 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pose&lt;/td&gt;
&lt;td&gt;108 ms&lt;/td&gt;
&lt;td&gt;64 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Package detection&lt;/td&gt;
&lt;td&gt;100 ms&lt;/td&gt;
&lt;td&gt;60 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Face recognition (InsightFace)&lt;/td&gt;
&lt;td&gt;443 ms&lt;/td&gt;
&lt;td&gt;62 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plate OCR&lt;/td&gt;
&lt;td&gt;248 ms&lt;/td&gt;
&lt;td&gt;62 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The NPU's own share of an adapter call is about 9 ms. The rest is JPEG decode and preprocessing on a busy CPU, so the adapter path is now bounded by image handling, not inference.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;Everything goes through ONNX Runtime's QNN execution provider, shipped as a plugin wheel (&lt;code&gt;onnxruntime-qnn&lt;/code&gt;). There is no Qualcomm SDK to install on the host. The &lt;code&gt;-qualcomm&lt;/code&gt; container gets the DSP device node, the DMA heap, and two host libraries bind-mounted, and that is it.&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;# OPENNVR_ACCEL=auto detects /dev/fastrpc-cdsp and picks the qualcomm flavour&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;OPENNVR_ACCEL=cpu|intel|qualcomm&lt;/code&gt; overrides the probe. A box with only a CPU gets exactly the images it got before.&lt;/p&gt;

&lt;p&gt;Compiled graphs are cached, so the second start skips the ~6 s compile. The pipeline reports which provider ONNX Runtime really ran on, and a request for an accelerator that silently fell back to CPU shows up as &lt;code&gt;requested != effective&lt;/code&gt; in the metrics instead of being hidden.&lt;/p&gt;

&lt;h2&gt;
  
  
  Things that cost a day each
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A plugin execution provider named in the &lt;code&gt;providers=&lt;/code&gt; list is silently ignored. It has to be attached by device with &lt;code&gt;add_provider_for_devices&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;python:slim&lt;/code&gt; lacks &lt;code&gt;libatomic1&lt;/code&gt;. The HTP backend fails to load and the session falls back to CPU with no error.&lt;/li&gt;
&lt;li&gt;The first "NPU" number I got (12 ms, looked great) was a stub detector after a failed session. Check the health endpoint and the degraded counter before trusting a number.&lt;/li&gt;
&lt;li&gt;The Ubuntu image ships Docker Compose 2.24.6, which randomly drops a container's second network at create. The installer now checks the Compose version and repairs network membership after every &lt;code&gt;up&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Measure your own hardware
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; detect_pipeline.bench &lt;span class="nt"&gt;--latency&lt;/span&gt; 200 &lt;span class="nt"&gt;--providers&lt;/span&gt; CPUExecutionProvider
python &lt;span class="nt"&gt;-m&lt;/span&gt; detect_pipeline.bench &lt;span class="nt"&gt;--latency&lt;/span&gt; 200 &lt;span class="nt"&gt;--providers&lt;/span&gt; QNNExecutionProvider:htp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It reports median, p90 and min per device, names the provider that really ran, and exits non-zero if the accelerator fell back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Also in 0.1.10
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Intel iGPU and NPU flavour via OpenVINO, VAAPI decode&lt;/li&gt;
&lt;li&gt;Signed self-update: each release ships a manifest signed by us and verified on the box, opt-in&lt;/li&gt;
&lt;li&gt;Camera tours for display boards, camera CSV/Excel import and export, bulk actions&lt;/li&gt;
&lt;li&gt;The app SDK's Look and Investigate steps for writing your own camera workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Next
&lt;/h2&gt;

&lt;p&gt;NVIDIA, desktop GPUs and Jetson. If you have a Jetson, Rockchip or Hailo box you'd lend to a benchmark, I have one board and would like more.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repo: &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://github.com/open-nvr/open-nvr/releases/tag/v0.1.10" rel="noopener noreferrer"&gt;https://github.com/open-nvr/open-nvr/releases/tag/v0.1.10&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Hardware guide: &lt;a href="https://github.com/open-nvr/open-nvr/blob/main/docs/HARDWARE.md" rel="noopener noreferrer"&gt;https://github.com/open-nvr/open-nvr/blob/main/docs/HARDWARE.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Discord: &lt;a href="https://opennvr.org/discord" rel="noopener noreferrer"&gt;https://opennvr.org/discord&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>edge</category>
      <category>python</category>
    </item>
    <item>
      <title>We tested every small model our camera agent uses on a 4-core CPU. The bigger model lost.</title>
      <dc:creator>Varun Pratap Singh</dc:creator>
      <pubDate>Mon, 19 Oct 2026 18:57:56 +0000</pubDate>
      <link>https://dev.to/varun_pratapsingh_d70428/we-tested-every-small-model-our-camera-agent-uses-on-a-4-core-cpu-the-bigger-model-lost-5cpb</link>
      <guid>https://dev.to/varun_pratapsingh_d70428/we-tested-every-small-model-our-camera-agent-uses-on-a-4-core-cpu-the-bigger-model-lost-5cpb</guid>
      <description>&lt;p&gt;I maintain OpenNVR, an open source video recorder with a camera agent built in. You can ask it what's happening on a camera, arm an alarm, search old footage, and soon it will look into events on its own.&lt;/p&gt;

&lt;p&gt;Most people who run it don't have a GPU. They have a small PC with 4 cores. So for this round we tested every model the agent depends on, using a 4 vCPU machine with no GPU. Until now we had picked models by reputation, like most projects do. We wanted numbers that anyone in open source can check, so every test script is in the repo.&lt;/p&gt;

&lt;p&gt;Four of our defaults changed. Some results were not what we expected.&lt;/p&gt;

&lt;h2&gt;
  
  
  How we tested
&lt;/h2&gt;

&lt;p&gt;One small test per job:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Language model:&lt;/strong&gt; can it use tools and finish a multi-step investigation?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vision model:&lt;/strong&gt; questions with known answers on labelled images.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speech to text:&lt;/strong&gt; word error rate on the phrases people actually say to the agent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Text to speech:&lt;/strong&gt; is it faster than real time, and is it understandable?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search:&lt;/strong&gt; find the right image from a text description.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All timings are on 4 CPU threads.&lt;/p&gt;

&lt;h2&gt;
  
  
  Language model
&lt;/h2&gt;

&lt;p&gt;We gave it 20 investigation cases, for example "person at the loading bay at 01:14". It has to check the camera, the history and the site rules, then decide. Each case ran 3 times.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Passed&lt;/th&gt;
&lt;th&gt;Checked before deciding&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;granite4:micro&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;44 / 60&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;56 / 60&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;granite4:tiny-h (7B MoE, 1B active)&lt;/td&gt;
&lt;td&gt;35 / 60&lt;/td&gt;
&lt;td&gt;49 / 60&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3:1.7b (our old default)&lt;/td&gt;
&lt;td&gt;21 / 60&lt;/td&gt;
&lt;td&gt;36 / 60&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LFM2-1.2B-Tool&lt;/td&gt;
&lt;td&gt;19 / 60&lt;/td&gt;
&lt;td&gt;37 / 60&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3:4b&lt;/td&gt;
&lt;td&gt;9 / 60&lt;/td&gt;
&lt;td&gt;9 / 60&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;qwen3:4b scored less than half of qwen3:1.7b. When we read the traces, the reason was simple. It thought for a long time and almost never called a tool, so it decided without looking. Granite 4 micro calls about two tools before it answers, and that alone more than doubled the pass rate. It is about twice as slow per turn. For an investigation that runs in the background, that's fine, so it is our default now.&lt;/p&gt;

&lt;p&gt;We also found a bug in our own agent. We had told the model to always look before describing, so when a user said "thanks, that's all", Granite went and checked a camera. Now small talk goes to the model without any tools. That helped every model, not just Granite.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vision model
&lt;/h2&gt;

&lt;p&gt;128 labelled images, 3 questions each: one about something in the picture, one about something that isn't (a "yes" here is a hallucination), and a people count.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Wrong "yes", of 126&lt;/th&gt;
&lt;th&gt;Count within one, of 61&lt;/th&gt;
&lt;th&gt;CPU time per new frame&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;qwen3-vl:2b-instruct&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;50&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;18 s (follow-up questions are free)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gemma3:4b&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;td&gt;17 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;moondream 0.5b&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;7.6 s&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Qwen3-VL never said yes to something that wasn't there. On a GPU it answers in about 3 seconds, so it's the default when a GPU is present. But on 4 cores it needs 18 seconds just to read the frame. If someone is at the gate, an answer after 18 seconds is too late to be useful. So on CPU we kept Moondream.&lt;/p&gt;

&lt;p&gt;One tip if you use Ollama: the plain &lt;code&gt;qwen3-vl:2b&lt;/code&gt; tag is the thinking version and ignores &lt;code&gt;think: false&lt;/code&gt;. Use the &lt;code&gt;-instruct&lt;/code&gt; tag.&lt;/p&gt;

&lt;h2&gt;
  
  
  Speech to text
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Word error rate&lt;/th&gt;
&lt;th&gt;Time per sentence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Parakeet TDT 0.6B v3&lt;/strong&gt; (onnx-asr, int8)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.4%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.31 s&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;faster-whisper base.en (int8)&lt;/td&gt;
&lt;td&gt;3.3%&lt;/td&gt;
&lt;td&gt;1.42 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;faster-whisper small.en&lt;/td&gt;
&lt;td&gt;3.7%&lt;/td&gt;
&lt;td&gt;2.67 s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This was the easy decision. Half the errors in about a fifth of the time. Speech recognition used to be the slowest step in a voice turn and now it's a third of a second. Parakeet can't translate and doesn't do Hindi, so Whisper is still there for sites that need that.&lt;/p&gt;

&lt;h2&gt;
  
  
  Text to speech
&lt;/h2&gt;

&lt;p&gt;Kokoro-82M sounds nicer than Piper. But on 4 cores it runs at 1.9x real time, so it takes longer to make the audio than to play it, and replies would pause mid-sentence. Piper runs at 0.23x. We kept Piper.&lt;/p&gt;

&lt;h2&gt;
  
  
  Search and detection
&lt;/h2&gt;

&lt;p&gt;For searching footage by description, like "red truck at the dock", SigLIP 2 B/16 scored 0.672 mAP against CLIP ViT-B/32's 0.571. It's slower per image (57 ms against 26 ms), but search quality matters more here. It's the default now, and OpenNVR re-embeds old footage automatically after the upgrade.&lt;/p&gt;

&lt;p&gt;The always-on detector moved from YOLOv8n to YOLO26n: 62 ms per frame instead of 75, slightly more accurate, same output format.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we learned
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;For agents, size wasn't what mattered.&lt;/strong&gt; Whether the model checks with its tools before deciding mattered more than parameter count.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;On a camera, a slow answer is a bad answer.&lt;/strong&gt; A good answer at 8 seconds beat the best answer at 18.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test on the hardware your users have.&lt;/strong&gt; Most of these rankings flip on a GPU, and most of our users don't have one.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All the scripts and raw numbers are in the repo: &lt;a href="https://github.com/open-nvr/open-nvr/blob/main/examples/camera-agent/MODELS_AND_LATENCY.md" rel="noopener noreferrer"&gt;MODELS_AND_LATENCY.md&lt;/a&gt;. If you run them on other hardware, please send a PR with your numbers.&lt;/p&gt;

&lt;p&gt;One gap we couldn't close: a vision model under 2B parameters that reads a frame in under 5 seconds on CPU and still doesn't hallucinate. If you know one, tell me in the comments.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://opennvr.org/blog/cpu-models-for-a-camera-agent/" rel="noopener noreferrer"&gt;opennvr.org&lt;/a&gt;. Drafted with AI assistance; all measurements are from the OpenNVR repository.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>benchmark</category>
      <category>selfhosted</category>
    </item>
    <item>
      <title>What if your IP cameras were programmable infrastructure, not just surveillance devices?</title>
      <dc:creator>Varun Pratap Singh</dc:creator>
      <pubDate>Tue, 13 Oct 2026 16:55:41 +0000</pubDate>
      <link>https://dev.to/varun_pratapsingh_d70428/what-if-your-ip-cameras-were-programmable-infrastructure-not-just-surveillance-devices-4mfo</link>
      <guid>https://dev.to/varun_pratapsingh_d70428/what-if-your-ip-cameras-were-programmable-infrastructure-not-just-surveillance-devices-4mfo</guid>
      <description>&lt;p&gt;I've been working on OpenNVR, an open-source project that started around IP cameras and NVR, but the bigger idea is to make camera infrastructure useful for building entirely new applications.&lt;/p&gt;

&lt;p&gt;Most camera setups are designed around viewing and recording footage. But what if developers could use the same infrastructure to build their own computer vision applications, AI workflows, event-driven services, and automation systems?&lt;/p&gt;

&lt;p&gt;That's the direction we're exploring with OpenNVR.&lt;/p&gt;

&lt;p&gt;A few things we're working toward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open camera infrastructure — work with ONVIF-compatible IP cameras without being locked into a proprietary ecosystem.&lt;/li&gt;
&lt;li&gt;Build your own applications — use APIs and an SDK-oriented approach to build services on top of camera streams and events.&lt;/li&gt;
&lt;li&gt;Bring your own AI — integrate your own models and vision pipelines instead of being tied to a single vendor's AI.&lt;/li&gt;
&lt;li&gt;Self-hosted and privacy-conscious — keep your camera infrastructure and data under your control.&lt;/li&gt;
&lt;li&gt;Beyond traditional NVR — explore use cases ranging from security automation to custom vision applications and AI agents.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The interesting question for me is whether camera infrastructure can become something like a platform developers build on, rather than just another appliance they install.&lt;/p&gt;

&lt;p&gt;We're still building and learning, and I'd genuinely appreciate feedback from people working on computer vision, self-hosted infrastructure, AI agents, or open-source systems.&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://www.opennvr.org" rel="noopener noreferrer"&gt;https://www.opennvr.org&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If the idea interests you, a GitHub star helps other developers discover the project. If it doesn't, tell me what we're missing — honest technical feedback is just as valuable.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>ipcamera</category>
      <category>vision</category>
    </item>
  </channel>
</rss>
