En uppgiftslista är något du rör vid många gånger om dagen. Om varje bock, namnbyte och dragning måste vänta på en server blir väntan till slut märkbar, och på tåget eller i en källare tar det stopp helt. Därför byggde vi thisflow tvärtom: dina uppgifter finns först på din enhet, och nätet hinner ikapp i bakgrunden. Här berättar vi vad det innebär i praktiken, och vad det kostar.

Vad local-first betyder hos oss

När du öppnar thisflow har appen en riktig databas på din enhet. I webbläsaren är det SQLite (som körs som WebAssembly och sparas i IndexedDB), en databas per inloggad person. Alla listor, tavlor och kalendrar läser från den lokala databasen. Sökningen körs också där, och därför kommer träffarna medan du skriver.

På servern kör vi PostgreSQL. Mellan dem finns PowerSync, en synkmotor som kopierar de rader du har rätt att se från Postgres till SQLite-databasen på var och en av dina enheter. En klient får bara rader från projekt där den har en roll, så en gäst i ett projekt får aldrig något från resten av arbetsytan.

Ändringar är namngivna kommandon

När du ändrar något gör appen tre saker i en och samma lokala transaktion: den uppdaterar det du ser, skriver ändringen till de lokala raderna och lägger ett namngivet kommando i kö, till exempel createTask, toggleComplete eller moveToSection. Kön skickas till vårt API i ordning, äldst först, så fort det finns en anslutning.

Vi skickar kommandon i stället för råa radändringar eftersom kommandon behåller avsikten. Servern validerar varje kommando, kontrollerar din roll i projektet, skriver det i en transaktion och för in det i aktivitetsloggen. Samma kommandon står bakom ångra, uppgiftshistoriken, AI-funktionerna och MCP-servern. Det finns alltså ett enda sätt att ändra en uppgift, var ändringen än kommer ifrån.

Varje kommando har dessutom ett eget id, så en omgång som skickas igen efter ett avbrott känns igen och körs inte två gånger.

Direkt, och uppmätt

En av våra produktprinciper är att varje interaktion ska visa sitt resultat på under 50 ms. Eftersom läsningar och skrivningar går till den lokala databasen ligger nätet aldrig i vägen.

Det kontrollerar vi i stället för att anta. Vårt prestandatest körs mot ett projekt med 1000 uppgifter. I versionen vi kallade ”Omedelbart även i långa listor” tog det ungefär 16–48 ms att bocka av, öppna och snabbinmata, mot upp till 100 ms tidigare (ändringsloggen). Siffrorna kommer från vår testmaskin, inte från din enhet.

Offline är normalfallet

Innan vi valde PowerSync jämförde vi den med en annan synkmotor i ett litet test som går att upprepa. Den andra motorn var snabbare på webben i alla siffror vi mätte. Den förlorade på en punkt: efter 60 sekunder utan anslutning vägrade den ta emot nya ändringar, och i vårt långa offlinetest behöll den 0 av 5 ändringar, medan PowerSync behöll 5 av 5. För en uppgiftsapp avgjorde det saken. Att fånga en tanke först och ordna den sedan fungerar bara om det aldrig hänger på nätet.

I thisflow sparas ändringar du gör offline på enheten, finns kvar efter en omladdning och skickas när anslutningen är tillbaka. Sidofältet visar vilket läge du är i: Offline när enheten saknar nät, Ej ansluten när den har nät men inte når oss.

Konflikter löses per fält

När två personer ändrar samma uppgift löser thisflow det per fält, och den senaste ändringen vinner. Byter du förfallodatum medan en kollega byter namn på uppgiften behålls båda ändringarna, eftersom de rör olika fält. Ändrar ni samma fält vinner den som kom sist.

Ångra följer samma regel. När du ångrar en ändring skrivs bara de fält tillbaka som just den ändringen rörde, så en kollegas ändring i ett annat fält under tiden finns kvar.

Avvägningarna, ärligt

Local-first är inte gratis, och det säger vi hellre rakt ut.

  • Du får veta när din ändring inte gick igenom. Vinner någon annans nyare ändring över din säger appen att deras nyare ändring behölls. Om servern nekar en ändring, till exempel för att du inte längre har åtkomst till projektet, ångras den på din enhet och du får veta varför. Om ändringar inte når servern på ett tag visar sidofältet hur många som väntar, med Försök igen nu.
  • Dina uppgifter tar plats på enheten. Den lokala databasen rymmer de projekt du kan se. Första besöket laddar också ner själva SQLite-motorn; sedan ligger appens skal i cacheminnet.
  • När du loggar ut raderas den lokala kopian, även ändringar som inte har skickats. Appen varnar först om det finns sådana. En utgången session raderar ingenting: köade ändringar skickas när du loggar in igen.
  • En del kräver servern. Uppgiftshistoriken byggs från serverns aktivitetslogg och kräver därför anslutning. Delning och medlemskap sköts också bara på servern, eftersom de styr vad synkmotorn skickar.
  • Senaste ändringen vinner är enkelt, inte magi. Skriver två personer i samma beskrivning i exakt samma stund slås texterna inte ihop. Samtidig textredigering lägger vi bara till om användarna ber om det.

Var din data finns

Serversidan körs i EU. Postgres och PowerSync-tjänsten körs på vår egen server hos UpCloud i Stockholm. Kopian på din enhet är din: den ligger i webbläsarens lagring och tas bort när du loggar ut. Mer om hur vi hanterar data finns på vår säkerhetssida.

Prova själv

Det snabbaste sättet att känna skillnaden är att lägga till några uppgifter och sedan stänga av nätet. Guiden för att komma igång tar ungefär fem minuter, och snabbinmatningen fungerar likadant med och utan anslutning.