Ecosystem architecture
Gapwise is one product ecosystem. gapwise contains the single web application for all university editions. Repository boundaries separate deployment, trust, and ownership; they do not create parallel sources of truth.
All canonical repositories are owned by the Gapwise GitHub organization at https://github.com/GapwiseHQ. Andrew Muratov remains the creator and primary maintainer.
Repository ownership
Section titled “Repository ownership”| Repository | Owns |
|---|---|
GapwiseHQ/gapwise |
web/PWA behavior, canonical student-state semantics, deterministic timetable/gap/routing logic, public API v1, OpenAPI, and both official SDK implementations |
GapwiseHQ/android |
native Android UX, device integration, secure mobile persistence, and Android distribution |
GapwiseHQ/ios |
native iOS UX, device integration, secure mobile persistence, and iOS distribution |
GapwiseHQ/ai |
OAuth/MCP delegation, permission checks, minimized delegated snapshots, and bounded AI actions |
GapwiseHQ/data |
campus-data provenance, evidence, schemas, attribution, transformations, and reuse guidance |
GapwiseHQ/cli |
Public campus discovery and queries, plus repeatable university scaffolding and validation (guide) |
GapwiseHQ/docs |
canonical public documentation of released first-party contracts |
GapwiseHQ/status |
independently deployed service health and incident communication |
The canonical web implementation and campus data for all supported universities are consolidated into gapwise and data, respectively. The JavaScript and Python SDKs remain in gapwise/sdk; a separate SDK repository would duplicate stable published source.
University edition flow
Section titled “University edition flow”hostname -> universities.json -> university timetable adapter -> shared meetings | |data/universities/<id>/campus.json -> campus catalog + path graph -> shared UI/routingGapwise resolves hostnames dynamically: gapwise.ca selects U of T, carleton.gapwise.ca selects Carleton, tmu.gapwise.ca selects TMU, queens.gapwise.ca selects Queen’s, laurier.gapwise.ca selects Laurier, york.gapwise.ca selects York, mcmaster.gapwise.ca selects McMaster, western.gapwise.ca selects Western, guelph.gapwise.ca selects Guelph, uottawa.gapwise.ca selects uOttawa, brock.gapwise.ca selects Brock, ubc.gapwise.ca selects UBC Vancouver, and waterloo.gapwise.ca selects the University of Waterloo main campus. See Add a university for the scaffold, data, testing, and deployment workflow.
Source-of-truth flow
Section titled “Source-of-truth flow”campus evidence / canonical data | v gapwise core deterministic product semantics / | \ / | \ student public mobile web API client | +-----+-----+ | | v v TypeScript SDK Python SDK npm + JSR PyPI
private student state | | explicit minimized delegation v ai repository OAuth/MCP
released contracts ---> docs repositoryprovenance/evidence --> data repositorypublic service health -> status repositorySDK distribution model
Section titled “SDK distribution model”Gapwise maintains two SDK implementations, not one SDK per runtime:
- TypeScript:
@gapwise/sdk- npm
0.1.2is published with provenance; - JSR
0.1.2is published with provenance through the core repository’s GitHub Actions OIDC publisher; - Node, Bun, and Deno are runtime/portability targets for this same implementation.
- npm
- Python:
gapwise==0.1.1- published on PyPI through Trusted Publishing;
- synchronous and asynchronous clients expose the same public v1 resources.
TypeScript and Python are equal first-party SDKs. Language-appropriate naming is expected, but capabilities, bounded enum values, uncertainty semantics, errors, and examples should stay aligned with OpenAPI v1.
Cross-repository rules
Section titled “Cross-repository rules”- OpenAPI and the core implementation own public HTTP behavior.
- Mobile consumes canonical semantics instead of reimplementing timetable/routing truth.
- AI receives explicit delegated context and does not become an authoritative timetable engine.
- Data explains where campus facts came from and preserves fact/inference/uncertainty distinctions.
- Docs describe released behavior and link to owning repositories rather than inventing contracts.
- Status reports operational evidence and does not infer package/product truth from uptime.
- Registry, runtime, app-store, and AI-client compatibility claims require external evidence.
- A meaningful contract change should be reviewed for downstream effects in every affected repository.
Canonical public surfaces
Section titled “Canonical public surfaces”- GitHub:
https://github.com/GapwiseHQ - App:
https://gapwise.ca - API:
https://api.gapwise.ca/v1 - OpenAPI:
https://api.gapwise.ca/openapi.json - Docs:
https://docs.gapwise.ca - Data:
https://data.gapwise.ca - AI/MCP:
https://ai.gapwise.ca/api/mcp - Status:
https://status.gapwise.ca
The public API and SDKs expose campus intelligence only. Private student context remains behind separate authentication/delegation boundaries.
Change-impact checklist
Section titled “Change-impact checklist”Before calling an ecosystem change complete, check whether it affects:
- OpenAPI/public API behavior;
- TypeScript SDK code/types/examples and npm/JSR distribution;
- Python SDK code/types/examples and PyPI distribution;
- native mobile semantics or adapters;
- data schemas/provenance/uncertainty;
- AI delegated schemas/permissions/tools;
- public documentation;
- status probes, canonical endpoints, or incident terminology;
- privacy, security, accessibility, attribution, or source-of-truth statements.
Connected does not mean duplicated: every surface should know how it relates to the others while preserving clear ownership.