ODEON
a serverless p2p concert hall — walk on stage, play together as a band
open the hall ↗
browse the code
clone the repo
the band
🎹 grandlayered-harmonic piano, velocity by touch, glissando keys
🥁 pads16 synthesized drum voices on an MPC grid
👋 thereminan XY surface — continuous pitch, pentatonic snap
🎸 bassfat saw + sub sine with a plucky filter
Up to 8 on stage; everyone else takes the best seat in the house —
spectators hear the full mix live and bring the applause. Share the invite
link and your room is your band.
how a band stays tight over the internet
No audio is streamed. What crosses the wire is notes — a note-on is
~40 bytes — and every browser synthesizes the same sound in WebAudio. Live
notes play the moment they arrive. The glue is the loop station: record
a 1/2/4-bar riff and it's quantized to 16ths, broadcast as data, and scheduled
by every peer sample-accurately against a shared bar clock — one peer conducts
(BPM + bar origin), everyone else syncs to its clock by ping/pong offset
estimation. Latency shifts when you hear a live flourish, never
where the groove sits.
how it works
- No servers, no accounts. A static Vite + TypeScript app; browsers are
js-libp2p peers that meet through a circuit-relay-v2 node, discover each other
via gossipsub and upgrade to direct WebRTC.
- The invite link is the room key. The secret lives in the URL fragment
and never leaves your browser; peers prove membership pairwise with a sealed
hello (AES-GCM bound to the room id and both authenticated peer ids).
- End-to-end encrypted. Every frame rides libp2p's noise layer, even
across the relay fallback.
- The conductor is replaceable. If the host leaves, the lowest peer id
inherits the clock with the groove's phase intact; late joiners get a snapshot
of the transport and every loop.
- Hosted from IPFS. The app and this very page (repo included) are
static files on IPFS behind IPNS + DNSLink — this page is also the git remote.
git clone https://git.ardegazu.ro/game6.git
honest limits
- Live (unlooped) notes arrive with network latency — tens of ms on good
paths. Play loose, record tight.
- Full-mesh design: comfortable up to ~8 players; beyond that, take a seat
in the house.
- If two peers claim the stage after a network split, the senior claim wins
and near-ties go to the lowest peer id — a fresh boot can never steal an
established band's clock.
ODEON
o sală de concert p2p fără servere — urcă pe scenă, cântați împreună ca o trupă
deschide sala ↗
răsfoiește codul
clonează repo-ul
trupa
🎹 pianpian cu armonice suprapuse, velocitate din atingere, clape cu glissando
🥁 pads16 voci de tobe sintetizate pe o grilă MPC
👋 theremino suprafață XY — înălțime continuă, snap pentatonic
🎸 bassaw gras + sinus sub, cu un filtru percutant
Cel mult 8 pe scenă; toți ceilalți primesc cel mai bun loc din sală —
spectatorii aud mixul întreg live și aduc aplauzele. Trimite linkul de
invitație și camera ta e trupa ta.
cum rămâne o trupă strânsă peste internet
Nu se transmite audio. Pe fir circulă note — un note-on are
~40 de octeți — și fiecare browser sintetizează același sunet în WebAudio.
Notele live sună în clipa în care sosesc. Liantul e stația de bucle:
înregistrezi un rif de 1/2/4 măsuri, e cuantizat la șaisprezecimi, difuzat ca
date și programat de fiecare peer cu precizie de eșantion pe un ceas de măsură
comun — un peer dirijează (BPM + originea măsurii), restul se sincronizează cu
ceasul lui prin estimarea decalajului cu ping/pong. Latența mută momentul
în care auzi o înfloritură live, niciodată locul unde stă
grooveul.
cum funcționează
- Fără servere, fără conturi. O aplicație statică Vite + TypeScript;
browserele sunt peers js-libp2p care se întâlnesc printr-un nod
circuit-relay-v2, se descoperă prin gossipsub și trec pe WebRTC direct.
- Linkul de invitație e cheia camerei. Secretul stă în fragmentul
URL-ului și nu pleacă niciodată din browser; peers își dovedesc apartenența
pereche cu pereche printr-un hello sigilat (AES-GCM legat de id-ul camerei și
de ambele peer id-uri autentificate).
- Criptat cap-la-cap. Fiecare cadru merge pe stratul noise al lui
libp2p, chiar și prin releul de rezervă.
- Dirijorul e înlocuibil. Dacă gazda pleacă, cel mai mic peer id
moștenește ceasul cu faza grooveului intactă; cine intră târziu primește un
snapshot al transportului și al fiecărei bucle.
- Găzduit de pe IPFS. Aplicația și chiar pagina asta (cu repo cu tot)
sunt fișiere statice pe IPFS în spatele IPNS + DNSLink — pagina asta e și
remote-ul git.
git clone https://git.ardegazu.ro/game6.git
limite, pe bune
- Notele live (nebuclate) sosesc cu latența rețelei — zeci de ms pe căi
bune. Cântă lejer, înregistrează strâns.
- Design full-mesh: confortabil până la ~8 jucători; peste, ia un loc în
sală.
- Dacă doi peers revendică scena după o ruptură de rețea, câștigă
revendicarea mai veche, iar aproape-egalitățile merg la cel mai mic peer id —
un boot proaspăt nu poate fura niciodată ceasul unei trupe așezate.
ODEON
szerver nélküli p2p koncertterem — lépj színpadra, játsszatok együtt zenekarként
nyisd meg a termet ↗
böngészd a kódot
repó klónozása
a zenekar
🎹 zongorarétegzett felhangú zongora, ütéserősség érintésből, glissando billentyűk
🥁 pads16 szintetizált dobhang egy MPC-rácson
👋 thereminegy XY felület — folytonos hangmagasság, pentaton snap
🎸 basszuskövér fűrészjel + szub szinusz, pengetős szűrővel
Legfeljebb 8 fő a színpadon; mindenki más a terem legjobb helyét kapja —
a nézők élőben hallják a teljes mixet, és ők hozzák a tapsot. Küldd tovább a
meghívólinket, és a szobád a zenekarod.
hogyan marad feszes egy zenekar az interneten át
Hang nem streamel. A dróton hangjegyek mennek — egy note-on
~40 bájt — és minden böngésző ugyanazt a hangot szintetizálja WebAudióban. Az
élő hangok érkezésük pillanatában szólalnak meg. A ragasztó a
loopállomás: felveszel egy 1/2/4 ütemes riffet, tizenhatodokra
kvantálódik, adatként megy szét, és minden peer minta-pontosan ütemezi egy
közös ütemórához — egy peer vezényel (BPM + ütemkezdet), a többiek ping/pong
eltolás-becsléssel igazodnak az órájához. A késleltetés azt tolja el,
mikor hallasz egy élő futamot, sosem azt, hol ül a groove.
hogyan működik
- Se szerver, se fiók. Statikus Vite + TypeScript app; a böngészők
js-libp2p peerek, amelyek egy circuit-relay-v2 csomóponton át találkoznak,
gossipsubbal fedezik fel egymást, és közvetlen WebRTC-re váltanak.
- A meghívólink a szoba kulcsa. A titok az URL fragmentben él, és
soha nem hagyja el a böngésződ; a peerek páronként egy lepecsételt hellóval
bizonyítják a tagságot (AES-GCM, a szoba id-jához és mindkét hitelesített
peer id-hoz kötve).
- Végponttól végpontig titkosítva. Minden keret a libp2p
noise-rétegén megy, a tartalék relén át is.
- A karmester pótolható. Ha a hoszt elmegy, a legkisebb peer id
örökli az órát a groove fázisával együtt; a későn érkezők pillanatképet
kapnak a transzportról és minden loopról.
- IPFS-ről hosztolva. Az app és maga ez az oldal (a repóval együtt)
statikus fájlok IPFS-en, IPNS + DNSLink mögött — ez az oldal egyben a git
remote is.
git clone https://git.ardegazu.ro/game6.git
korlátok, őszintén
- Az élő (nem loopolt) hangok hálózati késéssel érkeznek — jó útvonalon
néhány tíz ms. Játssz lazán, vegyél fel feszesen.
- Full-mesh felépítés: ~8 játékosig kényelmes; afölött ülj be a
nézőtérre.
- Ha hálózati szakadás után két peer követeli a színpadot, a régebbi
követelés nyer, a majdnem-döntetlenek a legkisebb peer id-hoz kerülnek — egy
friss boot sosem lophatja el egy összeszokott zenekar óráját.