an open source Park Smarter alternative. Works with IPS parking meters.
Find a file
Hank a8ba1fcae4
Some checks failed
build-apk / build (push) Failing after 5m9s
Release signing fix + Obtainium install guide + publish script
- Fix withReleaseSigning: RN template's unconditional debug signingConfig was
  overriding the release key. Now uses the release key when BBP_UPLOAD_* is set
  (verified: APK signed CN=BigBrainParking), else debug.
- INSTALL.md: dead-simple Obtainium setup (one-tap obtainium:// link + manual
  Forgejo-source steps). README links it.
- scripts/publish-release.sh: create a Forgejo release + upload the signed APK.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 13:27:19 -07:00
.gitea/workflows Initial commit: parksmarter-client + BigBrainParking app 2026-07-06 08:33:47 -07:00
app Release signing fix + Obtainium install guide + publish script 2026-07-07 13:27:19 -07:00
docs docs: clarify Obtainium reads repo Releases (not Packages) 2026-07-06 08:36:26 -07:00
parksmarter-client Detect declined sessions (200 + Status:Error); theme Sessions screen 2026-07-06 12:25:14 -07:00
scripts Release signing fix + Obtainium install guide + publish script 2026-07-07 13:27:19 -07:00
.gitignore Release signing fix + Obtainium install guide + publish script 2026-07-07 13:27:19 -07:00
INSTALL.md Release signing fix + Obtainium install guide + publish script 2026-07-07 13:27:19 -07:00
package-lock.json Add on-device debug logging: file capture + share (for real-session testing) 2026-07-06 11:59:41 -07:00
package.json Initial commit: parksmarter-client + BigBrainParking app 2026-07-06 08:33:47 -07:00
README.md Release signing fix + Obtainium install guide + publish script 2026-07-07 13:27:19 -07:00

BigBrainParking

An unofficial, de-Googled client for the ParkSmarter (IPS Group) parking system, built to run on GrapheneOS with UnifiedPush notifications and distributed via Obtainium — no Google Play Services, no Firebase, no app store.

Install it (users)

BigBrainParking installs and updates through Obtainium — no Google Play, no account. One tap (with Obtainium installed): obtainium://add/https://git.mowden.top/hank/BigBrainParking — or follow INSTALL.md for the manual steps. Works on GrapheneOS.

Monorepo layout

bigbrainparking/
├── parksmarter-client/   # Zero-dep TypeScript API client (reverse-engineered, live-verified)
├── app/                  # Expo / React Native app (BigBrainParking)
└── .gitea/workflows/     # CI: build signed APK -> publish release for Obtainium
  • parksmarter-client — the API layer. All ~40 endpoints, the custom-header auth model, and response models (most verified against production). Runs anywhere; the app imports it directly. See its own README for the API details.
  • app — the phone app. React Native (Expo prebuild), MapLibre maps, VisionCamera QR scanning, expo-secure-store token storage, local session-expiry reminders, and UnifiedPush wiring.

Features

Feature Status Notes
Phone + password login wired tokens in OS keystore
Map of nearby meters (clickable, zoom, live GPS) wired MapLibre + OpenFreeMap tiles (no key)
"Near my last location" proximity search wired caches last GPS fix
QR kiosk scan → meter lookup wired on-device VisionCamera
Save / share kiosks wired local (no server favorites API exists)
Active / past sessions wired list views
Start a paid session 🟡 gated flow wired to postStartParkingSession, disabled pending review (real charge)
Session-expiry reminders wired local notifications — no FCM needed
UnifiedPush (ntfy) 🟡 partial endpoint registration done; server→ntfy bridge still needed (see below)

Build & run (dev)

Requires Node 20, JDK 17, Android SDK, and a GrapheneOS device (or any Android device) with USB debugging.

npm install                                   # installs both workspaces
npm run build --workspace parksmarter-client  # compile the client
cd app
npx expo prebuild --platform android          # generate native project
npx expo run:android                          # build + install a dev client

The app talks to prod (apiv2.parksmarter.com) by default — change extra.psEnvironment in app/app.json to point elsewhere.

Notifications on GrapheneOS

Session-expiry reminders are scheduled locally from each session's end time, so they need no push infrastructure and work fully offline of Google. app/src/notifications/ also wires UnifiedPush (distributor: ntfy) for any genuinely server-initiated push — but note the ParkSmarter backend only pushes via FCM, so server push requires a small FCM→ntfy bridge (a service holding an FCM token that forwards to your ntfy topic, then registered via PUT /api/Device). Until that exists, local reminders cover the main case.

Distribution via Obtainium (self-hosted)

Tag a release and CI builds a signed APK and publishes it to this repo's releases; your phone's Obtainium tracks the repo and offers updates. See docs/DISTRIBUTION.md for the full server + CI + keystore setup.