A modern, open-source photography blog platform built with the latest web technologies. Share your photography journey with style and efficiency.
- 📱 Responsive design for all devices
- 🖼️ Automatic EXIF data extraction from photos
- 🔐 Secure authentication with Better Auth
- ☁️ Cloud storage with Cloudflare R2
- 🎨 Beautiful UI with Shadcn/ui components
- 🚀 Lightning-fast performance
- 📍 Location-based photo organization
- 🌐 SEO optimized
- 🎯 API powered by Hono.js
- 🌈 Dark
- 🌈 Light
- Framework: Next.js 15
- Database: Neon (Serverless Postgres)
- ORM: Drizzle
- Authentication: Better Auth
- UI Components: Shadcn/ui
- API Layer: Hono.js
- Storage: Cloudflare R2
- Deployment: Vercel
- Node.js 20+
- bun (recommended) or npm
- Neon Database
- Cloudflare R2 Account
Create a .env.local
file in the root directory:
# Database
DATABASE_URL=your_neon_database_url
# Auth
BETTER_AUTH_SECRET=
BETTER_AUTH_URL=http://localhost:3000 #Base URL of your app
NEXT_PUBLIC_APP_URL='http://localhost:3000'
# Cloudflare R2
CLOUDFLARE_R2_ENDPOINT=
CLOUDFLARE_R2_ACCESS_KEY_ID=
CLOUDFLARE_R2_SECRET_ACCESS_KEY=
CLOUDFLARE_R2_BUCKET_NAME=
CLOUDFLARE_R2_PUBLIC_URL=
# Mapbox
NEXT_PUBLIC_MAPBOX_ACCESS_TOKEN=
Replace your-domain.com
with your actual domain name. This is required for Cloudflare Image Optimization to work correctly.
- Clone the repository:
git clone https://github.com/your-username/photography-website.git
cd photography-website
- Install dependencies:
bun install
- Set up the database:
bun db:push
- Start the development server:
bun run dev
// TODO: implement admin user creation
Before deploying, you need to update the custom domain in image-loader.ts
:
// image-loader.ts
return `https://your-domain.com/cdn-cgi/image/${paramsString}/${normalizeSrc(
src
)}`;
Visit http://localhost:3000
to see your application.
This project is licensed under the MIT License - see the LICENSE file for details.
Contributions are welcome! Feel free to open issues and pull requests.
If you find this project helpful, please give it a ⭐️ on GitHub!
- 2025-01-12: Better Auth instead of Next Auth