VaxLink is a Chrome extension that parses GS1 vaccine barcodes and auto-fills
them into Ontario immunization EMRs (Panorama, InputHealth), with an
inventory management workflow for lot/expiry tracking. The repo also has a
small Next.js marketing site and a MkDocs documentation site, but the
extension (apps/extension) is the main deliverable.
- 📚 Documentation: https://wdgph.github.io/VaxLink/
- 🧩 Extension:
apps/extension
apps/extension- Chrome extension (Manifest V3) — the main projectapps/extension-tests- extension test suite (kept out of the Web Store zip)apps/web-next- Next.js marketing site (Pages deploy currently superseded by the docs site, see below)scripts- shell utilities (e.g.fetch-nvc.sh,package-extension.sh)skills- Claude Code skill definitions for common extension workflowsdocs- source for the MkDocs documentation site
- Parses GS1 AIs from scanned strings (
01,10,17,21) - Looks up vaccine metadata from the NVC bundle
- Auto-fills CHR fields (trade name, manufacturer, route, dose, strength, DIN/drug code, lot, expiry) into Panorama and InputHealth
- Shows expiry state (
Expired,Expiring soon,Valid) - Detects hardware barcode scanners (keystroke-timing heuristics), plus a dedicated Web Serial scanner channel for capture while the workstation is locked
- Supports single-fill, multiple-inject queue, and full inventory (receive, FEFO board, reconciliation, lot quarantine) workflows, with CSV/JSON export
- Open
chrome://extensions - Enable Developer mode
- Click Load unpacked
- Select
apps/extension
- Default source:
https://nvc-cnv.canada.ca/fhir/v2/Bundle/NVC - Auto-check every 24h (alarms)
- Manual refresh from popup
- Keeps last-known-good bundle if refresh fails
- Popup and hands-free inventory capture write to the
chrome.storage.localqueue keyinventory_scan_batch_v1 - The full inventory operations page (
inventory-manager.html) persists normalized items, transactions, and reconciliation snapshots in IndexedDB - Detailed extension notes live in
apps/extension/README.md
cd apps/extension-tests
npm testThis covers GS1 barcode parsing, Panorama/InputHealth autofill flows, multiple-inject queue ordering and dedup, and inventory export contracts.
./scripts/package-extension.sh alpha|prod packages the extension for the
Chrome Web Store, stamping the channel name at build time (dev → VaxLink
Alpha, main → VaxLink). See CLAUDE.md for the full build/release
reference.
A small Next.js landing page for VaxLink. .github/workflows/deploy-web-next-pages.yml
builds and deploys it to GitHub Pages on every push to main, but see the
Documentation site section below — it currently loses
the shared Pages slot to the docs site. See content/site.ts for the site
copy.
cd apps/web-next
npm ci
npm run dev- Public access to NVC API does not automatically grant blanket redistribution rights for bundled terminology data. Keep raw bundle files out of public commits unless you have explicit permission.
- If CHR DOM changes, update selectors in
apps/extension/content.js.
See CONTRIBUTING.md. Security issues: see SECURITY.md.
Architecture, the EMR adapter contract, release process, and engineering notes are published as a MkDocs site (Material theme) at https://wdgph.github.io/VaxLink/.
To build it locally:
uv sync --group docs
uv run mkdocs serveOpen http://127.0.0.1:8000.
The docs workflow (.github/workflows/docs.yml) builds the site on every
push to main and publishes it to the gh-pages branch. This is
currently the live Pages source for the repo (confirmed via
gh api repos/WDGPH/VaxLink/pages: build_type: legacy, source.branch: gh-pages) — a GitHub repo can only serve one Pages source at a time, and a
docs.yml run after a deploy-web-next-pages.yml run flips it back to the
branch-based docs deployment. In practice this means apps/web-next's own
Pages workflow succeeds as an Actions run but its output isn't what's
actually served at the Pages URL; the docs site "wins."