← All work

02/04 Work case study

vtag

Who owns this VM? Every VM, across VMware and Nutanix.

[Type]
Work case study
[Role]
Design & development
[Year]
2026
[Status]
In use internally
[Stack]
Python · FastAPI · SQLAlchemy · SQLite · pyVmomi · Nutanix v4 API · Entra ID · Vanilla JS
vtag — Who owns this VM? Every VM, across VMware and Nutanix.

A self-hosted ownership and resource-reporting tool that gives every virtual machine in a mixed VMware and Nutanix estate a business owner, automatically wherever it can.

The problem

In a large virtual estate, the hardest question is often the simplest one: whose VM is this? Ownership lived in naming conventions, folder trees, subnets and people’s memories. That made it close to impossible to say what each team was really consuming, let alone plan chargeback.

What I built

vtag reads inventory from VMware vCenter and Nutanix Prism Central using read-only accounts. It keeps ownership in its own database and turns allocation into something you can report on.

  • Rules engine: up to 20 conditions per rule, joined by AND/OR, on name, folder, cluster, IP or subnet, network, Nutanix project or category. Rules have priorities, live previews and conflict detection.
  • Unassigned queue: VMs no rule can place are queued for bulk manual assignment. Manual overrides survive renames and re-syncs.
  • Reporting: allocation by business unit or parent organisation, hypervisor comparisons, OS mix, and CSV exports with spreadsheet-injection protection.
  • Resource trends: daily history of cores, memory and consumed storage, measured since a baseline or over rolling 30/60/90/365-day windows.
  • Access: local accounts plus Microsoft Entra ID single sign-on with group-to-role mapping, HTTPS with in-app CSR generation, and one-click backups.

Under the hood

  • Stack: FastAPI and SQLAlchemy on SQLite in WAL mode, with an in-process collection scheduler and a plain-JavaScript frontend with hand-built SVG charts and no build step.
  • Collection: pages through the vSphere API with pyVmomi and through Nutanix’s v4.1 REST APIs, then normalises both into one model.
  • Deletion safety: a VM is retired only after two complete, successful polls without it, so a bad poll can’t erase ownership.
  • Tests: a synthetic 6,530-VM data set pins the reconciliation and aggregation logic.

Outcome

The team now has an owner for every VM in one place, and the report that used to take days of spreadsheet archaeology is one click. The demo runs the real UI against roughly 1,150 generated VMs. Rules, previews, reports and trends are all computed in your browser.

6,530VMs in the reconciliation test suite
20AND/OR conditions per ownership rule
2Hypervisor platforms, one ownership model
0Writes to vCenter or Prism

Live Try vtag

One-click sign-in · seeded data · resets on reload
vtag.pshl.appOpen full screen ↗

Runs entirely in your browser with generated data. Nothing you do is saved; reload to reset.