camply, the campsite finder ⛺️, is a tool to help you book a campsite online. Finding
reservations at sold out campgrounds can be tough. That's where camply comes in. It searches
thousands of campgrounds across the USA world via the APIs of booking services like
recreation.gov. It continuously checks for cancellations and
availabilities to pop up - once a campsite becomes available, camply sends you a notification
to book your spot!
📂 camply
├── README.md
├── docker-compose.yaml
├── cli/
| ├── pyproject.toml
| └── camply/
├── frontend/
| ├── Dockerfile
| ├── docker-compose.yaml
| ├── package.json
| ├── tsconfig.json
| ├── src/
| └── public/
└── backend/
├── Dockerfile
├── docker-compose.yaml
├── pyproject.toml
├── uv.lock
└── packages/
├── backend/
| ├── pyproject.toml
| └── backend/
├── db/
| ├── pyproject.toml
| ├── migrations/
| └── db/
├── providers/
| ├── pyproject.toml
| └── providers/
└── worker/
├── pyproject.toml
├── tests/
└── worker/
- This directory contains the legacy command-line interface (CLI) for the project. There will be no further development on this CLI and it can be ignored for new features.
- Stack: React 18 + TypeScript + Vite + Tailwind CSS + Shadcn/UI.
- State: TanStack Query for server state; React Context for auth.
- Forms: React Hook Form + Zod for strict validation.
- API: Axios client with OpenAPI TypeScript codegen.
- Auth: Auth0 redirect or local auto-auth, toggleable via backend config.
- Maps: MapLibre GL JS with a keyless OpenStreetMap default and configurable raster sources. Explore offers a collapsible map above the list across all filtered matches; see mapping configuration.
- Pages: Home (search), Explore, Dashboard (scan management), Early Access gate, Campground/Rec Area detail, static content pages.
- The frontend can be published as a static site served by any web server.
- Stack: Python 3.12 + FastAPI + SQLAlchemy (async) + Pydantic v2.
- API Endpoints: Search, campground/rec-area lookup, user profile (
/me), scan CRUD (/scans) — all with OpenAPI docs at/api/docs. - Auth: Two modes — local (auto-admin, no token needed) and Auth0 (JWT validation via PyJWT + JWKS).
- The backend is a
uvworkspace containing multiple packages:backend/: FastAPI application serving API endpoints and auth.db/: Database models (User, UniqueTarget, UserScan, ScanResult, etc.) and Alembic migrations.providers/: Third-party API providers (Recreation.gov) with pluggableBaseProviderABC.worker/: Celery-powered background task worker for campsite polling, availability diffing, de-duplicated scanning, and Pushover notifications.