Hoppa till huvudinnehåll
Rai Gomes / Dev+Des

Fallstudie · AI-SaaS

Lytdash

Landa jobbet du förtjänar.

Lytdash är en SaaS jag byggde för att få ordning på jobbsökandet. Den spårar varje ansökan på en kanban-tavla, poängsätter ditt CV mot varje annons med AI, genererar skräddarsydda CV:n och importerar jobb direkt från webbläsaren. Allt fungerar på både engelska och svenska.

ROLL

Produktdesigner & fullstackutvecklare

VARAKTIGHET

Pågående

TEKNIK

Next.js, TypeScript, Supabase, AI

TEAM

Solo (design & kod)

lytdash.app
Lytdash
Problemet

Att söka jobb är ett heltidsjobb i sig

Jag började bygga Lytdash mitt i min egen jobbsökning. Varje vecka kom samma frustration: massor av öppna flikar, ett kalkylblad jag slutade uppdatera efter två veckor och inget riktigt svar på frågan som faktiskt spelar roll. Passar mitt CV den här rollen eller inte?

01

Allt är utspritt

Ansökningar hamnar utspridda i flikar, bokmärken och mejl. Uppföljningar glöms bort, och plötsligt har du en intervju imorgon som du inte hunnit förbereda.

02

Du får aldrig återkoppling

Du skickar ditt CV och hör ingenting. Det finns inget sätt att veta om dina kompetenser matchar annonsen, vad som saknas eller varför ingen svarade.

03

Ett CV för alla jobb

Att anpassa CV:t för varje ansökan gör stor skillnad, men det är så tidskrävande att nästan ingen faktiskt gör det.

Jag byggde den för den svenska marknaden från dag ett. Hela produkten fungerar på engelska och svenska, och arbetsflödet följer hur rekrytering faktiskt går till här.

Research & upptäckt

Min första användare var jag själv

Att vara min egen första användare höll researchen ärlig. Innan jag byggde något ställde jag mig en enkel fråga: hade det här förändrat utfallet av en ansökan jag skickade den här veckan?

01

Vad befintliga verktyg missar

Kalkylblad är flexibla men passiva. Generiska trackers sparar din data men gör aldrig något med den. Inget därute slöt cirkeln mellan att spåra en ansökan och att faktiskt förbättra den.

02

Att tänka i steg

Jobbsökare tänker redan i steg: sökt, intervju, erbjudande. Så en kanban-tavla kändes naturlig från början, och den kom att forma hela informationsarkitekturen.

03

Återkoppling slår lagring

Den verkliga aha-upplevelsen var inte spårningen utan poängsättningen. När ditt CV får en ärlig matchningspoäng mot en annons slutar produkten vara en dagbok och börjar fungera som en coach.

Designprocess

Designsystemet kom före den första skärmen

Jag skrev designsystemet innan jag byggde dashboarden. Tokens, djupnivåer och åtgärdshierarki kom först, skärmarna efteråt. Varje yta hämtar från samma sanningskälla, i både mörkt och ljust läge.

01

Tydlighet först

En användare ska se vad som kräver uppmärksamhet inom en sekund efter att dashboarden öppnats. Försenade uppföljningar och kommande intervjuer får störst visuell vikt.

02

Djup i lager

Bakgrund, yta och upphöjda lager ser tydligt olika ut i båda teman. Djupet sköter hierarkin, vilket frigör färgen till att kommunicera status.

03

Tyst självförtroende

Inget dekorativt brus och inga generiska kortrutnät. Tunna kanter, lugn rörelse och typografi får göra grovjobbet.

04

Tillståndsverb, inte uppgiftsverb

Under en copy-genomgång märkte jag att 'Intervju bokad' känns mycket bättre än 'Boka intervju'. Gränssnittet firar ditt momentum i stället för att ge dig läxor.

Utveckling

En arkitektur som inte litar på AI:n

Det svåra var inte CRUD-delarna. Det var att få en icke-deterministisk AI-modell att bete sig som pålitlig infrastruktur. Varje AI-anrop passerar retry-, cache- och evidenslager innan utdatan får komma i närheten av poängpipelinen.

Chrome-tillägg(MV3)Next.js App RouterAPI-routes + Server ActionsSupabaseAuth · Postgres · RLS · StorageRetry-lager(jitter + backoff)Kanonisk cache(SHA-256)AI-motor(LLM)Persisterad AI-evidens

Jobb som importeras från tillägget går genom token-autentiserade API-routes. Varje AI-anrop omsluts av samma retry- och cachelager, och extraherad evidens sparas och återanvänds så att poängen förblir konsekventa överallt.

  • Default-deny-middleware och radnivåsäkerhet på varje tabell, så att den säkra vägen också är den enkla vägen
  • Auth-hjälparna är server-only, så ett misstag fäller bygget i stället för att slinka igenom
  • Atomära Postgres-funktioner för rate-limit-räknare, utan läs-kontrollera-skriv-kapplöpningar
  • CI kör typkontroll, lint, enhetstester och e2e-tester vid varje push
Produkten

Från utspridda ansökningar till en tydlig pipeline

Hela produkten är en loop. Du fångar ett jobb med ett klick, ser det landa i pipelinen, poängsätter ditt CV mot det och stänger gapet med en skräddarsydd version, utan att någonsin lämna flödet.

01

Pipeline-tavla

Ansökningarna bor på en kanban-tavla med uppföljningsknuffar och intervjupåminnelser. Försenade åtgärder får störst visuell vikt, så tavlan visar alltid var du ska titta härnäst.

lytdash.app/applications
Pipeline-tavla

02

AI CV-matchning

AI:n läser annonsen och ditt CV en gång och sparar det den hittar. En deterministisk motor poängsätter sedan matchningen, så samma indata ger alltid samma poäng, med delpoäng du faktiskt kan agera på.

lytdash.app/analysis
AI CV-matchning

03

Skräddarsytt CV med kvalitetsgrind

Ett klick genererar ett CV anpassat till annonsen. En kvalitetsgrind garanterar att det aldrig får lägre poäng än originalet, så ett skräddarsytt CV kan bara bli bättre, aldrig sämre.

lytdash.app/cvs
Skräddarsytt CV med kvalitetsgrind

04

Import med ett klick

Chrome-tillägget fångar valfri jobbannons in i din pipeline. Inget klipp och klistra, och inga API-nycklar sparade i webbläsaren.

chrome://extensions — Lytdash
Import med ett klick
Tekniska höjdpunkter

Stacken och varför jag valde den

01

Next.js App Router

Serverkomponenter, server actions och API-routes i en mental modell, med språkstöd från rotsegmentet.

02

TypeScript, strikt

Diskriminerade unioner klassificerar AI-fel, och uttömmande kontroller gör kantfall till kompileringsfel.

03

Supabase

Auth, Postgres med radnivåsäkerhet, lagring och atomära funktioner. Databasen är säkerhetsgränsen, inte appen.

04

AI-orkestrering

Strukturerad extraktion med JSON-scheman, omsluten av retries och cache vid varje anropsställe.

05

Testpyramid

Enhetstester för logiken, Playwright för flödena och fastnålade invariant-tester för poängmotorn.

06

Säkerhet som standard

Default-deny-middleware, explicita säkerhetsheaders, validering av uppladdningar och försvar i djupled för admin-routes.

07

i18n hela vägen

Engelska och svenska i produkten, mejlen och till och med AI-felmeddelandena.

08

Kostnadstänk

Rate limits dimensionerade efter verklig missbruksmatematik i stället för paranoia, med burst- och dygnsfönster.

Utmaningar

Problemen värda att skriva ner

Allt här kommer från en riktig produktionsbugg eller ett riktigt arkitekturbeslut. Den sortens sak som hamnar i en learnings-fil klockan ett på natten.

01

Icke-determinism mot förtroende

Problemet

Samma CV och jobbeskrivning gav 7 matchade kompetenser i ett anrop och 10 i nästa, även med identiska inställningar. Poängen ändrades mellan skärmar för samma data, och användarna märkte det.

Insikten

AI-utdata är ingen beräkning, det är en artefakt. Extrahera en gång, spara evidensen och låt allt nedströms arbeta utifrån samma artefakt. Anropa modellen igen först när användaren uttryckligen ber om det.

02

En kvalitetsgrind som inte kan ljuga

Problemet

Kvalitetsgrinden jämförde poäng från två olika extraktioner och började avvisa bra CV:n med falska regressioner.

Insikten

Om ena sidan av en jämförelse kommer från sparad evidens måste andra sidan härledas från samma evidens, aldrig extraheras om från grunden. 'Aldrig regrediera' blev en testinvariant i stället för en promptinstruktion.

03

Motståndskraft är allt eller inget

Problemet

AI-API:t fallerar då och då under last. Jag omslöt anropsstället som felade och lämnade de andra exponerade, så 'funkar för mig'-buggrapporter fortsatte droppa in i veckor.

Insikten

Ett retry-lager är klart först när varje anropsställe går genom det. En gemensam hjälpare med backoff och jitter som bara försöker om vid tillfälliga fel, med en etikett per yta så att loggarna visar vilken som kämpar.

04

Säkerhet prissatt i pengar

Problemet

Hur mycket rate limiting behöver en MVP egentligen? Paranoian säger allt. Leveranspressen säger inget.

Insikten

Jag satte mig ner och räknade på vad missbruk faktiskt skulle kosta. En enda missbrukare som hamrar API:t kan bränna tusentals kronor i månaden. Den siffran sorterade åtgärderna i måsten och trevligheter bättre än någon checklista.

Lärdomar

Vad projektet lärde mig

Lytdash är där jag slutade skriva kod som bara fungerar och började bygga system som fortsätter fungera. Det här är lärdomarna jag bär med mig in i varje projekt sedan dess.

  1. 01

    Behandla AI som ett opålitligt beroende

    Jag lärde mig att designa för modellen jag faktiskt har, inte den jag önskar att jag hade. Spara dess utdata, omslut varje anrop med samma skyddsnät och låt aldrig två olika extraktioner låtsas vara en sanning.

  2. 02

    Invarianter slår intentioner

    En prompt som säger 'gör det aldrig sämre' är en önskan. Ett test som verifierar det är en garanti. Så ofta jag kan gör jag om produktlöften till tester.

  3. 03

    Designsystem är hävstång, inte overhead

    Att skriva tokens och hierarkiregler före första skärmen kändes långsamt för ett soloprojekt. Det visade sig vara tvärtom. Varje skärm efter den första gick snabbare, och mörkt och ljust läge höll sig synkade av sig självt.

  4. 04

    Säkerhet är en standard, inte en funktion

    Neka som standard, skydda varje tabell, håll hemligheter på servern. Den verkliga lärdomen är strukturell: gör den säkra vägen till den enkla vägen och granska sedan undantagen i stället för reglerna.

  5. 05

    Användare läser utfall, inte infrastruktur

    Mitt första kvotfelmeddelande pratade om AI-leverantörens faktureringsinställningar. Ingen som använder produkten kan göra något med det. Nu berättar varje fel vad användaren faktiskt kan göra härnäst.

  6. 06

    Skriv ner lärdomarna

    Projektets learnings-fil har vuxit till över tusen rader regler ur riktiga buggar. Halva värdet ligger i själva skrivandet. En bugg är inte klar när den är fixad. Den är klar när regeln som förhindrar hela buggklassen är nedskriven.

Resultatet

En riktig produkt, och en bättre ingenjör

Lytdash är live som en fungerande SaaS, och att bygga den var den mest koncentrerade läroupplevelsen i min karriär. AI-orkestrering, säkerhetshärdning, kvalitetsgrindar och tvåspråkig produktdesign, allt i en kodbas.

88%

Acceptansgrad för skräddarsydda CV:n

uppmätt i den interna utvärderingssviten

+24,9

Genomsnittligt matchningslyft

för AI-skräddarsydda CV:n jämfört med originalet

10/10

Härdade AI-anropsställen

varje AI-anrop omslutet av retries och cache

2

Språk hela vägen

engelska och svenska i UI, mejl och felmeddelanden

lytdash.app/analytics
lytdash.app/analytics
lytdash.app/settings
lytdash.app/settings
lytdash.app
lytdash.app

Nästa steg

Vart det är på väg

LinkedIn-profilanalys

Poängsättning och förbättring av profilen med samma pipeline som driver CV-matchningen.

Monetarisering

Prenumerationer med plan-baserade kvoter och en självbetjäningsportal.

Djupare analys

Trattmätvärden över pipelinen, som svarsfrekvens per roll, källa och CV-version.

Kontinuerliga AI-utvärderingar

En växande utvärderingssvit så att varje modell- eller promptändring måste klara samma ribba.

Tack för att du läste. Låt oss höras.