Skip to content

Furry Places

Pet-Friendly business directory

Technologies Used

TypeScript
React
Tailwind CSS
Astro.js
Cloudflare Workers
Cockroach DB
Hono.js
tRPC
Claude
PostGIS
Drizzle ORM
Better Auth
Cloudflare R2
VAPID
Firebase
Meta Graph API
n8n
TanStack Query

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_MakePoint with GiST indexing for performance at scale

  • End-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_posts claim-then-post pattern)

Screenshots