Loading post…
Loading Detroit Meets…
Loading post…
3.0 is the biggest release since the App Store launch. Same product, same no-ads, no-tracking stance — but this version closes a bunch of long-standing gaps that have been on the roadmap since day one. Weather, status banners, an anonymous server-side backup of your saved meets that powers organizer change alerts, Waze, and a complete polish pass on meet detail, the map sheet, the menu, and the login screen.
If you only read one section, read Headlines. If you want the full list, every change end users will actually notice is below, grouped by area.
Alongside this release we are publishing the April 2026 Transparency Report — a plain-language log of exactly what data the app collected this month, what changed, what we removed, who we relied on, and any government or legal request we received (this month: zero). It is the first one; we plan to publish one every month.
If a third party shows up in the user-facing render path, you will see it there. If a number on the privacy page would have changed, you will see that too. Read it alongside this changelog so the privacy-relevant items in 3.0 — Open-Meteo as a server-proxied weather source, the per-install saved-meets backup, push delivery telemetry — are framed in the same place we publish the what and the why.
/api/weather endpoint backed by Open-Meteo — see the April Transparency Report for the privacy details.cancelled, postponed, or updated, the meet detail page now shows a high-contrast banner at the top with the reason and the time it was changed. This is the safety-critical "do not drive 45 minutes for nothing" feature, and it shows even on out-of-date native shells.https://detmeets.com/meet/123 link in Instagram, Messages, or Mail and it opens directly in the native iOS app at that meet — cold start or warm. , , and are also supported; everything else falls through to the system browser as before.A new card near the top of meet detail shows:
The card has its own loading and error states, and it stays out of the way (no card at all) when we don't have coordinates for the meet, when the feature is disabled by env, or when the native shell is below the minimum build. The forecast time line was simplified late in the cycle to drop the redundant hour suffix; if you remember the line saying "at 7p.m." mid-week and looking weird, that's why it doesn't anymore.
If the meet has been updated, postponed, or cancelled, you now see a banner at the top of the page with:
The banner is intentionally not gated on the native-shell minimum build — out-of-date apps and web visitors all see it. There is no version of the app where you can miss this signal because your phone is behind on updates.
The "Quick stats" row at the top of meet detail was rewritten:
MKDirections through a small native bridge — same routing data Apple Maps uses, including live traffic when MapKit has it. The row also surfaces a confidence label so you know what you're looking at: live traffic, typical traffic, or estimated only. Web and Android keep a crow-flight heuristic fallback.The bar at the bottom of meet detail (Save / Share / Add to calendar / Open in Maps) was rebuilt for narrow viewports — fewer overflow issues, better tap targets, and the Open in Maps button now drives the new picker described below.
The loading state at /meet/[id] now matches the live page layout — hero, banner placeholder, quick stats rows, sticky action bar — instead of a flat spinner, so there's no layout pop when content arrives.
When you tap Open in Maps on a phone, the picker now offers:
Plus a small hint line ("Apple Maps will be listed first" / "Google Maps will be listed first" / "Waze will be listed first") based on your device default and your stored preference. We removed iOS routing-app declarations along the way to keep the App Store happy; opening into a navigation app continues to work via standard URL schemes.
The first time you tap Open in Maps, you're asked to pick a default — Apple Maps, Google Maps, or Waze. The choice is what drives the "X will be listed first" hint above, and it persists on-device (it also rides along with the rest of your user prefs to the server, per-install). You can change the default later from Menu, or skip the prompt entirely and the picker will keep listing every option in its standard order.
The bottom sheet on the full-screen map got a long overflow pass:
Filtered empty states ("nothing matches your filters", "map still waking up", "turn on location for Near me") are spelled out clearly so you're never staring at an empty map wondering whether it's broken.
Saved meets and reminder choices are now mirrored to the server, anonymously, when sync is enabled. Important: this is per-install, not cross-device. Specifically:
installationId and stores it on-device. Phone Safari, the iOS app, and your laptop browser each generate their own id — there is no flow to link them, and the server cannot tell that two installs belong to the same person.savedAtIso wins) when an install pulls its own data back, mostly relevant after a reinstall on the same native shell.The reason the backup exists is so the server knows which installs have saved a given meet, so we can send the meet-change push notifications below. The "see it on another device" use case will need a real account flow before it can work, and that is on the What's next list (sort of — see Roadmap).
The native pull-to-refresh was rebuilt:
Saving a meet now offers a curated set of reminder presets instead of a single time picker:
"Time to leave" is dynamic, not a fixed offset. Every other preset in the list above is a known number of minutes/hours before the meet's start time, so we can schedule it once and forget it. "Time to leave" is different: it computes from your live drive ETA at fire time, not when you set the reminder, so traffic at 6 p.m. on a Friday gets the credit it deserves and the alert lands when leaving now actually means arriving on time.
You can pick any combination; we de-duplicate close-together reminders so you don't get double-pinged.
If you have a saved meet starting soon and you open the app inside the leave-now window computed from your live ETA, you'll get a one-off local notification: "Time to head out — about N min drive." This is not a background poller — it only runs when you foreground the app, so there's no constant location drain. It can also be turned off entirely; see the menu.
detmeets-meet-reminders), so multiple alerts for the same saved meet collapse into one row on the lock screen and in Notification Center instead of stacking up as separate noise. Tapping the group still routes you to the right meet detail page.The native Menu screen was rebuilt around the actually-useful items and trimmed of dev-only ones:
/admin/quality.A few things specific to the iOS app (and the Android shell that's not yet shipped). All of these are no-ops on the plain web.
Tapping a https://detmeets.com/... link from outside the app — Instagram, Messages, Mail, a group chat — now lands you directly in the native iOS app at the right screen instead of bouncing through Safari first.
App.getLaunchUrl() and route to it as soon as the WebView is ready.App.addListener("appUrlOpen")./meet/[id], /saved, /menu, and /map. Links pointing at any other host or any other path fall through to the system browser as before. There's no way for an arbitrary URL to push you into an unexpected app screen.On Android, the hardware back button now navigates browser history. When there's nothing left to go back to, the app minimizes instead of force-closing — so the next time you switch back to it you're where you left off, not staring at a fresh launch screen.
When you bring the app to the front, four short things run in parallel — none of which run in the background:
This is the only time any of those happen automatically. Closing the app puts everything to sleep until next foreground.
The login form was trimmed down to the essentials. Username-only with a single password field. Helper text and unused legacy fields were removed. The form prefers the username autofill hint on iOS so password managers fill correctly.
change-password call. No more "your password updated, but…" half-failures.The first-run notification/location prompt sheet and the smart-reminder prompt are now suppressed on legal and static routes (/privacy, /terms, /support, /download). Linking someone to the privacy page no longer pops a permission sheet over the legal text — that was off-putting and the wrong moment to ask.
When you've previously denied location or notifications and the app needs them — say, you tapped Near me after blocking location, or you want reminders to actually fire — the affordance now opens iOS Settings directly via the app-settings: URL scheme instead of telling you to navigate Settings → Detroit Meets manually. One tap, you're there. (Android falls back to a textual hint until the package-intent path is wired up alongside the Play Store submission.)
/api/report-client-error so production failures land in our logs.TRPCError codes never leak through to a button or a toast.If you're not an organizer or staff member you won't see any of this, but for completeness:
/admin/quality:
A representative slice — most of this is invisible:
car_meet (published, endsAt, startsAt) so upcoming queries hit a single covering index.**PublicMeetListing** payload for home / map / saved screens (no agenda, no audit columns); meet detail keeps the heavier PublicMeet payload.ssr: false)./api/push/register, /api/report-client-error) are now per-IP rate-limited.**/api/config/native-shell** so we can change the native-shell minimum-build threshold without rebuilding the web bundle.**/api/weather** (Open-Meteo proxy), ** (delivery telemetry), ** (cheap precondition check used by the native shell).A few items here that are worth highlighting in the changelog itself; for the full breakdown read the April Transparency Report.
Copy install ID clipboard action from the public menu.3.0 took a lot of late nights, a lot of "wait, is this actually ready" debates with a few patient people, and a lot of bug reports from organizers who tolerated half-broken weather cards while we got the proxy right. If you sent feedback at any point in the last six weeks, you are part of this version.
Detroit Meets on the App Store · April 2026 Transparency Report · @alex.30mm on Instagram
/saved/menu/map**/api/push/opened**/api/meet/[id]/exists**meets** (organizer ops), **quality** (admin telemetry), **sync** (anonymous cloud sync).