Overview
Dog Schedule turns "can you walk my dog" between neighbors into a real product: a community list of nearby people, a booking flow with confirmation and reschedule/rate negotiation, live GPS tracking with poo/pee/pin logging during the walk, a walk report sent to the owner afterward, ratings, and running earnings for anyone who charges. Every account can list dogs and offer to walk — there's no fixed role split, which shaped almost every screen to be direction-agnostic rather than role-gated.
Two neighbors, one dog, no fixed roles. Either person can be the one asking or the one walking — the same account does both, so there's no separate "owner" app and "walker" app to design, build, or explain.
This is the actual walker-and-dog illustration from the app's own "Organic" design source file — reused here rather than redrawn, to keep the case study honest about what the real design system looks like.
Five ways in, one account model
Email/password, Google, Apple, and phone number all create an account transparently on first use — no separate sign-up step. A fifth path, guest browsing, skips auth entirely and upgrades into a real account later without losing anything.
Booking a walk, either direction
There's no fixed "who can ask whom" — either side can be the requester. A request becomes one order-summary screen that adapts its buttons to whatever's actually actionable, and either party can renegotiate time or rate at any point before it's done.
What's built
Manage Dogs
Photo-forward grid of your dogs; a dog can be shared with someone from your conversations so they can walk it solo without becoming a co-owner.
Live walk tracking
MapKit + Core Location distance/duration tracking, with Poo, Pee, and Drop Pin logging that all surface on the walk's history map afterward.
Chat
Real-time Firestore-backed conversations, photo and document attachments, and tappable system messages that jump straight to the related walk/request.
Availability & earnings
Opt-in hourly rate, a recurring or calendar-range weekly schedule, and an earnings chart computed from each walk's actual agreed rate — never a flat estimate.
Push notifications
Cloud Functions send one notification per event — new message, new request, confirmed/declined, walk started, report sent, rating submitted.
Full localization
English and Hebrew via a String Catalog, ~540 strings, including right-to-left layout — follows the device setting or an in-app override.
Face ID app lock
Opt-in, device-local lock shown on cold launch and on returning from background — the one place biometrics adds real protection since Firebase Auth otherwise re-signs in silently.
Download my data / delete account
A full JSON export of everything tied to your account via the system share sheet, entirely on-device — the non-destructive counterpart to account deletion.
Night Mode
A live in-app dark theme independent of system Dark Mode — every design-system color resolves to a light/dark pair, flipped with no restart needed.
Key views
| Screen | What it's for |
|---|---|
| Home ("Community") | Quick actions, nearby people preview, upcoming/recent walks in both directions |
| Community list | Everyone nearby with an availability badge and filter pills |
| Person profile | Stats, bio, weekly availability, "Ask them to walk" / "Message" |
| Request a walk | Pick dog(s), date/time, note, "I'll come too", propose a rate |
| Order summary | One screen for every request status, either direction |
| Active walk (map) | Live tracking + poo/pee/pin logging |
| Walk report | Stats, route sketch, photos, note — reviewed before sending |
| Manage Dogs / Dog Profile | Add, edit, delete, and share a dog |
| Availability & rate | Opt-in walking, hourly rate, recurring or calendar schedule |
| Earnings | Monthly total + Sun–Sat bar chart |
| Chat list / thread | Live conversations, photo/document attachments |
| Profile hub (Settings) | Edit profile, Face ID lock, Night Mode, data export, delete account |
A few of the harder problems
Two independent proposal types on one booking
A reschedule proposal (proposedDate/proposedByUid) and a
rate proposal (proposedRate/rateProposedByUid) are tracked as
separate field pairs, so one outstanding time proposal and one outstanding rate
proposal — even from two different people — never clobber each other's attribution.
Guest sessions that don't lose data
Browsing without an account starts a real anonymous Firebase Auth session. Signing up later upgrades that same session in place via Firebase's account-linking, rather than starting over — dogs added and walks taken as a guest carry through untouched.
Hebrew / RTL as a first-class layout, not an afterthought
Full right-to-left support via a String Catalog (~540 strings), with a real gotcha
around how String(localized:) keys strings that contain interpolation —
documented as a standing gotcha for anyone adding new user-facing copy.
Push notifications depend on a chain outside the code
Without an APNs Authentication Key configured in the Firebase console, every send fails with a third-party-auth error even though client-side registration looks completely fine — a failure mode that's invisible from the client alone.
"Organic"
A warm, hand-drawn-feeling visual language across the entire app — pill-shaped components, a full color ramp, and a complete Night Mode counterpart for every token.
Bundled fonts: Outfit for headings, Figtree for body copy.
Next: Parking Share
A tight, permissioned system for a physical space — rules enforced end to end.