Alby Studio โ multi-vendor storefront builder
Context
Alby Studio is Aspire's Wix/Elementor + Dokan replacement โ a multi-vendor storefront platform where Albany hospitality merchants (wineries, cafรฉs, accommodation operators) get their own branded store at store.myalby.com.au/<slug>. Cross-cutting brand context in alby-brand-family-map.
Architecture
graph TD
M["Merchant"] -->|onboard KYC| SC["Stripe Connect Express"]
M --> ST["Storefront builder<br/>(Puck blocks)"]
C["Customer"] -->|checkout| SC
ST --> DB[("Postgres + Prisma")]
ST --> S3["MinIO<br/>s3.myalby.com.au"]
AS["alby-studio<br/>store.myalby.com.au"] --> ST
classDef app fill:#715EE3,color:#fff,stroke:#291F50;
class AS app;
Detail
Live URLs
- Primary:
https://store.myalby.com.au - MinIO S3:
https://s3.myalby.com.au(per minio-storage-per-app) - MinIO admin:
https://s3-admin.myalby.com.au
Stack
- Next.js 14 + Prisma + Postgres (legacy choice โ predates SvelteKit+Go default)
- NextAuth + Credentials/Google providers (merchant audience โ NOT Aspire Hub OIDC; staff /admin routes will be Hub OIDC per graphify-audit-resolutions-2026-05-21)
- Stripe Connect Express (per stripe-connect-marketplace-default)
- MinIO storage (dedicated per-app instance)
- SendGrid for transactional email (DKIM verified 2026-05-09)
- Coolify deploy via Dockerfile, auto-deploy on push to
main
Live capabilities (as of 2026-05-04)
- Vendor onboarding (Stripe Connect Express KYC flow)
- Vendor dashboard with onboarding-progress tracking
- Storefront pages with Puck block builder
- Product CRUD with image uploads to MinIO
- Cart + checkout via Stripe Connect (split payments)
- Order management + customer notifications
- Webhook handlers (Stripe, transactional events)
- Auth rate limiting on signup endpoints
- Subscription enforcement (trial + plan-limit gates)
- Sentry error tracking (wired, needs
SENTRY_DSN) - GST handling (10% on subtotal)
- Analytics dashboard
- Blog management per vendor
Production-launch gates (Kom-only)
| # | Gate | Status |
|---|---|---|
| 1 | Stripe live-mode keys (currently Sandbox) | โธ needs Stripe Connect activation on live account |
| 2 | Counsel-reviewed legal pages (/terms /privacy /refund-policy /vendor-agreement) | โธ blocked on lawyer |
| 3 | Friendly beta โ 3-5 real vendors through full flow | โธ recruitment task |
| 4 | Stripe webhook cleanup โ delete duplicate destination | โธ in Stripe dashboard |
Post-launch deferred
- Admin/platform UI (
/adminroutes โ currently psql-only) - Subscription billing (Stripe Subscriptions for paid plan upgrades, separate from Connect)
- Soft-block dashboard banner โ middleware on
/vendor/*injects trial-countdown / paywall - Email campaigns (via SendGrid)
- Automations trigger/action engine
- Abandoned cart recovery
- Custom domains per vendor (paid plan)
- Zinga Pay integration (blocked, no API docs yet)
Graphify audit findings (2026-05-21)
| Symbol | Edges | Verdict |
|---|---|---|
cn() | 88 | LEAVE AS-IS (shadcn convention) |
Button() / Card() family | 26-34 | Expected design-system reuse |
authOptions | 30 | Merchant-only surface; staff /admin will use Hub OIDC instead |
getVendorBySlug() | 21 | Typed VendorWithTheme return added in MR !1 |
Full audit: graphify-audit-2026-05-21. Resolutions: graphify-audit-resolutions-2026-05-21.
Known issues
- Node 25 local builds time out (
readFileSync ETIMEDOUTduring webpack asset processing). Workaround:--experimental-build-mode compileor build in Docker. Coolify uses Node 20 โ unaffected. zod v4 + @hookform/resolversvia v3-compat layer. If upgrading resolvers to v5+, may need minor zod tweaks.
Coolify resources
- App: per Coolify project for alby-studio
- MinIO:
l2cycmi0w0or73bm7ipn46t6
Related
- alby-brand-family-map โ disambiguates Alby Studio vs Place vs Travel
- graphify-audit-2026-05-21 + graphify-audit-resolutions-2026-05-21 โ code audit + verdicts
- stripe-connect-marketplace-default โ payment pattern
- minio-storage-per-app โ storage pattern
- coolify-deployment-default โ deploy platform
๐ Relationships
graph LR
alby_studio["alby-studio"]:::self
alby_studio --> alby_brand_family_map["alby-brand-family-map"]
alby_studio --> minio_storage_per_app["minio-storage-per-app"]
alby_studio --> graphify_audit_resolutions_2026_05_21["graphify-audit-resolutions-2026-05-21"]
alby_studio --> stripe_connect_marketplace_default["stripe-connect-marketplace-default"]
alby_studio --> graphify_audit_2026_05_21["graphify-audit-2026-05-21"]
alby_studio --> coolify_deployment_default["coolify-deployment-default"]
classDef self fill:#715EE3,color:#fff,stroke:#291F50;