A modern, open-source pet adoption platform and community hub connecting shelters, rescues, and potential pet parents. Built with Next.js for SEO-first rendering and deployed on Cloudflare Pages.
π Live Site: adoptdontshop.xyz
- π Advanced Search & Filtering β Find pets by type, breed, age, location, and more
- π± Responsive Design β Seamless experience across desktop, tablet, and mobile
- πΌοΈ Pet Profiles β Detailed information including photos, medical history, and personality
- π¬ Direct Contact β Connect directly with shelters and caregivers
- π Easy Pet Listing β Simple form to list pets for adoption
- π Secure β Supabase Auth with Row-Level Security
- π¬ Community Forums β Discuss tips, share success stories, and ask for advice
- ποΈ Pet Essentials Store β Browse recommended products and essential starter kits
- π¬ Direct Messaging β Connect directly with shelters, caregivers, and fellow adopters
- π‘οΈ Admin Safety Monitoring β Platform communications are monitored to ensure a safe environment
- π SSR + SEO β Server-rendered pages with dynamic Open Graph meta tags per pet
- β‘ Fast Performance β Next.js App Router with static generation and ISR
- π¨ Modern UI β Playful design with Framer Motion animations and shadcn/ui
- π Secure Backend β Supabase with Row-Level Security (RLS)
- β Type-Safe β Full TypeScript with strict mode
| Layer | Technology |
|---|---|
| Framework | Next.js 16 (App Router) |
| Language | TypeScript 5 (strict) |
| Styling | Tailwind CSS 3 |
| UI Components | shadcn/ui (Radix UI) |
| State | TanStack Query (React Query) |
| Animations | Framer Motion |
| Database | Supabase (PostgreSQL) |
| Auth | Supabase Auth |
| Storage | Supabase Storage |
| Deployment | Cloudflare Pages via @opennextjs/cloudflare |
| Linting | ESLint 9 + Prettier |
- Node.js 20+ (Download)
- npm 9+ (comes with Node.js)
- Git (Download)
- Supabase Account (supabase.com)
# Clone the repository
git clone https://github.com/mouhurtik/adoptdontshop.git
cd adoptdontshop-website
# Install dependencies
npm install
# Set up environment variables
cp .env.example .env.local
# Edit .env.local with your Supabase credentials
# Start development server
npm run devOpen http://localhost:3000 to see the app.
Create a .env.local file with your Supabase credentials:
NEXT_PUBLIC_SUPABASE_URL=https://your-project-id.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key-hereSecurity: The anon key is a publishable key β safe to use client-side. Your data is protected by Row-Level Security (RLS) policies in Supabase.
npm run dev # Start dev server (localhost:3000)
npm run build # Production build
npm run start # Start production server
npm run lint # Run ESLint
npm run type-check # TypeScript check
# Cloudflare Pages
npm run cf:build # Build for Cloudflare Workers
npm run cf:dev # Local Cloudflare dev
npm run cf:deploy # Build + deploy to Cloudflareadoptdontshop-website/
βββ app/ # Next.js App Router (route pages)
β βββ layout.tsx # Root layout (Navbar + Footer + Providers)
β βββ page.tsx # Home page
β βββ globals.css # Global styles
β βββ providers.tsx # Client providers (QueryClient, Auth, etc.)
β βββ not-found.tsx # Custom 404 page
β βββ browse/page.tsx
β βββ pet/[slug]/page.tsx # Dynamic pet page (SSR + generateMetadata)
β βββ about/page.tsx
β βββ pet-essentials/page.tsx
β βββ success-stories/page.tsx
β βββ sponsors/page.tsx
β βββ list-pet/page.tsx
β βββ terms/page.tsx
β βββ privacy-policy/page.tsx
βββ views/ # Page-level view components
βββ components/ # Reusable UI components
β βββ ui/ # shadcn/ui primitives
β βββ home/ # Home page sections
β βββ browse/ # Browse components
β βββ pet-details/ # Pet detail sections
β βββ pet-listing/ # Listing form sections
β βββ Navbar.tsx
β βββ Footer.tsx
βββ hooks/ # Custom React hooks
βββ contexts/ # React Context providers
βββ lib/ # Utilities
β βββ supabase/client.ts # Browser Supabase client
β βββ supabase/server.ts # Server Supabase client (SSR)
β βββ imageLoader.ts # Cloudflare image loader
βββ types/ # TypeScript type definitions
βββ constants/ # App constants
βββ utils/ # Utility functions
βββ public/ # Static assets
βββ next.config.mjs # Next.js configuration
βββ tailwind.config.ts # Tailwind CSS configuration
βββ wrangler.toml # Cloudflare Workers config
βββ open-next.config.ts # OpenNext adapter config
The app is deployed to Cloudflare Pages via @opennextjs/cloudflare:
- Connect your GitHub repo to Cloudflare Pages
- Configure build settings:
- Build command:
npx opennextjs-cloudflare build - Build output:
.open-next/assets
- Build command:
- Add environment variables:
NEXT_PUBLIC_SUPABASE_URLNEXT_PUBLIC_SUPABASE_ANON_KEYNODE_VERSION=20
- Add compatibility flag:
nodejs_compat
We welcome contributions! See CONTRIBUTING.md for guidelines.
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Make your changes
- Ensure TypeScript check passes (
npm run type-check) - Commit (
git commit -m 'feat: add amazing feature') - Push (
git push origin feature/amazing-feature) - Open a Pull Request
AGPL-3.0 β see LICENSE for details.
Made with β€οΈ for pets looking for their forever homes πΎ