Privacy

The short version: Freebee stores only what it needs to let you give and receive things, and we don’t share your data with advertisers or analytics providers.

The long version is below — what we collect, where it’s stored, and which third parties touch it.

Your account

WhatWhere it livesWhy
Name, email, cityOur Postgres database (hosted on Vercel)To identify you, send you account email, and show your freebies to neighbours in the same city.
Phone number — optionalOur Postgres databaseIf you add one at signup, it lets the first three people in line on your freebie reach you on WhatsApp instead of by email. Leave it blank and those people get an email button instead. Only people in the top 3 of a line on one of your freebies see it, and only while that freebie is active.
Passkey credential — public key, credential ID, device metadataOur Postgres databaseTo sign you in. Your biometric and the matching private key never leave your device — we only see the public half.
Recovery codes (hashed)Our Postgres databaseSo you can recover your account if you lose every passkey. We store one-way hashes; the plaintext is shown to you once and never re-displayable.
Email verification tokensOur Postgres databaseShort-lived tokens emitted when you click the verification link in your email. Discarded after use or expiry.
Default pickup details (location, time window, notes) — optionalOur Postgres databaseIf you tick “save these as my defaults” when accepting an offer, we keep them on your user row so future accepts pre-fill. You can change or clear them by entering new defaults on the next accept.

Things you post

WhatWhere it livesWhy
Freebies you post — title, category, description, photos (up to 6) with per-photo alt text, neighbourhood, conditionPostgres (text) + Vercel Blob (photos)To show your freebie to other users, and to make each photo usable for screen-reader users via its alt text. We also build a full-text search vector over these fields so other neighbours can find it.
Exact pickup spot you attach to a freebie (label + coordinates) — optionalOur Postgres databaseIf you enter an optional pickup spot, we store that text with your freebie. The website currently accepts manual text only and does not send it to an address-search service. The mobile apps can also save coordinates when you choose an address. Leave the field blank and we store nothing — the coarse town is enough.
Tags on your freebie — from the tags field, or #hashtags in your textOur Postgres database (tags + item_tags tables)To make freebies filterable by #tag and to populate the popular-tag chips on the recents and post pages. Tag slugs come only from what you typed — we don't infer extra tags about you.
Offers you make on others' freebiesOur Postgres databaseSo the freebie's owner can see who's interested, in first-come-first-served order, and pick a recipient. If you're in the top 3 of the line, you can also message the owner directly via WhatsApp or email — those messages go through your own WhatsApp/mail app, not our servers.
Pickup details an owner attaches when accepting your offerOur Postgres databaseSo the chosen recipient can see where, when, and how to pick the freebie up. Visible only to that recipient and the owner.
Freebies you favouriteOur Postgres database (favorites table)To populate your /saved page and remember which hearts to render as filled. Other users can't see what you've saved.
Saved searches (city, category, query) and the alerts they produceOur database (saved alert preferences and alert history)To send you offer, acceptance, and saved-search alerts. Only you can see your alerts.
Browser push subscriptions (endpoint, p256dh, auth, user-agent)Our Postgres database (push_subscriptions table)If you opted into browser push, we keep the push endpoint so we can dispatch the same alerts to your device's system alert tray. Dead endpoints are pruned automatically when delivery fails.
App push tokens (Expo push token, platform) — Freebee app onlyOur Postgres database (expo_push_tokens table)If you turn on alerts in the Freebee app, we keep the device's push token so the same offer, acceptance, and saved-search alerts reach your phone. Deleted when you sign out, turn alerts off, or remove the app (dead tokens are pruned when delivery fails).
Reports you file about a freebieOur Postgres database; available only to the four-author moderation teamFor moderation. We retain your identity with the report so the team can follow up if needed. Dismissed reports remain in the moderation history with the dismissal time and the author who handled them; dismissing a report does not delete it.

Operational data

WhatWhere it livesWhy
IP addressUsed transiently as a rate-limit key in Postgres; rows older than the longest window (~1 hour) are pruned.To stop abuse of public endpoints (login, signup, email send).
Session credentialAn HTTP-only cookie on your browser — or, for clients signing in through our API (such as a future mobile app), the same signed value held by that client instead of a cookieTo keep you signed in. No tracking, no third-party analytics cookies.
Server logsVercel runtime logs (retained per Vercel's policy)Debugging and security. Logs include request metadata; we try not to log sensitive payloads.

Third parties

WhatWhere it livesWhy
VercelHosting, Postgres, Blob, runtime logs, AI GatewayOur infrastructure provider. Subject to Vercel's privacy policy.
Vercel AI Gateway → Anthropic ClaudeAI-assisted freebie descriptions and photo alt textWhen you use “Describe this with AI” on /post, we send your (downsized) photos and any draft text you've typed to Anthropic via Vercel AI Gateway. The model returns a suggested title, category, condition rating, description, tags, and screen-reader alt text. We also ran a one-time backfill on freebies posted before the alt-text field existed: each pre-existing photo was sent to the same model to mint alt text retroactively. We don't persist anything on Anthropic's end — but the requests are processed by them.
Web Push providers (Mozilla autopush, Apple APNs, Google FCM, etc.)Browser push deliveryWhen you opt into browser push, your browser hands us an endpoint URL pointing at its push provider. To deliver an alert we sign a request to that endpoint with our VAPID key. The payload is end-to-end encrypted to your device — the push provider only sees ciphertext.
Expo push service (→ Apple APNs / Google FCM)Push delivery for the Freebee appApp alerts are relayed through Expo's push service to Apple or Google. Unlike browser push, Expo processes the alert text (title and body — e.g. a freebie's name) in transit along with the device token. Only applies if you turned alerts on in the app.
ResendOutbound and inbound emailWe hand your email address and message bodies to Resend so they can deliver mail on our behalf. This covers account mail (verification links, passkey and recovery-code security notices), replies forwarded back to the original sender, and — only if you turn them on under Alerts — opt-in alerts when someone offers to take your freebie, when your offer is accepted, when a new freebie matches a saved alert, and when a freebie you were in line for becomes available again. These alert emails are off by default and only ever sent to a verified address; manage them any time on the Alerts page.
OpenStreetMap (Nominatim geocoder)Optional “exact pickup spot” address search on /postWebsite pickup-address autocomplete is currently disabled: typing in that field sends no requests to Nominatim. Other explicit place lookups may use our server proxy, which sends the search text and app identifier without account information. Subject to the OpenStreetMap Foundation's privacy policy.
Apple / Google geocoders (mobile app only)Optional “exact pickup spot” address search in the Freebee appThe iOS and Android apps use the device's built-in geocoder (Apple's on iOS, Google's on Android) instead of OpenStreetMap when you tap “Find address” on the pickup-spot field. The address text you typed is handled by that platform service under its own privacy policy; we never send your device location, and if you don't use the search, nothing is sent.
Google FontsSelf-hosted at build time via next/fontFonts are downloaded at build and served from our origin — Google does not see your visit.

Your choices

  • Delete your account from your profile page, or from the Me tab in the mobile app. Either way removes your user record, passkeys, recovery codes, offers, favorites, saved alerts, alerts, push subscriptions, and freebies.
  • Disable browser push at any time from the toggle on Alerts. Your stored subscription is dropped from our DB on disable.
  • Remove individual saved alerts from the same page.
  • Photos uploaded to Vercel Blob are deleted when the corresponding freebie is removed.
  • For anything else, contact us.

Freebee is a small project, not a company. This page describes what the code actually does — if you spot a discrepancy, please tell us.