Back to experience

Wiring an ed-tech platform into Canvas LMS with Edlink

Full Stack Developer · JAKAPA · Remote · May 2023 - Jun 2025

JAKAPA is a social-emotional learning platform. To live inside teachers' existing workflows, it needed to connect to Canvas LMS so students could sign in once and reach JAKAPA without leaving the tools they already use. I built that integration end to end.

AngularNode.jsEdlink APICanvas LMSPostgreSQLOAuth2
Architecture diagram of the JAKAPA Edlink integration: a student authenticates through Edlink SSO from Canvas, the backend exchanges the code for an Edlink token, fetches the profile, resolves the district to an organization and provisions the account in one transaction, then a login-triggered roster mirror pulls Edlink enrollments and classes and upserts them idempotently into PostgreSQL.
  • Students sign in once from Canvas; no second account or password.
  • Accounts are created automatically on first login.
  • Rosters mirror into PostgreSQL on every login.
  • Idempotent upserts: a re-sync never duplicates a student.

The problem

Before the integration, JAKAPA and Canvas were two separate worlds. Students had to manage a second login, teachers had no automated roster sync, and assigned activities weren't reachable from the LMS they lived in every day.

Keeping rostering and assignment data consistent between the two systems by hand wasn't viable. As usage grew, it needed to be automatic and reliable.

What I built

  1. 1

    One login, no second password

    I built a full-stack Edlink API integration linking JAKAPA's Angular platform to Canvas, so a student signs in once through Edlink and lands in JAKAPA straight from Canvas with no second account or password.

  2. 2

    Automated enrollment

    The integration automatically enrolls students based on Canvas rostering, removing the manual setup teachers previously had to do for every class.

  3. 3

    Mirror rosters into Postgres

    On each Edlink login I pull the user's enrollments and classes and mirror them into PostgreSQL as groups and memberships, with idempotent upserts (ON CONFLICT DO NOTHING) so a re-sync never duplicates a student, and teachers are promoted to leaders automatically.