How it works

Need help? Contact us at support@karharimedia.com.

  1. 1. Visit & sign in — Continue with Google to enable YouTube or with Facebook to enable Pages. Connect the other provider in Settings → Connections to enable dual upload.
  2. 2. Upload audio + thumbnail — MP3/WAV/FLAC ≤200 MB + JPG/PNG/WEBP ≤15 MB. We upload to R2 (audio/<uuid>), probe duration, and keep a thumbnail preview. No thumbnail? We render a gradient with your title.
  3. 3. Pick visualizer — Bars (blurred BG + showwaves 1920×380) or Circular (800×800 canvas, 360 bars, colorkey). Choose cyan/green/pink/purple/red/white. We show a live preview.
  4. 4. Choose destination & visibility — Tick YouTube and/or Facebook, pick channel/page from the live pickers, set Public/Unlisted/Private and optional schedule, add description.
  5. 5. Generate once, upload everywhere — We create videoJobs doc, download assets from R2 to tmp, run ffmpeg (libx264 fast crf22 aac192k, yuv420p, timeout audioDuration×8000 up to 90 min), cache to R2 at social-videos/<jobId>.mp4, then upload: YouTube via resumable 5 MB chunks; Facebook via R2 file_url. Promise.allSettled — both can succeed/fail independently.
  6. 6. Track progress — Poll GET /api/jobs/[id] shows downloading → generating → uploading → done/failed with per-platform external IDs and video URLs. See all jobs at /dashboard/jobs and per-job at /dashboard/jobs/[id].
For admins
See /admin for visits (analyticsEvents), users, and per-user uploads. Grant admin by setting ADMIN_EMAILS or role=admin in DB. Ads (AdSlot 336×280, min-height 280 to avoid CLS) appear only on public pages (/, /how-it-works, /faq) with lazy afterInteractive loading.