Neouid
LiveMulti-tenant virtual currency & community commerce platform
Built solo, end to end — schema design, business logic, payment infrastructure, file storage, and a production hosting migration.
Neouid lets a "Bank Owner" create a branded virtual bank with its own currency, invite members, assign roles and granular permissions, mint and transfer currency, issue redeemable vouchers, and run an in-bank shop selling physical goods, digital downloads, or license keys — all backed by a tiered subscription model (Free / Pro / Enterprise) with real, enforced usage limits across every resource in the system. It is a closed-loop system by design: virtual currency has no cash value and cannot be bought, sold, or redeemed for real money through the platform. Bank Owners who want to offer real-world redemption do so entirely at their own discretion and their own risk — Neouid never sits in that flow of money.
Next.js 16
Framework
TypeScript
Framework
Supabase
Database & Auth
PostgreSQL
Database & Auth
Cloudflare Workers
Infrastructure
Cloudflare R2
Infrastructure
Paddle
Payments & Comms
Resend
Payments & Comms
Zoho Mail
Payments & Comms
Google OAuth
Auth & Trust
2FA / MFA
Auth & Trust
reCAPTCHA
Auth & Trust
Tiptap
Content & Uploads
sanitize-html
Content & Uploads
AWS SDK v3
Content & Uploads
browser-image-compression
Content & Uploads
Google Analytics
Analytics
Core banking engine
- Multi-tenant bank creation with custom currency name/symbol
- Role-based membership — owner, admin, member, plus custom roles with granular per-permission access control (Pro/Enterprise)
- Currency minting, peer transfers, and a full transaction ledger — balances are always computed from transaction history, never a mutable cached number
- Voucher / redemption code system with per-bank active-voucher limits
- QR-code based bank joining and voucher redemption
Commerce & digital goods
- In-bank shop supporting physical and digital products, with variants each carrying independent price, stock, image, and delivery method
- Three digital delivery modes: shared link, pooled unique keys claimed atomically on purchase, and secure uploaded files
- Purchase-gated downloads — ownership verified server-side on every request, access granted via 2-minute signed URLs, never a permanent public link
- Time-windowed discounts at both the product and individual-variant level, verified consistent between what's displayed and what's charged
- Full order lifecycle — shipping capture, status tracking, cancellation with automatic refund to balance
- Rich-text product descriptions, sanitized server-side before render
Subscriptions & billing
- Three-tier plan structure (Free / Pro / Enterprise) with limits enforced in the database itself — banks, members, products, vouchers, storage, roles, branding, and API access all gate independently per tier
- Full Paddle integration — inline checkout, HMAC-SHA256-verified webhooks with replay protection, and a self-service billing UI
- A usage dashboard — homepage snapshot and full account-level breakdown — with real-time consumption tracking and automatic upgrade prompts past a 75% threshold
File storage architecture
- Two-bucket R2 architecture — a public bucket for images, a fully private bucket for paid digital goods
- Client-side image compression before upload, cutting typical file sizes by 10–20x
- Presigned direct-to-bucket uploads — files never route through the app server
- Ledger-backed storage quotas enforced server-side
- Automatic cleanup on replace, plus an admin-triggered orphan sweep with mandatory dry-run and a 24-hour grace period
Trust & safety
- Unified content-reporting system with a platform-admin review queue
- Ban/lock system with required reasons, member-facing appeals, and automatic notifications
- DMCA policy and takedown flow
- Session/login-log retention with automated 90-day purge
- Account deletion that scrambles and frees the associated email for reuse
Platform administration
- A full Master Dashboard — bank/user management, unified reports queue, contact-message inbox with in-dashboard replies
- Sidebar badge counts across every pending-action category
- Product-level content moderation independent of the bank owner
The platform was originally built on PayPal; a processor-side account issue forced a full migration to Paddle as Merchant of Record mid-project. This meant redesigning the subscription schema (provider, provider_subscription_id, provider_customer_id), rewriting checkout and cancellation flows, and rebuilding webhook handling from scratch — all without disrupting the tier-enforcement logic already built on top of it.
Real Paddle webhooks were silently failing to update subscription state, while every unit-level check — signature verification, price-tier resolution, database writes — tested correctly in isolation. Root-caused through systematic elimination: ruled out a stale dev-server process, ruled out middleware interception, built a direct signed-request test script to isolate the handler from the delivery path, and ultimately traced the fault to a single missing path segment in the webhook destination URL — Paddle had been silently delivering every event to the homepage instead of the API route.
Mid-project, subscription limits changed from strictly per-bank to pooled totals across every bank a single owner controls. This required re-architecting the limit-checking functions from simple per-row counts to owner-scoped aggregate queries across joined tables, while leaving the Free tier's simpler per-bank model completely untouched.
Designed a purchase-gated download system where server-side ownership verification happens independently on every request — never trusted from a prior page load — and access is granted only via signed URLs that expire in minutes and are regenerated fresh on each click, making shared or leaked links useless.
Rather than defaulting to the already-integrated Supabase Storage, ran the real numbers on egress-driven costs at scale and chose Cloudflare R2 specifically for its zero-egress-fee model — the correct call for a platform where the same images get viewed repeatedly. Paired with a client-side compression pipeline to keep the actual storage footprint small regardless.
Rather than trusting client-reported state, built a genuine append-only ledger of every uploaded file, and layered an admin sweep tool on top that defaults to a dry-run preview and enforces a 24-hour grace period — directly preventing the tool from ever deleting a file a user has uploaded but not yet finished saving.
Spent a debugging session chasing what looked like a stale browser cache — component changes not reflecting despite hard refreshes, full server restarts, and .next deletion — before correctly diagnosing that Next.js 16.3's new persistent Turbopack filesystem cache was the real cause, and explicitly disabling it via config to confirm the diagnosis.
Migrated the deployment target from a standard Node.js runtime to Cloudflare Workers via the OpenNext adapter — surfacing and resolving two genuine platform incompatibilities (a jsdom-dependent HTML sanitizer with no Workers-compatible path, swapped for a pure-JS equivalent verified byte-identical against production data; a Next.js version floor required by the adapter) rather than papering over them, and requiring an explicit, itemized end-to-end verification pass — including deliberately testing both a valid and a forged webhook signature under the new runtime — before the migration was considered complete.
Diagnosed a React hydration-mismatch error, reported from a real user testing a shared link on Instagram, as third-party script injection from Meta's own in-app browser — not an application bug — and built a detection-and-redirect banner to address the actual underlying problem it revealed: Google OAuth silently fails inside in-app browsers, a genuine conversion risk for any social-shared link.
Bank creation, membership and roles, currency ledger, RLS-secured schema, base dashboard shell and design system.
Shop, products and variants, digital delivery (link/keys), orders, shipping, discounts.
Subscription tiers, PayPal integration, then full migration to Paddle as Merchant of Record; tier-gated capability system across every resource.
Reporting and moderation tools, ban/lock system, Master Dashboard, DMCA policy, cookie consent, data retention automation, GDPR-aligned Terms and Privacy Policy.
Cloudflare R2 integration, image compression pipeline, tiered storage quotas, purchase-gated secure file delivery, orphaned-file lifecycle management.
Real-time usage dashboards, threshold-based upgrade prompts, responsive redesign across every surface including a dual-layout pricing page.
Full migration from a Node.js-shaped deployment to Cloudflare Workers, including dependency incompatibility resolution and rigorous end-to-end verification against live services before go-live.
“Built solo — product decisions, database architecture, backend business logic, frontend implementation, payment infrastructure, file storage design, and DevOps/hosting migration.”