iArt.ai
AI motion graphics software — the After Effects alternative anyone can use. Create animations and explainer videos from a text prompt in minutes.
Capture your wedding POV
Translation pending
MediaTypeScript · CSSGitHub @cyriel04Availability needs another checkOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
📸 Mobile-first disposable camera for weddings — guests scan a QR code, take 30 photos or videos, and they upload straight to a shared Google Drive. No app, no accounts. Next.js 16 + Google Drive API.
Loading the full README.
Read the full README ↗Live: https://327photodump.vercel.app/
A mobile-first disposable camera app for weddings. Guests scan a QR code, type their name, and get 30 shots — photos or short videos — that upload straight from their phone to a shared Google Drive folder. No accounts, no app install, no friction.
Each guest gets their own subfolder. The couple gets everything in one place.
When the film is finished, the guest gets a gallery:
Shot count is tracked in localStorage so it survives page refreshes. No accounts and no server-side session.
src/lib/upload-limits.ts.localStorage), not on the server.eslint-config-next)src/
app/
page.tsx # NameEntry → CameraCapture → Gallery
locked/page.tsx # "scan the QR code" screen (proxy rewrite target)
api/
upload-session/ # POST: create a resumable Drive upload session
gallery/guest/ # GET: one guest's files (all same-name folders)
gallery/feed/ # GET: guests ordered by most recent shot
debug/ # GET: auth-chain diagnostics (locked in production)
_lib/validation.ts # request validation (private folder, not a route)
components/ # NameEntry, CameraCapture, Gallery, MyShotsGrid,
# FeedScreen, Lightbox, Thumbnail, ui/ (shadcn)
lib/
google-drive.ts # server-only Drive access
use-guest-session.ts # name + shot count, localStorage with fallback
upload-limits.ts # limits shared by client and server
access-code.ts # guest access code + cookie checks
proxy.ts # guest access gate for every page and API route
types/index.ts # API request/response shapes
__tests__/ # api/, components/, lib/, proxy.test.ts
| Route | Method | Returns |
|---|---|---|
/api/upload-session | POST { guestName, fileName, mimeType, fileSize } | { uploadUrl, folderId } · 400 on invalid input · 500 on Drive failure |
/api/gallery/guest?guestName= | GET | { files } newest first, [] for an unknown guest (never creates a folder) |
/api/gallery/feed | GET | { guests } one entry per name, most recent first |
/api/debug | GET | Auth-chain checks; 404 in production unless ?token= matches DEBUG_TOKEN |
Without a guest access cookie, API routes (except /api/debug) return 401 and pages show the locked screen (see Guest access code). If the app gets a 401 mid-session (cookie cleared or expired), My Shots and the Feed show "Your access expired — scan the QR code at the venue again". The camera keeps the unsent shot and adds ", then tap Upload to retry", so no shot is used up.
Error responses carry a generic error message only — raw Drive errors are logged server-side, never returned.
Files never pass through the server. Vercel serverless functions have a ~4.5 MB body limit and phone photos easily exceed that. Instead:
POST /api/upload-session)XHR PUT to that URL — no Vercel in the middleThe server forwards the client's Origin header when creating the session. Without it, Google doesn't enable CORS on the session URL and the browser upload fails silently.
Service accounts have no Google Drive storage quota. Files they create fail with:
403: Service Accounts do not have storage quota.
This is the beginning of the README. Read the rest at the original. Read the full README ↗