openjutsu
One-click character swap for videos: an open-source, local Higgsfield Genjutsu alternative built on ComfyUI and MiniMax H3, with FLUX.3 Klein relighting.
Web radio for GitHub Pages: Radio Browser, junguler M3U lists, SomaFM, with in-browser stream testing
MediaJavaScript · CSSGitHub @jamalxcodeOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗A web radio that runs entirely in the browser, live at https://radio.sala.company (GitHub Pages). It's styled after a 10-band shortwave portable, and it's the radio counterpart of M3U TV (video.sala.company).
| Source | How it loads |
|---|---|
| Radio Browser (radio-browser.info), the default | Live API: top voted, most listened, trending, by country, genre, language or name. Only stations that passed Radio Browser's own check are loaded. |
| junguler/m3u-radio-music-playlists | Genre M3U files read straight from GitHub (the genre menu comes from the GitHub API). |
| SomaFM | Official channel API. |
| Mirrored lists | Lists whose servers block browsers (no CORS) are copied into the published site by the deploy workflow once a day. Add more in lists/sources.json. |
| Your own | Any M3U/PLS URL, an uploaded file, or pasted text. ?m3u=<url> adds a list from a link. |
<audio> element checks whether audio actually starts, which also catches CDNs that cut off plain reads.status-json.xsl and Shoutcast /currentsong.
| On the radio | What it does |
|---|---|
| Band strip / BAND knob | Your station lists: FM = 1st, MW = 2nd, SW1–SW8 = the next eight |
| TUNING knob / scale | Moves through the stations; tunes in when you stop. Click the scale to jump. |
| ⏮ ⏸ ⏹ ⏭ under the dial | Previous · pause / play · stop · next |
| 🔊 · ● LIVE · ☆ | Mute · back to live · favorite |
| VOLUME knob | Volume |
| POWER switch | Play / stop |
| SENS DX / LOCAL | DX shows every station. LOCAL hides stations that are off air or blocked. |
| ⏾ Sleep (with the play controls) | 30 minutes to 3 hours in 30-minute steps, with a live countdown; at zero the sound fades out and the radio turns off |
| MEMORY · LIGHT | Favorite · dial lamp and effects |
| TUNE light | Green = playing, amber = tuning, buffering or paused, red = no signal |
#, so nothing is sent to any server) that carries your favorite stations, or a list, to another phone or person; opening it offers to add them. Big lists share their source instead of their contents.sw.js) keeps the app's own files in the browser, so the site opens instantly and still opens with no network, showing your lists, favorites and songs heard (streams need network). The page is fetched fresh whenever the network answers within 4 seconds, so updates arrive normally.radio-relay, a Cloudflare Worker (relay/relay.js, deployed at radio-relay.jamal-akuna-matata.workers.dev) that passes the audio through unchanged and adds the headers. Direct always goes first; the dial's LINK cell says RELAY when it's in use. HLS streams aren't relayed.Plain HTML, CSS and JS, with no build step. The scripts in js/ share one global scope and load in order:
| File | What's in it |
|---|---|
core.js | Storage, helpers, app state |
lists.js | List sources, parsing, the Add-list dialog |
health.js | Status badges and the stream tester |
guide.js | Station guide, filters, search and browsing |
radio.js | Dial, knobs, display, sleep timer, phone mini-player |
player.js | Playback, reconnecting, pause / mute / live, lock-screen controls |
nowplaying.js | Song titles and the songs-heard log |
car.js | Small phones: the push-button car radio and the station picker |
ipod.js | The iPod look: click wheel, menus, Now Playing; two-page layout on wide screens |
app.js | Station details, favorites, backup, settings, wiring, start-up |
hls.js loads from jsDelivr only when an HLS station plays.
.github/workflows/pages.yml publishes the site on every push to main and once a day. The daily run also refreshes the mirrored lists. In the repo's Settings → Pages, the source must be GitHub Actions. The custom domain comes from the CNAME file and the Pages settings.