Utvalgt arbeid

JOBBL

Oversikt

En markedsplass for korte praktiske oppdrag, åpen fra tretten, formet av det den nekter å vite.

Detaljer

At a glance

Type prosjekt
Markedsplass, mobil-først web
Min rolle
Definerte produktet og sikkerhetsreglene, designet det, og implementerte plattformen og appen.
Kategori
Produkter
Status
Under utvikling2026

Hva jeg gjorde

  • Satte reglene som lar en trettenåring bruke den lovlig
  • Designet flytene for å finne arbeid, legge ut et oppdrag og snakke om det
  • Bygget domenelaget, det versjonerte API-et og autorisasjonssuiten som tester det
  • Bestemte hva plattformen ikke må samle inn, og fjernet det som allerede gjorde det

Bygget med

  • TypeScript: Hele stacken, med reglene i sin egen pakke
  • Next.js: Webklienten og det versjonerte REST-API-et
  • PostgreSQL: Kilden, driftet i EU ved siden av applikasjonen
  • Drizzle: Skjema og spørringer
  • Zod: Ett sett skjemaer delt av klienten, API-et og tjenestene
  • Cloudflare R2: Bildelagring, omkodet og renset før det kommer fram
  • Twilio: Engangskodene som er den eneste måten en konto finnes på

Neste prosjekt

Wisr
Three screens from the JOBBL app side by side: a job card offering 240 kroner an hour, the form for posting a job, and the search screen

Behovet

Hekker, snø, raking, bæring. De korte praktiske oppdragene som før ble avtalt mellom naboer, og som fortsatt er den første jobben de fleste nordmenn hadde.

De passer dårlig på plattformene som finnes. De er bygget for håndverkere som gir pris på prosjekter, og de forutsetter en voksen med organisasjonsnummer. Så det lille oppdraget blir aldri lagt ut, og femtenåringen som gjerne ville tatt det har ingen steder å bli funnet.

Én konto, ingen budrunde

Den samme personen jobber på lørdag og legger ut et oppdrag på søndag, så det finnes én type konto, og registreringen spør aldri hvilken du er. De to ekstra tingene en oppdragsgiver trenger, spørres om i det øyeblikket oppdragsgiveren legger ut sitt første oppdrag, og ikke før.

Den som legger ut oppdraget setter prisen. Det finnes ingen budrunde, fordi et budmarked for fire timers raking presser prisen ned og de yngste nederst i det.

A JOBBL profile: a name, an unrated star row reading New on JOBBL, counts of jobs given and jobs done, and rows of skills and equipment the person has selected
The JOBBL search screen: a search field over category filters, and a job card for carrying plasterboard in Oslo at 240 kroner an hour, 1.3 kilometres away
Én profil for begge sider av oppdraget, og strømmen den vises i.

Beslutning

Slett stoppeklokka, fordi det å vite var risikoen

Bakgrunn
Det fantes en stoppeklokke: start og stopp på serveren, en låst sats, et utregnet beløp. Den virket. Så åpnet JOBBL for trettenåringer. Etter Skatteetatens regler om plattformrapportering må en plattform som vet hva en arbeidstaker har krav på, eller med rimelighet kan regne det ut, samle inn og verifisere fødselsnummeret til hver arbeidstaker og rapportere inntekten deres hvert år.
Hva jeg bestemte
Stoppeklokka ble fjernet. Arbeidet slutter nå når begge parter sier det er ferdig, og JOBBL registrerer hvem som sa det og når. Aldri hvor lenge, aldri hvor mye.
Avveining
Produktet mistet en virkelig nyttig funksjon og tilliten den ville båret. Det den kjøpte var å slippe å oppbevare fødselsnummeret til en trettenåring, som er det aller siste en liten markedsplass bør lagre.

Åpen fra tretten

Tillatelse er en tabell, ikke en advarsel. En trettenåring kan tilbys hage og rydding, med en forelders bekreftelse. Fra seksten åpner maling, flytting, montering og bæring seg. Riving er stengt for alle under atten, alltid. Velg riving når du legger ut, og ungdomsvalget finnes rett og slett ikke. Sett starten mellom åtte om kvelden og seks om morgenen, og de yngste båndene forsvinner fra det oppdraget.

En forelder bekrefter på sin egen telefon, og aldri med en signatur. En finger tegnet på barnets egen skjerm beviser ingenting, barnet kan tegne den, og bevis som ser ut som bevis og ikke er det, er verre enn ingenting. Så den unge taster inn en forelders nummer, en kode går til den telefonen, og det som registreres er et nummer, et tidspunkt og en handling på en annen enhet. Det beviser ikke foreldreskap. Ingenting annet enn BankID ville gjort det.

Alder lagres som et bånd, ikke en fødselsdato. JOBBL kan ikke verifisere en alder, så en fødselsdato ville samlet inn mer om et barn og bevist ingenting ekstra. Et bånd kan rettes oppover, som er en bursdag, og aldri nedover, og det er det som stille avslutter en forelders involvering ved seksten, uten at plattformen sitter på en dato å telle mot.

Beslutning

Ingen posisjon, ingen avstand

Bakgrunn
Avstanden under et oppdragskort falt tidligere tilbake på Oslo sentrum når noen avslo å dele posisjon. En i Bergen leste da en selvsikker avstand målt fra en by de ikke var i.
Hva jeg bestemte
En avstand JOBBL ikke kan stå inne for skrives ikke ut i det hele tatt. Kortet viser stedet i stedet, og avstandsfilteret forsvinner med den. Selve posisjonen spørres det om én gang, den beholdes i nettleseren og lagres aldri på serveren.
Avveining
Noen kort bærer mindre informasjon enn de kunne. Et filter som sier innenfor tjuefem kilometer fra en gjetning er en myntkast som skjuler ekte oppdrag, og et tall ingen kan stå inne for er verre enn ingen tall.
Slik fungerer det
  • Webappen er en klient av plattformen, ikke plattformen. Reglene ligger i sin egen pakke bak et versjonert API, slik at en app senere arver hver eneste av dem i stedet for å bygge dem på nytt.
  • Identitet kommer fra en signert http-only-informasjonskapsel og ingen andre steder, aldri fra en kropp, en spørring eller et hode. Hver tjenestefunksjon tar en aktør, så det finnes ingen usjekket lesing.
  • Databaserader forlater aldri serveren. Svar bygges opp felt for felt, slik at en kolonne lagt til senere ikke kan lekke ved et uhell.
  • Ett endepunkt kan koste penger for en anonym oppringer, det som sender en kode, så grensene er et budsjett, ikke høflighet: bare norske numre, én kode i minuttet, tre i timen, ti om dagen, en grense per adresse og et hardt daglig tak appen nekter å passere. Koder lagres bare som en nøklet hash, utløper på minutter, dør etter fem feil gjetninger, og virker én gang.
  • En kode vet hva den er til for. En som er sendt til en forelder for å bekrefte barnet, kan aldri brukes til å logge noen inn som den forelderen.
  • Chat finnes bare inne i et oppdrag, bare mellom de to sidene, og bare etter at arbeideren har søkt. Det finnes ingen kontaktliste og ingen måte å nå en fremmed på, og det fjerner en hel kategori misbruk før den kan oppstå.
  • Bilder omkodes på serveren før lagring: orientering påført, hver bit kameradata fjernet, og skalert til visningsstørrelse. Et telefonbilde av noens hus bærer koordinatene til det huset, og ingenting av det hører hjemme i en offentlig strøm. Dekoding er valideringen, så en fil som bare påstår å være et bilde når aldri lagringen.
  • En melding kan aldri leses av den den navngir, og du kan bare melde fra om det du allerede kunne nå, ellers ville det å be om å melde en samtale svare på om den finnes.
  • Penger er heltall i øre, aldri et flyttall og aldri en tekst, og lønn regnes bare ut på serveren.
  • En nonce per forespørsel og en innholdssikkerhetspolicy gjør at et skript som kommer på noen annen måte ikke kjører. Den settes i rapportmodus først, fordi forskjellen på en policy som beskytter og en som tar ned nettstedet en lørdag er hvilken rekkefølge du gjør det i.

Hvor det står

Sløyfen går: logg inn med telefon, finn et oppdrag, søk, snakk om det, bli enige om at det er gjort, gi hverandre vurdering. Autorisasjonssuiten logger inn som tre forskjellige personer og prøver å lese og skrive hverandres data gjennom det ekte API-et, og det er testen som holdes grønn framfor alle andre.

Den er ikke lansert. Varsler, betaling og kartvisning er ikke bygget, og heller ikke en måte for noen som har fått innhold fjernet til å svare på avgjørelsen, som vilkårene inviterer til, så det står skrevet som skyldig i stedet for utelatt.

Det prosjektet viste seg å handle om var ikke funksjoner. Det var en rekke avgjørelser om hva en plattform bør nekte å vite: ikke timene som ble jobbet, ikke et barns fødselsdato, ikke hvor noen står.