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.
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.
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.
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
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
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
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
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
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
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
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
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–6slatensen i röstassistenten, löst genom att skala modellen och prompten rätt, inte genom att köpa hårdvara
768 kandidateren regression i fuzzy-matchningen som jag orsakade, hittade och rullade tillbaka samma dag
402M tokens · $18,90genom att skicka merparten av agentarbetet till billiga modeller och spara de dyra till det som kräver dem
182 uppgifter · 47 delegeradeverklig orkestrering av flera agenter, över kod-, arkitekt- och granskningslägen
7 lokala modellerkörs på mitt eget grafikkort, efter att först ha bevisat att CPU-only fungerade
1 kvarstående problemen 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
Visar senast sparade ögonblicksbild. Livedata är tillfälligt otillgänglig.
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.