A modern, professional photography gallery and client management platform built with Next.js, MongoDB, and AWS S3.
- π Project Management: Organize photos into projects and folders
- βοΈ Cloud Storage: Secure file storage with AWS S3 integration
- π Shareable Galleries: Generate secure, time-limited gallery links
- π₯ Client Management: Manage multiple clients and their projects
- π§ Email Invitations: Send gallery invitations directly to clients
- β Selection Tracking: See which photos clients have selected/rejected
- π¬ Comment System: Receive feedback directly on photos
- π Real-time Notifications: Get notified when clients comment or select photos
- π Selection Analytics: Track selection statistics (selected, rejected, pending, mixed)
- π¨ Folder Organization: Create custom folders within projects
- πΌοΈ Beautiful Gallery View: Responsive masonry layout for photo viewing
- π Full-Screen Preview: View photos in high-quality modal
- β¨ Photo Selection: Select or reject photos with visual feedback
- π¬ Photo Comments: Leave comments and feedback on specific photos
- π₯ Direct Downloads: Download high-resolution photos (if permitted)
- π± Mobile Responsive: Perfect viewing experience on all devices
- π Secure Access: Token-based authentication for gallery access
- π Personal Dashboard: View all your joined galleries in one place
- Frontend: Next.js 15, React, Tailwind CSS
- Backend: Next.js API Routes, NextAuth.js
- Database: MongoDB with Mongoose ODM
- Storage: AWS S3
- Authentication: NextAuth.js with Credentials Provider
- Email: Nodemailer
- File Upload: Multipart form handling with busboy
Before you begin, ensure you have the following installed:
- Node.js (v18 or higher)
- npm or yarn or pnpm or bun
- MongoDB (local installation or MongoDB Atlas account)
- AWS Account (for S3 storage)
git clone https://github.com/The-Acers/studioLook.git
cd studioLooknpm install
# or
yarn install
# or
pnpm install
# or
bun installCreate a .env.local file in the root directory by copying the example:
cp .env.example .env.localThen, update the .env.local file with your actual credentials:
# MongoDB Configuration
MONGODB_URI=mongodb://localhost:27017/studiolook
# NextAuth Configuration
NEXTAUTH_URL=http://localhost:3000
NEXTAUTH_SECRET=generate-a-random-secret-here
# AWS S3 Configuration
AWS_REGION=us-east-1
AWS_ACCESS_KEY_ID=your-aws-access-key-id
AWS_SECRET_ACCESS_KEY=your-aws-secret-access-key
AWS_S3_BUCKET_NAME=your-s3-bucket-name
# Email Configuration
EMAIL_SERVER_HOST=smtp.gmail.com
EMAIL_SERVER_PORT=587
EMAIL_SERVER_USER=your-email@gmail.com
EMAIL_SERVER_PASSWORD=your-app-specific-password
EMAIL_FROM=noreply@studiolook.comGenerate a secure random string for NEXTAUTH_SECRET:
openssl rand -base64 32- Create an S3 bucket in your AWS console
- Configure CORS for your bucket
- Create an IAM user with S3 access permissions
- Copy the Access Key ID and Secret Access Key to your
.env.local
Option A: Local MongoDB
# Install MongoDB locally and start the service
mongodOption B: MongoDB Atlas
- Create a free cluster at MongoDB Atlas
- Get your connection string
- Update
MONGODB_URIin.env.local
npm run dev
# or
yarn dev
# or
pnpm dev
# or
bun devOpen http://localhost:3000 in your browser to see the application.
studiolook/
βββ src/
β βββ app/ # Next.js App Router pages
β β βββ api/ # API routes
β β β βββ auth/ # Authentication endpoints
β β β βββ projects/ # Project management APIs
β β β βββ files/ # File upload/download APIs
β β β βββ folders/ # Folder management APIs
β β β βββ gallery/ # Gallery sharing APIs
β β β βββ client/ # Client dashboard APIs
β β β βββ notifications/ # Notification APIs
β β βββ auth/ # Authentication pages
β β βββ projects/ # Project pages
β β βββ gallery/ # Gallery view pages
β β βββ client/ # Client dashboard
β β βββ dashboard/ #Dashboard merged
β βββ components/ # Reusable React components
β βββ lib/ # Utility functions and configurations
β β βββ auth.js # NextAuth configuration
β β βββ db.js # MongoDB connection and models
β β βββ s3.js # AWS S3 utilities
β β βββ notifications.js # Notification helpers
β βββ middleware.js # Next.js middleware
βββ public/ # Static assets
βββ .env.example # Environment variables example
βββ .eslintrc.json # ESLint configuration
βββ next.config.js # Next.js configuration
βββ tailwind.config.js # Tailwind CSS configuration
βββ package.json # Project dependencies
- Create unlimited projects
- Organize photos into custom folders
- Upload multiple files simultaneously
- Support for images (JPG, PNG, GIF) and videos (MP4, MOV)
- Generate secure shareable links
- Set expiration dates for galleries
- Share with specific email addresses
- Control permissions (view, select, comment, download)
- Track who has joined galleries
- Clients can select or reject photos
- Visual indicators (green for selected, red for rejected)
- Multi-user support with conflict resolution
- Real-time selection statistics
- Filter photos by selection status
- Clients can comment on individual photos
- Photographers receive notifications
- Click notification to jump to commented photo
- Threaded conversation support
- Real-time notifications for photographers
- Comment notifications with photo preview
- Selection notifications
- Click to navigate directly to specific photos
- Mark as read/unread functionality
We welcome contributions from the community! Here's how you can help:
- Check Existing Issues: Before creating a new issue, please check if it already exists
- Create Detailed Reports: Include steps to reproduce, expected behavior, and screenshots if applicable
- Use Issue Templates: Follow the issue template for bug reports and feature requests
Click the "Fork" button at the top right of the repository page.
git clone https://github.com/The-Acers/studioLook.git
cd studioLookgit checkout -b feature/your-feature-name
# or
git checkout -b fix/your-bug-fixBranch naming conventions:
feature/- New featuresfix/- Bug fixesdocs/- Documentation updatesrefactor/- Code refactoringtest/- Test additions or modifications
- Write clean, readable code
- Follow the existing code style
- Add comments for complex logic
- Update documentation if needed
npm run dev
# Test thoroughly in your local environmentgit add .
git commit -m "feat: add new gallery filtering feature"Commit message conventions:
feat:- New featurefix:- Bug fixdocs:- Documentation changesstyle:- Code style changes (formatting, etc.)refactor:- Code refactoringtest:- Test updateschore:- Maintenance tasks
git push origin feature/your-feature-name- Go to the original repository
- Click "New Pull Request"
- Select your fork and branch
- Fill in the PR template with:
- Description of changes
- Related issue numbers
- Screenshots (if UI changes)
- Testing steps
- Submit the pull request
- One PR per feature/fix: Keep changes focused
- Update documentation: Include README updates if needed
- Add tests: If applicable, add tests for new features
- Follow code style: Maintain consistency with existing code
- Respond to feedback: Address review comments promptly
- Automated Checks: CI/CD will run tests and linting
- Manual Review: Maintainers will review your code
- Feedback: Address any requested changes
- Approval: Once approved, your PR will be merged
- Recognition: Contributors are credited in release notes
- Use ES6+ features
- Follow React best practices
- Use functional components with hooks
- Keep components small and focused
- Use meaningful variable and function names
// Import dependencies
import { useState, useEffect } from 'react'
// Component definition
export default function ComponentName({ props }) {
// State declarations
const [state, setState] = useState(initialValue)
// Effect hooks
useEffect(() => {
// Effect logic
}, [dependencies])
// Event handlers
const handleAction = () => {
// Handler logic
}
// Render
return (
<div>
{/* JSX */}
</div>
)
}import { NextResponse } from 'next/server'
import { connectToDatabase } from '@/lib/db'
import { auth } from '@/lib/auth'
export async function GET(request) {
try {
// Authentication
const session = await auth()
// Database connection
await connectToDatabase()
// Business logic
const data = await fetchData()
// Response
return NextResponse.json({ data })
} catch (error) {
console.error('Error:', error)
return NextResponse.json(
{ message: 'Internal server error' },
{ status: 500 }
)
}
}# Run linting
npm run lint
# Build for production
npm run build
# Start production server
npm run start- Push your code to GitHub
- Import project in Vercel
- Configure environment variables
- Deploy
npm run build
npm run start- All API routes are protected with authentication
- Token-based gallery access with expiration
- Secure file storage with AWS S3
- Input validation and sanitization
- SQL injection prevention with Mongoose ODM
This project is licensed under the MIT License - see the LICENSE file for details.
- Next.js team for the amazing framework
- MongoDB for the database solution
- AWS for S3 storage
- All open-source contributors
- Issues: GitHub Issues
- Discussions: GitHub Discussions
- Advanced search and filtering
- Bulk photo operations
- Client feedback forms
- Integration with payment systems
- Mobile app (React Native)
- Advanced analytics dashboard
- Custom branding options
- Watermark support
- Automated backup system
Made with β€οΈ by photographers, for photographers
β Star this repo if you find it helpful!