Furry Places
Pet-Friendly business directory
Technologies Used
Main Contributions
Furry Places
A full-stack, pet-friendly establishment finder with geospatial search — built as a Bun-based monorepo spanning a native mobile app, two Astro web apps, and a Cloudflare Workers API.
What it does
Furry Places helps pet owners discover pet-friendly restaurants, cafes, hotels, and parks near them, and has grown into a broader community platform:
Geospatial discovery — search and browse pet-friendly establishments by location, with map views and distance-based filtering (PostGIS + PostGIS GiST indexes)
Community events — create, browse, and register for pet-related events, with sponsor listings and automated reminder emails
Missing pet reports (Pet Finder) — report and search for missing/found pets, with automatic expiry and renewal reminders
Animal shelters directory — browse and (for shelters) manage listings, subject to admin approval
Reviews & photos — user-submitted reviews and photos with a full moderation pipeline (reports, strikes, bans)
Notifications — opt-in email (Resend) and web/mobile push (VAPID + Firebase Cloud Messaging) for events, missing pets, and moderation outcomes
Automated data ingestion — a self-hosted n8n pipeline discovers new pet-friendly places via Google Places / OpenStreetMap, enriches them with Claude, and feeds them into an admin approval queue
Social auto-publish — newly verified establishments, published events, and approved shelters are automatically posted to Facebook and Instagram via the Meta Graph API
Architecture
A 5-package Bun monorepo:
mobile
Stack: React Native 0.86, Expo 57, Expo Router, Zustand, TanStack Query, Mapbox
Purpose: iOS/Android consumer app
web
Stack: Astro 5 (SSR), React 19, Tailwind, MapLibre GL
Purpose: Public-facing web app
admin
Stack: Astro 5, React 19, Tiptap, Recharts
Purpose: Moderation & operations dashboard
workers
Stack: Hono.js, tRPC, Drizzle ORM
Purpose: API, deployed to Cloudflare Workers
shared
Stack: tRPC client + Zod schemas
Purpose: Shared types/contracts across all clients
Backend: Cloudflare Workers running Hono + tRPC, backed by PostgreSQL/PostGIS (production on pooled CockroachDB via Cloudflare Hyperdrive), R2 for media storage, and KV for caching.
Auth: Better Auth — email/password, Google OAuth, anonymous sessions, bearer tokens for mobile, plus an admin plugin for roles/bans/impersonation.
API communication: End-to-end type-safe tRPC. Web/admin talk to the API through a same-origin proxy so auth cookies stay first-party; mobile uses bearer-token auth directly.
Highlights worth calling out
Same shared Zod/tRPC contract drives three different clients (mobile, web, admin) with zero API drift
Geospatial search built on PostGIS
ST_DWithin/ST_MakePointwith GiST indexing for performance at scaleEnd-to-end moderation system: user-submitted content flows through reports → strikes → temp/permanent bans
LLM-assisted data pipeline (n8n + Claude) for autonomously discovering and structuring new establishment listings
Multi-channel notification system (email, web push, mobile push) with dedupe/idempotency baked in (
notification_sends,social_postsclaim-then-post pattern)