Skip to content

Repository files navigation

Gapwise for iOS logo

Gapwise for iOS

The native iOS client for Gapwise.

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.

iOS Swift SwiftUI MIT

Swift · SwiftUI · Apple platform APIs · privacy-first local state


Gapwise · Android · iOS · AI · Data · Docs · Status


What Gapwise for iOS is

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.


Current status

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.


Product direction

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.

App surface

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 .ics files;
  • 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.


Technology

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.

Timetable import

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.


Privacy and security

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.


Development

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 ios

On 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 test

Linux 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.


Gapwise ecosystem

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.


Independent project

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.

License

Original project code and documentation are available under the MIT License.

Built for the spaces between classes — coming natively to iOS.

Open Gapwise →

About

Native iOS client for Gapwise, built with Swift and SwiftUI.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages