Overview
Apartment buildings often have more assigned parking spots than residents actively using them at any given time. Parking Share gives a building's admin a way to model the garage — floors and stalls — and gives each resident control over their own spot: mark it shareable, set a recurring weekly schedule or one-off date windows, and flag details like double-parking or an EV charger. Every permission boundary is enforced twice — once in the UI, and independently in Firestore security rules, so the rules hold even against a client that doesn't play by them.
One physical stall, one owner of record, shared out on a schedule — not handed over. The resident keeps the spot; sharing it just means someone else can use it during the windows they've opened up.
Drawn in the app's own "Deck / Industrial Signage" palette — concrete surface, ink, and the original accent orange — rather than a generic stock graphic.
From invite to shared spot
There's no open self-signup. An admin adds a resident by phone number; that phone number is the only thing that can ever sign in as that resident. First sign-in routes through a one-time setup screen before reaching the normal app.
What each role can actually touch
Admin — building manager
- Defines the garage: levels and stalls (floor/spot setup)
- Creates and edits the resident roster (name, phone/email, unit, spot)
- Can edit any spot's config — owner, unit, double-park, EV charger
- Signs in by phone or email
Resident
- Sees only their own spot and profile — never the roster or another spot
- Full self-service on their own spot: sharing toggle, weekly schedule, one-off windows, EV/double-park flags
- Own name is editable once, during first-time setup only
- Signs in by phone only (email sign-in is admin-only, by design)
- Read-only "Browse" tab to see the rest of the garage
What's built
Garage map
Admin-defined floors and stalls, rendered as top-down tiles with a car glyph colored by taken/free state, double-park stalls, EV and lock badges.
Resident directory
Full CRUD roster with a segmented phone/email switch and a role picker that's gated by role — users get phone-only, admins get either.
Sharing schedule
Recurring weekly day/time chips via native DatePicker, plus one-off
date-range windows for exceptions.
Rules-enforced ownership
Every write is checked against Firestore security rules — a resident's own doc, their own spot, nothing else — independent of what the UI allows.
Custom design system
"Deck / Industrial Signage" — stenciled display type, concrete-textured backgrounds,
a rocker toggle instead of the system Toggle, die-cut role tags.
Stall detail
Owner, unit code, double-parking flag, EV charger, shareable toggle — all editable by an admin, or by the resident on their own spot.
Key views
| Screen | What it's for |
|---|---|
| Login / OTP | Phone OTP or admin email sign-in |
| Garage onboarding | First-run wizard: level count → name floors → review → build |
| Garage map | Admin's live view of every level and stall |
| Resident directory + form | Roster CRUD, add/edit a resident |
| Resident setup | One-time onboarding after first invite sign-in |
| My Spot | Resident home — spot hero tile, share toggle, schedule summary |
| Spot config | Shared editor for owner/unit/double-park/EV/shareable — used by both roles |
| Schedule editor | Day chips + time range + one-off date windows |
A few of the harder problems
A security rule that silently failed only in combination
Combining !callerIsAdmin() && callerOwnsSpot(spotId) in one
allow update clause failed even though each half passed when tested alone.
The fix was removing the redundant admin check entirely — admins already had a separate
write rule, so the combined check was actively breaking resident writes. Found by
testing against the live Firestore REST API with a real end-user ID token rather than
trusting flaky simulator taps.
Admin create vs. self-signup are different rules
The original allow create rule only let a signed-in user create their
own doc — fine for admin self-signup, but it meant an admin could never actually
create someone else's resident doc under real rules. Fixed by adding a separate
admin-only create clause.
Hand-edited Xcode project file
The project is built without the Xcode GUI touching project.pbxproj —
every new Swift file needs four manual edits (build file, file reference, group,
sources build phase) to actually compile and link.
"Deck / Industrial Signage"
Grounded in the literal subject — concrete surfaces, stenciled signage type, painted lines — built from the app's original accent orange.
Custom bundled fonts: Big Shoulders Display ExtraBold for stenciled headlines, IBM Plex Mono for labels and codes, IBM Plex Sans for body copy.
Next: Dog Schedule
An open, two-sided marketplace with live tracking, chat, and payments.