YouTube metadata strategy (@useBrioso)
YouTube metadata strategy (@useBrioso)
How every video on the Brioso channel is titled, described and tagged. Companion to
blog-authoring-rules.md, whose house rules apply here too: English
only, no em-dashes or en-dashes, never name the audio model in reader-facing copy, human voice
rather than keyword stuffing. Keywords come from
keyword-research-bri-28.csv.
American English, always (revision 2026-07-31): license not licence, color not
colour, organize not organise, and so on, across titles, descriptions, tags and playlist
names.
Ticket: BRI-76. Feeds BRI-44 (content schedule), BRI-15 (playlists), BRI-75 (videos DB).
1. The “royalty free” question, settled
We may say royalty free. We may not say copyright free.
Royalty free is a licensing term of art: no per-use fees and no ongoing royalties. It has never
meant free of charge. Epidemic, Artlist and Soundstripe all charge money and use it. Our own
catalog-license.md §3 and
track-license.md §3 both use it verbatim, and /music/license
reads “royalty-free, licensed on a non-exclusive basis”. So charging for a track and calling it
royalty free is consistent, and the site already commits us to that reading.
“No copyright” and “copyright free” are a different claim, and they are wrong for us on three
counts that compound:
- They promise free use. In creator vernacular, copyright free music is music you download and
use for nothing. Asking for payment after that promise is the fact pattern Ford counterclaimed
on in Freeplay Music LLC v. Ford Motor Co. (2020): the Lanham Act exposure came from “FREE” in
the headline with the payment terms buried below. - For our catalog it is close to literally true, and that is the danger.
track-license.md§4 concedes the audio is AI-generated and may have
limited or no copyright protection. Telling a viewer the track has no copyright tells them they
do not need our permission, and they would be right. We would be arguing ourselves out of the
sale. - The keywords were never winnable anyway. The CSV already marks “copyright free music”
(12100/KD85) and “royalty free music for youtube” (5400/KD87) asdefer, owned by Epidemic and
the YouTube Audio Library. Dropping them costs nothing.
The real safeguard is not vocabulary, it is distance between the promise and the price. That is
what the Freeplay counterclaim turned on. Hence the three hard rules below, which are what actually
protect us. Once they hold, “royalty free” is safe wherever it appears.
Three hard rules
- The price appears above the fold, in the same sentence as the word “license”, inside the first
two lines of every description. - No token containing “free” appears in the first 100 characters, except “royalty free” itself,
which is allowed in line 1, provided the price and buy link land in line 2, same visible fold,
no “…more” expansion needed. Every other free-token stays banned there: not “free preview”,
not “free to use”, not bare “free”. This is a narrower reading of the same rule the doc always
had, not a reversal of it: the Freeplay risk is distance between the promise and the price, not
the word “free” existing at all, and “royalty free” immediately followed by “$4.99” closes that
distance to zero. - The claim caveat appears on every video, in our own words. Never “no claims”. Always: we do
not register our tracks, so we will not claim you; platforms can still throw false positives;
if one hits, we hand you your license documentation and help clear it. This mirrors the
/licenseheading, which correctly reads “no claims from us”.
Where “royalty free” is allowed
| Surface | Allowed |
|---|---|
| Catalog track title, thumbnail, tags, hashtags | No |
| Burned-in on-screen text | No |
| Description license section, adjacent to the price | Yes, once |
| Educational video title (“What royalty free actually means”) | Yes, as the lead |
Banned everywhere on the channel
Titles, tags, hashtags, thumbnails, burned-in frames:
no copyright, copyright free, free to use, free download, free music, 100% free,
any price in a title, a year stamp, ALL CAPS words, emoji, em-dashes, en-dashes.
One exception: inside the description body only, a single emoji may prefix each ALL-CAPS
section header (see §4), paired with a ▬ separator line between sections. That is the one place
on the channel emoji are allowed, restrained to one per header, never stacked, never used as
decoration elsewhere in the copy. Em-dashes and en-dashes stay banned everywhere, including inside
the description.
What we say instead
Revision (2026-07-26, resolved 2026-08-02): the catalog is stock, not exclusive. Each pre-made
track can be licensed by more than one buyer. This was originally written as “track-license.md §2
must drop its sold-once promise”; PR #134 resolved it better, by splitting the document rather
than weakening it. catalog-license.md §2 is explicitly
non-exclusive and governs the catalog; track-license.md §2 keeps its exclusivity promise, which is
true for Studio commissions. Never use exclusivity language (sold once, retired, delisted,
[Licensed]) in catalog copy, and never cite the Studio license from it.
The pitch instead leans on what royalty free actually buys the licensee against a subscription
library (Epidemic, Artlist, Soundstripe): once you license a track, it is yours forever, even if you
stop paying anyone anything ever again.
License it once, use it forever.
Never say “unique”, “one of a kind”, “exclusive”, or “no one else will ever have this sound”.
Multiple buyers can license the same track, so any exclusivity or scarcity claim is now simply
false, not just unfalsifiable.
Claims we may not make (2026-08-01)
BRI-152’s own review pass withdrew four competitive claims as unsupportable. They are recorded here
because a withdrawn claim tends to resurface in marketing copy months later, once the reason it was
dropped has been forgotten.
| Do not claim | Why it is false |
|---|---|
| Any license-durability advantage over Suno | Suno’s paid subscribers own their songs outright, an ownership transfer. We have no advantage to claim. |
| “A strict superset of Epidemic” | Epidemic now bundles 250k AI credits into a $9.99 plan, the same price as Brioso Pro, plus unlimited catalog. |
| That a perpetual license is unique to Brioso | Soundraw grants a worldwide perpetual license at roughly $6/mo and lets the user keep streaming royalties. |
.agents/docs/prd.md’s Messaging constraints (unmetered for normal use, a published limit may apply to automated/bulk retrieval, licenses already granted survive any future limit). BRI-162 still owns the actual number. |
The comparison that is still true, and worth leading with: durability against Epidemic and
Artlist specifically. Epidemic’s license lapses if you download a track and do not publish before
cancelling; Artlist voids use of downloaded assets in new projects after expiry. Ours is perpetual
on whatever you bought. Make that comparison against those two, never against Suno.
Also, per BRI-152: $4.99 sits below every per-track comparable (Epidemic $6.99, AudioJungle
$10 to $12, Foximusic $12 personal, Fiverr custom $15 to $30). Cite the set, not a single anchor;
an earlier draft justified the price against the cheapest observation alone and was wrong.
Open question: Stability AI attribution
The site footer now carries “Powered by Stability AI” (apps/web/src/components/Footer.tsx:160),
required by the Stability AI Community License that governs the model behind generation. PR #136’s
commit message quotes the clause as obliging commercial users to display it on a “website, user
interface, blogpost, about page, or product documentation”.
Whether that reaches a YouTube description is unresolved, and cannot be resolved from this repo:
the license text is not checked in. A description is not obviously any of the five surfaces
enumerated. Someone needs to read the actual license before we either add it or conclude we do not
have to.
Note the attribution names the vendor, not the model, so it does not by itself collide with the
house rule against naming the audio model in reader-facing copy. That rule is already broken
elsewhere, for what it is worth: docs/track-license.md names the model in text that renders into
the Studio buyer’s license PDF. The catalog license drops that sentence.
2. Two content lines, two sets of KPIs
.agents/docs/prd.md covers the two live/shipping use cases (agency Audio Brand Kit,
creator custom-gen), and every channel=youtube row in the CSV is game-audio creator intent. The
channel serves both, but as two deliberately separate lines. State this rather than letting it
drift.
Revision (2026-07-31): Line A’s shop window is the royalty-free catalog (BRI-125), not
/t/<slug>. /t/<slug> (BRI-85) was never built. The real per-track page ships in the open
PR #134 at
https://usebrioso.com/music/genre/<genre-slug>/<track-slug> (canonical; a /music/mood/<mood-slug>/<track-slug>
page also exists for the same track but is not canonical). See §4 and §5 for the details this
revision drives through the rest of the doc. Until PR #134 merges, no catalog track has a live
page at all, so nothing in this doc’s Line A template can go out yet regardless of /t/ vs
/music/.
Line A, catalog track videos. The shop window for the catalog. Near-zero search demand by
design, because the keywords that carry volume carry listener intent.
Judged on clicks to the track page and tracks licensed, never on views. A 200-view video that
sells a track beats a 50,000-view video that does not.
Line B, funnel and answer videos. The how-to rows (how to make video game music 260,
how to make music for a video game 170) plus the BRI-28 money clusters: sonic branding,
advertising, podcast, music on hold. This is where the agency ICP gets a surface.
Judged on briefs started.
Target roughly 2:1, A to B. Never let fewer than a third of uploads be Line B, or the channel and
the PRD are describing two different companies.
Why views are not a Line A KPI: chasing free-download keywords recruits a free-download
audience, and YouTube then optimises the channel toward more of them. That is a recommendation
cohort decision, and it cannot be undone later. It permanently caps conversion.
3. Title format
Budget 60 characters. Assume mobile truncates near 40. Front-load the exact CSV keyword, because
YouTube search weights early tokens.
The title carries only permanent facts. Since the catalog is stock (§1 revision), a track stays
available indefinitely, so “buy now” or “on sale” language is unnecessary rather than merely
unstable. Still avoid a price or a year stamp in the title: prices can change, and the title should
outlive any one price point. Same test governs burned-in on-screen text, which can never be edited
at all (§8).
Line A, catalog tracks (16:9)
{Exact CSV keyword} for {buyer use case} | "{Track Name}"
Boss Battle Music for Indie Games | "Ironclad Halo" (51)
Chiptune Music for a Pixel Art Platformer | "Bitmoss" (53)
Cyberpunk Music for Game Trailers | "Neon Grid" (47)
8 Bit Music for a Retro Game Menu | "Copper Coast" (50)
Epic Battle Music for a Boss Fight | "Ashfall Rite" (51)
16 Bit Music for an RPG Overworld | "Amber Route" (49)
Retro Game Music for a Menu Screen | "Turbo Lane" (49)
Cinematic Music for a Brand Film | "Long Field" (47)
Trailer Music for a Product Launch | "Signal Fire" (50)
Pixel Art Music for a Farming Sim | "Bramble Row" (49)
The quoted track name goes last on purpose: it is the slug anchor, findable as
brioso ironclad halo; it is the segment we can most afford to lose to truncation; and putting it
last keeps the keyword at position zero.
Line B, funnel and answer videos (16:9)
How to Make Video Game Music Without a Composer (47)
How to Make Music for a Video Game in 10 Minutes (48)
What Royalty Free Actually Means (and What It Does Not) (55)
Why Stock Music Makes Every Brand Sound the Same (48)
Sonic Branding: What Agencies Actually Deliver (46)
Podcast Intro Music: How Long Should It Be? (43)
“Royalty free” leads exactly once, in the definitional title, where the intent behind the search is
“what does this mean” rather than “give me a file”. It pairs with the scheduled blog post
royalty-free-music-meaning, and must not publish before that post goes live.
Shorts (9:16)
Around 40 visible characters under the overlay, usually one line. Drop the pipe, it reads badly
vertically. Drop the track name, there is no room, and it lives in the description and pinned
comment instead. One keyword, one hashtag.
Boss battle music, made to brief #gamedev (41)
Cyberpunk music for your trailer #cyberpunk (43)
8 bit music for a pixel game #chiptune (38)
Made to brief, licensed to you #indiedev (40)
Trailer music for a launch film #adcreative (43)
Remix pool: accepted, disclosed (BRI-90, decided 2026-08-02). Publishing a Short puts its audio
into YouTube’s remix / “use this sound” pool — YouTube redistributing our audio into third-party
Shorts at no charge, independent of the licenses we sell. Decision: accept this exposure rather than
watermark Shorts audio or avoid the format, and disclose it plainly in the license
(docs/catalog-license.md §2) rather than leave it silent. Shorts are cleared to ship once a
portrait render path exists (RESOLUTIONS in videos/youtube/src/schema.ts — see that file for
current status).
4. Description template
YouTube shows roughly 157 characters over about three desktop lines before “…more”, and fewer on
mobile. Lines 1 and 2 do all the work.
Revision (2026-07-31): price is a flat $4.99, not pay-what-you-want. BRI-152 (PR #133) retired
PWYW for single tracks entirely; packages/verticals/catalog/src/track-checkout.ts in the open
PR #134 hardcodes CATALOG_TRACK_PRICE_CENTS = 499,
server-set, never client-supplied. Say “$4.99”, never “pay what you want” or “$1 minimum”, once
that PR ships (see §10).
Live track
A royalty free synthwave track for game trailers, cyberpunk edits and neon-lit intros, from https://usebrioso.com/music.
• License it and download the files: https://usebrioso.com/music/genre/electronic/neon-grid ($4.99)
• Subscribe for new tracks every week: https://www.youtube.com/@useBrioso?sub_confirmation=1
▬▬▬▬▬▬
🎵 WHAT YOU GET
• The full length master in FLAC, MP3 320 and MP3 128
• A commercial license PDF issued to you with your purchase details
• Worldwide, perpetual, commercial use, no credit line required
• License it here: https://usebrioso.com/music/genre/electronic/neon-grid ($4.99)
▬▬▬▬▬▬
📜 HOW YOU CAN USE IT
Once you buy a commercial license, you can use this track in videos, games, apps, podcasts, client
work, or paid products, as part of a larger creative work. The license is non-exclusive, so other
people can license the same track. You can't resell the track on its own as a file or sound pack,
and you can't register it in Content ID or Rights Manager. We never register our tracks either, so
your authorized use shouldn't draw a claim from us, though platforms can still misfire on similar
sounding audio. If that happens, email us and a person will look at it.
License it here: https://usebrioso.com/music/genre/electronic/neon-grid ($4.99)
If a platform claims your video: https://usebrioso.com/copyright
Full terms: https://usebrioso.com/music/license
▬▬▬▬▬▬
🎧 WANT ONE MADE FOR YOU
Brioso composes custom tracks from a written brief.
Creators, start a brief: https://usebrioso.com/creators
Agencies, build a kit: https://usebrioso.com/agencies
▬▬▬▬▬▬
✨ MORE FROM BRIOSO
Royalty free game music, and what it actually costs you: https://usebrioso.com/blog/royalty-free-game-music
Browse the catalog: https://usebrioso.com/music
Follow us on X: https://x.com/usebrioso
#cyberpunkmusic #synthwave #gameaudio
The optional bundle line
When, and only when, the track’s taxonomy leaf has 5 or more published tracks, add one line to
“WHAT YOU GET”:
• Or get every Synthwave track in one ZIP for $19.90: https://usebrioso.com/music/genre/synthwave
The bundle is a flat $19.90 for every published track under one genre, mood or instrument node
(packages/verticals/catalog/src/track-checkout.ts, CATALOG_TRACK_PRICE_CENTS = 490).
The 5-track floor is arithmetic, not taste. $19.90 against $4.99 a track breaks even at 3.99
tracks. On a leaf with 2 tracks the bundle costs $9.95 a track, worse than buying both singly, and
linking it would be selling a worse deal to someone who trusted the description. The POC seeds
roughly 2 tracks a leaf, so no track qualifies today.
Link the bare taxonomy URL, no query string. The bundle button is hidden whenever a filter is
active (!mood && !q in music/genre/$genre/index.tsx), so a filtered URL renders a page with no
way to buy the thing the description just advertised.
Never write the track count as a fixed number. It is computed live from listPublishedByTaxonomy
at both checkout and download time, so “all 12 tracks” silently goes stale, and the ZIP the buyer
receives is whatever is published on the day they download.
Never state a duration
No description may name a track length, in seconds, minutes or as a range. The contract allows 15s
to 360s (packages/contract/src/schema.ts:127), the live site still says “30 seconds to 2 minutes”
(stale, BRI-158), and every track that currently exists is a ~16 second POC seed
(seed_catalog_poc.py, SECONDS = 16.0). Any number we print is wrong for some part of the
catalog.
“The full length master” stays, and is not a duration claim: it distinguishes the master from the
watermarked preview, which is exactly what a buyer is paying to move between.
Revision (2026-07-31): don’t repeat the track name in the description. The track name is
already the video title; opening line 1 with "Track Name" is a ... restated it for no reason.
Line 1 now starts straight with the description itself, still saying “royalty free” per the §1
exception, still immediately followed by the price and buy link.
Revision (2026-08-01): corrections from a full audit against the code and both open PRs. Five
things in this template were wrong or missing, each verified against the file named:
- Three master formats, not two.
packages/verticals/catalog/src/delivery.tsmasterFileSpecs()
delivers FLAC, MP3 320 and MP3 128. The 128 is a master tier, not the preview; the watermarked
preview (preview_key) is never delivered at all. - “Issued in your name” was false.
packages/licensing/src/template.tswrites
Licensee: ${order.buyerEmail}, and no buyer name is collected anywhere inLicenseOrderDetails.
For a buyer doing client work, “in your name” implies a legal entity they can hand to a client. - “Won’t draw a claim” overstated the license, which says authorized use “should not” trigger a
claim. §1 rule 3 requires our own words to carry the hedge, and the live/licensepage already
does. Now “shouldn’t”. - The larger-creative-work restriction was missing. Both license documents require the track be
used as part of a larger work; it is the clause that makes the standalone-resale ban coherent, and
it is the one restriction most likely to surprise a paying buyer. - Non-exclusivity was unstated. It is the reason the price is $4.99 and not $499, and a buyer who
has read the Studio/licensepage has been told the exact opposite. Saying so is not an
exclusivity claim; §9 bans claiming exclusivity we do not have, which is the reverse.
“If that happens, tell us” now has a destination: https://usebrioso.com/copyright, which has a
buyer-facing counter-notice path. Describe it as email reaching a person, never as a formal DMCA
process: the designated-agent registration with the US Copyright Office is a real external step and
is unfiled.
Revision (2026-07-31): line 1 names the catalog, not the bare domain. https://usebrioso.com/music
replaces the plain usebrioso.com mention, so the site reference is itself a clickable link to
the hub, not just a brand name a reader would have to type in themselves.
Order rationale. Line 1 says what the track is, says “royalty free”, and links the catalog.
The buy link and subscribe link are a 2-item bullet list right under it (not prose lines), visible
in the same fold as line 1 with no “…more” expansion needed: buy first, subscribe second (§2
revision on link order still applies, now as bullet position 1 and 2 instead of description
lines 2 and 3).
Revision (2026-07-31): subscribe is the second link, not the sixth. It used to sit at the
bottom of “MORE FROM BRIOSO”, after the license link and both product CTAs, meaning a reader had to
scroll past four other links to reach it. It now sits on line 3, right under the buy link, so it is
the second link encountered on expand, before any of the legal or CTA content. Below line 3: legal
necessity first (what you get, what the license covers, restrictions, the claim caveat), then the
two product CTAs (creators, agencies), then the remaining channel/social links, then hashtags.
Section separators are short, not full-width. A 6-character ▬ line breaks the description
into scannable blocks; each section header carries one emoji prefix: 🎵 What You Get,
📜 How You Can Use It, 🎧 Want One Made For You, ✨ More From Brioso. Same four, same
order, every upload. This is the one place emoji are allowed on the channel (§1); keep it to
exactly one per header, never stacked, never elsewhere in the copy.
Revision (2026-07-31): 6 characters, not 20, not 80. Even a 20-character separator rendered
as a near-full-width solid rule in a real YouTube description (checked against an actual upload).
A 6-character line reads as a small typographic break rather than a rule spanning the column, on
both desktop and mobile. Always check an actual rendered description, not just a character count,
before deciding a separator reads as a light touch rather than a bar.
The subscribe link uses ?sub_confirmation=1. Appending that parameter to the channel URL
makes YouTube prompt the one-click subscribe modal the moment the link is clicked, instead of just
opening the channel page. Use the full channel URL,
https://www.youtube.com/@useBrioso?sub_confirmation=1, verbatim, on every video, on line 3.
The subscribe/creator/agency/X links are channel-level constants. Same wording, same position
relative to their section, on every single upload, Line A or Line B, do not vary them per track.
Consistency there is what makes them scannable and ignorable for a viewer who’s already seen them.
Revision (2026-07-31): the top block and “WHAT YOU GET” are bullet lists; “HOW YOU CAN USE IT” is
prose. An earlier pass made every section flowing sentences after a screenshot showed the
original one-fact-per-line enumeration reading as an info dump. On review, facts-to-buy (the top
block: buy link, subscribe link) and facts-to-get (what’s in the download) read better as a short
bullet list, since each line is an independent, scannable fact. The usage/legal section reads
better as prose, since it’s an explanation with logical connectors (“because”, “though”), not a
list of independent facts. Use judgment by that test rather than a blanket rule: is this line a
standalone fact, or a sentence that depends on the one before it?
“WHAT YOU GET” and “HOW YOU CAN USE IT” both link the track page, the same URL as the top
block’s buy link. A reader who scrolled past the buy link without clicking it gets another chance
lower down, right where they’re evaluating what’s included or what they’re allowed to do with it,
rather than having to scroll back up.
“HOW YOU CAN USE IT” leads with permission, not disclaimers. Say plainly that buying a
commercial license lets the buyer use the track in videos, games, apps, podcasts, client work, or
paid products, before getting to the restriction (no standalone resale, no Content ID
registration) and the claim caveat. Nothing legally load-bearing gets cut for brevity: the
restriction and the claim caveat both still have to be in this section, in our own words, every
time; only the corporate-sounding preamble that used to open it is gone.
Exactly three hashtags, keyword-derived, because YouTube renders the first three above the
title. Never #royaltyfreemusic, never #nocopyrightmusic.
Only link to blog posts that are already live on the upload date. Posts are released
progressively via publishedAt in apps/web/src/data/blog/index.ts, and most are still drafts.
Check before linking, the same way blog cross-links are checked.
Since a track is never sold out (§7), the description body needs no volatile-state channel and
nothing on it changes after upload.
5. Naming convention
Two-word Title Case name. Evocative, no genre word, no number, no year. Two words keeps the quoted
segment short enough to fit the 60 character title. The slug is the kebab-case of the name.
Revision (2026-07-31): the catalog track link needs the genre segment, not just the slug.
The canonical page is https://usebrioso.com/music/genre/<genre-slug>/<track-slug> (PR #134,
apps/web/src/routes/_marketing/music/genre/$genre/$trackSlug.tsx). <genre-slug> is the
slugify()'d name of one entry in packages/catalog/src/taxonomy.ts’s genres list (§6 has the
full list); <track-slug> is globally unique per BRI-135’s DB constraint, so the loader ignores a
mismatched $genre segment for lookup and only 404s on it, meaning the genre segment is load-bearing
for the canonical URL even though it isn’t for the lookup. A track that also carries a mood tag
resolves at /music/mood/<mood-slug>/<track-slug> too, but for a track that has a genre that page
is not canonical: rel=canonical points at the genre URL, so link the genre URL.
Revision (2026-08-01): a track without a genre is canonical under its mood, and the genre URL
404s. BRI-127’s “one taxonomy axis per prompt” convention means many tracks have
genreSlug: null until BRI-142’s classifier backfill runs, and the genre route’s loader is
if (!track || track.genreSlug !== params.genre) throw notFound();. So:
| Track has | Canonical URL to link |
|---|---|
| a genre | https://usebrioso.com/music/genre/<genre-slug>/<track-slug> |
| no genre, a mood | https://usebrioso.com/music/mood/<mood-slug>/<track-slug> |
| neither | nothing to link. Do not publish; the track has no page. |
Never fall through to genrePath(track.genreSlug ?? ""), which emits /music/genre//<slug>, a
broken URL that looks plausible in a description and 404s on click. Check the axis before writing
the link, every time.
The URL shape is not frozen. docs/royalty-free-music-decisions.md warns that a 3-segment
/music/genre/<genre>/<subgenre>/<track> shape is needed once subgenre leaf pages exist, and
whoever builds those has to move genre-only tracks. Slugs are permanent (below); the path around
them is not, and a QR burned into a shipped master encodes the whole path. Do not render QR codes
against a catalog URL until the shape is settled.
One slug, and every artifact derives from it:
| Artifact | Value |
|---|---|
| Audio master | <slug>.wav, <slug>.mp3 |
| Render input | videos/youtube/renders/<slug>.json |
| Render output | out/<slug>-2160.mp4 |
| Catalog page and QR target | https://usebrioso.com/music/genre/<genre-slug>/<slug>, or the mood form above |
| Videos DB (BRI-75) | slug primary key, plus youtube_id, state, published_at, licensed_at |
| YouTube title | the Title Case name, in quotes |
| Playlist membership | keyed by slug |
Rules:
- Slugs are permanent and never reclaimed. The QR is burned into shipped masters, so
/music/genre/<genre-slug>/<slug>must return 200 forever regardless of whether the track is
later pulled from sale. - On a name collision, pick a different name. Never append
-2. A numbered suffix reads as an
afterthought and undermines the made-to-brief positioning. - No genre or mood in the slug itself.
neon-grid, notsynthwave-neon-grid, even though
genre is now a URL segment alongside it. The slug is permanent; a track’s genre tag can be
recategorised without touching the slug, and the URL segment updates independently. - Namespace note. Job slugs already live at
/status/$slug
(apps/web/src/routes/_marketing/status.$slug.tsx) and strategies at/strategy/$slug. Catalog
track slugs at/music/genre/$genre/$trackSlugare a separate namespace and must not be
conflated with either./t/$slug(BRI-85) is superseded and should not be built: the real route
already exists in PR #134.
6. Tags and playlists
Tags carry little direct ranking weight, but real weight in same-channel suggested-video
clustering, which is the main algorithmic lever a small channel has, and in disambiguating invented
track names.
8 to 12 tags, four tiers:
- Exact CSV keyword (1 to 2):
boss battle music,epic battle music - Transactional use case (3 to 4):
music for indie games,custom game music,
game music license,music for a game trailer - Channel cohesion (3 to 4, byte-identical on every upload):
brioso,brioso music,
custom music from a brief,royalty free license - Track identifier (1):
neon grid brioso
Banned tags: no copyright music, copyright free music, free music, free download,
royalty free music. The practical reason outweighs the legal one: those tags recruit the
free-download cohort, and the recommendation system will then serve us more of them.
Playlists
Each playlist is its own indexable surface, often easier to rank than any single video. Each links
to its matching landing page and blog post. This is the BRI-15 and BRI-44 hook.
- Game Audio: Boss Fights and Battle Themes (
epic battle music,boss battle music) - Chiptune and 8 Bit: Retro Game Music (
8 bit music,chiptune music,16 bit music,
pixel art music,retro game music) - Cyberpunk and Synthwave for Games and Trailers (
cyberpunk music) - Trailer and Cinematic Music for Brand Films (
trailer music,cinematic music) - Podcast Intros and Beds, links to
/blog/podcast-intro-music - Advertising and Brand Spots
- On Hold and Retail Beds
- Sonic Branding: Logos and Stings, the agency ICP, links to
/agencies - How Brioso Works, the Line B funnel videos
Playlist description: two plain sentences, one link to the matching site page, one to the matching
blog post.
7. No sold-out state, for now
Revision (2026-07-26): the catalog is stock, not exclusive. A track can be licensed by more
than one buyer, so there is no sold-out state to design around. A video’s title, description, tags
and pinned comment stay the same indefinitely once uploaded; nothing flips on a sale.
Never delete a video and never rename a track. The slug is the identifier across every system
in §5, and a QR pointing at it is burned into every shipped master, permanently.
If Brioso later moves back to selling a track only once, this section needs the lifecycle that was
here before this revision: append a status marker to the title, swap the top block of the
description, and flip /music/genre/<genre-slug>/<slug> to a sold state that still returns 200. Do
not reintroduce that without also rewriting docs/catalog-license.md §2 and the “What we say
instead” pitch in §1, so the site, the license and the channel change together rather than
drifting out of sync again.
8. Rendered frames are permanent, descriptions are not
A description can be edited forever. A rendered frame never can. So the burned-in layer carries
only facts that survive a sale.
On-screen may carry: the brand mark, the track name, the genre or mood tag, and the QR to
/music/genre/<genre-slug>/<slug>.
On-screen may never carry: a price, any token containing “free”, or a credit or attribution
instruction, since the license requires none.
The current default violates this. videos/youtube/src/schema.ts:16, src/Root.tsx:16,
render-inputs.example.json:4 and scripts/renderVideo.ts:33 all default the credit line to
"free to use — credit brioso.", which contradicts the license outright (no attribution is
required, and use is not free) and carries an em-dash. renders/neon-grid.json already overrode it
to “get a commercial license, see description below”, which is the right shape. See the blockers
below.
9. Pre-upload checklist
Gate: the track must exist, and its page must resolve
Update 2026-08-02: PR #134 (BRI-125) merged, and the structural blockers are gone. Verified
live the same day:
| URL | Was (2026-08-01) | Now |
|---|---|---|
/music |
404 | 200, and quotes $4.99, no pay-what-you-want copy left |
/music/license |
404 | 200, and says non-exclusive |
/copyright |
404 | 200 |
/license |
promised every track “exclusive to you” | scoped to “Studio custom track”, correctly |
So the template’s links are now the live architecture rather than a bet on it. PR #133 is still
open but does not gate anything: it is the docs-only BRI-152 decision record, and the $4.99
catalog price it describes shipped as code in #134
(packages/verticals/catalog/src/track-checkout.ts, CATALOG_TRACK_PRICE_CENTS = 499).
What still gates an individual upload is narrower, and per-track:
curl -s -o /dev/null -w '%{http_code}\n' "<the track URL you wrote>"
It must return 200. A structurally valid URL still 404s when the track is not a published row in
catalog_tracks, which is the normal state for any track that has not been seeded and published
yet. Both worked examples in the scratchpad (quiet-echoes, bus-window-6-am) 404 today for
exactly this reason: they are worked examples, not catalog rows.
Still true, and still the thing not to do: never substitute /license for /music/license.
They are now two correct documents for two different products. Sending a catalog buyer to the
Studio license hands them an exclusivity promise the catalog SKU is built to break.
Two open items that constrain copy rather than block it:
- BRI-186:
docs/catalog-license.mdstill does not disclose the forensic watermark and does not
affirmatively grant use without attribution. The template’s “no credit line required” is running
ahead of the binding text until that lands. - Custom-gen is still pay-what-you-want (
lib/routes.ts:71, BRI-153). That is the/creators
path, not the catalog, but “WANT ONE MADE FOR YOU” links there, so do not let a price for the
custom product appear in a catalog description.
Per-video checks
Run this against every video before it publishes. When BRI-75’s videos DB lands, this becomes a
test, in the same spirit as apps/web/src/data/blog/blog.rules.test.ts.
- Title is 60 characters or fewer, keyword first, track name last in quotes.
- Title contains no banned token, no exclusivity/scarcity word (
sold once,retired,
exclusive,limited), no price, no year, no emoji, no dash characters. - Keyword exists in
keyword-research-bri-28.csvand itschannelis notdeferorskip. - Line 1 does not repeat the track name (it’s already the video title); it opens directly with
the description and “royalty free”, per the §4 revision, and ends with
https://usebrioso.com/music, not the bareusebrioso.com. - The top block’s first bullet contains the price and the word “license” in the same sentence.
- No token containing “free” in the first 100 characters, except one “royalty free” in line 1,
and only if the price and buy link are in the bullet right under it, same visible fold. - The subscribe link with
?sub_confirmation=1is the second bullet in the top block, so it is
the second link a reader reaches on expand, not buried in “MORE FROM BRIOSO”. - No exclusivity or scarcity claim anywhere in the description, and no claim from the §1
banned-claims table (Suno durability, Epidemic superset, unique perpetual license, anything
“unlimited” or subscription-based). - “WHAT YOU GET” says three formats (FLAC, MP3 320, MP3 128), and says the license PDF is
issued to you with your purchase details, never “in your name” (no name is collected). - “HOW YOU CAN USE IT” leads with what buying a license permits, then “as part of a larger
creative work”, then that the license is non-exclusive, then the restriction (no
standalone resale, no Content ID registration), then the claim caveat, in our own words, not
“no claims.” The caveat says use shouldn’t draw a claim, never “won’t”. - No duration anywhere: no seconds, no minutes, no range. “Full length master” is allowed and
is not a duration claim. - The bundle line is present only if the track’s leaf has 5 or more published tracks, links the
bare taxonomy URL with no query string, and states no track count. - The track link is the correct axis: genre URL if the track has a genre, mood URL if it has
only a mood. Never/music/genre//<slug>. - Every link resolves: the track URL returns 200, and every blog link is live on today’s date.
The track link appears in the top block, “WHAT YOU GET”, and “HOW YOU CAN USE IT”, all
pointing at the same URL. -
https://usebrioso.com/copyrightis linked from the claim paragraph, described as email
reaching a person, never as a formal DMCA process. - Creators and agencies links present in “WANT ONE MADE FOR YOU”; catalog and X links present
in “MORE FROM BRIOSO”; all four byte-identical to every other upload. -
▬separator lines are exactly 6 characters (not 20, not the old 80), checked against an
actual rendered description, not just a character count. The four header emoji (🎵📜🎧✨) are
present, one emoji per header, none stacked, none used anywhere else in the description. - The top block and “WHAT YOU GET” are bullet lists (independent facts). “HOW YOU CAN USE IT”
is prose (an explanation, not a list). - American English spelling throughout (
license,color,organize, not the British forms). - Exactly three hashtags, none banned.
- 8 to 12 tags across the four tiers, none banned. Tags are entered directly into YouTube’s
Tags field, never typed as a trailing list inside the description. - Added to its genre playlist.
- Burned-in credit line carries no price and no “free” token.
Comment moderation: add free download, mp3 download, download link and no copyright to
the channel blocked-words list, and keep a canned reply. Otherwise the comment section sets a
free-download expectation under every video we own.
Language: English only, same as the blog. That covers titles, descriptions, tags and playlist
names. Do not add other languages opportunistically; the multi-language plan in BRI-28 is a
separate, deliberate phase.
10. Blockers before the first upload
None of these is optional: each one is either a broken link burned into a master, or a claim we
cannot stand behind.
| Ticket | Blocker | Where |
|---|---|---|
| BRI-85 | Superseded, do not build. /t/$slug was never built; the real catalog track route already exists at /music/genre/$genre/$trackSlug in the open PR below |
PR #134 |
| resolved | /music, /music/license and /copyright are live and docs/catalog-license.md is on disk. #133 stays open but gates nothing: it is a docs-only decision record, and the $4.99 price shipped as code in #134 |
PR #134 |
| resolved | /music quotes $4.99 with no PWYW copy left. One PWYW string survives at lib/routes.ts:71, but that is the custom-gen product (BRI-153), not the catalog |
apps/web/src/lib/routes.ts:71 |
| BRI-86 | Burned-in credit default contradicts the license and carries an em-dash | videos/youtube/src/schema.ts:16, src/Root.tsx:16, render-inputs.example.json:4, scripts/renderVideo.ts:33 |
| BRI-86 | Recoleta ships the DEMO weight, which its license forbids for public commercial output | videos/youtube/README.md |
| BRI-87 | Absolute no-claims copy we cannot guarantee per license §3 | apps/web/src/routes/_marketing/pricing.tsx:33, apps/web/src/lib/routes.ts:103 |
| BRI-87 | Resolved by PR #133: PWYW (and its $0.57/$1.00 floor mismatch) is retired entirely in favor of a flat $4.99, pending merge | pricing.tsx:70 vs components/music/DeliveryPanel.tsx:8 |
| BRI-87 | “Copyright-free” is reader-facing in 12 places on the site | Footer.tsx:121, Marquee.tsx:1, FeatureGrid.tsx:16, lib/routes.ts:29,95, lib/seo.ts:30, data/audiences.ts:39, __root.tsx:26, _marketing/index.tsx:31,52, pricing.tsx:26, agencies/index.tsx:79, showcase/agencies.tsx:32 |
| BRI-88 | License PDF ships [Your Company] placeholder (twice), an em-dash, and the job slug rather than the track slug. PR #134 adds orderLabel/trackTitles for the catalog path but does not fix the placeholder |
packages/licensing/src/template.ts:44,47 (the doc previously cited apps/web/src/server/license/template.ts, which no longer exists) |
| BRI-186 | Every delivered master carries an inaudible per-track AudioSeal watermark, and no user-facing document discloses it. Not docs/catalog-license.md, not /music/license, not /terms. It is per-track, not per-buyer, so it cannot identify who leaked a file, and it is verifiably inaudible. Disclose it in the license documents first, then mirror that wording into descriptions |
packages/inference-core/src/inference_core/watermark.py, seed_catalog_poc.py |
| BRI-186 | “No credit line required” is not in the binding license text. docs/catalog-license.md never mentions attribution at all; the claim exists only as a bullet on /music/license, and that page says the PDF’s terms win. True by omission, but a load-bearing selling point should be affirmative. Add an explicit “no attribution required” clause |
docs/catalog-license.md §1 |
| BRI-187 | catalogPurchases.userId is never written by the webhook (handleCatalogTrackCheckout inserts trackId, email, amountCents, stripeSessionId only), so /account purchase history renders empty forever even after real purchases. Do not link /account as a purchases library |
packages/billing/src/webhook.ts, apps/web/src/server/catalog/favorites.ts |
| n/a | Catalog purchases send no receipt email, and presigned download URLs expire in 1 hour. The only durable handle is the checkout-success?session_id= URL. “WHAT YOU GET” should not imply a re-downloadable locker |
packages/verticals/catalog/src/delivery.ts, packages/storage/src/r2.ts |
| BRI-187 | Unpublishing a track appears to 404 its page (getTrackBySlugFn has no sold/unpublished branch), which breaks §5’s rule that a catalog URL returns 200 forever. Admin ships a real publish/unpublish toggle, so this is reachable in normal operation |
apps/web/src/server/catalog/queries.ts, apps/admin catalog surface |
| n/a | Catalog tracks are ~16 seconds (SECONDS = 16.0), deliberately not representative of the launch duration mix. “Full length master” on a 16 second track reads as a bait-and-switch. Do not publish descriptions against POC-seeded tracks |
packages/stable-audio-3/scripts/seed_catalog_poc.py |
| BRI-89 | Resolved by PR #134, pending merge: rather than rewriting the shared track-license.md in place (which would have weakened Studio customers’ real exclusivity promise), the fix splits it into two documents. docs/catalog-license.md + /music/license cover the non-exclusive catalog; docs/track-license.md + /license keep the Studio exclusive-commission promise unchanged |
docs/catalog-license.md, apps/web/src/routes/_marketing/music/license.tsx |
| BRI-89 | Still open regardless of PR #134: docs/track-license.md §2 and apps/web/src/routes/_marketing/license.tsx (the Studio product) are correct to keep their exclusivity promise, but confirm no Line A copy anywhere links to the Studio /license by mistake once both license pages coexist |
docs/track-license.md, apps/web/src/routes/_marketing/license.tsx |
| BRI-89 | No policy on whether the master FLAC stays reachable at a guessable path | videos/youtube/public/, CDN |
| BRI-90 | Shorts: no portrait resolution, and the remix-pool question is undecided | videos/youtube/src/schema.ts |
| n/a | The playlist and tag lists in §6 predate BRI-125’s real taxonomy (packages/catalog/src/taxonomy.ts: dozens of genres/subgenres, moods, instruments) and were written assuming a game-audio-only catalog. They need reconciling against the real taxonomy before Line A scales past the game-audio niche |
packages/catalog/src/taxonomy.ts, §6 |
Notes on the items that need judgement rather than a fix:
The “copyright free” sweep (BRI-87). A YouTube-only ban is theater if the homepage, the marquee
and the meta description all say it. A plaintiff, or a buyer, reads the site, not this document.
Either the ban is site-wide or it is not a ban.
The license split (BRI-89), now resolved differently than originally planned. This doc
originally called for rewriting track-license.md §2 in place to drop “sold once, then retired.”
PR #134 does something better: it leaves the Studio product’s real exclusivity promise alone and
adds a second, non-exclusive license document for the catalog. Once merged, Line A copy (this doc)
should always cite docs/catalog-license.md / /music/license, never the Studio /license.