FREESMS
Öppen källkod · tidig version

Verkstadssystemet som klarar gropen.

För oberoende bilverkstäder. Byggt för en telefon i en smutsig hand, ett wifi som inte når ner under bilen och en disk som måste kunna svara när kunden ringer.

Ingen licensavgift · din egen server · SIE-fil till bokföringen

En bil, en hel arbetsdag

Från att bilen lämnas till att jobbet stänger sig självt: disken, mekanikern, kunden, lagret och ägaren, var och en med sin skärm. En del som saknas, en bil som åker hem och kommer tillbaka – som en vanlig vecka.

Ord, belopp, avrundning och vem som får se kunden kommer ur produktens egen kod när sidan genereras. Hela flödet körs mot den riktiga produkten i en webbläsare per roll vid varje ändring av koden – läs testet. Registreringsnummer, namn och belopp är exempel.

En bil, från intag till bokföring

Ta in en bil

Registreringsnummer, mätarställning och vad som är fel. Disken prissätter från verkstadens egen tidsbok.

Laga

Mekanikern ser bilen och jobbet, stämplar, fotograferar och säger till – även utan nät.

Fakturera den

Fakturor som inte går att ändra, löpande nummer, och månaden till redovisningsbyrån som en SIE-fil.

Närmare

Varje del för sig, närmare. Varje scen är ett flöde som körs mot den riktiga produkten vid varje ändring av koden.

När wifi:t försvinner

Teknikern ser något mer som behöver göras och säger till receptionen, från gropen. Nätet är borta. Det sparas i telefonen, väntar, och skickas en gång när nätet kommer tillbaka.

Orden i scenen är produktens egna: sidan genereras från samma språkkatalog och samma kod som FreeSMS skärmar. Flödet körs mot den riktiga produkten i en webbläsare vid varje ändring av koden – läs testet. Registreringsnummer, bilar, kunder och namn är exempel.

En morgon, från intag till bokföring

En bil tas in, mekanikern gör jobbet utan att se kundens uppgifter, disken fakturerar, och månadens fakturor går till redovisningsbyrån som en fil, inte som en integration att betala för.

Fakturans belopp räknas av produktens pengakod och SIE-raderna skrivs av dess bokföringskod, när sidan genereras. Flödet körs mot den riktiga produkten i en webbläsare, och testet läser den riktiga filen – läs testet. Registreringsnummer, bilar, kunder och namn är exempel.

”När blir den klar?”

Kunden ringer och frågar. Svaret står på jobbet: vad som lovats, vad som sålts och vad som stämplats. Och det säger till innan löftet är brutet, inte efter.

Siffrorna och bedömningen räknas ut av samma kod som jobbsidan använder, när sidan genereras. Flödet körs mot den riktiga produkten i en webbläsare – läs testet. Registreringsnummer, bilar, kunder och namn är exempel.

Kunden bestämmer, med bilden framför sig

Mekanikern fotograferar det som är slitet. Kunden får en länk, ser bilden på sin telefon och svarar ja eller nej – utan konto, utan app och utan att verkstaden behöver beskriva bromsbelägg i telefon. Ett ja syns direkt på tavlan, och blir en rad på jobbet i ett steg. Priset läggs fram för sig, och kundens ja gäller exakt det pris de såg.

Flödet körs mot den riktiga produkten i en webbläsare: fotot laddas upp, länken öppnas utan inloggning, och kundens ja blir en rad på jobbet – läs testet. Bromsbelägget är en teckning. Registreringsnummer, bilar, länken och namn är exempel.

Ett jobb, två skärmar

Samma jobb, öppnat av mekanikern och av kundmottagningen. Mekanikern får bilen och jobbet. Kundens namn och telefonnummer finns bara på disken – inte dolt för mekanikern, utan aldrig hämtat.

Vilken roll som får kundens uppgifter avgörs av produktens egen behörighetskod, och sidan genereras inte om scenen säger något annat. Flödet körs mot den riktiga produkten i en webbläsare, som också kontrollerar att namnet inte ens finns i mekanikerns sidkälla – läs testet. Registreringsnummer, bilar, kunder och namn är exempel.

Planeringen vet vem som är på plats

En bokning håller en tid utan att hitta på ett jobb. Planeringen ser personer och liftar som olika gränser, och säger till – den flyttar ingenting själv. Vem som tar bilen bestämmer en människa.

Orden kommer ur produktens språkkatalog när sidan genereras. Flödet körs mot den riktiga produkten i en webbläsare: liftarna sätts, bilarna bokas, Erik markeras ledig, dagen stängs – och en bokning på den stängda dagen nekas – läs testet. Registreringsnummer och namn är exempel.

Det som väntar på dig, och bara det

Var och en ser det som är deras att göra – inte ett flöde av allt som hänt. En sak kommer till rätt person av sig själv, och försvinner när någon har tagit hand om den. Ingen bockar av något för hand, och två vid disken ser samma lista.

Orden kommer ur produktens språkkatalog när sidan genereras. Flödet körs mot den riktiga produkten i tre webbläsare, en per roll, och testet kontrollerar att ingen sida laddades om – läs testet. Registreringsnummer och namn är exempel.

Schemat, och vem som får veta vad

Den som planerar personal lägger veckan och flyttar en dag. Lagens vila varnas för, inte förbjuds – kollektivavtal skiljer sig. Den det gäller får veta att schemat ändrats. Kollegor ser att någon är borta, inte varför: sjukdom är hälsouppgifter.

Orden och vilan räknas ut av produktens egen kod när sidan genereras. Flödet körs mot den riktiga produkten i tre webbläsare: schemat läggs, torsdagen flyttas, varningen visas, Erik får veta och läser, och disken ser ”borta” där Erik ser ”sjuk” – läs testet. Namn är exempel.

Kunden får veta, och det syns att den fick det

När verkstaden har en leverantör skickar disken länken direkt från jobbet: mejl genom verkstadens egen e-post, eller sms. Första gången till en ny adress bekräftas den. Inget går mellan åtta på kvällen och åtta på morgonen, inget går två gånger, och svar läses inte – numret att ringa står i meddelandet.

Orden kommer ur produktens språkkatalog när sidan genereras. Flödet körs mot den riktiga produkten i en webbläsare: mejlet går över SMTP till en riktig e-postserver, testet läser det som kom fram och öppnar länken i det som kunden skulle – läs testet. Sms genom 46elks, leveransrapporten och tysta timmar provas i serverns egna tester. Registreringsnummer, adresser och namn är exempel.

Priset innan bilen kommer

En kund frågar vad bromsarna skulle kosta, innan det finns en bil här. Disken lägger fram ett pris med villkor. Kunden läser varje belopp på sin länk och säger ja till en del, och det de godkände bokas och följer med in på jobbet – till priset de fick se, utan att något skrivs om.

Orden kommer ur produktens språkkatalog och beloppen ur dess pengakod när sidan genereras. Flödet körs mot den riktiga produkten i en webbläsare – läs testet. Registreringsnummer, bilar och namn är exempel.

När någon är sjuk

Erik ringer in sjuk, och han har ett jobb planerat för i dag. Disken ser det direkt, lämnar över jobbet till Tina med ett skäl och ser Erik kvar i historiken. Tiden han redan stämplat är hans. Ett jobb som tar två dagar flyttas utan att något bokas om.

Orden kommer ur produktens språkkatalog när sidan genereras. Flödet körs mot den riktiga produkten i en webbläsare: Erik markeras sjuk, krocken syns, jobbet lämnas över, Tina ser det i sin lista, en tvådagarsplan förs över och en bil som väntar på en del släpper sin lyft – läs testet. Registreringsnummer och namn är exempel.

När en rad är fel

En rad har rätt text men fel pris, eller var aldrig meningen. Disken rättar den på sidan och ser först vad det blir. En dyrare rad kräver ett nytt ja; det gamla ja:et står kvar som det var. En felaktig rad dras tillbaka med ett skäl och finns kvar i historiken.

Orden kommer ur produktens språkkatalog och beloppen ur dess pengakod när sidan genereras. Flödet körs mot den riktiga produkten i en webbläsare: priset rättas, godkännandet faller, den andra raden behåller sitt, två personer rättar samma rad och en rad dras tillbaka – läs testet. Registreringsnummer, namn och belopp är exempel.

När en bil har flera moment

Bromsarna är klara, avgasen väntar på en del och provkörningen utgår. Teknikern bockar av och säger vad som hindrar, utan ett pris på skärmen. Disken ser vad som står i vägen, och en bil med arbete kvar kan inte sättas som klar.

Orden kommer ur produktens språkkatalog när sidan genereras. Flödet körs mot den riktiga produkten i en webbläsare: listan görs av det godkända arbetet, teknikern bockar av och anger en hindrande del, disken utelämnar ett moment med skäl och ett kundbeslut, och bilen går inte att sätta som klar förrän allt är gjort – läs testet. Registreringsnummer och namn är exempel.

Samma kund, en gång

Numret ändras, bilen byter skylt och kunden finns plötsligt två gånger. Disken rättar på kortet och ser vad som ändrats, vem som gjorde det och när. En dubblett frågas om innan den skapas, och två poster som är en slås ihop efter en sida som säger vad som flyttas – utfärdade fakturor står kvar som de utfärdades.

Orden kommer ur produktens språkkatalog när sidan genereras. Flödet körs mot den riktiga produkten i en webbläsare: numret rättas, två som redigerar samtidigt får veta det, en felskriven skylt skrivs om medan en ny läggs till, bilen säljs, dubbletten frågas om och posterna slås ihop – läs testet. Namn och nummer är exempel.

När skiftet byter

Den som tar över ett jobb ska inte behöva fråga den som gick. Det som hänt står i en lista, hämtad från de register som redan finns: status, priset och godkännandet, stegen, delarna, besiktningen. Dit läggs anteckningar och samtal som inget annat register hade. En rättad anteckning behåller sin gamla formulering, och teknikern ser aldrig kundens eller prisernas sida.

Orden kommer ur produktens språkkatalog när sidan genereras. Flödet körs mot den riktiga produkten i en webbläsare: teknikern lämnar och rättar en anteckning, disken skriver ner ett tidigare samtal, och teknikern ser aldrig samtalet – läs testet. Namn och anteckningar är exempel.

Beställt någon annanstans

Reservdelar beställs hos grossisten, inte i systemet. Lagret noterar vad som beställts, hos vem och när det väntas, och sätter beställningen mot jobbets begäran. Dagen kan flyttas, leveransen kan komma i två omgångar och samma följesedel räknas en gång. En fel del går tillbaka, jobbet ber om rätt, och krediten är ett eget steg som kan komma före eller efter.

Orden kommer ur produktens språkkatalog när sidan genereras. Flödet körs mot den riktiga produkten i en webbläsare: teknikern ber om en del, lagret noterar beställningen och flyttar dagen, leveransen kommer i två omgångar, en del går tillbaka och krediteras – läs testet. Namn och beställningar är exempel.

När bilen hämtas

Kunden får inte bara en faktura. Verkstaden lämnar över vad som faktiskt gjorts, vad kunden sa nej till, vad som är kvar och vad verkstaden vill att de ska veta. Den byggs av det som registrerats som gjort, aldrig av en offert, och den påstår inte att bilen är säker. Den lämnas till den som hämtar, fryses, och en rättelse blir nästa version.

Orden kommer ur produktens språkkatalog när sidan genereras. Flödet körs mot den riktiga produkten i en webbläsare: bromsarna blir klara, teknikern föreslår något för senare, disken lämnar över till kundens bror och sedan en rättad version – läs testet. Namn och arbeten är exempel.

Fakturan kommer fram

Disken bekräftar vem fakturan är till och vart den ska, och skickar en länk som öppnar just det dokumentet. Att leverantören tagit emot meddelandet är inte detsamma som att kunden läst det: bara en öppnad länk eller en överlämning säger det. Skickas den igen stängs den första länken, och det som misslyckats hamnar på en lista att följa upp.

Orden kommer ur produktens språkkatalog när sidan genereras. Flödet körs mot den riktiga produkten i en webbläsare mot en riktig e-postserver: fakturan skickas, kunden öppnar länken, disken ser att den öppnats, skickar igen och den första länken slutar fungera – läs testet. Namn och adresser är exempel.

När fakturan är fel

En utfärdad faktura ändras inte. En del som debiterats fel krediteras för sig, efter att disken sett vad det blir och vad som är kvar att kreditera, och det går aldrig att kreditera mer än som fakturerats. Var det fel person fakturerades krediteras hela och rätt kund faktureras på en rättelseorder. Varje steg säger varför och vem, och inget lägger tillbaka en del på hyllan av sig själv.

Orden kommer ur produktens språkkatalog och beloppen ur dess pengakod när sidan genereras. Flödet körs mot den riktiga produkten i en webbläsare: en del krediteras efter en förhandsvisning, för mycket nekas, resten krediteras och rätt kund faktureras – läs testet. Namn och belopp är exempel.

När fakturan inte betalas

Obetalda fakturor listas inte bara, de följs upp: någon har dem, ett samtal och ett löfte skrivs ner, och en tvist spärrar påminnelsen utan att röra saldot. Påminnelsen innehåller vad som är skyldigt när den går iväg, och en som blivit betald i mellantiden skickas aldrig. Pengar som är skyldiga tillbaka blir en uppgift, och en återbetalning är inte detsamma som att ångra en felregistrerad betalning.

Orden kommer ur produktens språkkatalog och beloppen ur dess pengakod när sidan genereras. Flödet körs mot den riktiga produkten i en webbläsare mot en riktig e-postserver: fakturan tas, ett samtal och ett löfte skrivs ner, en tvist spärrar och hävs, påminnelsen går med rätt belopp, och en del krediteras och betalas tillbaka – läs testet. Namn och belopp är exempel.

Dagen går ihop

Vid stängning visar dagen vad som fakturerats och krediterats, för sig från vad som registrerats som inkommet och utbetalt, och varje summa är en länk till dokumentet eller posten den består av. Ägaren jämför med bankens utdrag, och skiljer sig siffrorna krävs en förklaring. Godkänns dagen och något ändras efteråt, till exempel en betalning som skrivs in sent, säger dagen att den ändrats. Allt som borde rättas först står som en lista.

Orden kommer ur produktens språkkatalog och beloppen ur dess pengakod när sidan genereras. Flödet körs mot den riktiga produkten i en webbläsare: en dag med delbetalning och kredit jämförs med banken, godkänns, och ändras av en återbetalning – läs testet. Namn och belopp är exempel.

Innan bilen kommit

En bokning finns innan det finns ett jobb, och kunden ska veta när de ska komma. Bekräftelsen skrivs ut först så att disken ser exakt vad som skickas, med tiden på verkstadens klocka och hur man når en människa. Den går genom samma kö som allt annat. En påminnelse som väntar stoppas om bokningen flyttas, avbokas eller bilen redan kommit, och det som inte gick fram hamnar i disken kö – eller sägs för hand.

Orden kommer ur produktens språkkatalog när sidan genereras. Flödet körs mot den riktiga produkten i en webbläsare mot en riktig e-postserver: bekräftelsen förhandsvisas och landar i en brevlåda, en påminnelse stoppas av en flytt och kunden sägs för hand – läs testet. Namn och tider är exempel.

När bilen kommer tillbaka

Att kunden kommer tillbaka är inte samma sak som att reparationen var fel. Ett återbesök öppnar ett eget jobb på samma bil och skriver ner vad kunden säger, men avgör ingenting om vems fel det var. Verkstadens ställningstagande – garanti, kulans, orelaterat – är en rad med anledning, och kan ändras utan att det tidigare försvinner. Ett krav på leverantören kräver att ärendet kallats garanti, och kan avslås och drivas vidare.

Orden kommer ur produktens språkkatalog när sidan genereras. Flödet körs mot den riktiga produkten i en webbläsare: ett återbesök öppnas från ett fakturerat jobb, ett ställningstagande kräver sin anledning, ett leverantörskrav avslås och drivs, och en tekniker ser vad som anmälts men inga pengar – läs testet. Namn och belopp är exempel.

När arbetet görs någon annanstans

Ett sublet-arbete är en rad på fakturan, men turbon som åkte iväg i tisdags och lovades till fredag syns ingenstans. Här är den en egen post: vad som skickats, till vem, när den väntas, vem som bevakar den. Var den är hålls isär från jobbets läge och från om bilen står på en lyft. Att den kommer tillbaka är inte att den är godkänd – det säger verkstaden själv, och först då kan jobbet bli klart.

Orden kommer ur produktens språkkatalog när sidan genereras. Flödet körs mot den riktiga produkten i en webbläsare: en turbo skickas, blir sen, kommer tillbaka, godkänns av verkstaden och inte förr, och fakturan lämnas vidare – läs testet. Namn och belopp är exempel.

Börja från det du redan har

Verkstaden har redan en kundlista, ett fordonsregister och en hylla med delar. En import skriver ingenting förrän du sett den: filen läses (semikolon, decimalkomma, åäö, även äldre Windows-filer), varje rad visas med vad den skulle göra, och en rad som kan vara någon som redan finns måste du svara på. Samma fil två gånger blir samma uppladdning, och ingående lager är ett daterat bokningsrad som aldrig läggs på två gånger.

Orden kommer ur produktens språkkatalog när sidan genereras. Flödet körs mot den riktiga produkten i en webbläsare med svenska filer: kunder, delar och ingående lager förhandsvisas och genomförs, en möjlig dubblett kräver ett svar och samma fil blir samma uppladdning – läs testet. Namn och antal är exempel.

Från första inloggningen till första kunden

Ägaren som just skapat verkstaden får en lista, inte en tom tavla. Den läses ur verkstadens egna inställningar: adressen finns eller inte, tekniken finns eller inte. Det som inte går att läsa – att fakturan setts över, vem som äger säkerhetskopiorna, att ”ingen slutkontroll” är ett val – sägs av en människa och sparas med vem och när. En enmansverkstad slipper personalfrågor, och en leverantör för sms eller registreringsuppslag är aldrig ett krav.

Orden kommer ur produktens språkkatalog när sidan genereras. Flödet körs mot den riktiga produkten i en webbläsare: ägaren fyller i uppgifterna genom formulären listan länkar till, tittar på en exempelfaktura och ser listan bli klar – läs testet. Namn och nummer är exempel.

På svenska hela vägen, på en telefon, med tangentbord

Varje mening en läsare kan få se har en svensk översättning, och ett test går igenom en vanlig dags sidor på svenska och ger besked om en engelsk mening hamnat kvar. Ett avslag talar svenska och läses upp av en skärmläsare. Tangentbordet kommer förbi menyn med ett tryck, ser alltid var det är, och skärmen fungerar på 360 pixlar utan att skrolla i sidled. Det som verkstaden själv skrivit – en delbeskrivning, en anteckning – översätts aldrig.

Orden kommer ur produktens språkkatalog när sidan genereras. Testet körs mot den riktiga produkten i en webbläsare: automatisk tillgänglighetskontroll i ljust och mörkt, på svenska och engelska, tangentbord, en telefonbredd och ett avslag på svenska – läs testet. Namn och siffror är exempel.

Skanna hyllan, skriv inte av den

Varje del har en etikett som skrivs ut på en vanlig skrivare, med numret i klartext under staplarna. En handskanner är ett tangentbord som skriver koden och trycker Enter, så skanna-skärmen har ett enda fält. Tekniken tar ut delen till jobbet med samma kod. Varje ankomst, uttag och räkning är en rad i lagerboken: det som ligger på hyllan är summan av dem, aldrig ett tal som skrivits över.

Orden kommer ur produktens språkkatalog och staplarna ritas av dess egen Code 128, när sidan genereras. Flödet körs mot den riktiga produkten i en webbläsare: etiketten skrivs, en kod hittar delen, en okänd kod avvisas, tekniken tar ut delen och saldot sjunker med ett – läs testet. Delar, koder och namn är exempel.

Rensa en person, behåll fakturan

En kund som ber om att få sina uppgifter raderade har rätt till det, och verkstaden måste ändå spara fakturan i sju år. FreeSMS gör båda: namn, telefon, e-post och adress rensas, utfärdade fakturor behåller det namn de gick ut med, och vad som rensades och vad som sparades, med skäl, skrivs ner. Innan dess kan personen få en kopia av allt som finns om dem. En anställd med inloggning raderas inte, den får stängas av först.

Etiketterna och meningarna kommer ur produktens språkkatalog; listan över vad som rensas och sparas är förkortad här, hela texten står på sidan Personuppgifter. Flödet körs mot den riktiga produkten i en webbläsare: en kopia hämtas, personen raderas, fakturan behåller namnet, det kan inte göras två gånger och inte från verkstadsgolvet – läs testet. Namn och uppgifter är exempel.

Hela verkstaden i en fil, utan oss

Ägaren kan när som helst ta med sig hela verkstaden: kunder, fordon och deras historik, jobb, fakturor som de utfärdades, besiktningar med bilderna, lager och stämplad tid. Det blir en zip med en CSV per tabell, en README som säger hur den läses och en förteckning med antal rader, läsbar utan FreeSMS. Lösenord och inloggningar följer aldrig med, och varje uttag listas så att man ser vem som tog ut verkstaden och när.

Orden kommer ur produktens språkkatalog; filförteckningen är ett urval av vad zippen innehåller. Flödet körs mot den riktiga produkten i en webbläsare: ägaren tar ut verkstaden, filen byggs, det är en riktig zip med förteckning och README, och varken disken eller någon annan kommer åt den – läs testet. Namn och tider är exempel.

Byggt för att gå att lita på

0 kri licens. AGPL-3.0.
1 serverdin egen. En binär och en Postgres.
SIE 4standardformatet för svensk bokföring.
2 språkSvenska först, English också.

Vanliga frågor

Vad kostar det?

Ingenting. FreeSMS är öppen källkod under AGPL-3.0. Det finns ingen hostad tjänst att betala för: verkstaden kör den på sin egen server, och den som vill ha hjälp med det kan anlita vem den vill.

Var ligger våra kunders uppgifter?

Hos er. Databasen står på verkstadens egen server, inte hos oss. Och inne i systemet får bara de roller som behöver kundens namn och telefon se dem – mekanikerns skärm hämtar dem aldrig.

Fungerar det med Fortnox, Visma eller vår redovisningsbyrå?

FreeSMS lämnar över månadens fakturor och betalningar som en SIE 4-fil – standardformatet som svenska bokföringsprogram läser in. Ingen integration att betala för eller vänta på godkännande av. Filen kontrolleras mot en oberoende SIE-läsare vid varje ändring av koden; mot ett kommersiellt program har den ännu inte provats, och det säger vi hellre än att låtsas.

Behöver vi ett certifierat kassaregister?

FreeSMS är byggt för fakturerad försäljning och har ingen kassa. Fakturerad försäljning omfattas inte av kravet på certifierat kassaregister, men hur det gäller just er verksamhet är en fråga för er redovisningsbyrå.

Vad händer om nätet går ner?

Det som skrivs sparas i telefonen och skickas, exakt en gång, när nätet kommer tillbaka. Det är den första scenen på den här sidan, och den körs som ett test vid varje ändring.

Är det klart att använda?

Det är tidigt. En bil kan gå hela vägen från intag till bokföring, men det finns saker kvar – de står öppet som ärenden i källkoden, med vad som saknas och varför.

Kör den på din egen server

Docker, ett lösenord och inget annat. Bakom HTTPS når hela verkstaden den.

cp .env.example .env
# sätt POSTGRES_PASSWORD i .env
docker compose up
Så kommer du igång