Commit Graph

12 Commits

Author SHA1 Message Date
Leon Serfaty 35379212fb fix(worker): neutralize server-only at runtime so the tsx worker can boot
The worker runs worker/index.ts under tsx (plain Node) and transitively
imports lib/flags (and other server-only-guarded modules) via the generation
pipeline. `server-only` resolves to its throwing index.js outside Next's RSC
bundler, crash-looping the worker container. Copy the package's empty.js over
index.js in the final image so the runtime import is a no-op; the build-time
client/server guard already ran during `next build`. Web is unaffected.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 21:31:38 -04:00
Leon Serfaty 328cd62766 fix(docker): use a >=32-char build-time BETTER_AUTH_SECRET placeholder
The security-hardening pass tightened lib/auth/auth.ts to reject secrets
shorter than 32 chars (or known placeholders) in production. next build
evaluates that guard while collecting page data for /api/auth/[...all], so
the old 21-char "build-time-placeholder" now fails the build. Lengthen the
throwaway build-only value to satisfy the guard; the real secret is still
injected at run time and never baked into the image.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 21:19:56 -04:00
Leon Serfaty 19a403b431 fix(storage): serve assets via app routes when MEDIA_PUBLIC_BASE_URL is unset
publicUrl() defaulted MEDIA_BASE to "/media" even with no env set, so cover
art on public share pages pointed at a /media path that only the old nginx
(Plesk) box served. In the containerized Coolify/Docker deploy nothing serves
/media, breaking those images. Return null when MEDIA_PUBLIC_BASE_URL is unset
so callers fall back to the app's own /api/public/.../cover route (the deploy
README already documents assets as app-served). Backward compatible: behavior
is unchanged when the env var is set.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 21:10:52 -04:00
Leon Serfaty 51c541ad22 Security & robustness hardening pass
Cross-cutting input-validation, isolation, and DoS-resistance fixes across
the app, API, billing, queue, and infra layers.

- Runtime validation (zod) for client-supplied admin actions (role/plan/
  limits), series generation index, and all pg-boss queue payloads
- Auth: require email verification before sign-in; reject weak/placeholder/
  short BETTER_AUTH_SECRET in production
- Billing: sanitize Stripe/PayPal errors (log server-side, generic to client);
  race-safe subscription upsert; only count "processed" webhook events as
  handled; verify org membership in getEffectivePlan to block plan escalation
- Series generation: reserve usage up front and refund on failure; bill the
  owning org, not the caller's active org
- Injection defenses: HTML-escape user fields in emails, strip CR/LF from
  subject/recipient, validate ElevenLabs voiceId before URL interpolation
- Media routes: stream off disk instead of buffering whole files; rate-limit
  anonymous public audio/cover endpoints by client IP
2026-06-20 20:59:03 -04:00
Leon Serfaty cd1d6a1a28 Add brand logo + favicon across app surfaces
Ship the Podcast Distribution AI wordmark as real assets and replace the
Mic-tile + text placeholder everywhere it appeared.

- public/logo-dark.png (dark wordmark, for light backgrounds) and
  public/logo-light.png (light wordmark, for dark backgrounds)
- New <Logo> component swaps the two via Tailwind dark: variants, so the
  dark logo shows on all non-themed surfaces (marketing, auth, admin,
  public share) and the light logo only in dark-mode app surfaces
- Wire <Logo> into the marketing header/footer, auth layout, app header
  (default branch only - white-label org logos untouched), admin header
  (+ Admin badge), and the public share page
- Favicon via App Router file convention: app/icon.png + app/apple-icon.png

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 20:58:37 -04:00
Leon Serfaty 013a3525e5 docs: point deploy git URL at the actual repo (admin/podcastdistributiona) 2026-06-20 20:17:09 -04:00
Leon Serfaty 4fb2645db1 Rebrand PodcastYes -> Podcast Distribution AI (podcastdistributionai.com) 2026-06-20 20:12:43 -04:00
Leon Serfaty 3ad90f076f fix: tolerate empty NEXT_PUBLIC_APP_URL during production build 2026-06-08 04:46:58 -04:00
Leon Serfaty 305278a846 Add comprehensive /features page + allow Unsplash imagery 2026-06-08 04:37:10 -04:00
Leon Serfaty 8138827657 Retarget deployment from Plesk to Dokploy (Docker Compose) 2026-06-07 18:30:53 -04:00
Leon Serfaty f033f00379 Comprehensive admin + user dashboards (production-ready) 2026-06-07 17:54:30 -04:00
Leon Serfaty 155507f21a Initial commit: PodcastYes — AI podcast platform 2026-06-07 03:58:32 -04:00