IP cameras have been around for many years and although many are intentionally left open (often as advertisment for potential tourists), even more are misconfigured and will begin streaming on request without needing authentication.

Watcher is an open source program capable of identifying and streaming video from these cameras, using a variety of means to find exposed devices.

The program is under active development and at this stage meant for enthusiasts, as it is a long way from being polished.


Currently Watcher is only available as source. It will build and compile on Windows 10 but as that the program is still heavily in development this is only recommended for enthusiasts.

GitLab: Watcher source

Once the project reaches a stable point, pre-built binaries will be provided.


There were a couple of things I wanted when I started building this:

  • The program should be able to run locally, rather than as a webservice.
  • It should run on both Windows and Linux.
  • Should be extensible, as we aren’t looking at a static environment.

For portability, Watcher is written in C++11. As there is a limit to how much of the wheel I’m willing to re-invent, SDL (Simple DirectMedia Layer) provides cross-platform window creation, OpenGL initialisation, input handling and a few other things. Layering on top of SDL and OpenGL, ImGui is used to create the user interface while keeping the bloat low. For data management, SQLite handles storing and retrieving data from a database local to the program, which requires no “real” database service to have to be installed. The much beloved cURL is used to interact with HTTP servers and finally, a JSON library serialises configuration files (such as rule sets) and messages between individual plugins.

Further building up on this, the map is built using tiles from a remote server: currently Stamen, but most tile servers which used the same specification as OpenStreetMap can be used.

Geolocation is handled by, using their public API. This is rate limited to 1000 requests a day, but Watcher will just store the addresses which need to be resolved and try again later.