Skip to content
OpenRenderKitPublic

About

Native iOS parking finder combining live Melbourne availability, stay limits, prices, providers, and Apple Maps directions.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

ParkAlong

One map for Victorian parking availability, time limits, prices, providers, and directions.

CI Platform Swift License

ParkAlong is a native, map-first iPhone app that brings fragmented parking information into one consistent view. Search a destination across Victoria, choose how long you intend to stay, and compare nearby on-street zones and off-street facilities without jumping between council pages, payment apps, and provider websites.

The normal app flow combines Victoria-wide bundled public parking data, live City of Melbourne sensor data and Apple MapKit. It has no account system, payments, reservations, ads, or runtime AI. An optional HTTPS delta endpoint can update mapped static records when explicitly configured; the bundled catalog remains the offline baseline.

Screenshots

ParkAlong availability-first map in dark mode Selected parking result showing availability, time limit and price Destination search ParkAlong availability map in light mode

Why ParkAlong?

Parking information is often split across several places:

  • council sensor maps show whether bays may be occupied;
  • street signs explain how long a driver can stay;
  • payment providers handle sessions and current rates;
  • commercial operators list separate off-street facilities;
  • navigation happens in another app.

ParkAlong normalizes those pieces into a single ParkingOption model and a single result sheet. The four primary answers are always the same: availability, location, time limit, and price/provider. Arrival prediction is a first-class product state, but it is numeric only when held-out evidence passes the release gates; otherwise ParkAlong explicitly abstains.

Features

  • Live on-street availability from City of Melbourne parking-bay sensors.
  • Green, amber, and red count pins: 3+ spaces, 1–2 spaces, or no currently vacant spaces.
  • Statewide parking discovery from 38,610 integrity-manifested public records, with explicitly restricted OpenStreetMap parking removed and authority/approved contractor records preferred over nearby duplicates.
  • Deep-plum ~N pins for validated predictions and red P pins for location-only results; every non-live pin carries a small amber warning.
  • Current restriction and price resolution from effective-dated schedules and tariffs when a public source supplies enough information.
  • Completion-first destination search plus relevant ParkAlong catalog results, ranked around the visible map rather than a Melbourne-only rectangle.
  • A single sliding stay track for 15 minutes, 1, 2, 3, 4 and 6 hours, plus an 8h+ arrival/stay planner supporting custom durations up to seven days.
  • Arrival-aware time-limit and price resolution across weekly windows, overnight boundaries and planned future days in Victoria local time.
  • Paid/free labelling where the active parking code makes it clear.
  • Provider links when a trustworthy reusable price is not available.
  • Nearby off-street facilities from MapKit, normalized alongside on-street zones.
  • A destination-anchored street-parking suggestion based on availability and straight-line proximity.
  • Individual vacant-bay markers fetched only after selecting a zone.
  • Apple Maps driving handoff to the representative parking pin, which may not be the vehicle entrance. ParkAlong does not recreate turn-by-turn navigation.
  • Two-minute refresh, foreground refresh, manual refresh, and checked-at timestamps.
  • Versioned historical buckets and held-out validation metadata; the shipped 2019 model abstains from 2026 arrival forecasts because it exceeds the two-year recency gate.
  • Viewport-driven loading, low-zoom clustering, generation ordering and short bounded caches so zooming or panning recalculates the parking actually on screen.
  • Deterministic test fixtures that never leak into a normal launch.
  • Light mode, dark mode, Dynamic Type, VoiceOver labels, and reduced-motion support.

Stay filters

The duration control is a real result filter, not a display preference.

Selection ParkAlong shows
15m Zones that allow at least a 15-minute stay, plus currently unrestricted options
1h Zones that allow at least one hour, plus currently unrestricted options
2h Zones that allow at least two hours, plus currently unrestricted options
3h Zones that allow at least three hours, plus currently unrestricted options
4h Zones that allow at least four hours, plus currently unrestricted options
6h Zones that allow at least six hours, plus currently unrestricted options
8h+ Opens Arrival & Stay for an eight-hour, future-day or custom one-minute-to-seven-day plan

Changing the plan retains the previous markers while a generation-safe refresh fetches a matching result set for the current viewport. If no nearby on-street zone fits, ParkAlong says so and keeps useful off-street options visible rather than presenting a network error.

How it works

flowchart LR
    Destination["Selected destination + visible map + arrival + stay"] --> Repository["ParkingRepository"]
    Sensors["City live sensors"] --> Repository
    Signs["Current zone restrictions"] --> Repository
    History["Historical buckets + held-out validation"] --> Repository
    Catalog["38,610 statewide static records"] --> Normalizer
    MapKit["Apple MapKit facilities"] --> Normalizer["ParkingOption normalizer"]
    Repository --> Engines["Availability, restriction, prediction and ranking engines"]
    Engines --> Normalizer
    Normalizer --> Map["Availability-first map"]
    Map --> Sheet["Unified result sheet"]
    Sheet --> Maps["Apple Maps handoff"]
Loading

Trust and freshness

Sensor rows are accepted only when they have a recognized occupancy state, usable zone/location data, and a status timestamp within the previous 24 hours. Ambiguous or stale rows are excluded. Static records can answer “where,” “how long,” and sometimes “how much,” but never inherit a live availability colour. Numeric forecasts require capacity, an exact matching time bucket, at least 500 held-out bay-interval outcomes, normalized MAE and per-bay binary Brier score no greater than 0.20, interval coverage of at least 0.80, interval radius no greater than 0.35, and observations no more than two years old. A failed gate produces an explicit reason—not a decorative low confidence percentage.

Ranking

Eligible on-street results shown are ranked deterministically with availability dominating proximity:

  • 70% predicted available-space count;
  • 20% straight-line proximity to the selected destination;
  • 10% capacity-aware modelled chance of at least one space.

The selected destination anchors straight-line proximity and suggestion ranking, while the visible viewport controls discovery. This proximity is straight-line distance, not walking-route distance.

Only options with a positive numeric observed or validated availability state participate in the suggestion. The suggestion compares the eligible on-street results shown and is withheld when only one result is eligible or when availability evidence is missing or zero. A future plan with an abstained forecast never reuses the current live count for ranking.

The map renders the top 24 ranked on-street options to remain responsive while zooming and panning.

Price and providers

ParkAlong shows Free when the current restriction code establishes it. For metered parking and commercial facilities, the app shows a current provider/payment link when it cannot verify a reusable exact tariff. It never invents a price.

Architecture

The project keeps networking, domain rules, prediction, ranking, and UI orchestration separate:

Component Responsibility
ParkingAPIClient Opendatasoft spatial queries, pagination, response validation, and decoding
ParkingRepository Viewport/plan refresh lifecycle, joins, bounded cache, live/forecast switching, and result construction
AvailabilityEngine Sensor trust cutoff and zone-level Present/Unoccupied counts
RestrictionEngine Active time window, parking-code parsing, and stay eligibility
PredictionEngine Evidence tiers, held-out release gates, honest ranges/probabilities and abstention
ParkingRuleResolver Victoria-time weekly/overnight restrictions and effective-dated tariff calculation
StaticParkingRepository Lazy statewide catalog loading, viewport filtering/clustering, source precedence, remote-delta merge and prediction gating
RankingEngine Pure deterministic availability-first scoring
OffStreetParkingService Nearby MapKit facility discovery and provider normalization
LocationService When-In-Use authorization and location fallback
DestinationSearchService MapKit completion/resolution plus visible-region relevance ranking
ParkingMapViewModel Main-actor UI orchestration and refresh race protection

Requirements

  • macOS with Xcode 16 or newer
  • iOS 17+ simulator or device
  • XcodeGen
  • Python 3 for data generators and their tests

No paid Apple Developer account is required for simulator use.

Run locally

git clone https://github.com/OpenRenderKit/ParkAlong.git
cd ParkAlong
brew install xcodegen
xcodegen generate
open ParkAlong.xcodeproj

Or build entirely from the terminal:

xcodebuild build \
  -project ParkAlong.xcodeproj \
  -scheme ParkAlong \
  -destination 'platform=iOS Simulator,name=iPhone 17 Pro,OS=latest' \
  CODE_SIGNING_ALLOWED=NO

Set a simulator location in central Melbourne:

xcrun simctl location booted set -37.8136,144.9631

Location permission is optional. If permission is denied, ParkAlong uses Melbourne CBD only as its initial camera; statewide destination and parking-catalog search remain usable.

Tests

Run the deterministic app test suite:

xcodebuild test \
  -project ParkAlong.xcodeproj \
  -scheme ParkAlong \
  -destination 'platform=iOS Simulator,name=iPhone 17 Pro,OS=latest' \
  CODE_SIGNING_ALLOWED=NO

Run generator tests:

python3 -m unittest discover -s Scripts/tests -v

Run the separate real-network smoke check:

python3 Scripts/smoke_live_api.py

Audit the anonymous Victorian sources and their actual event freshness:

python3 Scripts/probe_victoria_sources.py --source all

See the Victorian parking data source audit for tested council, statewide, app, and vendor evidence. Only City of Melbourne is currently classified as verified live occupancy; other sources remain static, stale, unavailable, or rejected until their anonymous responses prove otherwise.

UI tests use -ui-testing with deterministic -fixture-live, -fixture-loading, or -fixture-error launch arguments. -location-denied covers the CBD fallback and -intercept-navigation verifies navigation without leaving the test app. Normal launches never select fixtures.

Rebuild bundled data

Refresh current zone metadata and sign restrictions:

python3 Scripts/generate_metadata.py

The historical generator streams the 2019 archive directly from its ZIP and does not load 42.7 million rows into memory. January–October trains the baseline, November calibrates the 90% residual interval, and December remains an untouched evaluation window. The generated validation ledger records support, MAE, per-bay Brier score, interval coverage/radius, observation date, and model version for every supported segment:

mkdir -p Scripts/data
curl -fL \
  'https://opendatasoft-s3.s3.amazonaws.com/downloads/archive/7pgd-bdf2.zip' \
  -o Scripts/data/2019-parking-events.zip

python3 Scripts/generate_prediction.py \
  Scripts/data/2019-parking-events.zip \
  ParkAlong/Resources/Generated/historical_availability.json \
  --metadata ParkAlong/Resources/Generated/zone_metadata.json \
  --validation-output ParkAlong/Resources/Generated/historical_validation.json

The raw archive is ignored by Git. Only the compact generated artifact is committed.

Rebuild the anonymous statewide static catalog and its manifest:

python3 Scripts/generate_victoria_static_catalog.py

The generator combines public council data from Maribyrnong, Ballarat, Casey, Boroondara, Wodonga, Manningham, Latrobe, Moorabool, Mildura, Swan Hill, Brimbank and Port Phillip/Glen Eira accessible snapshots; the CC BY Vicmap parking-area layer; approved attributed layers for Colac Otway, Monash and Southern Grampians; official parking/rate pages for selected named facilities and regional parking areas, including four Greater Dandenong facilities; and OpenStreetMap's statewide layer. It records fetch time, complete source attribution, per-source retained counts, municipality/source/accessibility counts, byte size and SHA-256, clusters dense bay geometry, and never converts transactions or old surveys into live availability. All eight source IDs added in this expansion (Port Phillip, Glen Eira, two Brimbank feeds and four Greater Dandenong facilities) are static-only. The Brimbank source resource is dated 2019 and restrictions with exclusion semantics were withheld/filtered conservatively. Greater Dandenong tariffs were omitted because the pages publish no fee-effective date, and Number 8 capacity remains unknown because the source says more than 500. Locality labels are derived from official Vicmap polygons and do not upgrade parking-source authority. See the 19 September source expansion checkpoint for the priority method, measured bundle impact, and blocked candidates, the fresh 87-area geographic audit for council-level evidence gaps, and the 62-locality coverage audit for before/after locality evidence. Research holds with no ingest where reuse permission, exact geometry, or exact current semantics were unresolved include additional Stonnington facilities, Deakin Burwood, West Tarneit, Ringwood/hospital candidates, and Glen Waverley page corrections not safely mappable to source polygons.

Optional remote deltas use the same bounding-box/arrival/duration/zoom contract. Set the PARKALONG_REMOTE_BASE_URL Xcode build setting for a production build, or the environment variable with the same name for local development. It is empty and disabled by default; bundled records remain the offline fallback.

Data sources and attribution

Live and historical parking data is provided by the City of Melbourne and licensed under Creative Commons Attribution 4.0:

Off-street place discovery and destination search use Apple MapKit. Provider availability, opening hours, and prices remain controlled by each provider.

The bundled static catalog retains source-level attribution and source links in every record and in its manifest. It includes council and Vicmap open data under each catalogue's published terms and OpenStreetMap data under the Open Database License.

Privacy

  • No account or advertising identifier.
  • No first-party analytics or tracking.
  • No backend operated by ParkAlong.
  • Location is used on-device to centre searches and is not stored by the app.
  • Default app network requests are limited to City of Melbourne data and Apple MapKit/Maps. The statewide static catalog is fetched by a developer-run generator and bundled with the app; an optional operator-configured HTTPS delta source is off by default.

Source limitations

  • Availability changes quickly and is not a reservation.
  • Sensors can be unreliable on public holidays, around construction, or when a bay is temporarily unavailable.
  • Exact on-street and facility prices are not consistently exposed through reusable public interfaces; ParkAlong shows a number only when an effective public tariff can be resolved for the selected stay.
  • Off-street facility results can provide provider links while current capacity remains unknown.
  • Historical data currently describes 2019 patterns. Its measured artifact is retained for reproducibility, but the runtime recency gate abstains rather than presenting it as a current 2026 forecast.
  • Statewide static locations are discovery aids. Posted signs and on-site prices remain authoritative.

Contributing

Contributions are welcome. Start with CONTRIBUTING.md, use an issue for user-visible changes, and keep networking/domain behavior covered by deterministic tests. Please read the Code of Conduct and report sensitive problems according to SECURITY.md.

License

ParkAlong source code is available under the MIT License. Bundled and remotely fetched City of Melbourne datasets retain their original CC BY 4.0 terms and attribution requirements.

About

Native iOS parking finder combining live Melbourne availability, stay limits, prices, providers, and Apple Maps directions.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages