Departures is a personal iPhone app that shows your day as split-flap boards, in StandBy widgets and on a work display. This page explains, in plain language, what the app reads, where each request goes, what stays on your iPhone, and how to disconnect. It covers the app, its widgets, and this website.
Departures is a personal project by one developer (GitHub: samporter14). “I” below means that developer.
The short version
No accounts with me. You never create an account for Departures.
No servers of mine. I run none, so I never receive your calendar, tasks, location or anything else. I can’t see it, sell it or share it.
No analytics, ads or tracking. The app contains no analytics, advertising or tracking code and no third-party software libraries.
Requests go straight from your iPhone to the services you turn on (Google, Todoist, Open-Meteo, a bus agency, ESPN), over HTTPS. They are listed below.
Everything the app keeps is on your iPhone: sign-ins and keys in the Keychain, settings and the latest copy of each board in the app’s shared storage.
Read only. Departures never creates, changes, completes or deletes anything in your calendars or task apps.
You can disconnect any service in the app, and revoke access at Google or Todoist, whenever you like.
What Departures does not do
It has no account system, no sign-up, and no Departures server, database or API.
It has no analytics, crash-reporting, advertising or social SDKs, and it doesn’t use the advertising identifier.
It doesn’t ask for your camera, microphone, contacts, photos or motion sensors.
It doesn’t track your location. It asks iOS for a one-off, approximate position only when weather is due (the Weather widget can do this too when it refreshes).
It doesn’t send push notifications from a server. Its two kinds of notification are scheduled on your iPhone.
What each board reads, and where the request goes
A board only makes requests once you have set it up. Boards you haven’t set up make none. Like any app or website, each service you connect can see your iPhone’s IP address and the time of the request, plus a short User-Agent that names the app and its version. Departures sends no device identifier, and each service’s own privacy policy applies to what it receives.
Clock, My board and the work display
Reads
The iPhone’s clock; the text you type into My board; and, on the work display, whether the iPhone is charging (so it can say when it isn’t).
Goes to
Nowhere. These boards make no requests.
Calendar, from the calendars on your iPhone
Asks iOS for
Full calendar access, which iOS requires in order to read event titles.
Reads
Titles, start and end times, the all-day flag and calendar names of events from the start of today through the next two days, from the calendars you choose (every calendar by default, including Google, iCloud and Exchange calendars you have added to the iPhone).
Goes to
Nowhere. Events are read on the iPhone and never leave it.
Never
Creates, edits or deletes an event.
Calendar, from a secret iCal address
Reads
A calendar’s iCal feed, using the “secret address in iCal format” you paste in (for Google Calendar: Settings, the calendar, Integrate calendar). That feed can hold a calendar’s whole history, so Departures reads it as a stream and keeps only the next couple of days.
Goes to
The address’s own host, calendar.google.com for a Google calendar. The app also accepts addresses on outlook.office365.com, outlook.live.com and iCloud (icloud.com) and refuses any other host.
Sent
An ordinary request for that address. The address is itself the credential, so it is part of the request. There is no Google sign-in for this.
How often
Roughly every ten minutes at most for each calendar. The app and its widgets each keep their own ten-minute timer.
Google Tasks
Sign-in
Google’s own sign-in page, shown in the system’s web sign-in sheet (accounts.google.com), which can use the Google session already in your browser. Departures never sees your Google password.
Asks Google for
Permission to view your tasks (read-only), plus basic sign-in and your email address, so the app can show which account is connected.
Goes to
oauth2.googleapis.com to exchange the sign-in for tokens and to renew them, and tasks.googleapis.com to read your task lists and open tasks.
Reads
The names of your task lists, and each chosen list’s open tasks: title, due date (Google keeps no time), position and parent task. Completed, deleted and hidden tasks are not requested.
Never
Creates, edits, completes or deletes a task. The permission it holds cannot.
Note
While the app’s Google project is in Google’s testing stage, Google ends each sign-in after seven days. Departures then shows Reconnect, and it schedules a reminder notification on your iPhone shortly before that.
Todoist
Connect with
Todoist’s sign-in (read-only data:read permission), or a personal API token you paste in from Todoist’s developer settings.
Goes to
api.todoist.com, and Todoist’s own sign-in service when you connect with sign-in.
Reads
Tasks for the view you choose (today and overdue, next seven days, high priority, or your own filter): title, priority, due date and time, project and whether it is done. For “Upcoming reminders” it also reads your reminders.
Sent
Your token, and the filter text for the view you chose. If you write a custom filter, that text goes to Todoist exactly as typed.
Never
Adds, changes, completes or deletes a task. Notifications still come from Todoist, not Departures.
Weather
Goes to
Open-Meteo: api.open-meteo.com for the forecast and geocoding-api.open-meteo.com for city search.
Sent
A latitude and longitude, your temperature unit, and a request for the local time zone. The coordinates are either your iPhone’s location rounded to two decimal places (about 1 km) before it is saved or sent, or the coordinates of a city you chose. When you search for a city, the words you type (two letters or more) go to Open-Meteo’s search.
Reads
Current temperature and feels-like, today’s high and low, and the rain chance for the coming hours.
Location
Optional. If you allow it, Departures asks iOS for an approximate position once, when weather is due, and does not track you continuously. The saved position is ignored after 24 hours, and it is deleted as soon as you turn off Follow iPhone location. You can choose a fixed city instead and never share location.
Transit
Goes to
Your chosen agency’s bus-prediction service: TheRide (rt.theride.org) or U-M Magic Bus (mbus.ltp.umich.edu).
Sent
The API key you got from the agency (their service takes it as part of the request), and the route, direction and stop you chose. The app doesn’t send your location; you pick the stop.
Reads
Lists of routes, directions and stops, and the next predicted departures at your stop.
Sports
Goes to
ESPN’s public site data, site.api.espn.com. It has no account or key, and isn’t an official API.
Sent
The league, team and game identifiers and the dates it needs for the teams you follow. Nothing else about you, beyond what any web request reveals.
Reads
Team lists for the picker, each followed team’s next game, and live scores and recent finals.
Those are all of the places the app contacts. Departures only connects to the hosts above, over HTTPS, and follows redirects only within the same host. It uses a temporary network session that writes no cookies or web cache to disk.
iPhone permissions and local features
Calendars: full access, read-only, for the Calendar board. Turn it off any time in Settings, Privacy & Security, Calendars.
Location: “While Using the App”, at approximate accuracy, for the Weather board and the Weather widget. Turn it off in Settings, or switch to a fixed city.
Notifications: iOS asks the first time one is needed. Departures sends two kinds, both scheduled on your iPhone and never from a server: “Timer done” when a work-display timer ends while the app isn’t in front, and a reminder to reconnect Google Tasks shortly before Google’s seven-day testing limit.
Work display: it can keep the screen awake while it is open, and it reads the battery state to tell you when the iPhone isn’t charging. Both stay on the iPhone. Flap sounds are bundled with the app, play offline, and are off by default.
What is stored, and where
Everything is stored on your iPhone. Nothing is stored on a server of mine, because there isn’t one.
In the iPhone Keychain
Your Google sign-in (a refresh token, and the current access token that goes with it).
Your Todoist token, whether it came from Todoist’s sign-in or from you.
Transit API keys, one per agency.
Secret calendar addresses.
These items are readable after the iPhone has been unlocked once since it started, so that widgets can refresh on a locked StandBy display. They are marked “this device only”, so they don’t sync through iCloud Keychain or move to a new phone. The app and its widgets share them through the app’s own Keychain access group.
In the app’s shared storage (an App Group)
Your settings: colors and finish, the text on My board, your chosen weather city, followed teams, chosen calendars and task lists, your transit stop, your Todoist filter, and the name and host (never the address) of each calendar you added by address.
For Google Tasks, the email address of the account you connected. It appears only in the app, is sent back to Google only to pre-fill the sign-in when you reconnect, and stays until you Disconnect so the app can tell you which account needs to sign in again.
The rounded weather location, if you follow your iPhone’s location (see above).
The latest copy of each board’s data, such as the next events, task titles, weather, bus times and scores, so widgets can show something between refreshes. A saved copy is replaced at the next refresh, stops being shown after a set time (from ten minutes for buses to a day for tasks), and is cleared when you disconnect that board.
Backups and deleting the app
The app’s saved settings and board copies are part of your iPhone’s backups, as with any app. Deleting the app removes its stored settings and board copies. To make sure its sign-ins and keys are removed as well, use Disconnect in the app before you delete it.
Widgets
Departures’ widgets run in separate extensions that read the same shared storage and Keychain, and make the same kinds of request directly. iOS decides when a widget refreshes. Weather has its own extension so that the other widgets never ask for location. The Protect personal boards setting lets iOS hide Calendar, Todoist, Google Tasks, transit and My board content when its privacy protection is active, for example on a locked screen.
Disconnect and revoke
In the app. Each board’s settings has a Disconnect (Todoist, Google, a transit agency), and a calendar address can be removed from the list. That deletes the sign-in, token, key or address from your iPhone, clears that board’s saved data and refreshes its widget. Turning off Follow iPhone location deletes the saved location. iOS Settings can turn off calendar and location access.
At the source. Disconnecting inside Departures forgets the sign-in on your iPhone only. It does not contact Google or Todoist. To withdraw the permission itself:
Todoist: in Todoist, open Settings, Integrations, and remove Departures from the apps connected to your account. If you used a personal API token instead, that token can be reset from the same Integrations settings.
A secret calendar address: in Google Calendar’s settings for that calendar, reset the secret address. The old one stops working.
The Todoist sign-in return page
When you sign in to Todoist from Departures, Todoist sends your browser back to a page on this site, samporter14.github.io/departures/todoist/callback/, with a single-use code in the address. That page does one thing: a few lines of JavaScript pass the code straight on to the Departures app on your iPhone. The page stores nothing, loads nothing from any other site, sends nothing anywhere else, and sets a “no-referrer” policy so the address isn’t passed along when you leave it. It doesn’t display the code. The page is just a static file, but it is hosted by GitHub Pages, and GitHub may log requests to it like any web host (see This website).
Google user data
This section applies to information Departures receives from Google when you sign in with Google for the Google Tasks board.
What it accesses. Your Google Tasks lists and open tasks, read-only (the tasks.readonly permission), and the email address of the account you sign in with.
How it uses it. Only to show your tasks on your Departures boards and widgets, and to show which account is connected. It isn’t used for advertising, profiling, analytics or to build any other product, and it is not used to train any AI or machine-learning model.
Who sees it. No one but you. The data goes between your iPhone and Google, and stays on your iPhone. I can’t read it, no person reads it, and it isn’t transferred to me or to anyone else.
How it is protected and kept. Sign-in tokens are in the iPhone Keychain; task titles are held on your iPhone and shown for up to a day. HTTPS is used for every request.
How to delete it. Use Disconnect in the Google Tasks settings to remove the tokens, the email address and the saved task data from your iPhone, and revoke access on your Google Account. Because I hold no copy, there is nothing for me to delete on request.
Departures’ use and transfer to any other app of information received from Google APIs will adhere to the Google API Services User Data Policy, including the Limited Use requirements.
This website
The home page and this policy are plain pages: no cookies, no scripts, no web fonts, no analytics and nothing loaded from other sites. They are hosted by GitHub Pages, which, like any web host, may keep ordinary request logs under GitHub’s privacy statement. Links to other sites (Google and GitHub) leave this site, and those sites have their own policies.
Not affiliated
Departures is not created by, affiliated with, or supported by Todoist, and likewise not by Google, Apple or ESPN. It also has no connection with Open-Meteo, TheRide or the University of Michigan, whose public data it displays. Todoist, Google, Google Tasks, Apple, iPhone, StandBy and ESPN are trademarks of their owners.
Children
Departures isn’t directed at children. Because I receive no data from anyone, I don’t knowingly collect information from children or from anyone else.
Changes
If the app starts to do something that changes this policy (a new service, say), I’ll update this page and its effective date before that version is used. Please check the date at the top.
Contact
Questions about this policy or the app: open an issue on GitHub. Please don’t include tokens, secret calendar addresses or other private details in a public issue.