AEONTHRA is a local-first Canvas learning workspace. A Chrome extension captures course material, a static React app turns it into deterministic study systems, and everything stays in the browser without a backend or runtime AI calls.
Repo docs still use the OMEGA FORGE codenames:
SENTINELfor the extensionATLASfor the web appFOUNDRYfor the shared contracts
The shipped product and UI name in this repo is AEONTHRA.
- Captures supported Canvas course content through a Manifest V3 extension as a single
Complete Snapshotflow. - Supports bounded visited-page sessions keyed by Canvas origin and course id, then saves them as normal local capture history on demand.
- Hands validated extension captures directly into the app through a typed local bridge contract.
- Builds deterministic concepts, relations, provenance-backed study artifacts, and a real Atlas skill tree without runtime AI calls.
- Persists the active source workspace locally, scopes notes and progress by synthesis hash, and restores offline replay bundles with deterministic validation.
apps/web- static AEONTHRA classroomapps/extension- MV3 Chrome extension for Canvas capture and bridge handoffpackages/content-engine-v2- canonical production implementation of@learning/content-enginepackages/interactions-engine- deterministic ambient and interaction systemspackages/schema- shared schemas and bridge contracts.agents/skills- repo-local specialist workflows for this codebase
npm ci
npm run typecheck
npm test
npm run buildUse Node 24.x and npm 11.x.
npm run dev:webThe local classroom is commonly available at:
http://127.0.0.1:5176/
npm run build:extensionLoad the unpacked extension from apps/extension/dist.
Canonical source of truth:
apps/extension/src/**for extension codeapps/web/src/**for the classroompackages/**/src/**for shared deterministic logicpackages/content-engine-v2/src/**for the canonical study-compiler engine behind@learning/content-engineapps/extension/dist/as the generated unpacked-extension output
The extension and app communicate through a local-only bridge around:
NF_IMPORT_REQUESTNF_PACK_READYNF_PACK_ACKNF_IMPORT_RESULT
Queued handoffs live in chrome.storage.local["aeonthra:pending-handoffs"]:
- newest-first
- max length
5 - deduped by
packId - TTL
24h - cleared only on exact
handoffId + packIdacknowledgement - legacy
aeonthra:pending-bundlemigrates on read
Both the extension and app reuse inspectCanvasCourseKnowledgePack() before queueing, relaying, or importing. A valid bridge pack must be:
source === "extension-capture"- non-empty
- not textbook-only
- backed by
captureMeta.courseId - backed by
captureMeta.sourceHost - tied to one Canvas host and one Canvas course identity
Exact rejection codes:
invalid-bundlewrong-sourceempty-bundletextbook-onlymissing-course-idmissing-source-hostmissing-course-urlambiguous-course-identityhost-mismatchcourse-identity-mismatch
Direct bridge handoff is only supported when AEONTHRA runs on:
https://*.github.io/*http://localhost/*http://127.0.0.1/*
learning-freedom:source-workspaceis the canonical stored source pointer for Canvas and textbook inputs.learning-freedom:notes:<deterministicHash>andlearning-freedom:progress:<deterministicHash>hold scoped learner state.learning-freedom:notes:active-scopetracks the currently active note scope.- Legacy merged-bundle and unscoped-progress keys are migration-only compatibility paths.
Reset clears the active workspace and the active scoped learner state. It does not promise to erase every historical scoped record in the browser.
AEONTHRA now includes:
- field-level support metadata for
definition,summary,primer,mnemonic,commonConfusion, andtransferHook - optional evidence on relations
- distinctness blanking when concept-facing fields collapse into each other
- fail-closed practice in real workspaces unless transfer or assignment evidence is source-backed
- deterministic Atlas skill nodes for foundational, applied, distinction, transfer, assignment-readiness, chapter-reward, and mastery states
When evidence is weak, the app prefers omission over generic repetition.
Current verified command loop:
npm run typecheck
npm test
npm run buildAdditional verified targeted coverage exists for:
- bridge queue migration, expiry, exact ack clearing, and malformed queue rejection
- bridge request and pack message handling
- field support and relation evidence
- shell practice fail-closed behavior
- Atlas prerequisite, reward, recovery, and inspector behavior
- Vite canonical path allow-listing
- A real browser-mediated
capture -> open AEONTHRA -> import -> NF_PACK_ACK cleanupproof is still a manual path. The checked-in proof is unit, integration, typecheck, and build coverage. - Same-course preservation remains intentionally lenient for older hostless captures so legacy local workspaces can still match newer host-aware captures.
apps/web/src/AeonthraShell.tsxis still large and marked// @ts-nocheck; Atlas extraction landed, but the shell is not fully decomposed yet.- Two legacy
output/*.logfiles still remain because direct shell deletion was blocked in this desktop environment andapply_patchcould not delete their non-UTF8 contents.
npm run dev:webnpm run test:webnpm run test:extensionnpm run build:webnpm run build:extensionnpm run buildnpm run testnpm run typecheck
AEONTHRA is a working local-first learning product, not a mockup. The current repo state includes:
- a correlated extension handoff queue with exact ack clearing
- a shared Canvas importability classifier across worker and app
- provenance-backed semantic fields and relation evidence
- fail-closed shell practice rules
- a typed Atlas skill tree with inspect-first journey UX
- repeated typecheck, test, and build verification