Projekt Blogg Om mig CV
Göteborg, Sverige

Christian Toledo.
Fullstackutvecklare som bygger och driftar sina egna system.

Närmare sju år av att bygga webb- och mobilappar i produktion, på produktbolag och som konsult. React, React Native, Vue, Angular och .NET, för kunder som PostNord, Nordic Wellness och Ineras 1177, den nationella vårdplattform som miljontals svenskar använder. På fritiden bygger jag på samma sätt: en färdapp som nu ligger i stängd beta, byggd på två tillverkares Bluetooth-protokoll som jag reverse-engineerat själv, och ett hemmalabb med fem system som jag driftar och dokumenterar som produktion.

Senast fullstackutvecklare på Dear Friends och Nexer AB. Ursprungligen från Kuba, bosatt i Göteborg sedan 2011, och söker just nu mitt nästa team.

Utvalda projekt

Två saker jag byggt, driftar och håller igång.

Inga demos. Det ena är en Android-app och backend i stängd beta med riktiga användare; det andra är plattformen den körs på. Båda har verkliga felfall, och en nedskriven historik över besluten bakom dem: protokollreverseringen, fysikregressionerna och de infrastrukturval som gjordes i vardera.

// mobil + backend

Cityroam

En färddator för elbrädor och elsparkcyklar: en Android-app och en självhostad backend som pratar direkt med hårdvaran över Bluetooth. Två olika tillverkares proprietära protokoll, båda reverse-engineerade och återimplementerade från grunden. Inget leverantörs-SDK, och inget molnkonto som krävs för att åka.

I stängd beta. Källkoden är privat, så djupdykningarna är den läsbara versionen: protokollanteckningar, fysikmodellen och besluten bakom båda.

  • Två leverantörsprotokoll, inget av dem dokumenterat: Tynee-brädans Tuya-SDK reverse-engineerades och togs bort helt, ersatt av en Kotlin GATT-klient byggd från grunden och verifierad byte för byte mot en Python-referens. NAVEE-sparkcykeln hade inget SDK att ta bort över huvud taget, så dess krypterade utmaning-svar-handskakning fick räknas ut från en riktig capture av tillverkarens egen app.
  • Fysik anpassad till dina egna åkturer: backenden anpassar rullmotstånd, luftmotstånd och drivlineeffektivitet per läge genom regression över verklig resehistorik, i stället för att lita på ett tillverkartal eller gissa linjärt utifrån batteriprocent.
  • Offline först, av konstruktion: varje avslutad tur skrivs till telefonens egen SQLite-kö innan något nätverksanrop görs, så en tur finns i samma ögonblick den tar slut, oavsett om backenden går att nå. Inspelningen överlever att appen hamnar i bakgrunden eller dödas helt.
  • Ren GPS från brusig hårdvara: rå GPS-data från telefonen vägsnäpps genom en självhostad OSRM-instans och berikas med väder samplat över hela rutten, så en tur som faktiskt går från sol in i regn visar det.
Expo / React NativeKotlinTypeScriptBluetooth LEFastAPISQLModelAlembicOSRMDocker
// plattform

casa-verde

Proxmox-värden och deploypipelinen som fem separata system körs på. Inte en hög Docker-containrar, utan en plattform med infrastruktur som kod, krypterade hemligheter i git, driftkontroll mot livemiljön och en nedskriven historik över varje verkligt beslut bakom den.

Källkoden är privat, eftersom den innehåller krypterade hemligheter och nätverksupplägget för ett hus jag bor i. Djupdykningen täcker arkitekturen och besluten.

  • Push till main är deployen: en självhostad GitHub Actions-runner applicerar repot på värden och varje container. Ansible för de flesta stackar, GitOps för dem där en webhook-snabb omdistribution är värd sin extra komplexitet. Valt per stack, inte dogmatiskt.
  • 82 skrivna beslutsdokument: varje icke-trivialt beslut har en dokumenterad anledning, inklusive de som visade sig fel och fick rullas tillbaka. Den vanan är själva poängen med projektet.
  • Faktiskt övervakat: en daglig driftkontroll kör playbooken mot livemiljön och larmar om något handredigerats utanför pipelinen, plus automatiska säkerhetskopior och riktiga felnotiser, inte bara ”containern körs fortfarande”.
  • Den kör det andra projektet: Cityroams backend körs på den här plattformen, deployad av samma pipeline. De två projekten på den här sidan är inte oberoende. Det ena körs på det andra.
Proxmox / LXCAnsibleDocker ComposeKomodo (GitOps)Cloudflare TunnelHome Assistant
System

Fem system, en plattform.

casa-verde är inte ett projekt. Det är en Proxmox-värd och en deploypipeline som fem separata system körs på, vart och ett med sin egen stack, sina egna felfall och sina egna poster i beslutsloggen.

// mediakedja

Mediaautomation och streaming

En kedja på sexton containrar som hittar, sorterar, textar och serverar media, plus ett fotobibliotek som gör ansiktsigenkänning på samma integrerade grafikkrets som sköter videotranskodningen.

  • Sonarr, Radarr, Lidarr, Prowlarr och Bazarr för hämtning och undertexter; Jellyfin och Navidrome för uppspelning; Immich som självhostad ersättare för Google Photos
  • Jellyfin körs direkt på värden i stället för i en container, just för att få direkt iGPU-passthrough för hårdvarutranskodning
  • En återkommande minneskrasch i Bazarr rotorsaksanalyserades i stället för att döljas med en omstartspolicy
Docker ComposeJellyfinImmichIntel QSV / iGPU-passthroughNavidromeSamba
Så fungerar det →
// hemautomation + lokal AI

Smart hem och en lokal röstassistent

Home Assistant styr huset, med en röstassistent där taligenkänning, talsyntes och språkmodell alla körs på min egen hårdvara, plus en medveten uppdelning mot en molnmodell för allt som inte handlar om hemmet.

  • Whisper för tal-till-text, Piper för text-till-tal och Ollama för språkmodellen, allt självhostat och allt ursprungligen bevisat fungera på enbart CPU innan något grafikkort köptes
  • En tydlig integritetsgräns: allt som rör hemmet stannar lokalt, medvetet; öppna frågor går till en separat molnpipeline på ett annat väckningsord
  • Lampor, persienner och rörelsesensorer migrerade till Matter, medan dimmerknapparna fick stanna kvar, eftersom en flytt hade gjort det sämre
Home AssistantOllamaWhisperPiperGroqMatterDocker Compose
Så fungerar det →
// spelserverdrift

Spelserver

En dedikerad Project Zomboid-server för mig och mina vänner, med ett femtiotal mods och helt automatiserad hantering av mods och uppdateringar.

  • Den intressanta begränsningen är att en moduppdatering kan förstöra en pågående sparfil, så automationen måste vara försiktig med när den appliceras i stället för att bara hämta senaste
  • Provisioneras och uppdateras från samma Ansible-repo som allt annat, så det finns ingen handkonfigurerad server som bara jag vet hur man bygger om
AnsibleDockerProject Zomboidsystemd
Så fungerar det →
// nätverk + åtkomst

Nätverk, DNS och fjärråtkomst

Lokal DNS med riktiga hostnamn och nätverksövergripande annonsblockering, en reverse proxy framför varje tjänst, och inga öppna inkommande portar alls. Fjärråtkomst går genom en Cloudflare-tunnel med autentisering framför.

  • Ingenting är port-forwardat. Varje externt nåbar tjänst ligger bakom Cloudflare Tunnel med Cloudflare Access som autentiserar framför
  • AdGuard Home som lokal resolver, vilket ger varje tjänst ett riktigt .lan-hostnamn och blockerar annonser i hela nätverket
  • Självhostade push-notiser, så larmen inte är beroende av att en tredjepartstjänst förblir gratis
AdGuard HomeNginx Proxy ManagerCloudflare TunnelCloudflare Accessntfy
Så fungerar det →
// plattform + GitOps

Deployplattform och övervakning

Push till main är deployen. Ansible för de flesta stackar, GitOps för dem där webhook-snabba omdistributioner är värda en extra rörlig del, valt per stack snarare än dogmatiskt.

  • En självhostad GitHub Actions-runner applicerar repot på värden och containrarna vid varje push; hemligheter ligger krypterade i git med SOPS och age
  • En daglig driftkontroll kör hela playbooken i check-läge mot livemiljön och larmar om något handredigerats utanför pipelinen
  • Arkitekturdiagrammet på repots förstasida regenereras av CI från en redigerbar källa, så det kan inte tyst bli inaktuellt
AnsibleKomodoGitHub ActionsSOPS / ageProxmoxDocker
Så fungerar det →
Erfarenhet

Där jobbet faktiskt händer.

Nio års anställning på produktbolag och i konsultverksamhet. Som konsult är arbetsgivaren den som betalade, men kunden är vad arbetet faktiskt var, så båda finns med.

Frontendutvecklare (praktik)

Plejd AB · 2019 – 2020
  • Arbetade i en professionell kodbas på 100 000+ rader Angular.js/Vue.js hos ett svenskt smarta hem-företag, och byggde interna verktyg som användes av 50+ anställda dagligen. Min första riktiga produktionskodbas, parallellt med studier i frontendutveckling på Medieinstitutet
Kunder och plattformar
Plejd
Smarta hem-hårdvara

Svenskt · börsnoterat

Interna verktyg som användes dagligen av 50+ anställda

Angular.jsVue.jsFigma

Frontendutvecklare

Nordic Retail Group (tidigare Digital People) · Dec 2020 – Jan 2023
  • Ensam frontendutvecklare på Enginio, en Vue.js-plattform för att bygga annonskampanjer och varumärkesaktiveringar, från tidig startup till förvärv
  • Byggde ett återanvändbart Vue.js-komponentbibliotek i Storybook, och ägde frontendarkitektur, verktyg och CI/CD
  • Minskade initial laddningstid från 4,2s till 1,8s genom lazy loading och bundle-optimering
Kunder och plattformar
Enginio

B2B SaaS · annonsering och varumärkesaktivering

Ensam frontendutvecklare: arkitektur, komponentbibliotek, CI/CD

Vue.jsVuexSASSNode.jsExpressMongoDBCypressStorybookFigma

Fullstackutvecklare (konsult)

Nexer AB · Feb 2023 – Mar 2025
  • Ensam utvecklare på en React Native-app för Göteborgs Stadsmission, som kopplar samman givare av överskottsmat med människor i behov runt om i Göteborg
  • Byggde ett internt React-verktyg för PostNord som används för att planera postens leveransrutter i hela Sverige
  • Bidrog till Ineras 1177, den offentliga vårdplattformen (Optimizely + Angular), som en del av ett större utvecklingsteam
  • Samarbetade med backendutvecklare kring REST-API:er och .NET-integrationer, och stöttade juniora utvecklare inom React och TypeScript
Kunder och plattformar
1177 Vårdguiden
Offentlig vårdplattform

Nationell · miljontals användare

Angular-frontend på Optimizely, som del av ett av flera team

PostNord
Postoperatör

Nordisk · rikstäckande logistik

Internt React-verktyg för ruttplanering, i ett större team

Göteborgs Stadsmission
Ideell verksamhet, socialt arbete

Göteborg

React Native-app som kopplar matgivare till människor i behov, som ensam utvecklare

ReactTypeScriptReact NativeOptimizely 11/12SASS.NET CoreC#SQL ServerAzure DevOps

Fullstackutvecklare (konsult)

Dear Friends · Jan 2026 – Jun 2026
  • Byggde och lanserade två React Native-appar med Expo, en för Nordic Wellness och en för premiumvarumärket Grand Fitness, som båda hämtar liveinnehåll och priser från Umbraco-sajten bakom dem
  • Drev båda projekten från start till slut: testning, veckovisa testbyggen till testare via TestFlight och Google Play Console, publika releaser och projektledning
  • Byggde och underhöll Umbraco (.NET)-sajter för flera av byråns kunder, samt löpande WordPress-underhåll
Kunder och plattformar
Nordic Wellness
Gymkedja

Nordens största · 300+ anläggningar

React Native-app (Expo) och Umbraco-sajten bakom den. Ägde hela flödet från testning till publik release

Grand Fitness
Premiumgym

Del av Nordic Wellness

React Native-app (Expo) och Umbraco-sajten bakom den. Ägde hela flödet från testning till publik release

Fred's Food and Coffee
Restaurang och café

Göteborg

Umbraco (.NET)-sajt, byggd och underhållen

IEMS, BabySlides, Doxa Bostad, Hagab
WordPress-underhåll

Fyra byråkunder

Underhåll, uppdatering av beroenden och innehållsarbete

React NativeExpoUmbracoC# / .NETWordPressPHPTypeScript
Nu · Söker nya möjligheter

Kunduppdrag utförda via Nexer AB och Dear Friends. Logotyper och namn tillhör respektive varumärkesinnehavare och visas för att identifiera projekt jag bidragit till, inte som något godkännande.

AI

Hur jag faktiskt arbetar med AI.

Inte en lista på modeller jag hört talas om. Det här är vad jag kör, vad jag valt och varför, vad det kostar, och den enda delen jag ännu inte löst.

Lokalt, på min egen hårdvara

Sju modeller hämtade lokalt via Ollama (generella, kodinriktade och embedding), som körs på mitt eget grafikkort. Innan något av det kollade jag om röstassistenten i hemmet ens behövde ett grafikkort, och det gjorde den inte: tal-till-text går ungefär sex gånger snabbare än realtid på enbart CPU. Efterforskningen kom före inköpet.

Moln, valt per uppgift

Claude, OpenAI, Gemini, DeepSeek, z.AI och Groq, valda utifrån uppgift, kostnad och latens snarare än lojalitet. Det finns en gräns jag inte överskrider för bekvämlighets skull: allt som rör mitt hem stannar på lokala modeller, medvetet. Öppna frågor går till en molnpipeline på ett separat väckningsord.

Agenter som riktiga verktyg

Sju specialbyggda subagenter, medvetet uppdelade i läsande granskare, testkörare och stackspecifika implementerare, plus agentinstruktioner incheckade per repo. En av dem kör en riktig Android-build i en emulator och tittar faktiskt på skärmbilderna, i stället för att lita på att ett steg rapporterade att det gick bra.

I praktiken
45–57s → ~5–6s latensen i röstassistenten, löst genom att skala modellen och prompten rätt, inte genom att köpa hårdvara
768 kandidater en regression i fuzzy-matchningen som jag orsakade, hittade och rullade tillbaka samma dag
402M tokens · $18,90 genom att skicka merparten av agentarbetet till billiga modeller och spara de dyra till det som kräver dem
182 uppgifter · 47 delegerade verklig orkestrering av flera agenter, över kod-, arkitekt- och granskningslägen
7 lokala modeller körs på mitt eget grafikkort, efter att först ha bevisat att CPU-only fungerade
1 kvarstående problem en lokal modell som hittar på i stället för att erkänna osäkerhet: dokumenterat, delvis mildrat, inte löst

Den sista siffran är den jag helst vill få frågor om. En lokal modell som självsäkert hittar på ett svar är ett betydligt mer intressant problem än en som bara är långsam, och jag skriver hellre ner det än låtsas att bygget är färdigt.

Vad jag kör
Lokalt
Ollama
Agenter
Claude CodeRoo CodeClineCodexGemini CLI
Leverantörer
AnthropicOpenAIDeepSeekz.AIGroqOpenRouter
Aktivitet

Bygger fortfarande, de flesta dagar.

Kunduppdrag, egna produkter och öppen källkod, i både publika och privata repon.

1 549 bidrag det senaste året
Visa GitHub-profilen ↗
CV

Vill du ha det på papper?

Hela CV:t, på svenska eller engelska. Webbversionen har samma innehåll, men är lättare att läsa i mobilen och alltid den mest aktuella.

Uppdaterad september 2026 · PDF · 3 sidor

Vill du veta mer?

Om mig-sidan täcker vägen från Kuba till Göteborg och vad jag gör utanför koden, och bloggen går in på hur Cityroam och casa-verde fungerar. Jag söker ett team som bryr sig om teknisk kvalitet och levererar på riktigt. Låter det som ni, hör av er.