
ShortStak: Reverse-Engineering a Smart Garage App
Project Overview
A private iOS garage-access app that reverse-engineers a web frontend to provide native 1-tap access via Siri, CarPlay, and Home Screen widgets.
Category
Links
Collaborators
Solo Project
Date
August 2026
My Role
The Challenge
The Arduous Parking Process
Parking at my local garage (operated by Stakspace) should be a simple process, but it ended up being an incredibly frustrating daily ritual. Because the facility lacked a dedicated mobile SDK or app, they relied entirely on a web-based frontend for access control.
Every single time I wanted to park, both to enter and to exit, I had to:
- Open a web browser on my phone.
- Navigate to the parking portal.
- Enter my phone number and complete a 2FA flow.
- Enter payment information.
- Wait for the UI to load and tap a specific button to open the gate.
When you're sitting in a line of cars at a garage entrance or exit, this multi-step web flow is not just annoyingβit's stressful and dangerous. I needed a way to simplify this into a single tap.

The multi-step web browser flow required to open the garage door.

The web portal's strict location warnings.
The Solution
ShortStak: Native iOS Experience
I decided to build ShortStak, a private iOS garage-access app that completely bypasses the clunky web frontend. By reverse-engineering the website's API calls, ShortStak authenticates as a web browser against the parking.stakspace.com backend and triggers the door-open and door-close events natively.
Instead of a 5-step web process, I can now open the garage using:
- CarPlay: Tapping a button directly on my car's dashboard.
- Home Screen Widgets: A single tap on my phone's home screen.
- Siri Shortcuts: Using voice commands (e.g., "Hey Siri, open the Franklin Street Entrance").
- SwiftUI App: A beautiful, native iOS interface with swipe-to-unlock interactions.

ShortStak provides native iOS integration via CarPlay, Widgets, and Siri.
Technical Implementation
Reverse Engineering & API Spoofing
The hardest part of this project wasn't building the UIβit was figuring out how to talk to a backend that was never designed for third-party apps.
Impersonating a Web Browser
To trigger the POST /api/door endpoint, the app has to look exactly like a desktop Chrome browser. The app dynamically generates headers on each request:
- Spoofed
user-agentstrings. - Fresh
__stripe_midand__stripe_sidcookies. - Randomized
X-Forwarded-ForandClient-IPheaders to prevent rate limiting.
Dynamic JS Bundle Parsing
The list of garage doors isn't available via a simple JSON API. Instead, the Stakspace frontend compiles the door definitions directly into their Next.js JavaScript bundles.
To ensure the app doesn't break when they deploy updates, I built a live-refresh system (DoorProvider.refresh()) that:
- Fetches the
parking.stakspace.comHTML. - Uses Regex to find the current Next.js chunk filename (e.g.,
3296-f9c6f354b0f0fa49.js). - Downloads the chunk and parses it using Regex to extract the
doorId,name, andimagePathfor every door in the facility. - Deduplicates the results and persists them to
UserDefaults.

Extracting the door catalog by parsing minified Next.js bundles with Regex.
App Architecture & UI Surfaces
Building the Ecosystem
The SwiftUI app is built around a central DoorProvider singleton that manages the state across multiple UI surfaces:
- Main App: Features both a compact list view and an expanded hero-card view with custom gradient overlays and swipe-to-unlock sliders.
- CarPlay: Implemented using
CPListTemplate. It asynchronously downloads door thumbnails and displays them in a highly responsive 80x80 grid on the car's head unit. - Widgets: Using
AppIntents, I builtsystemSmallandsystemMediumwidgets that show the current state of a door ("Unlock", "Unlocking...", "β Unlocked") directly on the iOS Home Screen. - Siri: Configured an
OpenGarageDoorIntentso I can literally just talk to my Apple Watch as I pull up to the gate.
Screenshots

The main interface for ShortStak.

Using the app to access Stakspace.

Checking the garage locations.