Photo Jam - Photography Community App
Cross Platform Mobile App with Flutter/Appwrite
View Live Project
Photo Jam – Community Photography Learning Platform
Cross-platform mobile and web application that brings photographers together for collaborative learning through weekly lessons, photo challenges, and virtual meetups.
The Story
Photo Jam is the brainchild of Molly, a Lancaster, PA photographer who envisioned "The World's Nicest Photography Community." She wanted to create a structured environment where photographers of all skill levels could learn together, share their work, and grow through constructive feedback—without the toxicity often found in online photography communities.
The Solution
Photo Jam combines structured learning with social engagement: members receive weekly photography lessons, submit photos for community review, comment on each other's work, and join live video "jam sessions" where the group discusses submissions together. The platform fosters genuine connection and skill development through scheduled events, collaborative critique, and a supportive community culture.
Key Technical Achievements
Cross-Platform Architecture
- Flutter Framework: Single codebase deployed to iOS, Android, and web (app.photojam.net)
- Responsive Design: Custom WebContentContainer system adapts UI layouts across mobile and desktop browsers
- Platform-Specific Features: Native camera integration on mobile, file upload on web, platform-aware navigation patterns
- Deep Linking: go_router integration enables direct navigation from notifications and external links across all platforms
Community Features
- Weekly Lessons: Markdown-rendered photography tutorials with image examples and learning objectives
- Photo Gallery System: Multi-image upload with EXIF data preservation, image compression, and thumbnail generation
- Commenting & Engagement: Threaded discussions on submissions with real-time notifications
- Virtual Jam Sessions: Calendar integration with event scheduling, reminders, and add-to-calendar functionality
- User Roles: Role-based access control (nonmember, member, facilitator, admin) with granular permissions
Backend & State Management
- Appwrite BaaS: Authentication (email/Google/Apple Sign-In), PostgreSQL database, file storage, and real-time subscriptions
- Riverpod 2.x: Type-safe state management with providers for authentication, user profiles, and content
- Repository Pattern: Clean architecture with abstracted data layer for testability and maintainability
- Real-time Updates: Appwrite subscriptions for live comment notifications and jam session updates
Subscription & Payments
- In-App Purchases: StoreKit integration for iOS subscription management
- Discount Codes: Custom promo code system with validation and tracking
- Member Management: Subscription status tracking, access control, and grace periods
Push Notifications
- Firebase Cloud Messaging: Cross-platform push notifications for jam events, new comments, and community updates
- Smart Navigation: Deep links navigate users directly to relevant content (submissions, jams, profiles)
- Badge Management: iOS app badge counts for unread notifications with flutter_app_badger
Quality & Testing
- 70%+ Code Coverage: Comprehensive unit, widget, and integration tests with Mockito/Mocktail
- CI/CD Pipeline: GitHub Actions automatically run tests and generate coverage reports (Codecov)
- Pre-commit Hooks: Automated formatting, linting, and test execution before commits
- Golden Tests: Visual regression testing for UI consistency across platforms
Tech Stack
Flutter 3.x, Dart, Appwrite (BaaS), Riverpod, go_router, Firebase Cloud Messaging, StoreKit (In-App Purchase), image_picker, flutter_markdown, PostHog (analytics), Google Fonts, fl_chart (analytics graphs)
Outcomes
- Production Deployed: Live at app.photojam.net with active community of photography enthusiasts
- True Cross-Platform: Single codebase serves web, iOS, and Android with platform-appropriate UX
- First Flutter Project: Successfully shipped a production app while learning Flutter's ecosystem and best practices
- Community-Driven Design: Features built around real photographer needs—from lesson sharing to collaborative critique
- Scalable Architecture: Repository pattern and clean architecture enable easy feature additions and maintenance
Personal Impact
This was my first deep dive into Flutter for cross-platform development, learning:
- Flutter's widget system, state management patterns (Riverpod), and navigation (go_router)
- Mobile-specific concerns: camera/gallery access, push notifications, in-app purchases
- BaaS integration with Appwrite for authentication, database, storage, and real-time features
- Balancing native mobile UX with web responsiveness in a single codebase
- Building for a real community with real needs—not just technical exercises
Project Gallery
Other Projects

WeldCount - Weld Detection for Engineering Drawings
AI-Powered Welding Symbol Detection Platform

ParkingPercent - ML Occupancy Tracking
Connect security cameras to our API and automatically track parking lot utilization over time

Water Bath Temperature Control
Precision temperature controller for film development chemistry

Automated Slide Digitizer
High-resolution film slide scanning system using modified projector