type: decision
status: active
timestamp: 2026-06-23
tags: [decision, image-upload, public, pricing-tier, image-cdn, photos, pixie-app]

Public image-upload tool on image.oriz.in — gated by free/pro tier

Locked 2026-06-23. oriz-pixie gets public /upload page using the 5-host replicate pipeline (Cloudinary + ImageKit + imgbb + freeimage\ + GH Releases). Free tier: 5 uploads/day, requires sign-in + reCAPTCHA v3. Pro\ tier: unlimited. Reuses lib/photos.ts from oriz-roam-journal-app. Durability promise:\ best-effort only, no SLA — free tier compliance limits guarantees. Anonymous\ users see paywall card.

Public image-upload tool — gated by tier

Scope

image.oriz.in/upload exposes the family’s 5-host replicate pipeline as a public tool. User drops an image, gets back the URL(s). Powered by the same lib/photos.ts orchestration that journal-app uses.

Tier gating

TierUploads/daySign-inreCAPTCHA v3Notes
Anonymous0n/an/aSees paywall card with “Sign in to upload” CTA
Free5RequiredRequiredQuota tracked in Firestore (users/{uid}.image_uploads_today)
ProUnlimitedRequiredRequiredNo quota check
MaxUnlimitedRequiredRequired+ extras: signed delete links, expiration settings

Why gated

Durability promise

Best-effort only. Stated on the upload page: “Images are mirrored across 5 free-tier hosts. We retain image URLs but cannot guarantee permanent availability. Keep your own backup of important originals.”

This is the lawyer-safe stance. Reasons:

If 2/5 hosts survive, the image is still served via first-200-wins read path. So practical durability is high, but we promise nothing.

Implementation

Lives in repos/oriz/own/prod/apps/tools/oriz-pixie-image-tools-app/:

Upgrade flow

Free user hits 5/day cap ? “Upgrade to Pro for unlimited uploads” ? redirects to oriz.in/pricing?app=pixie-image&return=https://image.oriz.in/upload. Razorpay checkout on oriz.in. Tier updated in Firestore. Next refresh, user has unlimited.

Cross-refs


Edit on GitHub · Back to index