← Arbejde

Case 08 · Live

Automatiq — Intelligent SMS automatisering

Seks måder at sende en SMS på — en tidsplan, et tryk, en indgående besked, et ubesvaret opkald, ankomst til et sted eller tilslutning af en oplader — alt sammen samlet gennem én enkelt sendesti på en telefon uden nogen konto bagved og uden en server at kontakte. Bygget til mig selv, åbent og transparent, fordi alt i Play Store ville have et abonnement for at gøre det dårligere.

image showning a text Automatiq the robot
image showning a text Automatiq app has 6 triggers
Automatiq app logo of a robot

Automatiq

Se videoen 1 Se videoen 2

Problemet

At sende en besked på et fast tidspunkt er en opgave på fem minutter. At sende den pålideligt hver uge i et år på en telefon, som Android aktivt forsøger at sætte på standby, er noget helt andet.

Det er her, kategorien med apps til automatisering kommer ind i billedet. De kommercielle SMS-planlæggere vil stort set alle have de samme tre ting, før de vil udføre fem-minutters-opgaven: en konto, et abonnement og tilladelse til at sende dine beskeder gennem en andens server. Og de fleste stopper stadig stille med at fungere — ikke med en fejlmeddelelse, men med tavshed — ugen efter at en OEM-batterioptimering beslutter, at appen har været inaktiv længe nok til at blive lukket ned.

Tavshed er den værst tænkelige fejltilstand her. En besked, der ikke kommer frem, fortæller ikke sig selv; du opdager det først, når personen i den anden ende spørger, hvorfor du aldrig skrev. Derfor var briefet smalt og besværligt: En app, der bliver ved med at køre i månedsvis uden nogensinde at tjekke ind, som ærligt fortæller dig, når en afsendelse mislykkes, og som aldrig behøver at give beskedens indhold videre til andre for at beslutte, hvad der skal ske med den.

Beslutningerne

Pålideligheden kom af at have en sund mistillid til schedulerens pålidelighed. Androids præcise alarmer er nøjagtige, men kan tilbagekaldes — Doze, en genstart, en app-opdatering eller en aggressiv OEM-ROM. Derfor kører Automatiq med to motorer side om side: AlarmManager til det præcise afsendelsestidspunkt og et WorkManager-job hver time, som gennemgår alle aktive makroer og sender alt det, alarmen måtte have misset. To motorer introducerer dog en ny fejlmulighed — dobbelt afsendelse — så sendestien er beskyttet af et atomisk claim baseret på lokal midnat: Den motor, der kommer først, vinder, og den anden opdager, at tidsrummet allerede er taget. Alarmer og geofences aktiveres igen ved opstart, ved app-opdateringer og endnu en gang ved hver lancering som en selvreparerende mekanisme.

Privatliv kom fra den samme grundidé, blot anvendt på netværket. Der er ingen konto og ingen backend, fordi der ikke er noget, en backend skal gøre. Præcis to typer kald forlader nogensinde enheden: geofencing gennem Play Services og — kun hvis du selv aktiverer det og indtaster din egen gratis API-nøgle — en forespørgsel til Gemini for at få skrevet et AI-genereret svar. Hvis forespørgslen fejler, falder makroen tilbage til sin faste besked i stedet for ikke at sende noget. Nøglen gemmes kun på enheden, holdes ude af logs og udelukkes fra Androids cloud-backups.

Og ærligheden kom fra at nægte at stole blindt på radioen. "Handed to SmsManager" er ikke det samme som "sent" — netværket kan miste en besked efter afsendelsen, og en naiv implementation vil alligevel logge en munter succes. Hver besked får derfor en send-kvittering, så en sen fejl ændrer logposten, makrostatussen og widgetten til fejlet med radioens faktiske årsag. Hvor operatøren rapporterer tilbage, bliver leveringen også bekræftet.

Hvad der blev bygget

Seks udløsere, én sendesti:

  • Planlagt — et bestemt tidspunkt, valgfri kombination af ugedage, hver N. uge, med en valgfri udløbsdato eller en enkelt engangsdato
  • Manuel — tryk på makroen i listen eller brug en widget på hjemmeskærmen, som viser sin egen seneste afsendelse
  • Autosvar — en indgående SMS, der matcher en valgfri afsender og/eller et nøgleord, med beskyttelse mod loops
  • Lokation — ankomst til eller afgang fra et geofenced sted, genaktiveret efter genstarter og opdateringer
  • Ubesvaret opkald — et opkald, der ringer ud eller bliver afvist, med et valgfrit filter på den, der ringer
  • Enhedsstatus — opladeren, en specifik Bluetooth-enhed eller et navngivet Wi-- Fi-netværk, der forbinder eller afbryder

Alle seks ender i den samme funktion, og det er selve pointen: Ét sted, hvor en besked sammensættes, sendes, logges og verificeres, i stedet for seks næsten ens implementationer, der langsomt udvikler sig i forskellige retninger.

Oven i det kommer variabler i beskederne — dato, ugedag, modtagerens navn — så en makro med en liste af modtagere kan personliggøre hver besked i stedet for at sende den samme tekst til alle. Autosvar kan sende en fast tekst eller en Gemini-genereret tekst, enten holde den tilbage til din godkendelse eller sende den automatisk og rapportere resultatet bagefter. En planlagt makro kan gøre det samme den anden vej og omskrive sin egen besked ved hver afsendelse, så en ugentlig påmindelse aldrig lyder helt ens to gange, og falde tilbage til den oprindelige tekst i det øjeblik API'et ikke er tilgængeligt. Stille perioder kasserer ikke svar, der kommer ind om natten — de holder dem tilbage og svarer hver person på deres seneste besked, når perioden slutter. Mapper samler makroer med en hovedkontakt, en sundhedsskærm viser status for præcise alarmer og batteri med løsninger, der kan aktiveres med ét tryk, og alt kan eksporteres til og importeres fra JSON.

Resultat

I daglig brug på min egen telefon, sideloaded i stedet for publiceret — et personligt værktøj, der aldrig havde nogen grund til at blive et produkt. Det interessante er ikke funktionslisten, men hvad funktionslisten krævede nedenunder: en sendesti, der ikke kan sende dobbelt, en scheduler, der overlever et operativsystem, der forsøger at stoppe den, en AI-integration, der falder tilbage til almindelig tekst i stedet for at fejle, og en log, der rapporterer, hvad der faktisk skete, frem for hvad der blev forsøgt.

Det hele ligger på GitHub — arkitektur, migrationer, begrundelser for tilladelser og det hele.

Eller kontakt mig for få den nyeste version klar til installering på din Android telefon.

github.com/larssolo/automatiq

ENDA