Tavus

Vi bygger system som inte får stanna.

Tavus Sweden AB är ett mjukvarubolag i Älvsjö. Vi skriver Elixir och Erlang, och vårt flaggskepp är Revelius: hela driften för verksamheter med dörrar, platser och personal, i ett och samma system.

Revelius.Supervisor · strategi one_for_one

Revelius applikationsträd. Varje process är en knapp. Tryck på en för att avsluta den och se supervisorn starta om den, medan resten fortsätter.

Tryck på en process för att avsluta den.

Logg

    Processer som kör
    –
    Omstarter
    0
    Grannar som påverkades
    0

    En modell i webbläsaren av Revelius applikationsträd, förenklad. Namnen och strategin är de riktiga, tiderna är ungefärliga. Krascha fler än tre processer på fem sekunder och se vad OTP gör då.

    Erlang skrevs för telefonväxlar. Vi skriver det för dörrar.

    En camping har hundratals platser, en bom, en kassa och en ägare som sover. Ett solarium har ingen personal alls. Det är samma problem som Ericsson hade med växlarna: allt ska svara, hela tiden, och det som går sönder ska inte ta med sig resten.

    Därför bygger vi på BEAM. Varje öppen översikt är en egen process. Bokningar sprids med PubSub till alla som tittar, utan att någon laddar om. Domänen är skriven i Ash, så att samma regler gäller i webben, i appen och för assistenten som pratar med kundens data. Och det som aldrig får hända, som två bokningar på samma plats samtidigt, stoppas i databasen och inte i en knapp.

    1. 1986

      Erlang börjar som ett experiment i att styra en telefonväxel, på Ericssons datavetenskapliga labb. Labbet låg i Älvsjö.

    2. 1998

      Erlang/OTP släpps som öppen källkod. Supervisorer, processer och hot code loading blir allas.

    3. 2012

      José Valim släpper Elixir. Samma maskin, ett språk som är trevligt att skriva i.

    4. 2015

      Phoenix 1.0. Webben på BEAM, med kanaler och PubSub från start.

    5. 2019

      LiveView. Gränssnittet blir en process på servern, och JavaScript-lagret krymper till nästan inget.

    6. 2023

      Tavus Sweden AB grundas i Älvsjö.

    7. 2026

      Revelius: Phoenix, LiveView och Ash, en kund per schema, i drift.

    Revelius

    Flaggskeppet. Hela verksamheten i ett system.

    Revelius är för ägarledda verksamheter med fysisk drift: campingar, gym, solarier, salonger, verkstäder. Ägaren ser läget i en mening, morgon och kväll, och kan vara borta en vecka.

    • Kalendern och bokningarna
    • Personalen, passen och stämplingen
    • Lokalen, dörrarna och enheterna
    • Pengarna, saldona och betalningarna
    Till revelius.se

    En verksamhet är ett dokument.

    Under Revelius ligger ReveliOS. Tanken är enkel och har tagit oss längst: allt en verksamhet är, dess platser, enheter, regler, personal och pengar, beskrivs i ett enda dokument. Allt annat är en läsare av det dokumentet.

    bransch :camping do
      enhetstyp :elstolpe do
        kan :lasa_upp
        matar :kwh
      end
    
      platstyp :husvagn, enheter: [:elstolpe]
    
      regel :el_per_kwh do
        nar :incheckad
        debitera :kwh, pris: {:per_kwh, "SEK"}
      end
    end
    
    # Kundens egna platser, enheter och personal är data
    # ovanpå mallen. Ingen kod ändras när en kund växer.

    En branschmall som Spark-DSL, förenklad. Mallen blir Ash-resurser, verksamheten är rader i kundens eget schema.

    • ÖversiktenÄgarens läge i en mening: 24 av 32 platser i natt, två har inte betalat.
    • Portalen och apparnaGästen, personalen och ägaren läser samma rader med olika rättigheter.
    • AssistentenVerktygen är domänens egna handlingar, med användarens egna policyer. Listan kan inte glida isär från systemet.
    • EnheternaStolpen vet bara sin typ och sitt id. Resten läser den ur dokumentet.
    • VärldenSamma dokument ritat som en plats. En isometrisk värld där allt som rör sig är en händelse i datan.

    Världen är signaturen, inte ingången.

    ReveliOS ritar verksamheten som en plats, i 2:1 och med ett dygn som går. Efter solnedgången på kundens ort blir det natt och lyktorna tänds. Dra tidslinjen bakåt och dagen spelas upp. Dra den framåt och det planerade syns i konturer. Ingenting rör sig för att det är fint.

    Det finns inga poäng, inga streaks och ingen dagens stjärna. Förvaltaren visar läget och pekar inte finger. Det enda talet vi bryr oss om är hur många dagar i rad verksamheten har gått utan att någon behövde gripa in.

    Vet ej är aldrig en nolla.

    Noll, saknas, omätt och ej aktuellt är fyra olika saker. Ingen av dem får se ut som en annan.

    Varje tal bär sin nämnare.

    Och sin mätpunkt och sitt klockslag. 14 av 16 platser klockan 21:16, aldrig 88 procent.

    Grinden bor i handlingen.

    Aldrig i knappen. En regel som en annan väg in kan kringgå är ingen regel.

    Mergat är inte levererat.

    Och deployat är inte serverat. Leveransen bevisas i de bytes kunden faktiskt får.

    Ett val går inte att härleda.

    En standard är inte ett beslut. Det systemet gissar visas som förslag och sparas aldrig av sig självt.

    Skriv aldrig ett löfte du inte mätt.

    Ett åtagande utan en mätpunkt är en önskan. Den hör inte hemma i ett avtal.

    Varje ändring har en avsikt och ett kvitto.

    Mycket av vår kod skrivs av agenter. Det har gjort oss strängare, inte slarvigare.

    Arbetet börjar som en avsikt: ett åtagande med en kontroll som kan köras, och som ska fälla dagens kod innan något skrivs. En avsikt per ändring, med ett avgränsat scope. Betyget sätts av en körning mot verkligheten, aldrig av den som gjorde jobbet. Missarna sparas.

    Allt som når en kund passerar en människa. Agenter föreslår, vi godkänner, och allt hamnar i historiken.

    avsikt
    Två bokningar av samma plats kan inte överlappa
    kontroll
    mix test test/bokningar/overlapp_test.exs
    på basen
    3 av 3 fäller
    scope
    lib/revelius/bokningar/**

    körning
    på commitens träd
    utfall
    uppnådd
    satt av
    körningen, inte agenten

    Bygger du något som inte får stanna? Vi pratar gärna Elixir.

    info@tavus.se