Everything below is drafted from the verified numbers and adversarially reviewed. App Store copy lives separately in ios/APP-STORE-LISTING.md; the iOS submit steps in ios/SUBMIT-CHECKLIST.md.
SFGate ran a positive feature on CURB this week — https://www.sfgate.com/local/article/sf-street-sweeping-app-22317534.php — noting SFMTA "has not objected to the app's use of public data" and 2,500+ visitors. The four pieces below turn that hit into momentum; all were adversarially fact-checked against the verified numbers. The two emails are warm follow-ups to the cold pitches in §1 (add the reporter name + send). Mass-send nothing — personalize the greeting.
Subject: SF's posted "2-hour" sweep window is really ~20 minutes — the deeper data
Hi [reporter],
Quick follow-up on the street-sweeping ticket data I sent. SFGate ran a piece on it this week: https://www.sfgate.com/local/article/sf-street-sweeping-app-22317534.php — sharing it just to show the dataset holds up. There's a deeper story their writeup didn't have room for that feels more your speed.
I matched ~815,000 SFMTA street-cleaning citations to the exact block each was written on, about two years of data. The line most people miss: the posted "2-hour" window is really about 20 minutes of real risk — on a typical block, 77% of tickets land in the first 45 minutes. The bigger pattern is where enforcement is surging as the city builds: Mission Bay +107% and the Financial District/South Beach +68% versus five years ago.
Happy to send the full per-neighborhood breakdown, the method, and screenshots — exclusive on the surge angle if useful. A one-line no is totally fine.
The data is public; CURB (curb.guide) just helps people read it — free, no signup. The posted sign is always the final word.
Alejandro Vizio / curb.guide
Subject: SFGate just featured my SF parking-data project — the Mission is the lede
Hi [reporter],
Following up on my earlier note — no worries if it slipped by. One thing that might make this more useful: SFGate ran a feature on it this week (https://www.sfgate.com/local/article/sf-street-sweeping-app-22317534.php).
I'm a solo SF designer/developer in Haight-Ashbury. I pulled SFMTA's public street-cleaning citation data and matched each ticket to the block it was written on. The Mission is the #1 neighborhood by volume: 97,805 street-cleaning tickets over about two years, roughly $10.3M in fines at $105 each, heaviest around 8am on Thursdays.
The posted sign is always the final word — this just helps people read the city's own public data. Per SFGate, SFMTA hasn't objected to the public-data use.
Happy to send the Mission block-level breakdowns, the full dataset, and the method so you can check it. Totally fine if it's not for you.
Alejandro Vizio / curb.guide
X thread — new opener (1/) — replaces the §5 opener; the rest of the thread follows unchanged:
SFGate just covered a map I built of SF street-cleaning tickets. The headline finding: the posted "2-hour" sweep window is really about 20 minutes of real risk. On a typical block, 77% of street-cleaning tickets are written in the first 45 minutes after the window opens. Pulled from ~815,000 real citations, each matched to the block it was written on. Here's what the data shows 🧵 https://www.sfgate.com/local/article/sf-street-sweeping-app-22317534.php
LinkedIn — add-in paragraph (drop into the §6 post):
A quick update: SFGate ran a feature on this project, and per the article, SFMTA supports efforts that increase public awareness and compliance with parking rules and has not objected to the app's use of public data (https://www.sfgate.com/local/article/sf-street-sweeping-app-22317534.php). That means a lot, because the whole point was never to game enforcement — it's to help people actually read the city's own public records before they park. The posted sign is always the final word; this just makes ~815,000 citations legible.
Product Hunt — maker-comment add-in (append to the §2 first comment):
Update: SFGate covered this one, and per the article, SFMTA has not objected to the app's use of public data (https://www.sfgate.com/local/article/sf-street-sweeping-app-22317534.php). Still free, no ads, no signup, no data collection — and the posted street sign is always the final word.
Press-strip one-liner:
Featured in SFGate — https://www.sfgate.com/local/article/sf-street-sweeping-app-22317534.php
Product Hunt description tag (append to the §2 description):
…recently featured in SFGate (https://www.sfgate.com/local/article/sf-street-sweeping-app-22317534.php).
Email signature / pitch P.S.:
P.S. SFGate just covered the project, in case it's useful context — https://www.sfgate.com/local/article/sf-street-sweeping-app-22317534.php
Placement advice for curb.guide itself: the site is intentionally clean and ad-free, so keep any credit quiet — one small "Featured in SFGate" line in the About/footer, never a loud "As seen in" badge near the map (that reads like marketing and clashes with the tool-first feel). If in doubt, leave the homepage untouched and let the credit live on the About page, where someone vetting the project's trustworthiness will look.
Subject: SF's "2-hour" street-sweeping window is really 20 minutes — I have the ticket data
Hi [name],
I pulled ~815,000 SFMTA street-cleaning citations and matched each to the block it was written on. The posted 2-hour sweeping window is mostly a 20-minute reality: on a typical block, 77% of tickets are written in the first 45 minutes after the window opens. Show up at hour two and the truck — and the meter maid — are long gone.
214-255 Steiner St is the clean example: 221 tickets in two years, earliest at 9:00am sharp, median 9:11am, 90% done by 9:21am — on a posted 9-11am sign.
Two more findings in the same data:
- Enforcement is surging where the city is building: Mission Bay +107%, Financial District/South Beach +68% vs five years ago.
- The Mission is the #1 neighborhood by volume: 97,805 tickets, $10.3M, with most written around 8am on Thursdays.
I built this into CURB (curb.guide), a free map that colors every block by when it actually gets ticketed — no ads, no signup, no data collection. I'm one SF resident, not a company; an iOS app ships shortly. (The posted sign is always the final word — I'm just showing what the data does.)
I can hand over the full dataset, the per-neighborhood breakdowns, or screenshots. Worth a look this week?
Alejandro Vizio curb.guide
Subject: SF's "2-hour" street-sweeping window is really 20 minutes — and the Mission pays most
Hi [Name],
Quick one, and it's local data, not a pitch for a company.
I pulled ~815,000 of ~1M SFMTA street-cleaning citations and matched each one to the block it was written on. The posted "2-hour" sweep window is mostly a 20-minute reality: on a typical block, nearly all tickets are written in one short burst right after the window opens — 77% within the first 45 minutes.
Concrete example: the 200 block of Steiner. 221 tickets over two years on a posted 9-11am window. Earliest was 9:00am sharp; the median ticket was 9:11am; 90% were written by 9:21am. The back half of that "window" is effectively decorative.
The Mission is the most-ticketed neighborhood in the city: 97,805 street-cleaning tickets, ~$10.3M, over about two years — heaviest around 8am on Thursdays. The fine is now $105.
I'm a solo SF designer/developer. I built a free map (curb.guide) that colors every block by its next sweep and shows when tickets actually get written — but the story here is the data, and I'd rather hand it to you than promote the map. The posted sign is always the final word; this just shows the gap between the posted window and the enforced one.
I can share the full dataset, block-level breakdowns for any street, or walk you through the method. (Timely: SF suspends daytime sweep enforcement this Friday, Juneteenth, Jun 19.)
Thanks, Alejandro Vizio curb.guide
Subject: SF's posted 2-hour street-sweeping window is really 20 minutes — I mapped 815,000 tickets
Hi [Name],
SF posts a 2-hour street-sweeping window on every block. The tickets tell a different story.
I matched ~815,000 SFMTA street-cleaning citations to the blocks they were written on. On a typical block, 77% of tickets are written in the first 45 minutes after the posted start time — the "2-hour window" is really about 20 minutes of real risk. On 214-255 Steiner (posted 9-11am), the median ticket lands at 9:11am and 90% are written by 9:21am. The fine is $105.
A few more from the data: the Mission leads the city with 97,805 tickets ($10.3M) over two years, mostly around 8am on Thursdays. Enforcement is surging where the city is building — Mission Bay is up 107% and the Financial District/South Beach up 68% versus five years ago.
I'm a solo SF designer/developer. I built a free map of all this at curb.guide — every block colored by its next sweep, when tickets actually get written, plus permit zones and move-your-car alerts. No ads, no signup, no tracking. It also flags that SF suspends daytime sweeping enforcement this Friday for Juneteenth.
Could be a useful "how to stop getting street-sweeping tickets" piece, or a data story. Happy to share the full dataset, per-neighborhood breakdowns, or screenshots.
Thanks, Alejandro Vizio curb.guide
Find the right reporter: search each outlet for recent "parking," "SFMTA," or "transportation" bylines; their email is usually firstname@sfstandard.com / @missionlocal.org, and SFGate writers list contacts on their author page. Send Tue–Thu morning.
Tagline: The free SF map of where parking tickets actually land Description: CURB is a free map of San Francisco street-parking rules. Every block colored by its next street sweep, RPP zones, meters, and move-your-car alerts (calendar + push). No ads, no signup, no data collection. Just tap your curb. Topics: Maps · iOS · Open Source · Civic Tech · Productivity
Maker first comment:
Hi Product Hunt — I'm Alejandro, a product designer in SF, and I built CURB by myself because I was tired of guessing where I could park.
The whole thing is one static page plus a small ser 81A6 verless backend. Free, no ads, no signup, and it collects nothing about you. You tap your curb and it tells you the next street-sweeping time, whether you're in a residential-permit zone, where the meters and color curbs are, and it can ping you (calendar or push) before your block gets swept.
The part that surprised even me: I matched about 815,000 SFMTA street-cleaning citations to actual blocks. The posted window says "2 hours" — but in reality it's more like 20 minutes. On a typical block nearly every ticket is written in the same ~20-minute span right after the window opens (77% land in the first 45 minutes). One block I'll never forget — 214–255 Steiner St, posted 9–11am: 221 tickets over two years, earliest at 9:00am sharp, median at 9:11am, 90% done by 9:21am. So CURB doesn't just show you the rule — it shows you when tickets actually get written.
To be clear: the physical sign on your street is always the final authority. CURB never overrides it — it just helps you read the city's own public data.
What's next: a native iOS app is about to hit the App Store — a polished wrapper of curb.guide with native sweep-alert push (built and verified). I'm just one person, so any feedback means a lot. Thanks for checking it out. 🙏
Gallery captions:
- The whole city, colored by your next street sweep — green is clear, red means move it. Tap any block to read its rule.
- The 20-minute reality: 214–255 Steiner St got 221 tickets in 2 years on a posted 9–11am window — median ticket at 9:11am, 90% written by 9:21am.
- Move your car before the sweeper does. Add a calendar reminder or get a push alert — your choice, no account needed.
- SF suspends daytime street-sweeping enforcement on Juneteenth (Fri, Jun 19) — CURB flags city holidays so you don't move your car for nothing.
- Know your neighborhood: the Mission alone saw 97,805 tickets ($10.3M) over two years, heaviest around 8am on Thursdays.
Evergreen (no date hook — the Juneteenth angle has passed). Post 2–3 hoods/day across launch week; vary the opening line + local stat each time or Nextdoor flags duplicates as spam. Post in your OWN hood first and reply fastest there. One bare curb.guide mention auto-links. Title: Mapped where street-sweeping tickets actually hit in [Neighborhood] — does this match your block?
Mission
Neighbor here. I got one too many sweeping tickets, so I went through SF's public citation records for our blocks — and what surprised me: the tickets don't fall evenly across the posted 2-hour window. They cluster into about 20 minutes, when the truck actually passes. In the Mission that's heaviest around 8am on Thursdays — about 97,805 tickets over the last ~2 years ($10.3M in fines), the most of any SF neighborhood. The fine's $105 now, so it adds up fast.
I put it on a free map so you can check your own street: curb.guide — tap your block for its posted schedule, roughly when tickets really happen, and a reminder before the truck comes. No signup, no ads. The posted sign is always the final word. Does it match your block?
Sunset/Parkside
Neighbor here — I matched SF's public ticket records to our blocks. Out here the pattern's a little different from the rest of the city: tickets cluster on Tuesdays, right around noon. Over the last ~2 years that's about 64,201 tickets and ~$6.7M in fines around Sunset/Parkside, $105 each. The catch is they fall in a ~20-minute window when the sweeper passes, not across the full posted 2 hours.
Made a free map so you can check your own street — curb.guide, no signup. Tap your block for its schedule + a reminder before the truck. Posted sign always wins — curious whether it lines up with what you've seen.
Portola
Neighbors — I went through SF's public citation data for our area. In the Portola the sweeping tickets lean toward Tuesdays and skew early, around 7am — so the early sweep is the one to watch. About 10,934 tickets and ~$1.1M in fines here over the last ~2 years, $105 a pop. They cluster into ~20 minutes when the truck comes through, not the whole 2-hour window.
Built a free map of every block's schedule so you can check yours — curb.guide, no signup, no ads. The posted sign is the final say. Sharing in case it spares someone a ticket.
Seacliff
Neighbor here — quieter corner than most: about 5,208 tickets and ~$550k in fines over the last ~2 years in Seacliff. The pattern's Mondays around 9am, and like everywhere they cluster into ~20 minutes when the sweeper passes, not the posted 2 hours. The fine's $105 now.
Made a free map of every block's sweep times — curb.guide, no signup. Always defer to the posted sign. Posting in case it's useful here — does it match your street?
These build account standing before/around the Juneteenth PSA so your account isn't 100% self-promo. Do not mention curb.guide in any of these.
On a "got a ticket at 9:40 even though the sign says 9–11" thread:
Sucks, but unfortunately the sign is the rule and you were technically parked during the posted window. The catch nobody tells you: the sweeper usually comes through right when the window opens, and enforcement tends to follow it almost immediately. On most blocks the tickets cluster in the first 20-ish minutes after the start time, not spread across the full two hours. So a 9-11am sign realistically means "be gone by ~9:15," not 11. Move it before the start time and you're basically never caught. Appealing rarely works if the sign was posted, sadly.
On a "just moved to the Mission, how do I avoid tickets" thread:
Welcome. Few things that'll save you real money: 1) Learn your block's street-cleaning days cold — that's the #1 ticket in the city by far, and the Mission is the single worst neighborhood for it. Cleaning mornings around your area skew early, like 8am, and Thursdays tend to be heavy. 2) Check if you're in an RPP (permit) zone and get the residential permit if so. 3) Set a recurring phone alarm the night before each sweep day. Honestly the alarm is what keeps most of us out of trouble. The signs are always the final word, so read each one when you park.
On a "does street cleaning run on [holiday]?" thread:
SF suspends daytime street-sweeping enforcement on about a dozen city holidays (New Year's, Juneteenth, Labor Day, Thanksgiving, etc.), so you generally don't have to chase the sweeper those mornings. One caveat: holiday suspensions cover street cleaning, but they don't automatically cover metered parking, RPP time limits, or tow-away/peak-hour zones — those can still be enforced. SFMTA's official holiday enforcement schedule is the authority here, so it's worth a 10-second check for your specific spot. And as always, if there's a sign saying otherwise on your block, the sign wins.
Holiday PSA (reusable): before the next city holiday, post a text PSA (no link) — "No daytime street-sweeping enforcement on [holiday] ([date])" + the metered/RPP caveat above. Evergreen template; fill in the next holiday.
1/
San Francisco posts a 2-hour street-cleaning window on every block.
I matched 815,000 SFMTA tickets to the blocks they were written on.
It's not 2 hours. It's ~20 minutes. 🧵
2/
Take 214–255 Steiner St. Posted window: 9–11am.
Over 2 years: 221 tickets. Earliest at 9:00am sharp. Median ticket at 9:11am. 90% written by 9:21am.
The second hour of that "window" is decorative.
3/
And it's not just one block. Citywide, 77% of street-cleaning tickets are written in the first 45 minutes after the window opens.
"I'll move it before 11am" is exactly how you get a $105 ticket.
4/
So I built CURB — a free map of every SF block, colored by its next sweep, showing when tickets actually land. Plus permit zones, meters, and move-your-car alerts (calendar or push).
No ads. No signup. No account.
curb.guide
5/
Two more things in the data:
— Enforcement is surging where the city's building: Mission Bay +107%, FiDi/South Beach +68% vs 5 yrs ago. — The Mission leads the city: 97,805 tickets, $10.3M, mostly ~8am Thursdays.
6/
I'm one person in SF who got tired of doing the parking math in my head.
It's free, it's live, and a native iOS app is about to hit the App Store.
curb.guide — RT if it'd save a friend a ticket. 🚗💨
7/ (P.S.)
CURB also flags city holidays — when SF suspends daytime sweep enforcement (Juneteenth, Labor Day, Thanksgiving…), it tells you, so you don't move your car for nothing.
Your street-cleaning sign says 9–11am. The tickets say 9:11am.
I'm a product designer in SF, and I kept getting street-cleaning tickets. So I did what designers do when something feels wrong: I went to the data.
I matched ~815,000 public SFMTA street-cleaning citations to the blocks they were written on. The finding surprised even me — the posted "2-hour" window is mostly a ~20-minute reality. On a typical block, 77% of tickets are written in the first 45 minutes after the window opens. On 214–255 Steiner St (posted 9–11am): median ticket at 9:11am, 90% done by 9:21am.
So I built CURB (curb.guide) — a free map of every SF block, colored by its next sweep, showing when tickets actually get written, plus permit zones, meters, and move-your-car alerts. One static page + a small serverless backend. No ads, no signup, no data collection.
One principle I held the whole way: the posted physical sign is always the final authority. CURB never claims to override it — it just helps you read the city's own public data.
It's live, it's free, and a native iOS app is about to ship. If you're in SF, it might save you a $105 ticket. And if you're a maker: the most useful things often start as a personal annoyance plus a public dataset nobody bothered to read.
curb.guide
#SanFrancisco #ProductDesign #CivicTech #BuildInPublic
Note: PH lets you self-hunt now — you don't need a hunter, and self-launching gives you full control of timing + the maker comment. A well-followed hunter only helps with extra reach. If you want one, here's a humble DM:
To a maker/hunter you genuinely admire (X or PH DM):
Hey [name] — I really like [a specific thing they made/hunted]. I'm launching CURB on Product Hunt [date]: a free map of SF street parking that reverse-engineers ~815k matched tickets to show when each block actually gets ticketed (turns out the posted "2-hour" street-cleaning window is really ~20 minutes). Solo project, no ads, no signup. Would you be up for hunting it — or honestly just taking a look on launch day? Totally fine if not. Either way, thanks for the stuff you put out. — Alejandro (curb.guide)
Keep it short, name something specific of theirs, and give them an easy "no." Don't mass-send.
Night before
- Schedule the PH launch for 12:01am PT (PH days start at midnight PT — launching early = a full day on the leaderboard).
- Listing ready from the kit: tagline, description, topics, gallery images, maker first-comment.
- Line up 5–10 people who'll genuinely check it out in the morning. Never ask for upvotes (PH penalizes vote solicitation) — ask them to "take a look and leave feedback if it's useful."
- Clear your morning. Confirm the Google Maps tile quota cap is set (worst case the basemap falls to CARTO under a traffic spike — site stays up).
12:01am — Product goes live → immediately post the maker first-comment. 7–8am — Fire the X thread (post 1/, then the rest threaded). Post the LinkedIn post. In both, say "we're live on Product Hunt today" + link. 8am–12pm — Reply to every PH comment within minutes (engagement velocity drives ranking). Reply to X/LinkedIn replies. Share in any communities/Slacks you're genuinely part of. 12pm — Midday push: quote-tweet your own thread with any milestone ("#X of the day," a nice comment, a traffic stat). Afternoon — Send/follow up the 3 press emails if not already out. Keep replying everywhere. Watch Vercel analytics for the spike. Evening — Post a genuine thank-you comment on PH; a short recap tweet.
PH rules to not trip: don't say "upvote/support us" anywhere; don't vote-trade; engage authentically and fast. That's the whole game.