Your Complete Photography Assistant
Streamline your photography workflow with AI-powered tools for photo selection, caption generation, metadata editing, and watermarking.
- Node.js 18+ and npm/yarn
- OpenAI API key (for caption generation)
# Clone the repository
git clone https://github.com/your-username/photo-forge.git
cd photo-forge
# Install dependencies
npm install
# or
yarn install
# Set up environment variables
cp .env.example .env.local
# Add your OpenAI API key to .env.localCreate a .env.local file in the project root:
OPENAI_API_KEY=your_actual_api_key_hereGet your API key from OpenAI Platform.
# Development server
npm run dev
# Build for production
npm run build
# Start production server
npm run start
# Run linting
npm run lintOpen http://localhost:3000 to view the application.
Note: Add screenshots or GIFs of your app in action here
- Framework: Next.js 15 with App Router
- UI: React 19 + TypeScript
- Styling: Tailwind CSS 4
- AI Integration: OpenAI GPT-4o-mini
- Image Processing: Sharp + Canvas API
- Gestures: React Swipeable
- Metadata: ExifR for EXIF data reading
src/
├── app/ # Next.js App Router pages
│ ├── api/ # API routes
│ ├── caption-generator/ # Caption generation page
│ ├── metadata-editor/ # EXIF editing page
│ ├── photo-picker/ # Photo selection page
│ └── watermarking-tool/ # Watermark application page
├── components/ # Reusable UI components
│ ├── CaptionGenerator/ # Caption generation components
│ ├── MetadataEditor/ # EXIF editing components
│ ├── PhotoPicker/ # Photo selection components
│ └── WatermarkingTool/ # Watermark components
├── hooks/ # Custom React hooks
├── types/ # TypeScript type definitions
└── context/ # React context providers
- Container Pattern: Each feature uses a container component pattern for state management
- Custom Hooks: Business logic extracted into reusable hooks
- Component Composition: Small, focused components for maintainability
- Type Safety: Full TypeScript integration with proper type definitions
POST /api/generate-caption
Content-Type: multipart/form-data
image: File
maxHashtags: number (optional, default: 20)Response:
{
"description": "Caption text",
"hashtags": ["tag1", "tag2", "..."]
}We welcome contributions! Please follow these steps:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
- Follow the existing code style and conventions
- Add tests for new features
- Update documentation as needed
- Ensure all tests pass before submitting
This project is licensed under the MIT License - see the LICENSE file for details.
- Next.js for the amazing React framework
- OpenAI for AI-powered caption generation
- Tailwind CSS for utility-first styling
- Vercel for seamless deployment
Made with ❤️ by photographers, for photographers