SlotParking

SwiftUI-based parking management app for iOS

Unique Value: SlotParking bridges the gap between lot owners and drivers, providing real-time inventory and trusted access to parking in high-traffic urban areas.

Project Overview

SlotParking is an iOS app built with SwiftUI to help drivers and parking lot managers efficiently track and manage parking slots. Unlike my other projects, SlotParking requires direct engagement with private lot owners in Detroit. The project will begin as an MVP, and I will personally visit lots to pitch participation, gather feedback, and test the app in real-world conditions. This hands-on approach is essential for validating the product and building partnerships for future expansion.

SlotParking is designed so that drivers looking for a parking spot can use the app to see the remaining spots and cost of lots in the area—information that is currently unavailable. The app also shows how close each parking lot is to major entertainment venues in downtown Detroit, making it easier for drivers to find convenient and affordable parking.

Key Screens

SlotParking onboarding screen
Onboarding Screen
Quick intro to app features and benefits.
SlotParking map view screen
Map View Screen
Shows available parking slots and lets users reserve a spot.

Detroit Context & Brand Positioning

SlotParking is designed for Detroit: Industrial, efficient, and honest. The UI uses safety orange, concrete gray, and matte black for high visibility and a native Detroit feel. Giant buttons and workman fonts ensure speed and usability for attendants. Slogan: "Built for the Detroit grind." Target: high-traffic areas, with a focus on real-world utility and local branding.

Unique MVP Launch Approach

SlotParking will start as a pilot in Detroit, focusing on private lots managed by individuals. The app gives attendants a digital "Full" sign visible to drivers citywide. The MVP will be tested in the field, and lot owners will be invited to join the pilot program. Flyers, demo videos, and direct outreach will be used to build partnerships and validate the product.

How SlotParking works for privately owned lots:
  1. Attendant App: The attendant uses a simple interface—one tap for every car that enters, one tap for every car that leaves.
  2. Live Broadcast: Parking data is instantly broadcast to Detroit drivers searching for a spot. Drivers see the lot name and available spots, and can head directly to the lot.
  3. Scam Prevention: Verified SlotParking lots protect their reputation against parking scams. Drivers trust lots with live, digital inventory updates.
Why partner now?
  • Zero Hardware: No expensive sensors or gates. It’s all handled on the attendant’s smartphone.
  • Reduced Congestion: Stop the "is it full?" conversations that block your entrance. If the app says 0, they don't turn in.
  • Data for 2027: Get a report showing your peak occupancy times and turnover rates, helping you optimize pricing for Detroit Grand Prix and Auto Show.

Key Features

  • Real-time slot reservation and availability tracking
  • Parking history and analytics for users
  • Admin dashboard for lot managers
  • SwiftUI interface with accessibility support
  • Push notifications for reservation reminders
  • Integration with Apple Maps for navigation

Technical Approach

  • MVVM architecture for scalable codebase
  • SwiftUI for UI and user interaction
  • CoreData for local storage
  • Firebase for real-time updates and syncing spot counts across devices
  • Custom animations for slot selection and feedback

Challenges & Solutions

  • Challenge: Convincing private lot owners to adopt a new digital system.
    Solution: I plan to conduct in-person demos, provide easy onboarding materials, and offer direct support during pilot rollout.
  • Challenge: Preventing inaccurate spot counts due to manual entry errors.
    Solution: I will design a simple, error-resistant UI with confirmation prompts and real-time sync to minimize mistakes.
  • Challenge: Handling unreliable cellular connectivity in downtown Detroit.
    Solution: I intend to implement offline mode with local caching and automatic sync when connection is restored.
  • Challenge: Building trust with drivers and preventing parking scams.
    Solution: I will add “Verified Lot” badges and live inventory updates to ensure transparency and reliability.

Outcome

SlotParking is not yet built. Soon, I will begin outreach to Detroit lot owners to gauge interest and gather feedback for the app's pilot launch.

Code Highlights

Selected snippets from SlotParking showing real-time spot tracking, Firebase sync, and attendant UI logic.

SPOT COUNT MANAGER Swift class for tracking and updating available parking spots.
class SpotCountManager: ObservableObject {
    @Published var availableSpots: Int = 0

    func increment() {
        availableSpots += 1
        syncWithFirebase()
    }

    func decrement() {
        if availableSpots > 0 {
            availableSpots -= 1
            syncWithFirebase()
        }
    }

    private func syncWithFirebase() {
        // Firebase update logic here
    }
}

FIREBASE REAL-TIME SYNC

Swift function for listening to spot count changes in Firebase.

func listenForSpotUpdates() {
    let ref = Database.database().reference(withPath: "lots/detroitLot1/spots")
    ref.observe(.value) { snapshot in
        if let count = snapshot.value as? Int {
            self.availableSpots = count
        }
    }
}

ATTENDANT UI BUTTONS

SwiftUI view for attendant controls with large, high-contrast buttons.

struct AttendantControls: View {
    @ObservedObject var manager: SpotCountManager

    var body: some View {
        HStack(spacing: 32) {
            Button(action: { manager.increment() }) {
                Text("+")
                    .font(.system(size: 48, weight: .bold, design: .monospaced))
                    .frame(width: 80, height: 80)
                    .background(Color.orange)
                    .foregroundColor(.white)
                    .cornerRadius(16)
            }
            Button(action: { manager.decrement() }) {
                Text("-")
                    .font(.system(size: 48, weight: .bold, design: .monospaced))
                    .frame(width: 80, height: 80)
                    .background(Color.gray)
                    .foregroundColor(.white)
                    .cornerRadius(16)
            }
        }
        .padding()
    }
}