A browser-based suite of tools for generating Microsoft Entra ID distribution group CSV files from Bromcom student data exports. Built with Rust + Leptos, compiled to WebAssembly, and statically hosted on GitHub Pages.
All processing happens entirely in the browser — no data leaves your machine.
Upload a Bromcom export and an Entra ID export. Matches students by email address and generates one Entra ID import CSV per house/year combination.
Required columns:
- Bromcom:
House(s),Student email,Year Group Name - Entra ID:
mail,id
Upload a Bromcom Student Emails export, a Bromcom Class List export, and an Entra ID export. Filter students by class tags (e.g. MAT, MAF, SCI) and optionally split output by year group.
A tag matches anywhere in StudentClassList, so MAT picks up 10MAT1 and 7MAT3 alike. Keep tags long enough to be unambiguous: a short one matches more than you expect — MA would also pull in every DRAMA class.
Required columns:
- Student Emails:
Admission Number,Student email,Year Group Name - Class List:
AdmissionNo,StudentClassList,StudentYearGroup,StudentFullName - Entra ID:
mail,id
Every upload accepts .csv, .xlsx, .xlsb or .ods, in any slot. The format
is detected from the file's content rather than its name, so a mislabelled file
still works. Pre-2007 .xls workbooks are refused with a prompt to re-save:
the format is long superseded and carries the legacy macro attack surface.
All tools produce CSVs in the Entra ID bulk import format:
version:v1.0
Member object ID or user principal name [memberObjectIdOrUpn] Required
Example: 9832aad8-e4fe-496b-a604-95c6ef01ae75
<entra-id-1>
<entra-id-2>
...
- Rust (stable toolchain)
wasm32-unknown-unknowntarget:rustup target add wasm32-unknown-unknown- Trunk:
cargo install trunk
cd app
trunk serveOpens at http://localhost:8080.
cargo test --workspaceThe common crate (pure Rust) is tested natively; the app crate (Leptos WASM) has no unit tests.
Per-crate detail is in common/README.md and app/README.md.
trunk build --release --public-url /entragen/Output is in dist/.
entragen/
├── common/ # Pure-Rust logic (parsers, processors) — testable natively
│ ├── README.md
│ ├── fixtures/ # Generated .xlsx / .ods test workbooks
│ └── src/
│ ├── csv_parser.rs
│ ├── spreadsheet.rs
│ ├── house_teams.rs
│ ├── class_distribution.rs
│ ├── types.rs
│ └── errors.rs
├── app/ # Leptos WASM frontend
│ ├── README.md
│ ├── src/
│ │ ├── app.rs
│ │ ├── file_io.rs
│ │ ├── types.rs
│ │ ├── components/
│ │ │ └── file_upload.rs
│ │ └── pages/
│ │ ├── home.rs
│ │ ├── house_teams.rs
│ │ └── class_distribution.rs
│ ├── index.html
│ └── styles.css
├── Trunk.toml
├── CHANGELOG.md
├── Cargo.toml
└── .github/workflows/deploy.yml
Pushes to main automatically build and deploy to GitHub Pages via the Actions workflow in .github/workflows/deploy.yml. The live URL is https://<org>.github.io/entragen/.