This repository contains a portable learning context proof of concept built on AWS serverless services. It demonstrates how learning credentials and related activity signals can be ingested, normalized, and turned into learner-facing context and verifiable presentations.
It supports payloads aligned to:
- Caliper
- Open Badges 3
- CLR2
This codebase was created during a Gates Foundation-hosted hackathon and is shared as a proof of concept. It is intended to accelerate learning and experimentation, not to serve as production-ready reference implementation.
Expect gaps in hardening areas such as:
- security and threat modeling completeness
- scalability and performance tuning
- operational maturity and support guarantees
- conformance/compliance depth across all edge cases
- Developers who want to quickly run a working end-to-end demo and explore portable learning context patterns.
- Executive and program leaders who want to understand what is possible with standards-aligned context exchange without deep technical setup.
- Slides: 1EdTech: Portable Learning Context
- Video demo: Portable Learning Context for AI
npm ci
npm run build
npm run dev:learner-uxThen:
- Configure
apps/learner-ux/.envfromapps/learner-ux/.env.example. - Point
VITE_API_BASEto your deployed API endpoint. - Use OAuth client credentials values (
VITE_API_OAUTH_*) for easiest demo authentication.
services/*: Lambda handlers and shared backend logicpackages/veramo-wrapper: adapter boundary for presentation creation/verificationapps/learner-ux: React learner + verifier demo frontenddocs/*: local demo and deployment/operations guides
- API routes:
POST /ingest/caliperPOST /ingest/openbadges3POST /ingest/clr2GET /submissions/{submissionId}GET /learners/{learnerId}/contextPOST /presentation/createPOST /presentation/verify
- Backend flow:
- ingest handler (accept + queue)
- persist handler (validate + normalize + persist)
- status handler (submission status lookup)
- learner context handler (context shaping + presentation create/verify)
- Platform components:
- DynamoDB (
TrustedLearningContextCredentialTable,TrustedLearningContextEventTable,TrustedLearningContextSubmissionTable) - S3 raw payload bucket (for oversized payloads)
- SQS ingest queue + DLQ
- CloudWatch alarms + dashboard
- DynamoDB (
npm run lint
npm run typecheck
npm test
npm run build
npm run build:learner-ux
npm run cdk:synth# Dev
npx cdk deploy TrustedLearningContextServiceStack-dev --context stage=dev --require-approval never
# Prod (still prototype posture unless you harden it)
npx cdk deploy TrustedLearningContextServiceStack-prod --context stage=prod --require-approval neverAPI routes use a Cognito-backed JWT authorizer. The stack provisions:
- a Cognito user pool
- a Cognito domain (OAuth token endpoint)
- one or more app clients (OAuth2 client credentials flow)
Default app clients:
tlcs-ingest-app-<stage>tlcs-status-app-<stage>
Override app client names via CDK context:
npx cdk deploy TrustedLearningContextServiceStack-dev \
--context stage=dev \
--context apiClientNames=partner-a,partner-b \
--require-approval neverAfter deployment, use stack outputs:
CognitoIssuerUrlCognitoTokenEndpointCognitoAppClientId*
Use the token in Authorization: Bearer <token>. For local demos, set VITE_API_OAUTH_* and the learner UX can mint/refresh tokens automatically.
- Caliper payload generator/scenarios:
docs/caliper-local-generator.md - End-to-end walkthrough:
docs/demo-cheatsheet.md - Bootstrap/operations guidance:
docs/bootstrap-and-operations.md
GitHub Actions workflows:
.github/workflows/ci.yml.github/workflows/deploy-dev.yml.github/workflows/deploy-prod.yml
Deployment uses OIDC role assumption (no long-lived AWS keys).
Copyright (c) 1EdTech Consortium.
This proof-of-concept code is made available for non-commercial use.
If you want to use this work in a commercial product or service, please contact 1EdTech to discuss licensing and permission.