Loading…
☰ Contents

Mvox / RS Milow Audio — Ops Guide

Everything needed to run this system: what each piece is, how to do the things you'll actually need to do, and the limits that tell you when a free tier stops being enough.

01How this all fits together

Mvox is a one-time-purchase (no subscription) audio plugin suite. The business has four moving parts that all talk to each other:

  • A static website (no server of its own) that sells the plugins and hosts the account dashboard
  • A backend (database + login + small serverless functions) that both the website and the plugin itself talk to — this is the single source of truth for who owns what
  • Stripe for taking payment
  • The plugin itself (C++/JUCE), which checks in with the backend on launch to confirm it's licensed, then works offline for up to 14 days if it can't reach the internet

Nothing here requires running or maintaining a server — the website is static files, the backend is fully managed, and installers are files sitting in a GitHub release.

02The pieces

Website
rsmilowaudio.com — static HTML/CSS/JS, hosted on Vercel
project: mvox-suite
Backend
Database, login, and small server functions
Supabase · ref wnaqlrpcqwoajtqjpimo
Payments
Checkout + the record of who paid for what
Stripe (live account)
Plugin source
The actual C++ plugin code — private
github.com/RSMilow/MVOX
Installer files
Where every .exe/.pkg actually lives — public, no source code in it
github.com/RSMilow/mvox-downloads
Discord alerts
One-way webhook that posts new-ticket pings to a channel
no bot — can't manage roles/members
Test sitemvox-hero-test.vercel.app is a disposable scratch project for previewing design changes before they go live. Not linked from anywhere real — safe to ignore or delete anytime.
M-Space's EZ ModeA second reverb engine (toggle in Source/DSP/ReverbModule.h/.cpp) hand-ported from the open-source Reverb Trickery project (a Dattorro plate reverb + saturation + band filter, collapsed behind one knob). Delay lengths/coefficients came directly from Faust's own reverbs.lib dattorro_rev, not guessed. Advanced mode is the original, completely untouched engine — existing sessions/presets default to it.

03Doing things

The runbooks you'll actually reach for.

3.1 — Deploy the website

Every site file change (pricing, copy, layout, new pages) needs this to go live. Claude can edit every file but is blocked from running this specific command — it'll hand you the exact line to paste.

Set-Location "C:\Users\Rohit\Desktop\Mvox Website"
$token = (Get-Content .env | Where-Object { $_ -match '^VERCEL_TOKEN=' }) -replace '^VERCEL_TOKEN=', ''
npx.cmd vercel --prod --yes --token $token
Don't paste a literal <VERCEL_TOKEN> placeholderPowerShell treats </> as redirection operators, so a placeholder like that errors out (RedirectionNotSupported). The command above reads the real token straight out of .env instead, so there's nothing to substitute by hand.
This is PowerShell, not bash — and it's npx.cmd, not npx — see Known Quirks.

3.2 — Push a new plugin build live

Two ways, depending on scale:

  1. One file: sign in to your personal account, go to Account → Upload Installers, and drag the new build onto the matching slot. It replaces the file on GitHub instantly — no site redeploy, nothing else to do.
  2. A whole batch (e.g. after a source change that touches every plugin): rebuild everything, copy the fresh installers into Mvox Website\downloads\, then run:
    cd "C:\Users\Rohit\Desktop\Mvox Website"
    node scripts/seed-github-releases.js
    This uploads every file in that folder to the release, replacing whatever's already there under the same name.
One exceptionThe full Suite installer is ~125–130MB, over what the site itself can host. It never goes in downloads\ — it's uploaded straight to GitHub Releases on its own.

3.3 — Change a price

Stripe prices can't be edited once created — changing one always means creating a new Price object and retiring the old one. This touches four places, every time:

  1. Stripe: create the new Price on the same Product, set it as the product's default, deactivate the old Price (don't delete it — old receipts still point to it)
  2. supabase/functions/create-checkout-session/index.ts — the price ID map and the base-price map used for the launch-sale math and the suite-upgrade credit
  3. supabase/functions/admin-api/index.ts — the price used for revenue reporting
  4. account/dashboard.html and index.html — the displayed number in two homepage spots plus the dashboard's locked-product tag

Just tell Claude the new number — it knows this whole chain and updates all four in one pass.

3.4 — Change the database

supabase db push is broken for this project (its migration history got out of sync early on). Every schema change instead goes through Supabase's Management API directly: a new numbered file in supabase/migrations/, applied as a raw SQL call. Claude has this workflow memorized.

3.5 — Update backend logic (an Edge Function)

Unlike the site, Claude can run this one directly:

cd "C:\Users\Rohit\Desktop\Mvox Website"
npx supabase functions deploy <function-name>

Takes effect immediately, live, no further steps.

3.6 — Rebuild the plugin (Windows)

  1. Build: open a Developer Command Prompt (or run vcvarsall.bat x64 first), cd into Mvox\build, run cmake --build . — the project's generator is Ninja (single-config), so the build type comes from the cached CMAKE_BUILD_TYPE value, not a --config flag on this command (that flag is a Visual-Studio-generator thing and is silently ignored here)
  2. Only the main Mvox target auto-copies itself into C:\Program Files\Common Files\VST3\ after building. The 9 mini-plugins don't — copy each one's .vst3 folder over manually every time
  3. To cut new installers: stage the fresh .vst3 folders into Desktop\mvox parts\, run BuildMiniInstallers.ps1 (the 9 minis) and the two ISCC.exe MvoxSuite...Installer.iss commands (suite + trial)
Always confirm this before shippingMvox\build\CMakeCache.txt must have CMAKE_BUILD_TYPE:STRING=Release. If it ever reads Debug again, every installer built from it will link the Debug CRT (MSVCP140D.dll, VCRUNTIME140D.dll, ucrtbased.dll) instead of the real redistributable's Release DLLs — those only exist on machines with Visual Studio installed, so the plugin fails to load with a bare "error" status for every real customer. This exact bug shipped to customers once already (discovered 2026-08-30 via a customer's FL Studio scan + the open-source Dependencies tool) and was almost certainly also inflating the CPU-usage complaints, since Debug builds skip compiler optimizations and add runtime checks. To fix a stale cache: cmake -DCMAKE_BUILD_TYPE=Release . from inside Mvox\build, then rebuild — this forces a full recompile since Debug and Release object files can't be reused.
Mac builds happen on your Mac, from the same GitHub source — say "new repo" to whichever Claude session is over there and it'll clone fresh rather than reuse an old checkout.

3.7 — Change which Discord role gets pinged

There's no bot, only a webhook, so this can't be changed from Discord's side — the role ID is hardcoded into two Postgres trigger functions. Get the new role's ID (Discord → enable Developer Mode → right-click the role → Copy Role ID) and hand it to Claude.

04Limits & when to upgrade

What's confirmed vs. a well-sourced estimate — free-tier numbers shift, treat this as "roughly here, verify in your own dashboard before it matters."

Worth acting on now, not just watching Vercel's Hobby plan (confirmed — this is what the site is actually on) has historically restricted itself to non-commercial use — the moment a site is actively charging customers, its own terms point to Pro. This site has been taking real Stripe payments since launch. Worth a deliberate decision either way — Pro also removes the "no overage, project just stops" bandwidth cliff below.
The one that can silently take the plugin offline Supabase free-tier projects pause automatically after 7 days with no activity. Since the plugin calls this same backend to verify a license on every launch, a paused project means real customers' plugins can't check in (a brand-new install would fail outright; someone who's verified recently falls back to the 14-day offline cache). Mitigation: log into the Supabase dashboard at least once a week.
ServiceCurrent planFree-tier ceilingWhat happens at the limit
VercelHobby (confirmed)100GB bandwidth/mo · 100MB max per static file · no overage billingSite pauses until next month — no way to pay through it. (100MB file limit is why installers live on GitHub instead.)
SupabaseFree (inferred)500MB database · 5GB egress/mo · 50k monthly active users · 500k function calls/mo · 1GB file storagePauses after 7 days idle — see above. Otherwise requests throttle/reject past the cap.
StripePay-per-transactionNo plan tier — scales with volumeNothing to hit. Standard processing fees apply per charge.
GitHubFree2GB per release asset · private repos freeBiggest file today is ~130MB — plenty of headroom.

Vercel's plan confirmed directly via its API. Supabase's tier is inferred from an earlier 50MB Storage upload error matching the known free-tier cap, not read off a billing endpoint directly.

05Known quirks

  • PowerShell uses ;, not && — a command chain copied from anywhere bash-flavored will fail with a parser error.
  • Use npx.cmd, not npx — bare npx tries to run a PowerShell script, blocked by this machine's execution policy.
  • Claude can't run certain commands itself — deploying the live site, setting secrets, and calling raw GitHub/Stripe APIs directly are blocked by an internal safety check regardless of chat approval. Claude prepares the exact command; you run it. Deploying an Edge Function is not blocked.
  • supabase db push doesn't work for this project — see 3.4.
  • Only the main Mvox target auto-installs after a build. The 9 mini-plugins need manual copying every time.
  • Stripe prices are immutable. No "edit price" — only create-new-and-retire-old.

06Where things live

PathWhat's there
Desktop\Mvox Website\The site itself, plus supabase\functions\ and supabase\migrations\
Desktop\Mvox\Plugin C++ source (git repo, pushes to RSMilow/MVOX)
Desktop\mvox parts\Installer staging — Inno Setup scripts, BuildMiniInstallers.ps1, staged .vst3 folders
Mvox Website\downloads\Local staging before seed-github-releases.js uploads to GitHub
Mvox Website\stripe_price_ids.txtPlain-text mirror of current Stripe price IDs
C:\Program Files\Common Files\VST3\Where installed plugins actually live for any DAW

07Credentials

Everything below lives in Mvox Website\.env — never committed to git.

  • VERCEL_TOKEN — deploys the site
  • GITHUB_TOKEN — pushes installer files to the downloads repo
  • SUPABASE_ACCESS_TOKEN — the Management API workaround for schema changes
  • STRIPE_SECRET_KEY — creating/retiring prices, live account
Treat as real secretsEvery one of these grants meaningful write access. Don't paste them anywhere outside this project.