Show HN: atradio.fm – A social internet radio platform built on Bluesky ATProto

tsiry1 pts0 comments

atradio.fm/atradio at main · Tangled

atradio.fm

atradio

Star

Fork

Atom

Configure Feed

Issues

Pull Requests

Commits

Tags

Feed URL

Select the types of activity you want to include in your feed.

A social internet radio platform built on AT Protocol.

atradio.fm

atproto

radio

Star

Fork

Atom

Configure Feed

Issues

Pull Requests

Commits

Tags

Feed URL

Select the types of activity you want to include in your feed.

TypeScript

88.7%

Pkl

6.8%

Clojure

1.5%

CSS

1.4%

JavaScript

0.9%

HTML

0.4%

Shell

0.1%

main

No tags found

26

Code

Clone this repository

Use permalink

HTTPS

https://tangled.org/atradio.fm/atradio<br>https://tangled.org/did:plc:435ozdblpbscwvuzz3npqll5<br>getComputedStyle(s).display !== 'none').textContent)"<br>class="px-3 py-2 text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200"<br>title="Copy to clipboard"

SSH

git@tangled.org:atradio.fm/atradio<br>git@tangled.org:did:plc:435ozdblpbscwvuzz3npqll5<br>getComputedStyle(s).display !== 'none').textContent)"<br>class="px-3 py-2 text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200"<br>title="Copy to clipboard"

For self-hosted knots, clone URLs may differ based on your setup.

Download tar.gz

Download .zip

apps

38 minutes ago

brand

9 hours ago

deploy

11 hours ago

packages

1 hour ago

systemd

12 hours ago

tools

11 hours ago

.gitignore

7 hours ago

LICENSE

25 minutes ago

README.md

11 hours ago

bun.lock

6 hours ago

compose.yml

6 hours ago

console

12 hours ago

mise.toml

12 hours ago

package.json

13 hours ago

preview.png

11 hours ago

tsconfig.base.json

13 hours ago

turbo.json

13 hours ago

Commits<br>26

update LICENSE

18f48b8c

tsiry-sandratraina.com

25 minutes ago

main

style(listeners): use purple for the headphones/listener count, not green

synth-magenta resolves to green (#64e882); switch the listener-count badge<br>on StationCard and the miniplayer to synth-purple so it reads distinct from<br>the cyan/pink/green already in the card.

a935eb66

tsiry-sandratraina.com

38 minutes ago

fix(feed): dedupe global recently-played by actor (story-style)

The "Recently played on atradio" row now shows one entry per listener —<br>their most recent play — instead of repeating a busy user many times.<br>getGlobalRecentlyPlayed groups by actor, taking max(played_at) and that<br>play's station; cursor paginates on the per-actor latest-play time.

089c3a96

tsiry-sandratraina.com

43 minutes ago

fix(playback): proxy http streams through the api to avoid mixed content

Serving the app over https blocks http:// station streams as mixed content.<br>Add GET /api/stream?url= which reverse-proxies audio (bytes piped straight<br>through, ICY metadata + Range forwarded, upstream aborted on client<br>disconnect).

Only http:// stream URLs are rewritten, and only when the page itself is<br>https — https streams and dev keep playing directly. The Player routes<br>playback (rockbox engine, native , HLS fallback) through the proxy<br>while ICY "now playing" polling stays on the original url (runs server-side).<br>HLS manifests are never proxied (would break relative segment URIs).

32702cbe

tsiry-sandratraina.com

58 minutes ago

feat: listening status, recently-played feeds & unique listener counts

Introduce fm.atradio.actor.status (singleton `self` record) written whenever<br>a station reaches "on air", plus shared defs actorInfo/playView/listenerCount.

API:<br>- new recently_played history table (one row per status update) + migration<br>- jetstream indexes actor.status plays; refactor commit handling into explicit<br>per-collection handlers (fixes the not-favorite => station fallthrough)<br>- XRPC: getRecentlyPlayed (per-actor, distinct), getGlobalRecentlyPlayed<br>(platform events + actor), getListenerCounts (count distinct did per station)

Web:<br>- PlayStatusSync writes the status record on play (keyed on station id)<br>- profile "Recently played" tab; home horizontal row of global plays<br>- unique-listener badge on StationCard and the miniplayer (useListenerCount)<br>- request repo:fm.atradio.actor.status OAuth scope

53b1d0fb

tsiry-sandratraina.com

1 hour ago

refactor(lexicons): rename fm.atradio.audioSettings to fm.atradio.audio.settings

Rename the audio settings lexicon NSID and move its pkl/json to the<br>audio/settings path mirroring the NSID. Update all usages: NSID map,<br>zod schema $type, comments, tests, and the OAuth scope in<br>client-metadata.json (repo:fm.atradio.audio.settings).

fd78bc11

tsiry-sandratraina.com

1 hour ago

cache proxy responses

85268c90

tsiry-sandratraina.com

6 hours ago

Branches

main

25 minutes ago

Default

README.md

atradio.fm#

A social internet radio platform built on the AT Protocol . Search stations<br>from radio-browser.info and TuneIn, stream<br>them in the browser, and save favorites + your own stations to your own PDS<br>(portable, user-owned data). Installable as a PWA.

Architecture#

OAuth + reads/writes (in the browser, via atcute)<br>apps/web (React SPA) ───────────────────────────────►...

atradio hours text gray actor feed

Related Articles