PixVault — The Self-Hosted Google Photos You Actually Want to Use
Google Photos hoards your memories and Amazon Photos looks like it was designed in 2011. PixVault is a polished, self-hosted photo web app with a one-click Docker Compose setup that actually respects your privacy and your eyes.
Difficulty
intermediate
Category
Consumer Apps
Market Demand
High
Revenue Score
7/10
Platform
Web App
Vibe Code Friendly
No
Hackathon Score
🏆 7/10
Validated by Real Pain
— sourced from real community discussions
Self-hosted photo management tools are either painful to set up or lack the polish of Google Photos, leaving privacy-conscious users stuck with vendor lock-in.
What is it?
The r/selfhosted crowd has been begging for a beautiful self-hosted photo manager for years — Nextcloud is painful, Immich is powerful but rough, and Google Photos is a privacy nightmare. PixVault ships as a Next.js web app with a one-click Docker Compose, auto-organization by date and face clusters, full-text search, and shareable albums. Managed hosting at $7/month captures the non-technical crowd; a one-time $29 self-hosted license captures the homelab nerds. Why 100% buildable right now: Next.js 14 app router, Supabase for metadata, Cloudflare R2 for storage at $0.015/GB, and sharp for image processing are all stable and cheap enough to make this viable solo.
Why now?
Cloudflare R2 egress-free storage dropped the cost of self-hosted photo apps to near-zero in June 2025, making a polished managed hosting tier finally profitable at $7/month — this was not possible 18 months ago.
- ▸One-click Docker Compose setup with pre-configured Postgres and R2 storage
- ▸Auto-organize photos by date with smart album grouping (Implementation: sharp EXIF extraction + date bucketing)
- ▸Full-text search across metadata, location, and auto-generated tags via Claude vision
- ▸Shareable album links with optional password protection and expiry dates
Target Audience
Privacy-conscious home users and self-hosters on r/selfhosted (2M+ members) and r/homelab (1.5M+ members) who hate Google Photos lock-in.
Example Use Case
Sarah, a privacy-conscious parent with 40k family photos on Google Photos, buys the $29 license, runs Docker Compose in 4 minutes, imports her library, and never worries about Google scanning her kids photos again.
User Stories
- ▸As a privacy-conscious parent, I want to self-host my family photos with a one-click Docker setup, so that Google cannot scan or monetize my childrens pictures.
- ▸As a homelab enthusiast, I want to search my 50k photos by date and location without cloud dependency, so that I maintain full control of my data.
- ▸As a non-technical user, I want managed cloud hosting for my photos, so that I get the privacy of self-hosting without touching a terminal.
Done When
- ✓Upload: done when user drags 10 photos into the browser and all appear in the gallery grid within 10 seconds.
- ✓Search: done when user types a year into the search bar and only photos from that year appear instantly.
- ✓Share: done when user clicks Share Album, copies the link, opens it in incognito, and views photos without logging in.
- ✓Docker setup: done when docker-compose up starts the full app with zero manual config and the browser opens to a working gallery.
Is it worth building?
$29 one-time license x 200 sales = $5,800 in month 1. Managed hosting at $7/month x 300 users = $2,100 MRR by month 4. Realistic with targeted r/selfhosted posts.
Unit Economics
CAC: $8 via Reddit organic post. LTV: $84 (12 months at $7/month managed). Payback: 2 months. Gross margin: 82%.
Business Model
One-time license + managed hosting SaaS
Monetization Path
Free self-host forever, $29 one-time for priority support and updates, $7/month managed cloud hosting for non-technical users.
Revenue Timeline
First dollar: week 2 via beta license sale. $1k revenue: month 1 (35 licenses). $2k MRR: month 4 (managed hosting). $5k MRR: month 8.
Estimated Monthly Cost
Cloudflare R2: $5 (demo/managed tier), Vercel: $20, Supabase: $25, Resend: $10. Total: ~$60/month at launch.
Profit Potential
$3k-$8k MRR achievable at month 6 combining license sales and managed hosting.
Scalability
High — managed hosting tier becomes recurring MRR, team/family plan adds seats.
Success Metrics
Week 1: 500 GitHub stars. Week 3: 50 license sales. Month 3: 100 managed hosting subscribers.
Launch & Validation Plan
Post to r/selfhosted with a 60-second demo video, DM 20 active Nextcloud complainers, get 10 beta installs before building managed hosting.
Customer Acquisition Strategy
First customer: post a polished demo video to r/selfhosted showing the 4-minute Docker setup vs Nextcloud 45-minute hell. Ongoing: GitHub repo with a great README, ProductHunt launch, YouTube tutorial targeting 'self-hosted google photos alternative' keyword.
What's the competition?
Competition Level
Medium
Similar Products
Immich (powerful but developer-only UX), Nextcloud (painful setup), Photoprism (slow and complex) — none ship with a polished one-click setup targeting non-technical self-hosters.
Competitive Advantage
Prettier than Immich, easier than Nextcloud, cheaper than Plex, and ships with a working Docker Compose on day one.
Regulatory Risks
GDPR: user photo data must be deletable on request. Self-hosted version has zero regulatory risk. Managed hosting requires a data processing agreement for EU users.
What's the roadmap?
Feature Roadmap
V1 (launch): upload, gallery grid, search, shareable albums, Docker Compose. V2 (month 2-3): bulk import from Google Takeout, auto date albums, mobile-responsive PWA. V3 (month 4+): family sharing seats, AI auto-tagging, video support.
Milestone Plan
Phase 1 (Week 1-2): core upload, gallery, and Docker Compose ship and tested. Phase 2 (Week 3): shared albums and Stripe licensing live. Phase 3 (Month 2): managed hosting tier live with 20 paying subscribers.
How do you build it?
Tech Stack
Next.js 14, Supabase (Postgres + Auth), Cloudflare R2, sharp for image resizing, Docker Compose — build with Cursor for backend, v0 for UI components, Lovable for onboarding flow
Suggested Frameworks
sharp, next-auth, Drizzle ORM
Time to Ship
3 weeks
Required Skills
Next.js, Docker, Cloudflare R2 API, image processing with sharp.
Resources
Cloudflare R2 docs, sharp docs, Docker Compose guides, Supabase quickstart.
MVP Scope
app/page.tsx (gallery grid landing), app/upload/page.tsx (drag-drop uploader), app/album/[id]/page.tsx (shared album view), app/api/photos/route.ts (upload + list handler), app/api/search/route.ts (metadata search), lib/db/schema.ts (Drizzle schema), lib/storage.ts (R2 client), components/PhotoGrid.tsx (masonry grid), docker-compose.yml (one-click setup), .env.example (R2 keys + DB URL), seed.ts (10 demo photos)
Core User Journey
Clone repo -> run docker-compose up -> open browser -> drag in photos -> share first album link with family.
Architecture Pattern
User uploads photo -> R2 storage -> sharp generates thumbnail -> EXIF extracted -> metadata saved to Postgres -> gallery query returns sorted results -> shared album link resolves via slug.
Data Model
User has many Albums. Album has many Photos. Photo has one ExifMetadata. Album has many ShareLinks with expiry and password fields.
Integration Points
Cloudflare R2 for photo storage, Supabase for metadata and auth, sharp for image processing, Resend for share notifications, Stripe for license and hosting payments.
V1 Scope Boundaries
V1 excludes: face clustering, mobile app, video support, multi-user family accounts, AI tagging.
Success Definition
A non-technical user finds the GitHub repo, runs Docker Compose, imports 1,000 photos, and buys the managed hosting plan without emailing the founder once.
Challenges
Distribution is the real killer — r/selfhosted has noise and Immich already exists; differentiation must be visceral in the first 10 seconds of the demo video, not in a feature list.
Avoid These Pitfalls
Do not build face recognition in V1 — it doubles build time and adds no demo value. Do not launch without a demo video showing the Docker setup in real time. Finding first 10 paying customers requires a Reddit post that leads with the problem not the product.
Security Requirements
Supabase Auth with magic link. RLS on all photo and album tables. Pre-signed R2 URLs for photo access (never public). Input validation on file type and size. GDPR: full data export and deletion endpoint.
Infrastructure Plan
Vercel for Next.js frontend and API routes, Supabase for Postgres and auth, Cloudflare R2 for photo storage, GitHub Actions for CI, Sentry for errors, Vercel Analytics for traffic.
Performance Targets
100 DAU at launch, 2,000 req/day. Gallery load under 1.5s (thumbnails CDN-cached). Photo upload under 3s for 5MB file. R2 pre-signed URL generation under 200ms.
Go-Live Checklist
- ☐Security audit complete.
- ☐Payment flow tested end-to-end.
- ☐Error tracking (Sentry) live.
- ☐Monitoring dashboard configured.
- ☐Custom domain set up with SSL.
- ☐Privacy policy and terms published.
- ☐5+ beta users signed off.
- ☐Rollback plan documented.
- ☐Launch post drafted for r/selfhosted and ProductHunt.
First Run Experience
On first run: 12 seeded demo photos appear in the gallery organized by month. User can immediately browse, search by year, and open a pre-created shared album link. No manual config required: Docker Compose auto-seeds demo data and env vars have working defaults for local Minio storage.
How to build it, step by step
1. Define schema: photos, albums, share_links tables in lib/db/schema.ts with Drizzle. 2. Run npx create-next-app pixvault --typescript --tailwind --app. 3. Install sharp, drizzle-orm, @aws-sdk/client-s3, @supabase/supabase-js. 4. Build R2 upload handler in app/api/photos/route.ts with multipart form parsing. 5. Build PhotoGrid component in components/PhotoGrid.tsx with masonry layout via CSS columns. 6. Build drag-drop uploader page in app/upload/page.tsx using react-dropzone. 7. Build search endpoint in app/api/search/route.ts querying Postgres metadata. 8. Build shareable album page in app/album/[id]/page.tsx with password gate. 9. Write docker-compose.yml bundling Next.js, Postgres, and Minio (local R2 substitute). 10. Verify: run docker-compose up, upload 20 photos, create a shared album, open the link in an incognito tab end-to-end.
Generated
June 12, 2026
Model
claude-sonnet-4-6
Disclaimer: Ideas on this site are AI-generated and may contain inaccuracies. Revenue estimates, market demand figures, and financial projections are illustrative assumptions only — not financial advice. Do your own research before making any business or investment decisions. Technology availability, pricing, and market conditions change rapidly; always verify details independently.