✨ v5.0.1 is out.  Three Setup-flow fixes from real-world use of v5.0: Step 5 “Operations” now scrolls so Factory Default and the bottom rows stay reachable at 125% / 150% Windows scaling. Step 2 “Interface” now refreshes the adapter list every time you land on it instead of caching the snapshot from app launch — an IP gained while the app was minimized actually shows up now. NEW: when the interface you picked can’t reach the brand’s factory IP, Step 2 now offers a one-click button to add a temporary same-subnet alias (like 192.168.0.89) right there. Cleanup is automatic. Get the installer · or the bare exe
Convergint techs: the Axis/Bosch/Hanwha password list is not posted here. Find me on Convergint Teams (Brian Preston) and I'll send it over. Keeps the list out of search indexes and away from scrapers.
Version 5.0.1 · Windows 10/11

A “Work-In-Progress” Field Toolkit for IP Camera Techs

Discover, program, test, and document Axis, Bosch, and Hanwha cameras from one Windows app. Built by an installation manager, for field techs.

Axis VAPIX Bosch RCP+ Hanwha / Wisenet LLDP Discovery Batch Operations Open Source
✨ New in v4.4.x:  Real installer alongside the bare exe — Start Menu, optional Desktop shortcut (opt-in), Add/Remove Programs uninstaller. One-click in-app update: when a newer version ships, the toolkit downloads the installer and runs it for you; if the timing is tight, Inno’s Restart Manager prompts you to close the running app and continues. App auto-relaunches when install finishes.
Features

Everything on one install

No more juggling five tools per job. Discover, authenticate, program, verify — all in one window.

🔍

Network discovery

ARP sweep plus LLDP switch port lookup so you know exactly which port each camera is plugged into.

🔑

Password manager

Built-in list of known passwords. Try them all at once, find the one that works, remember successful creds per camera.

🛠

Step-by-step wizard

Guided programming flow with live checklist, firmware capture, and automatic verification after each step.

👥

Additional users

Add service accounts in bulk during initial programming. Applied before network change to avoid re-auth hops.

📠

Cross-subnet programming

Reach cameras on DHCP default IPs even when your laptop is on the target subnet. Works without NIC juggling.

📥

Firmware capture

Pulls firmware version, model, serial, and MAC off every camera. Exported to CSV/XLSX for the as-built binder.

📈

Ping + verify loop

Every programming step is followed by a real ping and auth check. No more "did it take?" uncertainty.

🔀

Image grabber

Pull a snapshot from each camera to prove it's online, aimed, and unblocked — bundled into the job report.

📈

CSV / Excel export

Programmed-cameras log, found-passwords report, and ping results all export cleanly for handoff docs.

🖥

DPI-aware UI

Crisp on 4K laptops, readable on 1080p field tablets, clamps dialogs to the active monitor on multi-display rigs.

📝

Remembers preferences

Per-job settings file. Pick your default interface, credential list, and export paths once — reused next time.

🔗

VAPIX + fallback

Primary API plus param.cgi fallback for older Axis firmware that doesn't accept modern VAPIX.

Supported

Three major brands, one workflow

Detected automatically by MAC OUI + HTTP fingerprint. You can force a brand manually if auto-detect guesses wrong.

Axis
VAPIX · param.cgi fallback
Bosch
RCP+ · Service account
Hanwha / Wisenet
SUNAPI
Screenshots

See it in the field

Main window, wizard flow, and export preview.

Main window
Main window · network scan
Programming wizard
Programming wizard · step checklist
Export preview
Exports · CSV + XLSX + snapshot JPEGs
Transparency

Open source · no tricks

This tool touches cameras — devices built for watching. That earns extra scrutiny, and it should. So the entire source is published on GitHub. Read it, audit it, compile it yourself, modify it. If you don't trust the binary, don't run the binary — run the code.

What the app doesn't do:

  • No telemetry. No analytics. No phone-home.
  • No camera stream capture, recording, or upload. It views live preview frames locally, and only at your request.
  • No credentials are transmitted anywhere except to the camera you're programming.
  • No auto-updates that pull remote code. Updates are manual — you download the new .exe or rebuild from source.

What it does need network access for:

  • Talking to cameras on your LAN (VAPIX, RCP+, SUNAPI, ICMP ping, ARP).
  • LLDP/CDP queries to your switches (for port discovery).
  • That's it.

Real person, real day-job: Brian Preston, Installation Manager — Data Centers, Convergint. Convergint employees can find me on internal Teams for employment proof.

Code signing: Release builds of CCTVIPToolkit.exe are signed via the SignPath Foundation — a free code-signing program for open-source projects. Signing happens in CI on every tagged release; signature is verifiable with signtool verify /pa CCTVIPToolkit.exe.

Get notified of new versions:
From source

Build it yourself in 60 seconds

Windows, Python 3.10+, PyInstaller. build.bat does the rest.

Quick build

1. Install Python 3.10 or newer (python.org)
2. Download and extract cctv-ip-toolkit-source.zip
3. In the extracted folder, double-click build.bat
   (It installs dependencies, bundles the app, and drops CCTVIPToolkit.exe in dist/.)
4. Run the exe. No installer — it's portable.

Manual build

pip install requests pillow openpyxl pyinstaller
pyinstaller --onefile --icon=app.ico --name=CCTVIPToolkit axis_toolkit_v3.py
What's new

Recent releases

2026-05-12
v5.0.1 — Three Setup-flow tweaks from real-world v5.0 use. (1) Step 5 “Operations” now scrolls. At 1920×1080 with 125% / 150% Windows scaling the four ops groups ran past the bottom of the visible window and Factory Default disappeared with no scrollbar — the canvas+scrollbar wrapping keeps everything reachable at any DPI, with MouseWheel scroll when the cursor is over the list. (2) Step 2 “Interface” now re-enumerates the network adapters every time you land on the step. Before, the dropdown was captured once at app launch and only refreshed by close+reopen — so if you minimized, picked up a new IP (VPN, DHCP renew, a fresh NIC), and came back, the toolkit didn’t see it. Now it always reflects what your PC has right now, and there’s a manual ↻ Refresh button next to the dropdown. (3) NEW reachability check on Step 2: when the interface you picked can’t reach the brand’s factory IP (typical case: laptop on 10.0.0.x trying to program an Axis camera at 192.168.0.90), the toolkit now tells you up-front and offers a one-click button to add a temporary same-subnet alias (like 192.168.0.89) to that NIC. No more discovering the gap during the wizard and backing out. Cleanup runs automatically — same machinery as the existing Auto Multi-Home so it survives a crash.
2026-05-11
v5.0.0 — MAJOR UX REWRITE: tabs are gone, replaced by a linear numbered Setup flow. The toolkit now opens to a six-step Setup wizard that walks you through Brand → Interface → DHCP → Camera List → Operations → Status — one decision per screen, the way a real job actually unfolds. No more wandering between Discovered / Passwords / Operations tabs wondering which one comes first. The old session bar (Interface + DHCP at the top of the main window) and the brand selector are now Setup steps inline where they belong. “Passwords” renamed “Users & Passwords” to reflect that the tab manages both the system-user accounts created during programming AND the saved password list used for authentication attempts. Power-user / one-off screens (Camera List editor, Discovered, Users & Passwords, Operations, Programming Status, Log & Results) are still there — reach them via the new Tools ▾ menu in the top-right of the header bar. A Home button in the same header returns you to Setup any time. Everything from v4.6 carries forward: FW-aware set_network path (90s → 5s on FW 10.x), bundled DHCP MAC filter, wizard re-entry guard, ONVIF CreateUsers/DeleteUsers fixes, instant camera-found via bundled DHCP lease state, MAC editor in the camera list.
2026-05-10
v4.5.3 — Bundled DHCP MAC filter, multi-home interface gates, fast Cancel. The bundled DHCP server now ACKs leases only to camera-vendor MACs (active brand’s OUI) plus a user-editable whitelist — managed PoE switches with web-management interfaces (the kind that DHCP-solicit on power-up) can no longer steal the single lease IP from your camera. New section in Configure DHCP… for the toggle and whitelist. Wait-loop also verifies the lease holder’s OUI before declaring “Camera found” so a non-camera that did sneak past can’t fool the wizard into trying to factory-reset it. Auto multi-home now refuses to start a run when enabled without a specific INTERFACE picked in the top bar — modal at toggle-time AND at run-start, instead of silently “skipping multi-home” and letting the post-program verify time out. Cancel honors in-flight protocol calls within ~100ms via cancel-aware sleeps and per-attempt cancel checks in set_network’s retry loop — previously a click could wait up to 53 seconds for the 15s ReadTimeout × 3 attempts to play out. Bundled DHCP no longer fails with cryptic WinError 10049 when the dropdown’s stored IP is stale — re-resolves current IPv4 by InterfaceIndex at server-start time, with a friendly translation when the NIC has no IPv4. EXPORT_DIR honors Windows User Shell Folders redirection (Nextcloud / OneDrive / Dropbox-mapped Documents) and auto-migrates existing CSVs / wizard logs / screenshots from the legacy default profile path on first launch. Beta builds get an unmissable v4.5.3bN.<sha> ⚠ BETA in the title bar. Icon loader switched to iconphoto via PIL so PNG-encoded ICO entries actually load (Tk’s plain iconbitmap was silently falling back to the default feather). Multi-home cleanup now fires immediately on Cancel instead of only on successful runs. Cooked over a marathon real-world install session 2026-05-10 against P3265-LV + P3268-LV with a stray managed PoE switch on the programming segment.
2026-05-06
v4.5.2 — Opt-in beta update channel. New radio button in Settings → Update Channel: pick Stable releases only (default) or Beta + stable to also receive beta builds for early access to fixes being tested in the field. Beta builds are labeled clearly in the update prompt with the version + a “not a stable release” note so you always know what you’re about to install. Switch back to Stable any time and the toolkit goes back to tagged releases only.
2026-05-06
v4.5.1 — Reliability release for the v4.5 reuse-camera workflow. Smarter detection of which cameras really need a factory reset and which are already clean. If you re-use a camera that already has a password and you give the wizard that password, it just changes the password to the new one — no factory reset needed. If the toolkit ever gets stuck logging in mid-program, it now tries one auto-rescue: factory-reset with the password you provided, wait for the camera to come back, and pick up where it left off. Stuck cameras that won’t accept the existing password no longer trigger a 30-times-in-a-row retry storm; the wizard pauses, prints clear paperclip-reset instructions, and waits quietly for 30 seconds. Programming screen reads from across the room: bigger banner, bigger camera name, bigger plug-in/programming/done callout. The big ✓ DONE banner now stays on screen until you physically unplug the just-programmed camera; as soon as it disappears from the network, the screen flips to PLUG IN for the next one. New “Already factory-reset” button on the password prompt for older cameras that don’t auto-detect. Cameras that take a moment to finish setting up before the toolkit assigns them an IP are now handled with retries instead of failing. ONVIF cleanup at the end of programming retries on transient failures. Cooked over the 2026-05-04/05/06 KBO/KBW field session.
2026-05-05
v4.5.0 — Smart pre-flight: plug in, click Program, camera IS here, defaulting to HERE. The wizard now hunts down previously-configured cameras autonomously and brings them back to programmable state. Stage 1 (smart): mDNS at link-local → no-auth basicdeviceinfo probe → walk saved passwords (per-MAC cache means subsequent factory-resets on the same camera authenticate in one HTTP roundtrip) → ask the camera its real configured IP via param.cgi Network → auto-alias just that /24 on the selected NIC. One alias, one camera, exact subnet. Stage 2 (fallback): blind /24 sweep across six common deployment subnets (10.0.0, 10.0.1, 192.168.0, 192.168.1, 192.168.50, 172.16.0) for cameras smart-pass missed. Per-camera factory-reset prompt with inline “Provide camera password” fallback if the saved walk fails. Plus: Tools → Find Camera Anywhere… (manual one-off discovery), wait-loop heartbeat every 15s, set_network diagnostic logging on every leg, wizard auto-saves chosen password to Passwords list, atexit cleanup so closing the app tears down temp NIC aliases. Cooked over a long real-world reuse session against a P3265-LV with a hardcoded 10.0.0.26 from a prior site, on a programming NIC with no 10.0.0.x address. Beta1 → beta10 iteration log lives in the cctv-ip-toolkit Gitea repo.
2026-05-04
v4.4.7 — Auto-route to discovered cameras on unknown subnets. When mDNS surfaces a camera at a previously-configured static IP that’s not on any of the host’s NICs (e.g. camera advertises 10.0.0.26 but your programming NIC is on 192.168.0.0/24), the wizard now offers per-camera — with explicit consent — to add a temporary same-subnet alias to the selected interface so it can actually reach the camera to factory-default and reprogram it. Closes the silent “discovered but unreachable” gap that previously made the wizard skip such cameras during the “Waiting for camera…” loop. Aliases register in the same multihome_state.json as the existing Auto Multi-Home flow; cleanup runs at wizard end and is crash-resilient on next launch. Requires admin (same as Auto Multi-Home).
2026-05-04
v4.4.6 — Auto-relaunch dropped (again). v4.4.5’s 3-second-delay launcher still hit the PyInstaller DLL-load race during the in-app update download → install → relaunch flow on slower disks / AV-active systems. v4.4.6 reverts to v4.4.4 behavior: installer ends with the standard “Setup complete” page, open the toolkit from your Start Menu / Desktop shortcut after install. RestartApplications=no so the in-app update flow also stops trying to auto-relaunch the closed instance.
2026-05-04
v4.4.5 — Auto-relaunch returns. v4.4.4 dropped the post-install “Launch CCTVIPToolkit” checkbox to dodge a PyInstaller DLL-load race. v4.4.5 brings it back, this time routed through cmd /c "timeout /t 3 && start "" <exe>" so the new process starts 3 seconds after Inno’s file replacement settles — well past any AV / OS file-lock release window. The in-app updater UI now ends with the new version auto-launching, no Start Menu click needed.
2026-05-04
v4.4.4 — Three fixes: (1) Taskbar icon was reverting to the generic Tk feather on CI builds — the .spec was bundling logo.ico (file icon) but not app.ico (the runtime taskbar icon the code loads at startup); both are now bundled. (2) Add User row at the bottom of the Passwords tab was clipped on default window heights because v4.4.3’s Import-from-file section ate too much vertical space; compacted to a single button. (3) In-app updater auto-relaunch occasionally died with “Failed to load Python DLL” (PyInstaller bootloader race when Inno fired the new process before the OS released file locks on the freshly-extracted temp dir); auto-relaunch dropped — installer ends with the standard Setup Complete page and you launch the new version once from your Start Menu / Desktop shortcut.
2026-05-04
v4.4.3 — Passwords: import from file. New 📂 Import from file… button in the Passwords tab. Accepts .txt, .csv, .tsv, .md, .list. Markdown files have passwords extracted from inside fenced code blocks (headers, prose, and policy sections are ignored). CSV/TSV takes the first non-empty column per row. Plain text is one password per line. Blank lines and # comments skipped, dedupes against the existing list, popup reports "Imported N new (X already in your list)". Convergint techs can now drag-and-drop the password list .md instead of copy-paste-trim.
2026-05-04
v4.4.2 — First CI-canonical release. Same app code as v4.4.1; release artifacts now built and published by GitHub Actions on every tag push (windows-latest runner: PyInstaller + Inno Setup + source zip, ~2 min). Beta builds via push to beta/** branches publish as prereleases automatically. Local build.bat is now a contributor-build-from-source fallback only. SignPath Foundation integration block ready to enable in the workflow once the OSS code-signing application is approved.
2026-05-03
v4.4.1 — Installer post-install launch fix. v4.4.0 installer’s “Launch CCTVIPToolkit” option failed with CreateProcess code 740 (“requires elevation”) because the toolkit’s manifest requires admin (for bundled DHCP and static-IP setting) but Inno’s [Run] entry was launching in user context. Added shellexec flag so ShellExecute is used — UAC prompt + app launches normally. The in-app updater flow benefits too: post-install relaunch goes through ShellExecute.
2026-05-03
v4.4.0 — Installer + in-app updater. Inno Setup installer ships alongside the bare exe (Start Menu, optional Desktop shortcut, uninstaller in Add/Remove Programs, per-user or admin install). Update Available dialog now offers “Install vX.Y.Z now” as the primary action: downloads the installer to %TEMP% with inline progress, launches it detached, exits cleanly. Inno’s Restart Manager catches the race window and shows “Close apps to continue” if needed; app auto-relaunches post-install. Stable AppId GUID across all installer versions so future installers always upgrade in place. build.bat auto-installs Inno Setup via winget if missing.
2026-05-03
v4.3.0 — Major release. Session-level Interface picker + bundled DHCP server at the top of the main window (declared once, applies to every wizard). DHCP server hands a fixed lease IP for the post-factory-reset rendezvous, with pre-flight DHCPDISCOVER probe and typed-confirmation gate so it cannot accidentally fight an existing DHCP. Two-phase factory_reset wait that confirms the camera went offline before declaring done. HTTP-confirmed factory IP discovery (no more boot-blip ghosts). FW 10.x compat: pwdgrp.cgi retries with HTTP Digest on 401. Right-click context menu on Camera List. Wizard Enter/Alt+arrow keyboard nav. Multi-monitor dialog placement fixed across every popup. Taskbar feather icon replaced with the real app icon. Hostname-set defaults OFF.
2026-04-27
v4.2.6 — Update dialog now pulls the new EXE directly from fieldtoolkit.com instead of bouncing you to the GitHub release page. Source file renamed to cctv_toolkit.py to reflect the multi-brand reality. Zero camera-side changes.
2026-04-25
v4.2.4 — Heavy comment pass on the vendor protocol code (Axis, Bosch, Hanwha) so the public source carries the field-tech context and vendor-quirk notes that explain the why. No functional changes.
2026-04-22
v4.2 — Built-in update checker (Help menu + silent startup check). First-launch What's New popup. Download prompts link to the latest GitHub release.
2026-04-22
v4.1 — Split user data: config in %APPDATA%, exports in Documents (user-configurable). Upgrades never touch your password list. Triplett integration temporarily hidden.
2026-04-16
Add LLDP switch port discovery (Tools menu).
2026-04-11
Add step-by-step programming wizard with live checklist + firmware capture.
2026-03-26
Fix dialogs snapping to monitor 1 on multi-monitor setups.
2026-03-25
Add additional-users feature; VAPIX param.cgi fallback; cross-subnet programming; MAC recording; interface selector.
2026-03-19
v4.0 — Add Hanwha / Wisenet support, force-brand selector.
Feedback

Found a bug? Want a feature?

No ticket system, no account required. You fill out a short form, it emails me. If you leave your email address I'll write back.

💬 Report bug or request feature
Get it

Ready to program?

Portable. No installer. Run it off a USB stick.