2026 · INTERNAL TOOLS | IDENTITY
ID Card Management Tool
Replaced a manual Power Automate + Excel-script pipeline for producing staff and student ID cards with a directory search, native photo resize, and direct filing into the card-production queue.
Built at Immaculata-La Salle High School

Tech Stack
Overview
Producing an ID card meant finding the person in a spreadsheet, resizing their photo by hand with an Excel macro, and filing the record for the card printer, one extra manual hop for every single card. I replaced it with a search-driven form: look someone up (or enter them manually if they're not in any roster yet), upload a photo, and the app resizes it natively and files the record directly into the shared production queue. The directory search itself went through a few iterations. It started against live Microsoft Graph, then moved to synced roster data for speed, with a live-directory fallback for anyone not yet in a synced list.
Impact
Who it serves: Front-office staff producing ID cards for students and staff
Before
Producing a card meant finding the person in a spreadsheet, resizing their photo by hand with an Excel macro, and filing the record for the card printer, one extra manual hop for every single card.
After
A search-driven form looks someone up, resizes their photo natively, and files the record straight into the shared production queue. No macro, no manual filing step.
Est. Annual Cost Saved
$230/yr
Estimate, not an audited figure. Methodology and sources are disclosed above for each comparable product.
What I Built
- Directory search across synced roster sources with a live-directory fallback, or manual entry for anyone not listed
- Photo upload with native server-side resize, no more Excel macro step
- Extended a live, shared production-queue list with new fields (manual-entry flag, role/group, photo URL) without disrupting existing records
- Mobile-hardened form inputs for a front-office iPhone workflow
- A scheduled sync job that refreshes the roster sources nightly and archives the raw export files
Screenshots

What I Learned
A legacy SharePoint list column can silently reject every write from the Graph API regardless of payload shape. Confirmed by direct testing, then worked around by adding a parallel column instead of fighting the old one.
The photo output needed a non-uniform stretch rather than a center-crop, since losing part of the photo was worse than mild distortion for this printer's actual card template: an explicit product call, not the 'obviously correct' resize approach.
Merging three separate roster export sources into one directory search, with a live-directory fallback, covers people the syncs miss without making every search pay for a live API call.