A web application that helps dog owners find and share dog-friendly locations including restaurants, parks, stores, and more.
- 🗺️ Interactive Map - Explore dog-friendly locations on Google Maps
- ⭐ Reviews & Ratings - Read and write reviews for locations
- 📸 Photo Sharing - Upload and view photos of locations
- ❤️ Favorites - Save your favorite dog-friendly spots
- 🔍 Search & Filter - Find locations by type, name, or area
- 👤 User Profiles - Track your contributions and favorites
- 🔐 Authentication - Secure sign-in with Clerk
- Nuxt 3 - Vue 3 framework with SSR
- TypeScript - Type-safe development
- Tailwind CSS - Utility-first CSS framework
- Pinia - State management
- Google Maps API - Interactive maps
- Nuxt Server API - API routes
- PostgreSQL - Database with PostGIS
- Prisma - Type-safe ORM
- Clerk - Authentication
- Cloudinary - Image hosting and optimization
- Vercel - Hosting (production)
- Docker - Local development
- Node.js 18+
- Docker & Docker Compose
- npm or yarn
Create a .env file in the root directory:
# Database
DATABASE_URL="postgresql://postgres:password@localhost:5432/onlypaws?schema=public"
# Clerk Authentication
CLERK_PUBLISHABLE_KEY=your_clerk_publishable_key
CLERK_SECRET_KEY=your_clerk_secret_key
# Google Maps
GOOGLE_MAPS_API_KEY=your_google_maps_api_key
GOOGLE_MAPS_DEFAULT_LAT=40.7128
GOOGLE_MAPS_DEFAULT_LNG=-74.0060
GOOGLE_MAPS_DEFAULT_ZOOM=13
# Cloudinary
CLOUDINARY_CLOUD_NAME=your_cloudinary_cloud_name
CLOUDINARY_API_KEY=your_cloudinary_api_key
CLOUDINARY_API_SECRET=your_cloudinary_api_secret
CLOUDINARY_UPLOAD_PRESET=your_upload_presetnpm installdocker-compose up -dnpm run prisma:generate
npm run prisma:migratenpm run prisma:seednpm run devThe application will be available at http://localhost:3000
npm run dev- Start development servernpm run build- Build for productionnpm run preview- Preview production buildnpm run lint- Run ESLintnpm run lint:fix- Fix ESLint errorsnpm run format- Format code with Prettiernpm run typecheck- Run TypeScript compiler checknpm run test:unit- Run unit testsnpm run test:e2e- Run end-to-end testsnpm run prisma:generate- Generate Prisma clientnpm run prisma:migrate- Run database migrationsnpm run prisma:studio- Open Prisma Studio
only-paws/
├── src/
│ ├── app/
│ │ ├── components/ # Vue components
│ │ ├── composables/ # Reusable logic
│ │ ├── layouts/ # Page layouts
│ │ ├── pages/ # File-based routes
│ │ ├── stores/ # Pinia stores
│ │ ├── types/ # TypeScript types
│ │ └── utils/ # Utility functions
│ └── server/
│ ├── api/ # API endpoints
│ └── utils/ # Server utilities
├── prisma/
│ ├── schema.prisma # Database schema
│ └── seed.ts # Database seed data
├── tests/ # Test files
├── docker-compose.yml # Docker configuration
└── nuxt.config.ts # Nuxt configuration
GET /api/locations- List all locationsPOST /api/locations- Create a location (auth required)GET /api/locations/:id- Get location detailsDELETE /api/locations/:id- Delete location (auth required)
POST /api/reviews- Create a review (auth required)DELETE /api/reviews/:id- Delete review (auth required)
POST /api/photos- Create a photo (auth required)DELETE /api/photos/:id- Delete photo (auth required)
GET /api/favorites- Get user favorites (auth required)POST /api/favorites- Add favorite (auth required)DELETE /api/favorites/:locationId- Remove favorite (auth required)
POST /api/users/sync- Sync Clerk user with databaseGET /api/users/profile- Get user profile (auth required)
- Push your code to GitHub
- Import project in Vercel
- Add environment variables
- Deploy
- Create PostgreSQL database on Render
- Update
DATABASE_URLin Vercel - Run migrations:
npm run prisma:migrate:deploy
Please follow the coding guidelines in AGENTS.md when contributing to this project.
MIT License - see LICENSE file for details