A better tracker for the Washington State Ferry System
An alternative to the WSDOT mobile app. With Ferry FYI, you get:
✨ Polished, modern UI with dark mode support
🔮 Forecasted sailing fullness
⌚ More accurate delay reporting
📢 Filtered WSF bulletins
📷 Traffic cameras: ordered, tagged, and enhanced
⛴️ Supports all WSF routes
🗺️ Shortcuts to VesselWatch
🎫 Link to reserve sailings
- Install postgres
- Create a database named
ferryfyi(CREATE DATABASE ferryfyi;)
- Create a database named
git clone git@github.com:anstosa/ferry.fyi.gitcd ferry.fyigit lfs install && git lfs pullyarncp .envrc.sample .envrcand fill out.envrcfile (usedirenvor similar to populate variables)yarn db:migrateto initialize database
For a prod-like local Docker Compose setup with the app, detector runtime, Postgres, and automatic database migrations, see Local container development.
Run the full containerized development stack with yarn dev:up.
yarn installs the repository pre-commit hook automatically. It type-checks
app changes, synchronizes Capacitor artifacts after native dependency or
configuration changes, and compiles Android resources for native edits.
- Run
yarn client - Run
yarn server(in another terminal) - Go to http://localhost:4040
From WSL, yarn start:android uses the Windows Android SDK and emulator when it
is installed, avoiding WSL graphics issues. It waits for Android itself to finish
booting, builds the APK in WSL, then installs and opens it through Windows ADB.
It uses the first configured AVD by default; set ANDROID_AVD_NAME to select a
specific emulator. Without a Windows SDK, it falls back to the Linux emulator.
Physical device
- Plug device into Windows via compatible cable
- Run
adb tcpip 5555on Windows - Run
adb connect <phone ip>:5555in WSL - Run
adb reverse tcp:4040 tcp:4040in WSL - Run
npm run start:androidto load app onto phone
WSA
- Install WSA
- Enable Developer Mode in WSA Settings
- Open any WSA app
- Run
adb connect <WSA ip from settings page> - Run
npm run start:androidto load app into WSA or run app from Android Studio
Use the Publish apps GitHub Action with platform android and the release
version, or push an android-v* tag. It starts from a clean checkout, installs
dependencies, builds the production web bundle, runs cap sync android, signs
the App Bundle, and uploads it to Play internal testing. No local build, sync,
or version-code command is required before committing.
The iOS target is generated from the same Capacitor app as Android and requires macOS, Xcode, and an Apple Developer account for device builds and App Store distribution.
- Install dependencies with
yarnon a Mac. - Set
AUTH0_IOS_CLIENT_IDto the dedicated Auth0 iOS application, setAUTH0_CLIENT_REDIRECTtofyi.ferry://callback, and add that URL to the Auth0 application's allowed callback and logout URLs. Keep only the Auth0 database connection enabled for the iOS application; the web application retains Google for the/iosaccount-migration flow. - Run
yarn open:ios, select the App target in Xcode, and choose the Apple Developer signing team. Keep the bundle identifier asfyi.ferryunless the registered App ID requires a different one. - Run
yarn iosto build, sync, and launch on a selected simulator or connected iPhone. The iPhone must grant camera and location access for ticket scanning and nearby-terminal features. - For a release, use Publish apps with platform
iosand the release version, or push anios-v*tag. The workflow builds, synchronizes, signs, and uploads the TestFlight archive from a clean checkout.
yarn build:ios builds the production web bundle with an iOS-specific cache name and synchronizes it into the Xcode project. Run it again after changing web code or Capacitor plugins. The generated project targets iOS 15 and later.
For automated TestFlight uploads, configure the GitHub Actions credentials in iOS TestFlight release automation, then push an ios-v* tag or run Publish apps manually.
Thank you to
for providing free cross-browser testing.
Weather data and forecasts are provided by Open-Meteo under CC BY 4.0. Ferry FYI uses and summarizes this data for capacity forecasts.