Det började inte med AI, appar eller ett kontrollcenter. Det började med en vanlig MP3-ström.
Relay Seven började redan 2020, långt innan stationen hade det namn, det utseende och den teknik den har idag. Första versionen var i grunden precis det en internetradio behöver vara för att överhuvudtaget räknas som radio: en vanlig MP3-ström som gick att ansluta till och lyssna på. Ingen avancerad programlogik, ingen egen showmotor och ingen röstkedja som försökte förstå sammanhang. Jag ville först få den mest grundläggande saken att fungera stabilt: musik in, MP3 ut, lyssning över nätet.
De första åren handlade därför mycket mer om uthållighet än om funktioner. En stream som fungerar i fem minuter är ett test. En stream som kan stå och rulla kväll efter kväll utan att jag behöver sitta bredvid den är början på en radiostation. Jag fick lära mig den skillnaden ganska tidigt. Det finns massor av små fel som aldrig syns när man provar en låt: anslutningar som blir hängande, en källa som inte reconnectar, metadata som stannar på föregående låt, en fil som har annorlunda samplingsfrekvens eller en spelare som tror att strömmen dött bara för att leveransen varit ojämn en kort stund.
På den tiden behövde jag inte ett avancerat system. Jag behövde en kedja som gick att förstå. Därför blev första generationen medvetet enkel. MP3 var distributionsformatet och allt annat fick växa fram efter hand. Den enkelheten har faktiskt påverkat många senare beslut. Varje gång projektet blivit för komplicerat har jag kunnat gå tillbaka till samma fråga: vad är den minsta kedjan som måste fungera för att musiken fortfarande ska höras?
Det är fortfarande ett viktigt designmål 2026. Jag kan idag starta om kontrollcentret, bygga om en språkmodul eller ändra en scheduler utan att själva musikströmmen måste dö. Den principen föddes inte i en arkitekturritning. Den föddes under de tidiga åren när hela projektets värde låg i att MP3-strömmen faktiskt fortsatte gå.
musikfiler
↓
enkel spelkö
↓
MP3-kodning
↓
stream
↓
lyssnareDet fanns inget glamoröst i den kedjan, men den gav mig något väldigt viktigt: en fungerande kärna att experimentera runt. Jag behövde inte lösa allt på en gång. Jag kunde låta radion vara radio först och bygga intelligensen senare.
Hur jag tänkte då
2020 fanns ingen anledning att bygga ett stort system. Jag behövde först bevisa att idén hade ett värde för mig. Det gjorde att jag höll arkitekturen nästan löjligt enkel. Ju färre delar som fanns, desto lättare var det att förstå varför strömmen dog när den dog.
Jag fick samtidigt den första smaken av ett problem som skulle följa projektet i sex år: en internetradio är en kedja av realtid och halv-realtid. Filen kan finnas på disk men ändå komma för sent. Nätet kan vara snabbt men ändå få ett kort avbrott. Klienten kan ha buffert men ändå tappa om upstream står still för länge. Redan här lärde jag mig att felsökning måste göras från källa till lyssnare, inte från den komponent jag råkar misstänka först.
Jag testade därför mycket genom att medvetet stoppa och starta delar. Vad händer när källan försvinner? Kommer strömmen tillbaka? Vad ser klienten? Måste någon manuellt trycka på play igen? Sådana tester blev grunden för det jag idag kallar recovery-behaviour.
De första nätterna med strömmen
Det första jag fick lära mig var att en MP3-ström kan fungera perfekt medan jag tittar på den och ändå bete sig helt annorlunda efter några timmar. Jag kunde starta en spelare, höra musik, byta låt och tro att allt var klart. Sedan kunde jag komma tillbaka senare och upptäcka att metadata hade frusit, att källan hade tappat kopplingen eller att någon del inte hade återanslutit efter ett kort nätproblem.
Jag började därför testa på ett helt annat sätt. I stället för att bara fråga “spelar det?” började jag medvetet skapa fel. Jag stoppade källan, startade om den, bröt anslutningen och såg vad som kom tillbaka av sig självt. Jag testade vad som händer om en låtfil saknas, om nästa fil har ett annat tekniskt format och om en klient ansluter mitt i ett byte. Det gav mig tidigt en respekt för recovery som jag fortfarande använder idag.
Det var också här jag började förstå värdet av att inte låta en enda process vara allt. Om samma process väljer låt, kodar ljud, håller streamen och serverar metadata blir ett litet fel ett stort fel. Jag hade inte orden “separation of concerns” i huvudet varje gång, men jag började intuitivt vilja bryta isär saker.
if source_disappears:
keep_service_alive()
retry_source()
if metadata_breaks:
audio_must_continue()
if one_component_restarts:
avoid_restarting_everything()Det här är viktigt eftersom dagens Relay Seven ser väldigt avancerat ut jämfört med 2020, men själva grundkravet är fortfarande identiskt: musikströmmen är den sista saken som ska ge upp.