Make Your Formats Portable
A super‑simple, open way to share Programs, Personas, Sound Sets, and presets
This repository provides a catalog service for [Radio Starlight], a generative radio station application. It is a self-contained toolset enabling you to organize various entities (such as SoundSets, Programs, Persons, etc.) into a browsable "catalog," which Radio Starlight can access and import.
By following these instructions, you can:
- Maintain a local "Repository" of entity packages (usually
.ziparchives) along with images and other media files. - Automatically generate a static site (
docs/) that indexes these entities, usinggenerate-index.js. - Host that generated site locally (or on any static hosting platform).
- Optionally run a minimal admin interface (
metadata-admin-server.js) to edit repository-level metadata. - Preview your content locally with
local-server.js. - Edit release notes stored in
whats-new.jsonusingwhats-new.js.
Portable: importable formats anyone can use in Radio Starlight
- Controlled: you publish only what you want—keep attribution intact
- Zero‑backend: static JSON + media, host anywhere (Pages, Netlify, S3, internal)
- A static catalog of Programs, Persons, Sound Sets, and content presets.
- Generated from zipped exports from Radio Starlight.
- Browsable JSON + media that Starlight can import via URL.
- No lock‑in: plain files you can version in Git
- Fast onboarding: collaborators import ready‑to‑use formats
- Works online or in secure, offline environments
- Share formats and Sound Sets with collaborators or fans
- Keep persona + sound consistent across episodes
- Publish selectively—building blocks or full Programs
- Publishers & Rights Holders
- Distribute official templates with attribution baked in.
- Reproducible Programs (bundle dependencies).
- Curate highlights using a simple Featured folder.
- Consistent on‑air personality and Sound Set across episodes
- Selective sharing: publish only what you want reused
- Attribution and credits preserved in every import.
- Reproducible shows: Program packages can include dependencies.
- Spotlight approved items with a Featured/ folder.
- Works offline; preview locally with a tiny HTTP server.
- Host on static platforms; no custom backend required.
- Provide clear names, descriptions, and cover images.
- Keep a simple changelog via whats-new.json so consumers see updates.
- Netlify, Vercel, Cloudflare Pages (global CDN).
- Amazon S3 + CloudFront or any internal web server.
- Local‑only for secure or air‑gapped workflows.
- Rights: publish only content you control or have licensed.
- Privacy: keep catalogs private or internal when needed.
- Revocation: update or remove items and regenerate the site.
- “We need control.” → Static catalogs are curated and versioned by you
- “We can’t add infra.” → Use simple static providers or internal hosting
- “What about lock‑in?” → It’s plain JSON + media with open tooling
Decide what you want to share (Program vs. Broadcast vs. building blocks).
Publish a minimal catalog with one Featured item.
Share the URL with collaborators or early adopters.
-
Repository (sourceDir): This folder now typically contains zipped entity packages (e.g.
Programs/MyShow.zip). Each archive bundles anentity.jsonand its media.generate-index.jscan still read standalone JSON files, but using zip archives is recommended. -
Docs (targetDir): After running
generate-index.js, a structured site is created, containing:- Each zip archive becomes a folder with its final
entity.jsonand extracted images. - Program archives additionally include
entity+deps.jsonwith bundled dependencies. - Automatically generated
index.jsonfiles allow hierarchical browsing.
- Each zip archive becomes a folder with its final
- Node.js (v14 or higher recommended)
- Basic familiarity with the command line and JSON.
Clone or download this repository. Inside the directory, you should see:
├─ generate-index.js
├─ local-server.js
├─ metadata-admin-server.js
├─ whats-new.js
├─ config.sample.json
└─ ... (other files)
Your Repository (sourceDir) typically follows this pattern:
CatalogRepository/
│
├─ Programs/
│ ├─ Featured/
│ │ └─ MyShow.zip
│ └─ MyShow.zip
│
├─ Persons/
│ ├─ Featured/
│ │ └─ Announcer.zip
│ └─ Announcer.zip
│
├─ SoundSets/
│ └─ MySet.zip
│
├─ Feeds/
│ └─ MyFeed.zip
│
├─ repo-metadata.json <-- Optional folder-level metadata
└─ ...
Note: The repository can have arbitrary subfolders for organization, and you may place either
.ziparchives or raw JSON files. When using theFeaturedfolder, only the items placed directly insideFeaturedare listed as featured items; nested subfolders are ignored (though the catalog browser will still show them).
-
Copy
config.sample.jsontoconfig.json. -
Modify these fields:
- sourceDir: Path to your Repository (e.g.
"../CatalogRepository"). - targetDir: Path to your Docs folder (e.g.
"../CatalogSite/docs"). - baseUrl: Base URL used to form any
downloadURLor remote references (e.g."http://localhost:3000").
- sourceDir: Path to your Repository (e.g.
Example:
{
"sourceDir": "../CatalogRepository",
"targetDir": "../CatalogSite/docs",
"baseUrl": "http://localhost:3000"
}A quick local admin tool to edit the metadata file named repo-metadata.json. This file typically stores:
name(the name of your repository)description(short description)lastModified(automatically updated on save)
Usage:
node metadata-admin-server.js- Opens a server at http://localhost:4000
- Lets you edit the name & description in a simple HTML form.
- Writes out
repo-metadata.jsonin yoursourceDirfolder whenever you hit "Save."
Core script that processes your Repository and creates a structured Docs folder. It:
-
Clears the target folder (removing old contents).
-
Recursively scans the source directory.
-
For each
.ziparchive or standalone JSON entity:- Parses it, extracts images/audio if found as Base64, and writes them into the output folder.
- Generates an
entity.jsonwith updated references (pointing to the newly extracted media). - Produces an
index.jsonin each directory, listing items present (includingdownloadURLfor non-JSON files). - Handles
.zippackages exported by the app, automatically unpacking them. Program archives become folders with their resources and anentity+deps.jsonfile, while other entity archives become folders containingentity.jsonand images.
-
If a
whats-new.jsonfile exists at the repository root, it is copied to the docs root. -
The final output folder can then be served or hosted anywhere.
Usage:
node generate-index.js- Ensure you have a valid
config.jsonin the same directory. - After it completes, look in your
targetDir(e.g.../CatalogSite/docs) for the generated site.
A minimal local HTTP server to serve the generated Docs folder to test or preview your catalog.
Usage:
node local-server.js- By default, listens on http://localhost:3000.
- Serves files directly from
targetDiras set inconfig.json. - Any directory requests automatically serve that folder’s
index.jsonif it exists. - Useful for previewing or local testing before deploying the site.
A lightweight editor for a whats-new.json file that describes recent changes.
Usage:
node whats-new.js- Opens an editor at http://localhost:5000/editor.
- Saves the JSON to your
sourceDirwhenever you hit "Save".
Inside each entity directory (e.g. Persons/, Feeds/, SoundSets/), you can place a subfolder named Featured. Any zipped packages (or JSON files) placed directly in that Featured folder are picked up as "featured" items by Radio Starlight.
Example:
SoundSets/
└─ Featured/
├─ MyCoolSet.zip
├─ AnotherFeaturedSet.zip
└─ MySingleFileSoundSet.zip
Radio Starlight’s catalog browser will list these items as "Featured" in the app, also nested items in subfolders will be shown.
-
Prepare the Repository
- Export your entities as
.zippackages from Radio Starlight (you can also use raw JSON). - Place those archives (or JSON files) into the
sourceDir(e.g.CatalogRepository/). - Run
metadata-admin-server.jsto set top-level metadata (like the repository name/description).
- Export your entities as
-
Generate the Docs Site
node generate-index.js- This wipes the old
targetDir(e.g.docs/), then creates a fresh, fully indexed site. - Check the console output for logs about extracted images, audio, etc.
-
Preview Locally
node local-server.js- Add your catalog URL in Radio Starlight to point to the local server.
- Open Radio Starlight and browse your catalog.
-
Publish
- Once satisfied, you can deploy the
targetDir(e.g.docs/) to any static hosting service (like GitHub Pages, Netlify, etc.).
- Once satisfied, you can deploy the
Enjoy building your Radio Starlight Catalog! For questions or suggestions, feel free to open an issue or fork this project.