Responsive React/Hono app for a college student's UTA commute and time management.
- Home and campus geocoding with explicit address confirmation in the UI.
- Walk routing with a configurable typical walk time; default is 20 minutes rather than a guessed 5-minute walk.
- UTA GTFS + GTFS-Realtime vehicle and trip-update data.
- Route discovery keeps the preferred route (455 by default) in the candidate set instead of filtering it out. For the currently tested West Bountiful → Weber State addresses, GTFS identifies 455 as a leg of a transfer rather than a one-seat direct trip.
- Selected routes show the complete journey: home walk → bus leg(s) → transfer walk → bus leg → campus walk.
- Live map with route shapes, stops, user position, and matching live vehicles. Map viewport is preserved when live data refreshes.
- Class schedule editor used to calculate today's departure.
- Browser reminders for “get ready” and “leave” times when notifications are enabled.
- Canvas LMS integration using an institution URL and personal API token. Tokens are encrypted at rest and never returned to the browser; active courses and upcoming assignments can be synced.
- Dark/light UI with explicit foreground/background colors to avoid unreadable contrast.
Anki, calendar, reminders, email, eWeber, AI, and additional study/time-management services should be added as independent integrations rather than coupled to the commute logic.
Canvas tokens are encrypted with CANVAS_ENCRYPTION_KEY, stored per user in the val-scoped SQLite database, and omitted from API responses.
- Canvas LMS: encrypted API-token storage, active courses, assignments, and Canvas calendar events.
- Calendar: authenticated
.icsexport combining the entered class schedule with Canvas calendar events and assignment due dates. - Anki: browser-side AnkiConnect connection to a local Anki instance; no Anki credentials are stored.
- Email: test delivery through Val Town's
std/email, using the signed-in account email when available. - Phone push: optional ntfy.sh topic; a Val Town interval checks every 15 minutes and sends the ready/leave reminders while the app is closed.
- AI: optional OpenAI Responses API integration, disabled until
OPENAI_API_KEYis configured. Requests usestore:falsein the app. - eWeber/Banner: official registration-history entry point is exposed, while the local schedule editor remains the fallback because the student portal requires an authenticated Weber session.
Canvas OAuth is possible in Canvas installations that permit third-party developer keys, but the current implementation deliberately uses a personal access token so it does not require storing a Canvas client secret. Canvas's current API supports OAuth2 and calendar-event access.
For AI, add the server-side API key through Val Town environment variables rather than putting it in browser code.