A beautiful React application for sharing and viewing wedding photos. Shutterly Wedded allows wedding guests to upload their photos and view all the memories shared by other guests, powered by Cloudinary for professional image management and optimization.
- 📷 Photo Upload: Drag-and-drop or click to upload multiple photos at once
- 🖼️ Photo Gallery: View all uploaded photos in a beautiful grid layout
- 🔍 Photo Modal: Click on any photo to view it in full size with details
- 👤 Photo Attribution: Each photo shows who uploaded it and when
- 📱 Responsive Design: Works great on desktop, tablet, and mobile devices
- ☁️ Cloud-Powered: Images hosted and optimized by Cloudinary
- 🚀 Fast Loading: Automatic image optimization and CDN delivery
- 🏷️ Smart Metadata: Automatic tagging and custom metadata storage
- React 18 with TypeScript
- Tailwind CSS for styling
- Lucide React for icons
- Cloudinary for image hosting, optimization, and management
- Node.js (version 14 or higher)
- npm or yarn
- A Cloudinary account (free tier available)
git clone <your-repo-url>
cd wedding-gallery
npm install-
Create a Cloudinary Account:
- Sign up at cloudinary.com
- Go to your Dashboard
-
Find Your Credentials:
- Cloud Name: Found at the top of your Cloudinary dashboard
- Upload Preset: You'll need to create this (see step 3)
-
Create Upload Preset:
- In Cloudinary Console, go to Settings → Upload
- Click "Add upload preset"
- Set these settings:
- Preset name:
wedding-gallery-upload - Signing Mode:
Unsigned - Folder:
wedding-gallery - Tags:
wedding-gallery,user-upload
- Preset name:
Create a .env file in the project root directory:
# Create .env file
touch .envAdd your Cloudinary credentials to the .env file:
# Cloudinary Configuration
REACT_APP_CLOUDINARY_CLOUD_NAME=your-cloud-name-here
REACT_APP_CLOUDINARY_UPLOAD_PRESET=wedding-gallery-uploadImportant:
- Replace
your-cloud-name-herewith your actual Cloudinary cloud name - Never commit the
.envfile to version control - The
.envfile should be in your project root (same level aspackage.json)
npm startOpen your browser and navigate to http://localhost:3000
- Click the "Upload Photos" button in the navigation
- Enter your name
- Drag and drop photos or click to select files
- Watch the upload progress and see your photos appear instantly
- Photos are automatically optimized and stored in Cloudinary
- Click the "Gallery" button in the navigation
- Browse through all uploaded photos with optimized thumbnails
- Click on any photo to view it in full size
- See detailed metadata including uploader, upload date, and image analysis
- Use the "Refresh" button to load newly uploaded photos
| Variable | Description | Required | Example |
|---|---|---|---|
REACT_APP_CLOUDINARY_CLOUD_NAME |
Your Cloudinary cloud name | ✅ Yes | my-wedding-app |
REACT_APP_CLOUDINARY_UPLOAD_PRESET |
Upload preset name | ✅ Yes | wedding-gallery-upload |
When deploying to production (Vercel, Netlify, etc.), add these environment variables in your hosting platform's settings:
Vercel: Project Settings → Environment Variables Netlify: Site Settings → Environment Variables Heroku: Settings → Config Vars
REACT_APP_CLOUDINARY_CLOUD_NAME=your-cloud-name
REACT_APP_CLOUDINARY_UPLOAD_PRESET=wedding-gallery-upload"Upload failed" errors:
- ✅ Check that your
.envfile exists and has the correct variables - ✅ Verify your cloud name is correct (check Cloudinary dashboard)
- ✅ Ensure upload preset
wedding-gallery-uploadexists and is set to "Unsigned" - ✅ Restart your development server after adding environment variables
Photos not appearing in gallery:
- ✅ Check browser console for error messages
- ✅ Verify photos are uploaded to the
wedding-galleryfolder in Cloudinary - ✅ Ensure photos are tagged with
wedding-gallery
Environment variables not working:
- ✅ Restart development server (
npm start) - ✅ Check that
.envfile is in project root (same level aspackage.json) - ✅ Verify variable names start with
REACT_APP_ - ✅ No spaces around the
=sign in.envfile
shutterly-wedded/
├── public/
├── src/
│ ├── components/
│ │ ├── Header.tsx
│ │ ├── PhotoGallery.tsx
│ │ └── PhotoUpload.tsx
│ ├── config/
│ │ └── cloudinary.ts
│ ├── services/
│ │ └── cloudinaryService.ts
│ ├── types/
│ │ └── Photo.ts
│ └── App.tsx
├── .env (you create this)
├── package.json
└── README.md
- Fork the repository
- Create a feature branch
- Make your changes
- Test thoroughly
- Submit a pull request
For detailed setup instructions, see CLOUDINARY_SETUP.md
For Cloudinary-specific questions:
Made with ❤️ for capturing beautiful wedding memories