Context
Picking a credential is a high-stakes decision made with surprisingly bad information. Program pages tell you what you’ll learn. Job sites tell you what’s hiring today. Government data tells you what the labour market projects. Almost nothing connects the three — and the people who need them connected most are eighteen-year-olds, mid-career changers, and the counsellors trying to help them.
E&EO (“Education & Employment Outlooks”) is a free, bilingual public platform built to answer the question those people actually ask: what does this credential lead to, in the region I’d live in, against the labour market I’d be entering?
The brief
E&EO is a Roga Digital product. The brief I set for it:
- Free at the point of use. No paywall, no sign-up gate to look up a credential. The audience includes people who can’t afford to pay for career advice — that has to be a non-negotiable.
- Bilingual by default. EN-CA and FR-CA as first-class experiences, not English with a translation overlay.
- Real public data, kept current. Job Bank outlooks, the National Occupational Classification (NOC), Statistics Canada wage data, and curated institution/credential records — refreshed against federal release cadence, not scraped once and forgotten.
- Bidirectional search. I have a job in mind, what programs lead there? and I have a program in mind, where does it lead? are the same question from opposite sides — both have to feel native.
- Regional, not national-by-default. A “moderate” outlook in Vancouver and a “moderate” outlook in Prince George are different jobs. The platform is regional from the first interaction.
- Built to scale across provinces without rewriting the data layer for each one.
It descends from earlier work I did on the VIU Career Outlooks tool during my co-op — same instinct, much narrower scope. E&EO is what that idea looks like when it’s built for the country.
How it works
The product is built around a deliberate two-step flow: pick the region, then ask the question. Every screen after the homepage assumes you’ve chosen where you actually want to live and work.
The map view uses real geographic boundaries (TopoJSON via d3-geo), not a stylized illustration, so users recognize the country they’re standing in. A list view and an economic-region view exist for accessibility and for the cases where someone knows their LMI catchment by name.
Once a region is locked, the product asks one of two questions:
Both paths surface the same underlying graph: programs ↔ NOC occupations ↔ regional outlooks ↔ wage bands. The difference is just where the user enters.
Search by program
Type a program name and the result is a list of credentials offered in that region — the institution, the campus, the credential type — paired with what each program actually leads to and how that career looks in the region.
Three numbers per career — entry-level, typical, experienced — because “median wage” alone is a lie of omission. The outlook bar uses the federal Job Bank rating (Limited / Moderate / Good) so users see the same signal the government is publishing, not a re-scored derivative.
Search by career
Coming in from the other side — start with a job — and the platform inverts the same data: which programs in this region lead here, what’s the regional outlook, what’s the wage band, and what’s the NOC code if you want to dig deeper into federal data yourself.
NOC codes aren’t decoration — they’re the citation. A high-school student doesn’t need them, but a counsellor or a journalist does, and surfacing them keeps the platform honest about where its claims come from.
How it’s built
The interesting part of E&EO is not the front end. It’s the data plumbing that lets a search return real answers instead of plausible-sounding ones.
- Front end — SvelteKit (Svelte 5, runes), Tailwind v4, deployed on Vercel. The map is real geo data through d3-geo and TopoJSON, simplified at build time.
- i18n — Paraglide JS, with EN-CA and FR-CA modeled at the message and route layer. There’s a parity check in CI so a missing French string is a build failure, not a runtime fallback.
- Data layer — Postgres (Neon, serverless) with Drizzle ORM. The schema models institutions, programs, credentials, NOC occupations, regions (province + economic region), outlooks, and wages as first-class entities — not denormalized blobs.
- The hard part: CIP–NOC concordance. Programs are classified by CIP (Classification of Instructional Programs); jobs are classified by NOC. The federal concordance between them is one-to-many in both directions and is the actual product. Without it, “this credential leads to these careers” is wishful thinking. E&EO carries a maintained concordance and exposes it as the join that powers both search modes.
- Ingestion — a set of typed import scripts pull the NOC structure, regions, Job Bank outlooks, institution and credential data, and a province-specific scrape pipeline (BC first). Each step is idempotent so a partial run doesn’t poison the index.
- Search — built and optimized offline against the database, served as a typed index so a query doesn’t have to trigger a half-dozen joins on the request path.
- Observability — Sentry for errors and performance, geoip for soft regional defaults so the first page already feels local.
- Quality gates — Vitest for unit and integration, Playwright for E2E, an i18n parity check, and a custom test-pyramid preflight. If French strings drift or the test mix gets top-heavy, CI says so.
The architecture is built for scaling province-by-province. Adding a new province is a new scrape adapter and a new region row, not a rewrite.
Status
- Live, with British Columbia institutions and programs available now.
- Bilingual EN-CA / FR-CA from launch — not retrofitted later.
- Free, with no account required to search.
- National rollout through late 2026, province by province, on the same data model.
What’s next
The roadmap, in priority order:
- Provincial expansion. Each province has its own scrape contract and its own quirks; the data model is ready, the ingestion work is per-province.
- Saved searches and shortlists for accounts. The infrastructure for it is there; the value lands once a user has more than one province’s data to compare across.
- Editorial layer (the Blog / Regional sections in the nav) for the kind of context that data alone can’t carry — what a “Moderate” outlook actually means, how to read NOC codes, what’s changing in a given region.
- Counsellor-facing surfaces for the people who use this professionally rather than personally.
For specifics on the data architecture, the CIP–NOC concordance, the bilingual content layer, or what running a public-facing platform against federal data feeds actually looks like — book a call.