A privacy-first Swift + SwiftUI app for Gapwise, currently focused on University of Toronto timetables and campus context, designed around fast local interaction and canonical Gapwise data boundaries.
Swift · SwiftUI · Apple platform APIs · privacy-first local state
Gapwise for iOS is the native iPhone client for Gapwise, a free and open-source multi-university timetable and campus-intelligence platform.
While the Gapwise web platform supports 14 universities across 16 campus models in Canada, including UBC Vancouver, the University of Waterloo, and McGill Downtown, the current native iOS client foundation focuses on the University of Toronto (with UTM timetable events and campus coordinate boundaries), with broader multi-university native client expansion planned.
The goal is a real native iOS application rather than a WebView wrapper: navigation, storage, rendering, accessibility, interactions, and platform integration are designed for iPhone while staying aligned with the wider Gapwise repository ecosystem.
The repository contains a working early native foundation: an iPhone SwiftUI target, local .ics timetable import with review-before-save, local timetable persistence, deterministic timetable/reconciliation logic, date-aware Today and Timetable views, a Gaps surface backed by portable schedule arithmetic, a currently UTM-specific Map integration boundary, Settings, portable domain tests, and GitHub Actions for Linux-portable and macOS/iOS validation.
This remains an early implementation, not a shipped client. Import compatibility is validated against synthetic standards-based fixtures rather than every producer or a live ACORN export. Native UTM map rendering, production routing, account continuity, remote integrations, and broader timetable editing remain future work. The production app starts from local user data rather than seeded demo data.
The native iOS experience follows the same principles as the rest of Gapwise:
- Fast to open and easy to understand. The important parts of the day should be immediately visible.
- Honest native coverage. The current client accepts UTM timetable events while retaining the tri-campus domain model and unresolved-campus state needed for broader support.
- Campus-data honesty. Map and routing features only claim facts supported by canonical Gapwise Data evidence.
- Local-first timetable handling. Import and core schedule use work without unnecessary network transmission.
- Optional account continuity. A Gapwise account should enhance continuity rather than gate core timetable use.
- Deterministic planning. Timetable arithmetic, gaps, route timing, and feasibility should remain explicit and testable.
- Native interaction. Navigation, gestures, sheets, system pickers, accessibility, appearance, and lifecycle behavior should feel natural on iOS.
The current foundation includes:
- Today, derived from the local timetable with current/next-class context and truthful empty states;
- Timetable, with local schedule browsing, import, review, and meeting details;
- Gaps, using deterministic portable schedule arithmetic rather than heuristic suggestions;
- Map, currently an honest UTM-specific integration boundary rather than fabricated tri-campus routing coverage;
- Settings, for implemented local preferences, timetable management, privacy information, and ecosystem links;
- native document picking and import preview for compatible
.icsfiles; - atomic local JSON persistence behind an async repository boundary;
- light/dark appearance, Dynamic Type-friendly layouts, VoiceOver-minded labels, and native navigation.
Planned work includes broader import compatibility, richer timetable editing, canonical UTM map consumption and routing, exports/integrations, and optional account continuity.
Gapwise for iOS uses modern native Apple tooling:
- Swift
- SwiftUI
- Foundation persistence and Apple lifecycle APIs
- platform-secure storage such as Keychain when secret material is eventually required
- a native UTM map layer consuming canonical Gapwise data/contracts rather than inventing a parallel source of truth
- optional Gapwise account integration only after its security boundary is implemented and reviewed
Portable domain models, iCalendar parsing, timetable interpretation, reconciliation, and schedule arithmetic are kept separate from persistence and SwiftUI presentation.
Gapwise accepts user-selected .ics files through the system document picker. Parsing, interpretation, preview, and persistence happen locally. The original calendar file is not retained as an application data source and timetable contents are not uploaded as part of ordinary import.
The parser supports the timetable-oriented iCalendar subset exercised by the repository fixtures, including VCALENDAR, VEVENT, DTSTART, DTEND, SUMMARY, LOCATION, DESCRIPTION, UID, bounded weekly RRULE values, folded lines, escaped text, UTF-8 input, UTC/system timezone identifiers, and floating timestamps.
Course/campus interpretation is deliberately conservative. UTM building evidence can establish UTM identity; conflicting or insufficient evidence remains unknown. UTSG and UTSC remain explicit domain values rather than being recast as UTM, although this early iOS version does not yet accept those meetings into its saved timetable.
Repeated imports reconcile by source identity and event UID so unchanged meetings are not duplicated. Existing local data is not silently discarded simply because a later import omits an event.
Current limitations include unsupported recurrence-exception families and incomplete building recognition. Import is not ACORN login, credential access, scraping, or account/API integration.
The iOS client follows the wider Gapwise security posture:
- minimize collection and transmission of student timetable data;
- keep calendar handling local where practical;
- never embed privileged service credentials in the application;
- distinguish local-only features from optional account/cloud behavior;
- use platform-backed secret storage when secret material is introduced;
- preserve uncertainty instead of inventing location/accessibility certainty;
- keep permissions narrow, understandable, and revocable.
The current timetable store uses local application storage behind an explicit repository boundary. Calendar import is designed to run on-device without requiring networking or telemetry. No account sync or production map/routing capability is claimed by this foundation.
The app targets iPhone on iOS 17 or later and uses an Xcode project with no third-party runtime dependency requirement in the current foundation.
git clone https://github.com/GapwiseHQ/ios.git
cd iosOn macOS, open Gapwise.xcodeproj, select the Gapwise scheme, and build/test on an iPhone simulator or device.
The portable Swift core can also be validated on Linux. The repository CI uses Swift 6.3.3 on Ubuntu Noble for the portable package:
docker run --rm -v "$PWD:/workspace" -w /workspace swift:6.3.3-noble swift package describe
docker run --rm -v "$PWD:/workspace" -w /workspace swift:6.3.3-noble swift testLinux cannot validate SwiftUI, the system document picker, Apple security-scoped URL behavior, signing, simulator lifecycle, or other Apple-only integration. Those remain macOS/Xcode validation responsibilities.
| Repository | Role | Primary surface |
|---|---|---|
gapwise |
Core web/PWA, canonical timetable/gap/routing semantics, public API, OpenAPI, and SDK source | gapwise.ca / api.gapwise.ca |
android |
Native Kotlin + Jetpack Compose Android client | Android app |
ios |
Native Swift + SwiftUI iOS client | iOS app |
ai |
OAuth/MCP layer for explicitly delegated student context and bounded actions | ai.gapwise.ca |
data |
Canonical public multi-university campus data, provenance, schemas, validation, and distribution | data.gapwise.ca |
docs |
Canonical public developer documentation | docs.gapwise.ca |
status |
Independent service-health monitoring and incident communication | status.gapwise.ca |
The repositories are separate implementation and trust boundaries, but they form one product. Native clients should consume canonical Gapwise behavior rather than silently becoming independent timetable, routing, or campus-data engines.
Gapwise is an independent student software project created by Andrew Muratov. It is not affiliated with, endorsed by, or an official service of the University of Toronto.
Original project code and documentation are available under the MIT License.
Built for the spaces between classes — coming natively to iOS.