Gå til indhold
Casper Havelykke
Alle projekter

Røket

En app mod ensomhed, hvor man ser, hvad folk i nærheden laver lige nu, og kan invitere til eller deltage i aktiviteter. Bygget i React Native og Firebase og udgivet i Google Play.

Tre skærme fra Røket, kortet med aktiviteter i nærheden, listen over aktiviteterne og en gruppechat

Røket er mit største og mest gennemarbejdede egne projekt. Idéen er at gøre det nemt at lave noget sammen med folk i nærheden, fx en kop kaffe, en gåtur eller et brætspil, i stedet for at scrolle gennem profiler.

Kortet over København med aktiviteter som markører og tidsvinduet nederst Listen over fem aktiviteter i nærheden, sorteret efter afstand En aktivitet, Coffee and a chat, med tid, sted, deltagere og en knap til at deltage Gruppechatten for aktiviteten
Kortet, aktiviteterne i nærheden, en enkelt aktivitet og gruppechatten.

Det kan appen

  • Et levende kort. Forsiden viser, hvad folk i nærheden laver lige nu, med en liste over de samme aktiviteter sorteret efter afstand.
  • Et tidsvindue. Man trækker et vindue på tre timer hen over døgnet for at se, hvad der sker senere. Det kører i 60 fps på UI-tråden med Reanimated, og kort og liste filtreres med det samme.
  • Åbne invitationer. Man opretter en aktivitet, andre i nærheden kan deltage, og hver aktivitet får sin egen gruppechat.
  • Hold kontakten. Efter en aktivitet kan man bede om at holde kontakten og få en privat chat.
  • Gæstetilstand. Man kan se hele appen uden en konto, og anonyme konti ryddes automatisk op efter 30 dage.
  • Seks sprog og mørkt tema. Dansk, engelsk, spansk, tysk, fransk og portugisisk, og kortet skifter stil med temaet.

Sådan er den bygget

Appen er skrevet i React Native med TypeScript og bruger Firebase til login, database, filer og push-beskeder. Alt, der kræver særlige rettigheder, ligger i Cloud Functions, så det aldrig afgøres i appen:

  • Forbindelser som en tilstandsmaskine. At bryde, genanmode og blokere er envejsovergange, som Firestores sikkerhedsregler kun lader hver bruger sætte én gang. Cloud Functions rydder op bagefter.
  • Moderering af billeder. Uploadede billeder scannes med Google Cloud Vision, og upassende billeder fjernes og logges automatisk. Ovenpå er der rapportering, advarsler og udelukkelser, og billeder i chats slettes efter 12 timer.
  • Egne kortmarkører. Markørerne er React-komponenter i appens tema. Med React Natives nye arkitektur krævede det en særlig løsning, før de blev tegnet rigtigt på kortet.
  • Sprog uden huller. Alle tekster ligger ét sted med en type, der er afledt af ét af sprogene. Mangler en oversættelse, fejler det allerede, når koden bygges.

Det sværeste

Hele brugerrejsen i chatten. En chat ser enkel ud, men en samtale i Røket kan være i mange tilstande: Aktiviteten kan være slut, den ene kan have slettet samtalen eller blokeret den anden, og en gæst uden konto skal have forklaret, hvorfor der ikke er nogen beskeder. Hver tilstand skal vise de rigtige knapper, informationer og fejlbeskeder på alle seks sprog. Det krævede meget test og tilretning, før alt virkede og så ordentligt ud. Chatskærmene alene er ændret i 35 commits. Tre eksempler:

  • Slettede samtaler. Når den ene sletter en privat samtale, slettes beskederne på serveren, og chatten låses. Den anden ser en systembesked, og feltet til at skrive bliver erstattet af knapper til at anmode om kontakt igen eller slette samtalen helt. Jeg testede forløbet fra ende til anden på to enheder.
  • Nye beskeder. En besked, man lige har sendt, har ikke noget tidspunkt, før serveren svarer, så datooverskriften sprang ind et øjeblik efter og skubbede til samtalen. Nu regnes en ventende besked som dagens, og nye beskeder vokser ind på plads, så resten af samtalen glider blødt op.
  • Fejlbeskeder. Fejl fra Firebase bliver oversat til en forståelig besked på brugerens sprog i stedet for en fejlkode. Undervejs fandt jeg også ud af, at appen gik ned, når man loggede ud, fordi Firestore afviste de lyttere, der stadig var aktive. Nu har alle lyttere, der kræver login, deres egen fejlhåndtering.

Status

Røket er udgivet i Google Play. Det er et fritidsprojekt, som jeg har bygget for at holde mig skarp, mens jeg søger job, og for at prøve kræfter med AI-værktøjer i et rigtigt projekt fra idé til udgivelse. Et socialt medie kræver markedsføring for at få brugere, og den del har jeg ikke brugt penge på, så målet har været selve appen.