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.