Loading post…
Loading Detroit Meets…
Loading post…
This report covers everything else since the project started, so it's the whole history in one place: what we collect, what we removed, who we rely on, and any government or legal request we received.
The period is March 25, 2026, the day of the first commit, to November 1, 2026.
If you're curious about a specific month or any other period, I'm happy to provide a report for it at any time.
The period is 186 commits: 39 in March, 73 in April, 25 in May, 9 in June, 30 in July, 9 in August, 1 in September, and none since. Hashes are from the repo, in case you want to diff it yourself.
| Date | Ship |
|---|---|
| March 25 | Initial commit (0bd7d6e). |
| March 26 | Listings, admin, and production hardening (20be74c). Blog and client error reporting (9032196). Staff sign-in with provisional passwords that must be changed on first login (16b8fcf). Audit log detail (f7637a2). Introduction blog post (d8b5d75). Public beta notice in the footer and on meet pages (111748d). Vercel config (da34180). The database client was pointed at a Supabase pooler and then moved to Neon serverless the same day (ed0ec58, 74411e8). Link-preview share image (6bf2522). |
| March 27 | Calendar subscription feed copy, Community Pick flag (cce8a0c). |
| March 28 – 31 | No commits. |
| Date | Ship |
|---|---|
| April 1 | Capacitor iOS shell added (e3805d9). Charity badge for organizers (02f5396). Staff session list and revoke through Better Auth (6932b81). Add-to-calendar fixed for iCal and Outlook (a649c67). Privacy Policy updated for the iOS app and Vercel hosting (bba8e4b). |
| April 2 | Server-side HTML sanitization with sanitize-html (484eded). ICS files open in the system browser (dcc7ada). |
| April 9 | "Copy iCal" action, native iOS styles and components (4f68c45, fac3c3d). |
| April 19 | Drizzle migrations 0000 to 0005 committed, with agenda items and "Time TBD" meets. Privacy and Terms pages, a Support page, pull-to-refresh and haptics (377c4af, ca4c962, 844ef66, 30913fe). |
| April 20 | Catbox uploader policy added to the Privacy Policy and Terms (36a5fcf, beb837c). |
| April 21 | Full-screen map and native location integration, with iOS location and notification disclosures (58e3f78, 0152862). |
| April 22 | App Store launch. iOS project at marketing version 2.1, build 7 (e432576, edb3c3a). Native Apple Maps driving ETA (061e625). Blog featured-post notifications (abe65bb). Legal docs updated for the App Store (2d77820). |
| April 23 | APNs push support and migration 0006 (4c9152f). Featured-post push workflow replaces the Vercel cron (29f8c9d). |
| April 24 | Featured push now dispatches after a Vercel production deploy (d71fdfc). Download page. Android Capacitor shell added (f29b32f, 7950a36). 2.3 changelog. |
| April 27 | Capacitor App plugin and native-shell thresholds resolved at runtime (910fe21, dc847b1). Migrations 0007 and 0008. |
| April 28 | iOS release signing, Waze directions, UX polish across meet, map, menu, and account screens (16cb0cd, 71a7ddb, 1dc9e59). |
| April 29 | 3.0. Runtime geocoding removed and car_meet index added (d105f8e, migration 0009). 3.0 changelog and April transparency report (4fee385). |
| April 30 | 3.1. Public meet submissions, a staff moderation queue, and status pushes to submitters (dad7b2e, migration 0010). Privacy Policy and Terms updated for submissions (79d3628). Offline meet detail and a service worker (a42724c). |
| Date | Ship |
|---|---|
| May 6 | 3.2. Permissions-driven staff controls and richer audit logs, migrations 0011 to 0017 (64c38d3). Privacy Policy update for permission flags and internal notes (4c9b5f5). |
| May 7 | Copy-from-meet templates in the admin meet form (0787b94). |
| May 11 | Security and reliability audit, tiers 0 to 7 (b1b8fc1). CSP image source widened to https: (7345e81). |
| May 14 | 4.0. Offline caches, the inbox, Live Activities, MapLibre, /status and /api/health, and migrations 0018 to 0027 (d4b2e12). Alternate app icons removed the same day (9782ecd). Site announcement (14c30d1). Detroit Grand Prix community pick (90042bc). Inbox mark-read (c847326). Cron and APNs error handling (b9cbef2). |
| May 21 | 4.1. Instagram AI prefill and the "Near me" sort (70ae79d, b2066a0). Featured-post push dedupe on device (c865931). Privacy Policy and Terms updated. |
| Date | Ship |
|---|---|
| June 1 | May transparency report published (9fc1d08). |
| June 2 | 4.2. Leave-by alerts without a Live Activity, saved-meets calendar download, editorial spotlight, sun card, migrations 0028 to 0030 (f8be783, 26f8558). Privacy Policy updated. |
| June 8 | Three Dependabot bumps (@types/react, Better Auth 1.6.14, Capacitor CLI 8.4.0). |
| June 9 – 30 | No further product commits. |
| Date | Ship |
|---|---|
| July 8 | Prerender and submit-status fixes, address autocomplete and device-location reliability (60d3be2, 8db0afa). |
| July 9 | Support page redesign, tabbed meet-form wizard, sharper Instagram prefill (559de45, e501e9b, 28e9a9a). |
| July 10 | 4.3. Map reach mode and the related-meets rail removed (24e898f). Full-text search (migration 0031), anonymous flyer upload, offline ETA, saved-meet auto-purge (5b39e04). Auto-archive defaulted to one day (b55c6ea). Privacy Policy updated. |
| July 11 | 4.4. Live Activity, keyboard zoom, and toast fixes (bcb22bf). Admin Stats page, then restricted to site administrators (735e2bb, 265d210). Live Activities kill switch (c01ea74). |
| July 13 – 16 | Woodward Dream Cruise community pick (dc4bf1e). Blog posts categorized as story or update (c1e5e96). |
| July 25 – 26 | Dependency merges only. |
| Date | Ship |
|---|---|
| August 1 – 29 | No commits. |
| August 30 | 4.5. Live Activities removed, migration 0032 (9edae05). Map retinted to neutrals (d77640e). Native versions synced to 4.4 (95597fc). Leave-by alerts scheduled through QStash, migration 0033, cron cut to hourly (302e8a4). Public API v1 (996f81f). 4.5 changelog and July report published (975c70b). iOS deployment target and Info.plist cleanup (ed9af3f). Privacy Policy and Terms updated. |
| Date | Ship |
|---|---|
| September 1 | Better Auth upgraded from 1.6.14 to 1.7.2, with migration 0034 adding account.issuer (a41d78c). |
| September 2 – 30 | No commits. |
| October 6 | The Privacy Policy now names Upstash QStash in Section 9 and lists what each scheduled job carries. The August and September reports were published the same day. |
| October 7 – November 1 | No commits. |
There's no anonymous telemetry beacon and no third-party analytics SDK in the app or on the site. That was true at the start of May and it's true now. This is the full list of what the server receives, as of November 1.
Standard web request data that any server sees: IP, user-agent, the page you asked for, and the referrer if your browser sent one. Vercel keeps it in short-lived access logs. We don't aggregate it, sell it, or build a profile from it. Cookies are limited to what staff login needs, like CSRF protection. No advertising or third-party cookies.
An opaque APNs device token, an opaque installation identifier we generate on first launch, the platform, and your permission state. No email, name, IP, or device fingerprint.
Each install gets its own identifier. With sync on, the server stores saved meet ids and when you saved them, your reminder choices, a small snapshot copied from the public listing so saved meets render offline, a last-seen time, the platform, and an app version string. Since June sync is on by default in current builds, though operators can switch it off.
Sync was never cross-device by default. Two devices are two unrelated installs. Since May 21 you can copy a sync ID from one device and paste it into another, but nothing links installs unless you do that yourself.
Since May, with sync on, the server also holds inbox rows (kind, title, body, deep link, optional meet id, read time) and in-progress submit drafts, both keyed to your installation id. Inbox rows older than 90 days are deleted every night.
Your device asks our own /api/weather endpoint, and our server asks Open-Meteo for the forecast at the meet's coordinates and start time. Open-Meteo sees our IP and the meet's location, never yours.
One short call records the notification id, its category, and an opened time. It isn't attached to your installation id.
When a page crashes inside the React error boundary, the browser posts the error message, error name, a short digest, a truncated stack, and the page URL to /api/report-client-error, which writes it to our server logs. No DOM contents, form data, cookies, headers, or IP address are in the payload.
One call to read the minimum supported build number. It sends no identifiers.
When you save a meet and turn on leave-by alerts, your device sends an integer for estimated drive minutes. Never coordinates. Since August 30, we use that number to schedule two delayed jobs through Upstash QStash, one early alert and one urgent alert. Each job carries your installation id, the meet id, and which alert it is. QStash calls a signature-verified route on our server when the job comes due and we send the push through Apple. We keep the two QStash message ids on your leave-by row so a fresh drive time can cancel the old jobs.
Public submissions without an account started April 30 (3.1), with a honeypot, rate limiting, and a kill switch. Submitter contact details are stored for moderation, visible only to administrators, and never shown publicly. Your IP is used only as a short-lived rate-limit key and isn't stored with the submission (see the audit section below for when that wasn't true). If you attach a flyer, our server mirrors it to Catbox, so Catbox sees our IP and not yours. The public status lookup at /submit/status returns rows that match the contact detail or sync ID you type in, so treat those like lightweight credentials.
Search queries (capped at 120 characters) are run against Postgres and not written to any table. The public API at /api/v1 returns only fields that are already public on the site. We don't issue API keys, so there's no account to tie requests to.
Organizer accounts are username-only, with no email or real name required. Sign-in runs on Better Auth in our own database. Staff accounts can carry permission flags and internal notes that only administrators see. The admin stats page shows SQL counts, not individual visitor records.
Near me and map distance sorting keep approximate coordinates in memory on the device. We don't log your live location to Postgres. Saved-meet auto-removal, the last-known drive-time cache, your theme and palette, and the offline tile cache are all local to your device. Sunset and golden-hour times are computed on the device from public venue coordinates.
FEATURE_ETA_CONFIDENCE flag (July 10).FEATURE_LIVE_ACTIVITIES kill switch. Migration 0032 dropped the table and the token column, so those records no longer exist on our side. I'd rather delete a feature than keep storing tokens for it.remote-notification, which push needs./status page, and health check (May). The status page and /api/health report aggregate probes only..ics back. No installation id in the request./developers (August). Documented in the Terms under Section 6a.As of November 1, 2026. The render path is what loads when a typical visitor browses meets, the map, or a meet page without submitting anything.
On the render path:
*.basemaps.cartocdn.com. Your device fetches them directly. We pass no installation or sync id to CARTO.Off the render path, only when you do something specific:
/submit.We don't use Google Analytics or any analytics SDK, Meta, TikTok, Twitter, or LinkedIn pixels, Sentry, LogRocket, FullStory, or any session replay, Mixpanel, Amplitude, PostHog, or Segment, any ad network or data broker, or Mapbox or Google Maps tiles in production.
The August 30 Privacy Policy described leave-by scheduling but never named Upstash or said what each scheduled job carries. It should have. The August and September reports both flagged it, and it was fixed on October 6, 2026: the Privacy Policy now names QStash in Section 9 and lists exactly what each job contains. It's the one Privacy Policy change in October.
Privacy Policy updates are dated April 1 (iOS app and Vercel hosting), April 20 (Catbox uploads), April 22 (App Store launch, CCPA statement, Neon named), April 23 (push notifications), April 28 (sync and Open-Meteo), April 30 (public submissions), May 6 (staff permissions and internal notes), May 13 and 14 (Live Activities, leave-by alerts, inbox, rate limits, share extension, health endpoints), May 21 (sync linking, submit status, address suggestions on the public form), June 2 (leave-by without Live Activity, calendar download), July 10 (appearance preference, saved-meet auto-removal, drive-time cache, tile cache), August 30 (Live Activities removed, leave-by scheduling, public API), October 6 (QStash named), and November 1 (public flyer uploads, search, and Cloudflare disclosed, plus retention and deletion requests). The Terms changed on April 22, April 23, April 30, May 13, May 21, August 30, and November 1. The full history is in the accordion on the Privacy Policy page.
If we receive any of the above, the next report will say so. If we're ever gagged from saying so, this block will simply stop appearing.
What changed:
/api/push/register (40 a minute per IP) and /api/report-client-error (24 a minute) in April.0034 for staff sign-in.If you find a security issue, message @alex.30mm on Instagram.
Before publishing this I audited the code against the Privacy Policy and this report. Everything below was fixed before this went out.
0000 through 0034): 11 in April, 17 in May, 3 in June, 1 in July, 2 in August, 1 in September.Most of what I added since March stores nothing new or stores it on your device, and the biggest single change was a deletion. The vendor miss is the part I'd undo if I could. Still no ads, no analytics SDKs, and no sale or sharing of your information.
If something here is wrong or missing, message @alex.30mm on Instagram.
Effective: November 1, 2026 · Period covered: March 25 – November 1, 2026 (published November 1, 2026)