Skip to content

Trust and safety

Security

Sonic Weaver is a free browser tool. The single most important consequence for your security is that the work happens on your device: your audio, your project document and your rendered video are produced locally. This page describes what protects the parts that do touch a server, states the limits honestly, and tells you how to report a problem.

Response headers on every request

These are read from the same module the server configuration builds its rules from, so the table cannot describe a policy the site is not actually sending.

HeaderValueWhat it does for you
X-Content-Type-OptionsnosniffBrowsers must honour the declared content type instead of guessing it, so a file that claims to be an image can never be executed as a script.
Referrer-Policystrict-origin-when-cross-originLinks out of Sonic Weaver carry only the origin, never the full path. A site you click through to cannot see which project or template page you came from.
X-Frame-OptionsDENYBy default, other sites cannot embed Sonic Weaver in a frame. A short allowlist permits only this site to frame its ad document and editor creation workspaces; other framing remains blocked.
Permissions-Policycamera=(), microphone=(), geolocation=(), payment=(), usb=(), browsing-topics=(), hid=(), serial=(), bluetooth=(), midi=(), idle-detection=(), local-fonts=()Camera, microphone, location, payment, interest-based ad topics, and every way of reaching a device plugged into or near your computer (USB, HID, serial ports, Bluetooth and MIDI), plus idle detection and the list of fonts installed on your computer, are switched off at the platform level. No script on any page, an ad's included, can ask you for them under this site's name. Microphone visualization is not a shipped feature; if it ever ships this entry has to change first.
Strict-Transport-Securitymax-age=63072000; includeSubDomains; preloadThe site is HTTPS-only for two years from your last visit, including every subdomain of sonicweaver.com. The header also asks browsers to preload the site, which protects even a first visit from a downgrade once sonicweaver.com is on the browser preload list.

A Content-Security-Policy is sent alongside them. It is the mechanism behind the two route lists below.

Routes with no advertising surface

Sonic Weaver is free because its pages carry ads. The screens where you sign in, sign up, recover an account, see your recovery codes, or where the admin works carry no ad script at all and are served a stricter Content-Security-Policy in which no advertising or ad-measurement origin is reachable, enforced by your browser from the response header, not by a script that politely declines to load.

  • /login
  • /signup
  • /recover
  • /migrate-account
  • /admin
  • /settings/security
  • /join
  • /dashboard/channel/members
  • /stream/connect

Each of these screens except /stream/connect also sends Cross-Origin-Opener-Policy same-origin. If a page on another site opened one of them in a new window, it loses its hold on that window: it cannot later send it to a look-alike page, or watch what it does. /stream/connect keeps that link because the Stream studio opens it and takes your stream key back through it.

Cross-origin isolated routes

The editors are not cross-origin isolated. They were (COOP same-origin and COEP credentialless, so the in-browser machine-learning runtime could use SharedArrayBuffer), but isolation also blocks advertising frames, so since 23 October 2026 the editors run without it. Transcription and vocal isolation still run in a background worker, on the graphics processor where the device has one. The editor and studio use the site's Content-Security-Policy, and their one ad is a labelled banner at the top, never over the canvas, the timeline or a control.

The ad frame, the listed editor creation workspaces, and Classic and Studio themselves (shown inside SW Agent) can be embedded by this site only (X-Frame-Options SAMEORIGIN, frame-ancestors self):

  • /ad-frame/:unit
  • /background-animator
  • /layers/assets
  • /stem-splitter
  • /transitions
  • /transitions/:id
  • /intros-and-outros
  • /intros-and-outros/:id
  • /overlays
  • /motion-graphics
  • /motion-graphics/:id
  • /lyric-videos
  • /audio-effects
  • /albums
  • /thumbnail-maker
  • /watermarks
  • /assets
  • /assets/:type/:id
  • /templates
  • /templates/:id
  • /editor
  • /studio

How the rest is protected

Your music and imported files stay on your device

Analysis, rendering and video export all run on your machine through the Web Audio API, WebGL/Canvas and WebCodecs. Music, images and other files you import stay in your browser: saving a project stores your settings and each imported file's name and fingerprint, never the file itself. Neither rendering nor saving uploads a file you import, so there is no server-side copy of it to leak. Transcription and vocal isolation download the model to your browser and run it locally too, so the audio is not sent to an inference service. Earlier versions of Studio kept a private copy of files that signed-in members imported; those copies were never public, and they still open in the projects that use them.

src/lib/audio/, src/lib/engines/v3/runtime/, src/lib/whisper.ts, src/lib/ml/demucs.ts, src/lib/studio/, src/lib/projects/dal.ts

Published music uses a separate, explicitly selected copy

When music posting is available, publishing can upload a compressed copy of the full song or preview you selected, plus resized image copies. Saving an editor project does not upload its originals. The server checks ownership of uploaded copies, validates their type and duration, and requires the current music ownership confirmation before publication. Exact matches against previously reviewed files are reviewed by hand; the automatic check does not issue strikes or establish copyright clearance.

src/lib/community/media/, src/lib/copyright/, src/app/api/community/posts/

Passwords are never the whole story for sensitive actions

Accounts use Better Auth with optional passkeys and an optional authenticator app, which then asks for a six-digit code after the password at sign-in. A passkey check counts only when the passkey asks for its own PIN, fingerprint or face. Owner and administrator accounts cannot open the admin until they hold a passkey or an authenticator app, and every administrative action needs a fresh passkey or authenticator check on top of an already valid session and writes an immutable audit event; an account with admin access that already holds one also needs that check before adding another passkey. Removing a passkey or changing your username needs a sign-in from the last ten minutes, a fresh passkey or authenticator check, or a code from the app, and turning the authenticator app off needs the password and a current code or a backup code. Connecting Google to your account needs a sign-in from the last ten minutes or a fresh passkey or authenticator check. Changing your password signs out every other device, and a new password that already appears in a known data breach is refused: only the first five characters of its SHA-1 fingerprint leave the server for that check, to the free Pwned Passwords service, and if the service does not answer the password is accepted. A new password, passkey or Google connection appears in your Security notifications, so a change you did not make stands out. Account recovery uses a passkey, a single-use hashed recovery code, or an existing trusted session, and a password set through recovery signs out every device. Sonic Weaver does not send account email, so there is no reset link to intercept.

src/lib/auth/, src/app/admin/

Sign-in attempts are counted in the database

Sign-in, sign-up, recovery codes and second-step codes are limited per network address, and the counts live in the database, so a restart does not reset them. Wrong passwords are also capped per account, from every address together: after ten in fifteen minutes, that account's password sign-in pauses for up to fifteen minutes while a passkey, Google and a recovery code keep working, and a right password never counts. These limits are on for the live site.

src/lib/auth/rateLimits.ts, src/lib/auth/signInBudget.ts, src/lib/security/durableRateLimit.ts

Every read and write rechecks who you are

Application data access goes through server-only data-access modules. Projects, assets, community posts, profiles, notifications and admin operations each re-verify the session and the relevant ownership, visibility, suspension or role boundary on every call rather than trusting a check made earlier in the request. Mutation routes additionally require an exact trusted origin. Answers that belong to your account are never stored by a cache and are sent with Cross-Origin-Resource-Policy same-origin, so a page on another site cannot load them. When something fails inside the server, you get a plain sentence; the server's own error text, which can name its tables and the values it was given, stays in its log.

src/lib/db/, src/app/api/, src/lib/security/posture.ts, src/lib/security/publicErrors.ts

Uploads are validated after they land, not just before

Client upload tokens are short-lived, scoped to an authenticated owner and a random object path, and bounded by declared type and size. What arrives is then checked by magic bytes and a real decode; SVG and 3D model inputs get format-specific sanitisation, and anything unparsable or incomplete is quarantined rather than served. An SVG is checked as the browser will read it, with namespaces and character references resolved, and your own SVG opens as a download rather than as a page on this site. Community pages serve only a separate public-preview derivative, never the private source object. Downloads of your own files have a daily ceiling per account, counted in the database, so a script cannot run up the site's transfer bill; reopening a project whose files have not changed costs nothing against it.

src/app/api/assets/, src/lib/assets/svgSafety.ts, src/lib/assets/assetReadBudget.ts

A picture you post never says where you took it

Phone photos carry hidden details: the GPS position where they were taken, the phone that took them and when. A picture you choose for your profile, a post's still or a post's images is redrawn on your device before it is uploaded, which keeps the picture and drops those details. The server then refuses any public picture that still carries them, and the public picture addresses serve a copy without them if an older file has any.

src/lib/assets/imageMetadata.ts, src/lib/community/media/imageDerivative.ts

A link cannot change your saved work

Links can start a project already set up: a look, a background, an overlay, even edits in plain words. When a link names one of your saved projects, Classic opens it and ignores anything the link asks to change, and says so, so nobody can send you a link that rewrites your work. SW Agent only puts a message in its box from a link; nothing runs until you press Send.

src/lib/editor/savedProjectLinks.ts, src/lib/assistant/launch.ts

Concurrent edits cannot silently overwrite each other

Project writes carry a revision token. A save built from a stale copy of the document is rejected instead of quietly replacing newer work, which is the difference between a merge conflict and lost work.

src/app/api/projects/

Known limits

  • Sonic Weaver has not had an external penetration test or a third-party security audit. Nothing here is a certification.
  • There is no paid bug bounty. Reports are still welcome and are treated as defects.
  • Some dependency advisories remain open in build tools and in copies of a validation library that only ever read the site's own configuration, where no request reaches them. Advisories in what runs on the live site are fixed as they land. Each one is re-checked on every dependency update; see docs/SECURITY.md for the current ledger.
  • Sign-in, sign-up, account recovery and sign-in codes are limited per network address, and wrong passwords per account, counted in the database on the live site, and uploading and downloading your own files have daily ceilings per account. Most other actions use a brake kept in each server's memory, which resets when that server restarts: it slows a burst, it does not cap a day.
  • Exported video is written by your browser and is not scanned or signed. What you export is what you rendered.

Reporting a vulnerability

Email visualizers@novusstreamsolutions.com with the affected URL, the steps to reproduce, and what an attacker would gain. You will get an acknowledgement within 5 working days.

  • Please do not post exploit details to the community feed or any public issue tracker before we have replied.
  • Test only against your own account and your own uploads. Do not access, modify or retain another person’s data.
  • No automated scanning that degrades the service for other people, and no social engineering of anyone.
  • Good-faith research that stays inside those lines will not be met with a legal complaint.