iOS 17+ · SwiftUI · Next.js · Neon Postgres + PostGIS · Stripe · App Store review
BRYKK Local
The neighborhood marketplace where nobody pays to be a neighbor.
BRYKK Local is a neighborhood marketplace built around safe, in-person meetups. Browsing takes no account at all. Posting takes about twenty seconds. Listings show as an approximate area rather than an address, chat happens in-app so phone numbers stay private, and suggested meeting spots — fire stations, police departments, libraries — are one tap away. Underneath it runs a population-priced business alert system that never touches the consumer experience.
- SwiftUI (iOS 17+)
- Next.js 16 (App Router)
- TypeScript
- Neon Postgres + PostGIS
- Upstash Redis
- Vercel Blob
- Stripe
- APNS
- Resend
- Cloudflare DNS

Origin
How it started
I started with a delivery network for one town and learned the thing I actually had was a location engine and a trust problem. People do not mostly want a stranger to drive their groceries; they want to sell the crib in the garage without meeting someone sketchy in a parking lot. So I rebuilt around that: the marketplace is the product, safety is the feature, and the meetup is the moment that matters. I am a firefighter, so the safe-spot list was not a growth idea — it was the first screen I designed.
Features
What it does
Browse without an account
The feed, the map, search, and every safe-spot detail work with no sign-up at all. An account is only required to post, message, or start a meetup. Removing the wall in front of browsing removed the single biggest reason people bounce off a marketplace with no listings yet.
Meet Safely
Propose a public meeting spot from an OpenStreetMap-sourced list of fire stations, police departments, and libraries. The other party accepts, both get directions, and neither ever sees the other's home. This is the feature the whole app is arranged around.
Location privacy by architecture
A listing's position is a hash-offset point placed roughly 150 to 350 meters inside a 500-meter map circle — never the real address, and stable enough that it doesn't jitter between loads. There is no setting to turn this off because there is no mode where the true point is stored for display.
Six kinds of post, one feed
Sale, free, request, event, garage sale, and food truck all share a feed and a map. Requests invert the marketplace — instead of hunting for a listing, you post what you need and let neighbors come to you. That inversion is also what the business layer listens to.
Transaction-gated reviews
A seller marks an item sold and picks the buyer; only then can either side review. Reviews stay hidden until there are at least two. One report hides a listing pending human review, blocking is one tap, and a moderation queue backs all of it. Ratings mean something because they cost a real exchange to produce.
BRYKK Local Pro — the business layer
Local service businesses declare what they do and where they work, then get an instant push and email the moment a neighbor posts something matching. Coverage is priced by how many people are inside the circle they draw rather than by miles, so rural reach stays cheap and dense cities cost what they actually reach. Businesses pay on the web; consumers never pay anything, ever.
Under the hood
Engineering
Geography as a priced primitive
The US is divided into roughly 2,486 market zones mapped to Census PUMAs, each holding on the order of 100,000 to 200,000 people — neighborhood-sized in a dense city, multi-county in rural Missouri. Loading 2,486 zone polygons and 85,528 census tracts into PostGIS meant coverage could be priced by population rather than area, which is the only way one flat national price is fair in both Manhattan and Cass County. Zones auto-name themselves and all went live on day one.
One subscription, many inline prices
Every business is one Stripe customer with one subscription carrying many independently priced line items, each built as inline price_data rather than a shared catalog product. That means genuinely per-customer pricing with no catalog explosion and no conflicts, all landing as a single itemized monthly invoice. Items can be added or dropped anytime and Stripe prorates. The billing path was proven end to end in sandbox — 11 of 11 tests — before anything shipped.
Built to run without me
A hard requirement from the start: no step in the business funnel can require the founder. Purchase is self-serve, matching is automatic, zones name themselves, and scarce one-of-one slots are enforced by a database unique index rather than application logic — double-selling is physically impossible, not merely unlikely. The entire revenue layer sits behind a single flag so the consumer app could ship while billing stayed dark.
Hand-rolled everything
SwiftUI on iOS 17+ with no third-party UI framework and a full custom design system. Auth is scrypt password hashing with sha256'd 90-day bearer tokens held in the iOS Keychain. Push is APNS with a team .p8 key, delivered after the response commits so a post can't notify before it exists. Photos on Vercel Blob, rate limits in Upstash Redis, mail through Resend, DNS on Cloudflare.
What's possible
Neighbors first, couriers later
The consumer marketplace is not the business — it is the demand engine. Every free request a neighbor posts is a signal a local business would pay to hear in real time, and the value of that signal rises with the density of the neighbors rather than with anything I sell them. Delivery is where this goes next, but only once that density exists: any user who wants to can offer to courier for someone else, entirely their choice and never an assignment, with matching switched on per area as drivers actually accumulate there. Launching with delivery meant recruiting both sides of a market in a town that had neither. Earning the neighbors first means the couriers are already standing in the room.