All case studies

Custom App

·

2025–2026

Employee Tech Documentation — an in-house replacement for spreadsheet IT

A custom Flask + React asset tracker with MSAL/LDAP auth, audit trails, and M365/UniFi integrations. Deleted the IT spreadsheets.

full company

Employees in system

M365 · UniFi · Zoom

Integrations

MSAL + LDAP

Auth surfaces

every mutation

Audit coverage

The IT function ran on a set of shared Excel files — who has what laptop, which phone, which software license, what access. Those spreadsheets were the reason audits took weeks and offboardings were incomplete.

I built a proper asset-tracking / employee-technology system in Flask + React. Authentication via MSAL for M365 users and LDAP for local AD. Every record is audit-logged. Integrations pull asset state directly from M365, UniFi, and Zoom so the database doesn't lie.

Stack

  • Python / Flask backend
  • React + TypeScript (Vite) frontend
  • SQLite with in-app schema-upgrade migrations
  • Session-based auth (MSAL, LDAP)
  • M365 Graph + UniFi + Zoom API connectors

Why custom

There are off-the-shelf IT asset management tools. Most of them are either too expensive for a site our size, too generic to integrate with the systems we actually use, or both. For a one-person IT shop, a lean custom app that knows exactly our integrations is a better investment.

What the system does

  • Tracks employees, their assets (laptops, phones, monitors, peripherals), and the license footprint per user.
  • Reconciles the tracked state against live API data from M365, UniFi, and Zoom — flags drift (license assigned in M365 but no user record; user record but no UniFi access; etc.).
  • Runs the onboarding + offboarding playbooks — it knows what to provision and what to revoke, with checks against each integration that the action completed.
  • Full audit log on every write — who changed what, when, from where.

Lessons

Building your own IT tooling is worth it exactly when the off-the-shelf option would require more customization than the custom build. The integration surfaces were the hard part; the CRUD was trivial. Picking the right data model — the relationships between employee, asset, license, access — took a couple of weeks of iteration and is why the system earns its keep.