<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>MONC</title>
	<atom:link href="http://monc.se/feed/" rel="self" type="application/rss+xml" />
	<link>https://monc.se/</link>
	<description>Allt du vill veta om ny teknik</description>
	<lastBuildDate>Fri, 22 May 2026 06:15:47 +0000</lastBuildDate>
	<language>sv-SE</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://monc.se/wp-content/uploads/2026/05/monc-ikon-150x150.webp</url>
	<title>MONC</title>
	<link>https://monc.se/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Web scraping med strukturerad JSON och hur nya API-typen fungerar</title>
		<link>https://monc.se/kul-med-teknik/web-scraping-strukturerad-json-api/</link>
					<comments>https://monc.se/kul-med-teknik/web-scraping-strukturerad-json-api/#respond</comments>
		
		<dc:creator><![CDATA[David Eriksson]]></dc:creator>
		<pubDate>Fri, 22 May 2026 06:15:47 +0000</pubDate>
				<category><![CDATA[Kul med teknik]]></category>
		<guid isPermaLink="false">https://monc.se/articles/web-scraping-strukturerad-json-api/</guid>

					<description><![CDATA[<p>Lär dig hur nya web scraping-API:er returnerar färdig JSON istället för HTML. Jämför traditionella metoder med LLM-baserad extraktion.</p>
<p>Inlägget <a href="https://monc.se/kul-med-teknik/web-scraping-strukturerad-json-api/">Web scraping med strukturerad JSON och hur nya API-typen fungerar</a> dök först upp på <a href="https://monc.se">MONC</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Vill du skrapa en webbsida och få tillbaka färdig, typad JSON i stället för HTML som du själv måste tolka? Det är precis det som en ny generation av web scraping-API:er försöker lösa. Du definierar ett schema med fältnamn, datatyp och ett exempelvärde. API:et hämtar sidan, extraherar datan och returnerar ett objekt du kan använda direkt.</p>
<p>Det låter banalt. Men det är ett rätt fundamentalt skifte från hur webbskrapning fungerat de senaste tio åren.</p>
<h2>Vad ett traditionellt scraper-API faktiskt gör</h2>
<p>De flesta etablerade tjänsterna löser ett enda problem: att hämta sidan. De roterar proxyer, kör headless-browsers, hanterar Cloudflare och returnerar HTML till dig.</p>
<p>Sen är det ditt jobb.</p>
<p>Du sitter där med en sträng på 300 KB och ska skriva selektorer i BeautifulSoup, Cheerio eller Playwright. När sajten ändrar sin layout, vilket händer ofta, går din parser sönder utan att du märker det förrän datan blir tom eller fel. Du bygger alltså en lagerkaka: API:et hämtar, din kod tolkar, din databas lagrar. Tre ställen där saker kan gå sönder.</p>
<p>Om du är ny på vad ett <a href="https://monc.se/sa-funkar-det/vad-ar-api/">API egentligen är</a> rekommenderar jag att börja med grunderna kring API:er innan du dyker djupare.</p>
<h2>Skiftet från schema till JSON-utdata</h2>
<p>Den nya modellen byter ut HTML-svaret mot strukturerad data direkt. Du skickar något i stil med:</p>
<p>&#8221;`json</p>
<p>{</p>
<p>&#8221;url&#8221;: &#8221;https://exempel.se/produkt/123&#8221;,</p>
<p>&#8221;schema&#8221;: {</p>
<p>&#8221;namn&#8221;: { &#8221;type&#8221;: &#8221;string&#8221;, &#8221;example&#8221;: &#8221;Sneakers&#8221; },</p>
<p>&#8221;pris&#8221;: { &#8221;type&#8221;: &#8221;number&#8221;, &#8221;example&#8221;: 899 },</p>
<p>&#8221;lager&#8221;: { &#8221;type&#8221;: &#8221;boolean&#8221;, &#8221;example&#8221;: true }</p>
<p>}</p>
<p>}</p>
<p>&#8221;`</p>
<p>Tillbaka får du ett rent JSON-objekt med exakt de fälten, redan typade. Ingen parsning. Ingen efterbehandling. Ingen kod som ska underhållas när sajten byter klassnamn på sina prisetiketter.</p>
<p>Under huven används en språkmodell som läser den renderade sidan och plockar ut värdena som matchar schemat. Det är detta som gör att samma anrop fungerar mot en webbshop, en nyhetsartikel eller en jobbannons utan att du behöver skriva ny logik.</p>
<p><strong>Skillnaden märks direkt</strong> när du börjar bygga något i produktion. En integration som tidigare krävde två dagars selektorarbete blir en eftermiddag.</p>
<h2>Varför effektiviteten ofta blir bättre</h2>
<p>Påståenden om &#8221;6-7 gånger effektivare&#8221; än konkurrenterna är värda att granska kritiskt, det beror helt på vad man mäter. Men det finns några reella faktorer som drar ner kostnaden:</p>
<ul>
<li><strong>Färre misslyckade anrop.</strong> När extraktionen sker server-side och valideras mot schemat slipper du anrop som returnerar tom data</li>
<li><strong>Mindre dataöverföring.</strong> JSON med fem fält är hundratals gånger mindre än en full HTML-sida</li>
<li><strong>Inga separata &#8221;credits&#8221; för olika features.</strong> Traditionella tjänster tar ofta 5-75 credits för ett JS-renderat anrop och 1 credit för ett enkelt, det gör prissättningen oförutsägbar</li>
<li><strong>Mindre kod att underhålla.</strong> Den dolda kostnaden i scraping är inte API-avgiften, det är utvecklartid</li>
</ul>
<p>Den sista punkten är den största. Du sparar inte 50 öre per anrop. Du sparar fyra timmar i veckan på att laga sönderbruten parsing.</p>
<h2>Vad du faktiskt kan bygga med det</h2>
<p>Användningsfallen är desamma som tidigare, bara enklare att komma igång med:</p>
<p>Prisbevakning mot konkurrenters webbshoppar. Sammanställning av jobbannonser från flera plattformar. Insamling av öppna data från svenska myndighetssidor där det inte finns något publikt API. Aggregering av nyheter eller fastighetsannonser till en egen tjänst.</p>
<p>Just det sista är intressant. Många svenska sajter saknar fortfarande öppna API:er trots att informationen är publik. Hemnet, Blocket och flera kommunsidor är klassiska exempel där utvecklare i åratal har byggt egna lösningar.</p>
<h2>Det juridiska kring webbskrapning</h2>
<p>Här blir det viktigt att vara nykter. Att skrapa en webbsida är inte automatiskt lagligt bara för att tekniken är smidig.</p>
<p>Datainspektionen (numera Integritetsskyddsmyndigheten) har varit tydlig med att personuppgifter omfattas av GDPR även när de hämtas från publika sidor. Skrapar du namn, e-post eller andra identifierande data utan rättslig grund, då har du ett problem oavsett hur snyggt JSON-svaret ser ut.</p>
<p>Tre saker att kolla innan du skrapar något:</p>
<ol>
<li><strong>Sajtens villkor.</strong> Många förbjuder explicit automatiserad åtkomst</li>
<li><strong>robots.txt.</strong> Inte juridiskt bindande, men ett tydligt signalvärde</li>
<li><strong>Vilken typ av data.</strong> Aggregerad statistik är något helt annat än personuppgifter</li>
</ol>
<p>För rena tekniska data, produktpriser, väderdata, börskurser, är riskerna oftast små. För allt som rör individer: var försiktig.</p>
<h2>När du inte ska använda ett scraper-API</h2>
<p>Det finns en frestelse att lösa allt med ett snyggt nytt verktyg. Gör inte det.</p>
<p>Om sajten du vill hämta data från har ett öppet API, använd det. Det är snabbare, billigare och stabilare. SCB, Trafikverket, Naturvårdsverket och en lång rad andra svenska aktörer publicerar data via vanliga REST-endpoints. Att skrapa deras webbsidor i stället är att göra livet onödigt krångligt för sig själv.</p>
<p>Är det en engångskörning på en handfull sidor? Skriv ett litet Python-script med requests och BeautifulSoup. Du behöver ingen tjänst.</p>
<p>Är volymen riktigt hög och datan komplex? Då börjar <a href="https://monc.se/sa-funkar-det/generativ-ai/">LLM-baserad extraktion</a> kosta, varje anrop drar tokens hos modellen som körs i bakgrunden. För skrapning i miljonklassen kan en handskriven parser fortfarande vara billigare per anrop.</p>
<h2>Vad du bör titta efter när du jämför tjänster</h2>
<p>Om du står inför valet mellan flera leverantörer:</p>
<p><strong>Prissättningsmodellen är viktigare än listpriset.</strong> En tjänst som kostar 0,01 dollar per anrop men tar 50 credits för ett JS-renderat anrop kan i praktiken bli dyrare än en som tar 0,03 dollar flat rate. Räkna på dina faktiska anrop, inte på marknadsföringspriset.</p>
<p><strong>Schemavalidering.</strong> Returneras tomma fält eller felaktiga datatyper utan varning? Det är värre än ett rent fel, du upptäcker problemet först när din databas är full av skräp.</p>
<p><strong>JS-rendering ingår eller inte.</strong> Många moderna sajter laddar innehåll med JavaScript efter att HTML:en levererats. Utan rendering får du en tom sida.</p>
<p><strong>Stealth-funktioner.</strong> Hur tjänsten hanterar Cloudflare, anti-bot-system och CAPTCHA avgör om den faktiskt fungerar mot de sajter du bryr dig om.</p>
<h2>Det här är en del av en större trend</h2>
<p><a href="https://monc.se/sa-funkar-det/ai-gor-kodning-billigare-forandrar-utvecklare/">LLM-driven dataextraktion</a> dyker upp på fler ställen än bara skrapning. Du ser samma mönster i verktyg som omvandlar dokument till strukturerad data, i kundtjänst-bottar som plockar ut intent från fritext, och i hur AI förändrar kodningsarbetet generellt.</p>
<p>Det gemensamma: att låta en modell tolka ostrukturerad input mot en känd struktur är otroligt mycket billigare nu än för två år sedan. Det öppnar för verktyg som inte var ekonomiskt rimliga tidigare.</p>
<p>Web scraping är bara ett av många områden som påverkas. Men det är ett där förändringen är konkret nog att du kan testa själv på en eftermiddag, och se direkt om det förändrar hur du bygger.</p>
<p>Inlägget <a href="https://monc.se/kul-med-teknik/web-scraping-strukturerad-json-api/">Web scraping med strukturerad JSON och hur nya API-typen fungerar</a> dök först upp på <a href="https://monc.se">MONC</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://monc.se/kul-med-teknik/web-scraping-strukturerad-json-api/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Semble möjliggör effektiv kodsökning för AI-agenter med 98% färre tokens än grep</title>
		<link>https://monc.se/sa-funkar-det/semble-ai-agenter-tokenkostnad/</link>
					<comments>https://monc.se/sa-funkar-det/semble-ai-agenter-tokenkostnad/#respond</comments>
		
		<dc:creator><![CDATA[David Eriksson]]></dc:creator>
		<pubDate>Fri, 22 May 2026 06:05:00 +0000</pubDate>
				<category><![CDATA[Så funkar det]]></category>
		<guid isPermaLink="false">https://monc.se/articles/semble-ai-agenter-tokenkostnad/</guid>

					<description><![CDATA[<p>Semble löser AI-agenters dyra kodsökning med 98% färre tokens än grep. Open source-verktyg för effektiv kodnavigering utan GPU-krav.</p>
<p>Inlägget <a href="https://monc.se/sa-funkar-det/semble-ai-agenter-tokenkostnad/">Semble möjliggör effektiv kodsökning för AI-agenter med 98% färre tokens än grep</a> dök först upp på <a href="https://monc.se">MONC</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>När en AI-agent som Claude Code letar efter kod i ett stort projekt och inte hittar det den söker, faller den ofta tillbaka på `grep`. Sen läser den hela filer. Sen startar den underagenter. Resultatet blir att tusentals tokens går åt, ofta utan att rätt kodrad ens dyker upp. Det är problemet som <strong>Semble</strong> löser, och siffrorna är värda att titta närmare på: 98% färre tokens jämfört med grep+read, samtidigt som träffkvaliteten ligger på 99% av en mycket större transformer-modell.</p>
<p>För dig som följer utvecklingen kring AI-assistenter för programmering är det här intressant av en enkel anledning. Tokens kostar pengar. Och kontextfönstret tar slut.</p>
<h2>Vad Semble egentligen gör</h2>
<p>Semble är ett open source-verktyg byggt för att ge kodningsagenter ett bättre sätt att hitta relevant kod. I stället för att skanna filsystemet rad för rad med `grep` och sen mata in stora mängder text i språkmodellen, bygger Semble ett semantiskt index över kodbasen och returnerar bara de bitar som faktiskt är relevanta.</p>
<p>Tekniken kombinerar tre saker:</p>
<ul>
<li><strong>Statiska embeddings</strong> från en liten modell (potion-code-16M) som körs direkt på CPU</li>
<li><strong>BM25</strong>, en klassisk algoritm för textsökning som väger ord efter hur ovanliga de är</li>
<li><strong>Reciprocal Rank Fusion</strong> som slår ihop resultaten från båda metoderna, med extra omrankning baserad på kod-specifika signaler</li>
</ul>
<p>Det låter krångligt, men poängen är enkel. Vanliga embedding-modeller behöver ett grafikkort och tar tid att köra. Semble klarar sig utan både GPU och API-nycklar.</p>
<h2>Varför token-kostnaden är ett verkligt problem</h2>
<p>Den som använt Claude Code, Cursor eller liknande agenter på ett större projekt har märkt det. Agenten letar. Den läser. Den letar igen. Snabbt har den dragit 50 000 tokens bara för att hitta en funktion som ligger tre mappar bort.</p>
<p>På månadsbasis blir det dyrt. På företagsnivå blir det väldigt dyrt.</p>
<p>Vill du läsa mer om hur AI-assistenterna fungerar i praktiken har vi skrivit om <a href="https://monc.se/sa-funkar-det/github-copilot/">GitHub Copilot</a> och <a href="https://monc.se/sa-funkar-det/ai-gor-kodning-billigare-forandrar-utvecklare/">hur AI gör kodning billigare</a>. Semble pekar mot en specifik del av den ekvationen: själva <em>sökningen</em> i kodbasen, som idag är onödigt slösaktig.</p>
<h2>Siffrorna från benchmarken</h2>
<p>Utvecklarna bakom Semble har testat verktyget mot ett eget benchmark med cirka 1 250 fråge/dokument-par över 63 repon och 19 språk. Resultaten:</p>
<table>
<thead>
<tr>
<th>Aspekt</th>
<th>Semble vs grep+read</th>
</tr>
</thead>
<tbody>
<tr>
<td>Tokenanvändning</td>
<td>98% lägre</td>
</tr>
<tr>
<td>Hastighet</td>
<td>~200x snabbare än 137M-transformer</td>
</tr>
<tr>
<td>Träffkvalitet</td>
<td>99% av en stor transformer-modell</td>
</tr>
<tr>
<td>Hårdvara</td>
<td>CPU räcker</td>
</tr>
</tbody>
</table>
<p>Jämförelsen görs mot <a href="https://huggingface.co/nomic-ai/CodeRankEmbed">CodeRankEmbed</a>, en betydligt större kodtränad modell på 137 miljoner parametrar. Att en modell på 16 miljoner parametrar når 99% av den prestandan, samtidigt som den körs hundratals gånger snabbare, är ovanligt.</p>
<p>Att ta siffrorna med en nypa salt är klokt. Det är utvecklarnas eget benchmark. Men idén är solid och resultatet stämmer med vad andra statiska embedding-modeller visat: för retrieval-uppgifter behöver du inte den största modellen.</p>
<h3>Vad betyder &#8221;statiska embeddings&#8221;?</h3>
<p>En vanlig embedding-modell läser hela texten varje gång och beräknar en vektor utifrån sammanhanget. Det är dyrt. En statisk embedding-modell tränas så att varje ord eller token får en förbestämd vektor som inte ändras vid körning. Då räcker det med en uppslagning plus lite efterbearbetning.</p>
<p>Skillnaden i hastighet märks direkt. Skillnaden i kvalitet är mindre än man tror, åtminstone för kodsökning där exakta ord och symbolnamn väger tungt.</p>
<h2>Installation och hur du kommer igång</h2>
<p>Semble finns på <a href="https://pypi.org/project/semble/">pypi.org</a> och installeras enklast med pip eller <a href="https://docs.astral.sh/uv/getting-started/installation/">uv</a>. För svenska utvecklare som redan har en Python-miljö igång handlar det om en enda kommandorad.</p>
<p>Verktyget indexerar din kodbas lokalt. Inga API-nycklar. Ingen data som skickas till en extern tjänst. Det är värt att lyfta fram i en tid när många AI-verktyg kräver att du laddar upp din kod till någon annans server.</p>
<p>För utvecklare som vill följa projektets utveckling och teststatus finns kodbasen kontinuerligt testad via app.codecov.io.</p>
<h2>Vem har nytta av det här?</h2>
<p>Semble är inte tänkt att ersätta din IDE:s sökruta. Det är byggt för agenter. Men det öppnar för några konkreta användningsfall:</p>
<p><strong>Om du bygger egna AI-agenter</strong> som ska navigera kodbaser blir Semble en naturlig komponent. Det är öppen källkod, körs lokalt och är snabbt nog för att integreras i en interaktiv loop.</p>
<p><strong>Om du använder Claude Code eller liknande verktyg</strong> professionellt och märker att tokenkostnaden skenar, kan ett MCP-baserat verktyg framför Semble vara en utväg.</p>
<p><strong>Om du är nyfiken på hur retrieval för kod fungerar</strong> är det ett pedagogiskt projekt. Koden är begränsad nog att läsa igenom på en eftermiddag, och kombinationen BM25 + embeddings + RRF är ett standardmönster som dyker upp överallt i moderna sökmotorer.</p>
<p>Att skriva sina egna agenter har blivit förvånansvärt enkelt det senaste året. Vi gick igenom det i artikeln om <a href="https://monc.se/sa-funkar-det/vibe-coding/">en kodningsagent på 400 rader shell</a>, Semble är pusselbiten som hanterar &#8221;hur hittar agenten rätt fil att titta i&#8221;.</p>
<h2>Den större trenden handlar om små modeller och smart användning</h2>
<p>Det är lätt att tänka att AI-utveckling bara handlar om större modeller. Mer parametrar, fler GPU:er, högre kostnad. Semble pekar åt andra hållet. En 16-miljoners-parametrar-modell som körs på en vanlig laptop och slår betydligt större modeller på den specifika uppgift den är byggd för.</p>
<p>Det är samma utveckling vi sett på andra håll inom AI. Specialiserade små modeller som löser ett avgränsat problem bättre än de stora generalisterna. För svenska utvecklare som vill experimentera utan att bränna molnbudget är det goda nyheter.</p>
<p>Om generativ AI som koncept är nytt för dig har vi en bredare genomgång i <a href="https://monc.se/sa-funkar-det/generativ-ai/">Generativ AI: vad det är och varför så många pratar om det</a>. Där hittar du grunderna som gör att resten av AI-världen blir lättare att navigera.</p>
<p>Det jag tar med mig från Semble är inte själva verktyget, utan principen. Token-effektivitet kommer bli en av de viktigaste mätstickorna för AI-verktyg de närmaste åren. Inte för att tokens är dyra i sig, utan för att kontextfönstret är en ändlig resurs. Den som slösar fyller det med skräp. Den som är effektiv lämnar plats åt det som faktiskt löser problemet.</p>
<p>Inlägget <a href="https://monc.se/sa-funkar-det/semble-ai-agenter-tokenkostnad/">Semble möjliggör effektiv kodsökning för AI-agenter med 98% färre tokens än grep</a> dök först upp på <a href="https://monc.se">MONC</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://monc.se/sa-funkar-det/semble-ai-agenter-tokenkostnad/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>AI och statistik bakom moderna sportodds: så räknar maskinerna ut sannolikheten</title>
		<link>https://monc.se/sa-funkar-det/ai-sportodds/</link>
					<comments>https://monc.se/sa-funkar-det/ai-sportodds/#respond</comments>
		
		<dc:creator><![CDATA[David Eriksson]]></dc:creator>
		<pubDate>Thu, 07 May 2026 23:28:33 +0000</pubDate>
				<category><![CDATA[Så funkar det]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[Algoritmer]]></category>
		<category><![CDATA[Datavetenskap]]></category>
		<category><![CDATA[Live Odds]]></category>
		<category><![CDATA[Maskininlärning]]></category>
		<category><![CDATA[Oddssättning]]></category>
		<category><![CDATA[Sportbetting]]></category>
		<category><![CDATA[Sportteknologi]]></category>
		<guid isPermaLink="false">https://monc.se/?p=3364</guid>

					<description><![CDATA[<p>Att en match mellan två fotbollslag ska sättas till oddset 1.85 mot 4.20 låter enkelt. Men bakom siffrorna finns idag</p>
<p>Inlägget <a href="https://monc.se/sa-funkar-det/ai-sportodds/">AI och statistik bakom moderna sportodds: så räknar maskinerna ut sannolikheten</a> dök först upp på <a href="https://monc.se">MONC</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><!-- WP-titel: AI och statistik bakom moderna sportodds: så räknar maskinerna ut sannolikheten SEO-titel: AI och sportodds: så fungerar oddssättning med maskininlärning Meta-description: Så använder spelbolagen AI och maskininlärning för att sätta sportodds. Datakällor, modeller, live odds och vad det betyder för dig som spelare. Slug: ai-och-sportodds Faktagranskat-mot: WSC Sports, Oddin.gg, ParlaySavant, Spelinspektionen, branschpatent USPTO Taggar: AI, Maskininlärning, Sportbetting, Oddssättning, Datavetenskap, Algoritmer, Statistik, Sportteknologi Keywords (ILJ): AI,maskininlärning,sportodds,oddssättning,sportbetting,Monte Carlo,algoritm,decimalodds,live odds --></p>
<p>Att en match mellan två fotbollslag ska sättas till oddset 1.85 mot 4.20 låter enkelt. Men bakom siffrorna finns idag en hel teknikstack med maskininlärning, realtidsdataflöden och statistiska modeller som tillsammans behandlar tiotusentals datapunkter per sekund. På bara några år har oddssättning gått från att vara hantverk där erfarna analytiker satte priser efter magkänsla, till en data driven process där neurala nätverk korrigerar oddsen flera gånger per minut under en match.</p>
<p>Här går vi igenom hur tekniken faktiskt fungerar, vilka datakällor som används och varför live odds har blivit ett av de mest beräkningsintensiva problemen inom konsumentteknik.</p>
<h2>Från manuell oddssättning till datadrivna modeller</h2>
<p>Traditionellt baserades odds på säsongssnitt, formkurvor och en analytikers bedömning. Den modellen har inte försvunnit, men den har försetts med ett tjockt lager av automation. Moderna oddsmotorer drar in matchstatistik, spelarbiometri, väderdata, skaderapporter, vilodagar mellan matcher, resvägar och till och med röststämningen i sociala medier inför en match.</p>
<p><a href="https://wsc-sports.com/blog/industry-insights/ai-sports-predictions-for-2026-why-traditional-methods-are-now-obsolete/">Enligt branschanalyser från WSC Sports</a> klarar moderna maskininlärningsmodeller idag att förutsäga matchvinnaren i stora ligor med 75 till 85 procents träffsäkerhet, jämfört med 50 till 60 procent för traditionella statistiska metoder. Ett amerikanskt patent från oddsleverantören som ligger bakom flera av de stora sportböckerna beskriver hur två eller flera oddsformler körs parallellt och korreleras mot historiska utfall i en så kallad cross-databas innan ett slutgiltigt odds skickas vidare till användaren.</p>
<p>Det är viktigt att skilja på två saker som ofta blandas ihop. Det ena är spelbolagets prismodell, som är tekniken vi beskriver här. Det andra är spelarens egen modell, alltså AI-verktyg som tipstjänster använder för att försöka hitta värdespel. De delar metoder men har motsatta mål: spelbolaget vill att oddset ska vara så nära den verkliga sannolikheten som möjligt med ett påslag, spelaren letar efter situationer där oddset avviker från den verkliga sannolikheten.</p>
<h2>Vilka datakällor matas in i modellerna?</h2>
<p>Mängden data som strömmar in i en modern oddsmotor är betydligt större än vad många tror. För en enskild fotbollsmatch i högsta serien handlar det inte sällan om över 50 distinkta variabler. En grov uppdelning ser ut så här:</p>
<ul>
<li><strong>Strukturell data</strong> som ligaplacering, head-to-head-historik, hemma- och bortastatistik, antal vilodagar och resväg sedan föregående match.</li>
<li><strong>Spelardata</strong> som individuell formkurva, skadestatus, antal speltimmar de senaste veckorna, biometri från träningsdata och positionsdata från GPS-västar.</li>
<li><strong>Realtidsdata under match</strong> som boll- och spelarpositioner, hörnor, gula kort, tempo, expected goals och passningsstatistik.</li>
<li><strong>Externa faktorer</strong> som väder, vindstyrka, banunderlag, publikstorlek och tidszonsskillnader för bortalaget.</li>
<li><strong>Marknadsdata</strong> som linjerörelser hos andra spelbolag, volymer på olika utfall och stora insatser som triggar omräkning.</li>
</ul>
<h3>Datakällorna jämförda</h3>
<p>Olika datatyper bidrar med olika mycket till modellens prediktiva styrka. Tabellen nedan visar en förenklad bild av hur tunga olika kategorier brukar väga i typiska modeller för fotboll och hockey.</p>
<table>
<thead>
<tr>
<th>Datakategori</th>
<th>Uppdateringsfrekvens</th>
<th>Relativ vikt i modellen</th>
<th>Exempel på källa</th>
</tr>
</thead>
<tbody>
<tr>
<td>Historisk matchstatistik</td>
<td>Per match</td>
<td>Hög</td>
<td>Officiella ligadatabaser</td>
</tr>
<tr>
<td>Spelarbiometri och form</td>
<td>Daglig</td>
<td>Hög</td>
<td>Klubbar, GPS-leverantörer</td>
</tr>
<tr>
<td>Skaderapporter</td>
<td>Daglig</td>
<td>Mycket hög</td>
<td>Klubbar, sportmedier</td>
</tr>
<tr>
<td>Väder och underlag</td>
<td>Per timme</td>
<td>Medel</td>
<td>SMHI, motsvarande</td>
</tr>
<tr>
<td>Realtidsdata under match</td>
<td>Sekund för sekund</td>
<td>Mycket hög för live odds</td>
<td>Sportradar, Genius Sports</td>
</tr>
<tr>
<td>Marknadsrörelser</td>
<td>Sekund för sekund</td>
<td>Hög</td>
<td>Andra spelbolag</td>
</tr>
<tr>
<td>Sociala medier och sentiment</td>
<td>Kontinuerlig</td>
<td>Låg till medel</td>
<td>API-flöden från X, Reddit</td>
</tr>
</tbody>
</table>
<h2>Vilka modeller används för att räkna ut själva oddset</h2>
<p>Det finns ingen enskild modell som dominerar branschen, utan oddsmotorer kombinerar i regel flera olika tekniker. De vanligaste familjerna är:</p>
<ul>
<li><strong>Logistisk regression och Poisson-modeller</strong> är det klassiska statistiska skiktet och används fortfarande för många bas-uträkningar, särskilt i fotboll där Poisson-fördelningen passar bra för antal mål.</li>
<li><strong>Gradient boosting-modeller</strong> som XGBoost och LightGBM är arbetshästar i branschen för att vikta in dussintals variabler och hitta icke-linjära samband.</li>
<li><strong>Neurala nätverk och djupinlärning</strong> används främst för komplexa, sekventiella mönster som hur en match utvecklas över tid eller för att modellera enskilda spelares påverkan.</li>
<li><strong>Monte Carlo-simulationer</strong> körs för att simulera tusentals till miljontals tänkbara matchutfall och därigenom uppskatta sannolikheter för specifika händelser, exempelvis att en match slutar 2-1 eller att en viss spelare gör mål.</li>
<li><strong>Förstärkningsinlärning</strong> börjar dyka upp i live-oddsmotorer där modellen kontinuerligt belönas eller bestraffas baserat på hur bra prognoserna stämmer mot verkliga utfall.</li>
</ul>
<h3>Hur sannolikhet översätts till odds</h3>
<p>När modellen har räknat ut sannolikheten för ett visst utfall är steget till ett offentliggjort odds inte mer komplicerat än lite gymnasiematematik. Ett decimalodds är teoretiskt 1 dividerat med sannolikheten.</p>
<p>Om en modell uppskattar att hemmalaget vinner med 55 procents sannolikhet blir det &#8221;rättvisa&#8221; oddset 1.82. Spelbolaget lägger sedan på en marginal, ofta kallad overround eller juice, vilket innebär att summan av implicerade sannolikheter på alla utfall överstiger 100 procent. Det är just denna marginal som är spelbolagets statistiska fördel över tid.</p>
<p>Ett räkneexempel för en fotbollsmatch med tre möjliga utfall ser ut så här:</p>
<table>
<thead>
<tr>
<th>Utfall</th>
<th>Modellens sannolikhet</th>
<th>Rättvist odds</th>
<th>Erbjudet odds (med 5 % marginal)</th>
</tr>
</thead>
<tbody>
<tr>
<td>Hemmaseger</td>
<td>50 %</td>
<td>2.00</td>
<td>1.90</td>
</tr>
<tr>
<td>Oavgjort</td>
<td>28 %</td>
<td>3.57</td>
<td>3.40</td>
</tr>
<tr>
<td>Bortaseger</td>
<td>22 %</td>
<td>4.55</td>
<td>4.33</td>
</tr>
</tbody>
</table>
<h2>Live odds är där maskinerna verkligen briljerar</h2>
<p>Det är i live-betting som AI-aspekten blir mest synlig för spelaren. När en match pågår behöver oddsen räknas om bokstavligen flera gånger per minut. En hörna, ett byte, en skadad spelare eller bara att tempot går ner kan ändra sannolikheterna för slutresultatet på ett ögonblick. För att hantera detta krävs en realtidsinfrastruktur med extremt låg latens. Det handlar i praktiken om tre saker som måste fungera parallellt:</p>
<ul>
<li><strong>Datainsamling i realtid</strong>: positionsdata, händelsedata och statistik strömmas in från arenan via leverantörer som Sportradar och Genius Sports, ofta via dedikerade observatörer på plats kombinerat med kamerabaserad spårning.</li>
<li><strong>Modellinferens på millisekundnivå</strong>: tränade modeller måste kunna producera ett nytt sannolikhetsestimat för varje marknad inom någon eller några tiotals millisekunder efter att ny data anlänt.</li>
<li><strong>Riskhantering</strong>: varje insats som läggs påverkar exponeringen mot ett utfall, vilket kan motivera att flytta oddsen även om den underliggande sannolikheten inte ändrats.</li>
</ul>
<p>För många erfarna spelare är det här som det blir intressant att titta på olika spelbolags utbud. Sajter med stort matchutbud och bred täckning, exempelvis <a href="https://www.bethard.com/sv/casino">Bethard casino</a> och liknande svensklicensierade plattformar, behöver underhålla tusentals samtidiga marknader på allt från Allsvenskan till MMA, vilket bara är möjligt med tung automatisering.</p>
<h2>Begrepp som spelaren själv möter i tekniken</h2>
<p>Det är inte bara spelbolagen som använder matematiska begrepp. Som spelare stöter du på samma underliggande koncept om du läser någon bettingguide. De viktigaste:</p>
<ul>
<li><strong>Implicerad sannolikhet</strong> är det som oddset säger om hur troligt utfallet är. För decimalodds 2.50 motsvarar det 40 procent.</li>
<li><strong>Expected value (EV)</strong> är det förväntade ekonomiska utfallet av ett spel räknat över oändligt många upprepningar. Positivt EV betyder att oddset är högre än den verkliga sannolikheten.</li>
<li><strong>Varians</strong> är hur mycket utfallen avviker från medelvärdet på kort sikt. Ett spel kan ha positivt EV men hög varians, vilket innebär stora svängningar.</li>
<li><strong>Closing line value</strong> är skillnaden mellan det odds du fick och det odds som gällde när matchen startade. Branschen ser detta som den bästa enskilda indikatorn på långsiktig spelskicklighet.</li>
</ul>
<h2>Var står svensk reglering i förhållande till AI-modellerna?</h2>
<p>Svenska spelinspektionen kräver att alla licensierade aktörer kan redovisa hur deras spel fungerar och att rättvisa kan verifieras. För digitala casinospel sker detta genom RNG-certifieringar, men för sportbetting finns inga formella krav på att en oddsmodell ska vara förklarbar. Däremot finns det en växande diskussion, särskilt i USA, om reglering av AI-driven oddssättning där delstaten Illinois utrett krav på transparens i algoritmerna.</p>
<p>På EU-nivå kan AI-förordningen i framtiden komma att klassa vissa typer av personifierad oddssättning som högrisksystem, men i nuläget är området i hög grad oreglerat på modellnivå. För spelaren betyder det att skillnaden mellan olika spelbolags odds inte bara handlar om marginal, utan också om vilken modell som ligger bakom. För information om hur svensk spellicens fungerar i övrigt finns en bra översikt hos <a href="https://www.spelinspektionen.se/">Spelinspektionen</a>.</p>
<h2>Vad detta betyder för dig som följer sport</h2>
<p>Sportbetting är inte längre en bransch där erfaren magkänsla räcker, vare sig hos spelbolagen eller hos seriösa spelare. Den som sätter oddset har idag en datadriven modell som processar mer information på en sekund än en mänsklig analytiker hinner med på en vecka. För den som spelar för nöjes skull spelar detta mindre roll, men det är värt att vara medveten om att marginalerna som spelbolaget arbetar med är just statistiskt designade för att ge huset en fördel över tid.</p>
<p>För den som vill förstå sin sport på djupet är det däremot en spännande utveckling, eftersom mycket av tekniken bakom oddsmodellerna också används av klubbar och förbund för att analysera spelarprestationer, taktiska upplägg och rekrytering.</p>
<div>
<h2>Vanliga frågor om AI och sportodds</h2>
<h3>Hur exakt kan AI förutse en sportmatch?</h3>
<p>Branschanalyser pekar på 75 till 85 procents träffsäkerhet för matchvinnare i de största ligorna, jämfört med 50 till 60 procent för traditionella statistiska metoder. För enskilda detaljutfall som exakt slutresultat är träffsäkerheten betydligt lägre.</p>
<h3>Använder svenska spelbolag AI för att sätta odds?</h3>
<p>Ja, alla större spelbolag på den svenska marknaden använder någon form av algoritmisk oddssättning. Hur avancerade modellerna är skiljer sig dock mellan aktörerna, och många mindre bolag licensierar färdiga oddsfeeds från specialiserade leverantörer.</p>
<h3>Kan jag som spelare slå AI-modellerna?</h3>
<p>Det är teoretiskt möjligt men svårt. Den vanligaste vägen är att specialisera sig på en mindre liga eller marknad där spelbolagets modell har färre datapunkter att arbeta med, och leta efter avvikelser mellan deras odds och din egen bedömning.</p>
<h3>Vad är skillnaden mellan fasta odds och flytande odds?</h3>
<p>Fasta odds sätts av spelbolaget innan matchen och justeras endast när ny information dyker upp. Flytande odds, vanligast vid totospel och tipsspel, ändras beroende på hur mycket pengar som satsas på respektive utfall.</p>
<h3>Vad är Monte Carlo-simulering?</h3>
<p>En metod där datorn simulerar samma matchscenario tusentals till miljontals gånger med små slumpvariationer i indata för att uppskatta sannolikheten för olika utfall. Tekniken används både inom oddssättning och i många andra områden av tillämpad statistik.</p>
</div>
<p><script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "Hur exakt kan AI förutse en sportmatch?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Branschanalyser pekar på 75 till 85 procents träffsäkerhet för matchvinnare i de största ligorna, jämfört med 50 till 60 procent för traditionella statistiska metoder. För enskilda detaljutfall som exakt slutresultat är träffsäkerheten betydligt lägre."
      }
    },
    {
      "@type": "Question",
      "name": "Använder svenska spelbolag AI för att sätta odds?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Ja, alla större spelbolag på den svenska marknaden använder någon form av algoritmisk oddssättning. Hur avancerade modellerna är skiljer sig dock mellan aktörerna, och många mindre bolag licensierar färdiga oddsfeeds från specialiserade leverantörer."
      }
    },
    {
      "@type": "Question",
      "name": "Kan jag som spelare slå AI-modellerna?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Det är teoretiskt möjligt men svårt. Den vanligaste vägen är att specialisera sig på en mindre liga eller marknad där spelbolagets modell har färre datapunkter att arbeta med, och leta efter avvikelser mellan deras odds och din egen bedömning."
      }
    },
    {
      "@type": "Question",
      "name": "Vad är skillnaden mellan fasta odds och flytande odds?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Fasta odds sätts av spelbolaget innan matchen och justeras endast när ny information dyker upp. Flytande odds, vanligast vid totospel och tipsspel, ändras beroende på hur mycket pengar som satsas på respektive utfall."
      }
    },
    {
      "@type": "Question",
      "name": "Vad är Monte Carlo-simulering?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "En metod där datorn simulerar samma matchscenario tusentals till miljontals gånger med små slumpvariationer i indata för att uppskatta sannolikheten för olika utfall. Tekniken används både inom oddssättning och i många andra områden av tillämpad statistik."
      }
    }
  ]
}
</script></p>
<p>Inlägget <a href="https://monc.se/sa-funkar-det/ai-sportodds/">AI och statistik bakom moderna sportodds: så räknar maskinerna ut sannolikheten</a> dök först upp på <a href="https://monc.se">MONC</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://monc.se/sa-funkar-det/ai-sportodds/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Hur AI gör kodning billigare och förändrar utvecklarnas arbetsuppgifter</title>
		<link>https://monc.se/sa-funkar-det/ai-gor-kodning-billigare-forandrar-utvecklare/</link>
					<comments>https://monc.se/sa-funkar-det/ai-gor-kodning-billigare-forandrar-utvecklare/#respond</comments>
		
		<dc:creator><![CDATA[David Eriksson]]></dc:creator>
		<pubDate>Wed, 06 May 2026 11:32:48 +0000</pubDate>
				<category><![CDATA[Så funkar det]]></category>
		<guid isPermaLink="false">https://monc.se/articles/ai-gor-kodning-billigare-forandrar-utvecklare/</guid>

					<description><![CDATA[<p>Kod kostar nästan ingenting att producera längre. Lär dig hur agentisk kodning förändrar utvecklaryrket och vad som blir värdefullt nu.</p>
<p>Inlägget <a href="https://monc.se/sa-funkar-det/ai-gor-kodning-billigare-forandrar-utvecklare/">Hur AI gör kodning billigare och förändrar utvecklarnas arbetsuppgifter</a> dök först upp på <a href="https://monc.se">MONC</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Kod kostar nästan ingenting att producera längre. En AI-agent kan skriva tusen rader på en kafferast. Det betyder inte att utvecklaryrket är dött, det betyder att tyngdpunkten flyttas. Det som blir värdefullt är att veta <em>vad</em> som ska byggas, hur det ska testas, och vilka rader som faktiskt ska överleva nästa pull request.</p>
<p>Det här är den verkliga lärdomen från det senaste årets explosion av agentiska kodverktyg som Claude Code, Cursor och GitHub Copilot Workspace: själva skrivandet är inte längre flaskhalsen. Granskningen är det. Specifikationen är det. Arkitekturen är det.</p>
<h2>Vad agentisk kodning egentligen är</h2>
<p>En agentisk kodningsagent är inte autocomplete. Den får en uppgift, planerar steg, kör kommandon i terminalen, läser filer, skriver kod, kör tester och rättar sig själv när något går fel. Den jobbar i loopar tills uppgiften är klar, eller tills den kör fast.</p>
<p>Skillnaden mot tidigare AI-assistenter är att agenten <em>agerar</em>. Den frågar inte &#8221;vill du att jag skriver den här funktionen?&#8221;. Den skriver den, kör den, läser felmeddelandet och försöker igen.</p>
<p>Det förändrar arbetsflödet i grunden. Du sitter inte längre och knattrar. Du beskriver, övervakar och bedömer.</p>
<h2>Tio principer som visat sig hålla</h2>
<p>Utvecklare som arbetat seriöst med agentiska verktyg det senaste året landar i ungefär samma slutsatser. Här är de som återkommer mest:</p>
<p><strong>1. Skriv specifikationen, inte koden.</strong> Den största hävstången ligger i att formulera problemet exakt. En vag prompt ger vag kod. En tydlig spec med inputs, outputs, edge cases och acceptanskriterier ger användbar kod.</p>
<p><strong>2. Behandla agenten som en junior med oändlig energi.</strong> Den jobbar snabbt, glömmer kontext, och behöver tydliga ramar. Lämna inte arkitekturbeslut åt den.</p>
<p><strong>3. Testa innan, inte efter.</strong> Skriv testerna själv eller låt agenten skriva dem först, sen koden. Annars skriver agenten kod som passar testerna den själv hittar på.</p>
<p><strong>4. Små commits, ofta.</strong> När kod är billig är det också billigt att slänga. Commit-historiken är din säkerhetslina när agenten gör något oväntat.</p>
<p><strong>5. Granskning är inte valfritt.</strong> Det är arbetet. Att läsa varje rad agenten producerar är inte en flaskhals, det är där värdet skapas.</p>
<p><strong>6. Verktyg framför kontext.</strong> Ge agenten tillgång till linters, typkontroller, tester och dokumentation. Den blir bättre av att kunna verifiera, inte av att få mer instruktioner.</p>
<p><strong>7. Kortare loopar.</strong> En agent som kör tester på 3 sekunder hittar fel snabbare än en som väntar 90 sekunder. Investera i tooling.</p>
<p><strong>8. Acceptera att kod är slit-och-släng.</strong> Prototyper behöver inte vara vackra. De behöver bevisa eller motbevisa en idé.</p>
<p><strong>9. Granska säkerhet manuellt.</strong> Agenter är fortfarande dåliga på att tänka som angripare. SQL-injektioner, autentiseringsfel och läckta hemligheter glider igenom.</p>
<p><strong>10. Behåll smaken.</strong> Det som skiljer god kod från fungerande kod är fortfarande en mänsklig bedömning. Konsistens, läsbarhet, namngivning. Outsourca inte det.</p>
<h2>Det som faktiskt förändras i vardagen</h2>
<p>Tänk dig att du ska bygga en enkel API-endpoint som hämtar användardata. För några år sedan skulle du läsa dokumentation, skriva ruttdefinitionen, koppla in databasen, hantera fel och skriva tester. Kanske två timmars jobb.</p>
<p>Idag säger du till agenten: &#8221;Bygg `/api/users/:id` med JSON-respons, 404 vid okänd användare, integrationstest mot testdatabasen.&#8221; Den är klar på fyra minuter.</p>
<p>Men då börjar ditt jobb. Returnerar den rätt fält? Läcker den känslig data? Är felhantering konsekvent med resten av kodbasen? Använder den samma autentiseringsmönster som andra endpoints? Det är frågor agenten inte ställer själv, och som blir uppenbara först vid läsning.</p>
<p>För nybörjare betyder det här något viktigt. Om du inte förstår vad en API faktiskt är och hur HTTP-statuskoder fungerar, kan du inte granska. Och kan du inte granska, blir du beroende av att agentens output råkar vara rätt.</p>
<h2>Det blir billigare att prova, dyrare att vara slarvig</h2>
<p>En sak som ändras är ekonomin för experiment. Att bygga en prototyp kostade tidigare timmar. Nu kostar det minuter. Det betyder att tröskeln för att testa en idé sjunker dramatiskt, vilket är bra.</p>
<p>Samtidigt: kostnaden för att producera <em>dålig</em> kod sjunker också. Och dålig kod som körs i produktion drar med sig samma problem som alltid. Säkerhetshål, prestandaproblem, underhållsskuld. Bara att nu finns det mycket mer av den.</p>
<blockquote><p>Den som inte kan läsa kod kan inte heller granska den. Och granskning är jobbet nu.</p></blockquote>
<h2>Vad du bör lära dig nu</h2>
<p>Om du är ny i utveckling är frestelsen att hoppa direkt till AI-verktygen. Det är förståeligt. Men det leder till en konstig position: du producerar kod du inte förstår, för problem du inte fullt definierat.</p>
<p>Bättre väg: lär dig grunderna ordentligt först. HTML, CSS, JavaScript, en backend-stack, hur en webbläsare faktiskt fungerar, hur localhost används under utveckling. Sen lägger du på AI-lagret. Då blir agenten en accelerator, inte en krycka.</p>
<p>Det är samma princip som med vibe coding, du kan komma långt på känsla och AI-stöd, men du tar dig inte hela vägen utan grundförståelse.</p>
<h2>Granskning som färdighet</h2>
<p>Det här är den verkliga kompetensförskjutningen: kodgranskning blir den viktigaste tekniska färdigheten.</p>
<p>Vad innebär det praktiskt? Att kunna läsa en diff och se inte bara vad koden gör, utan vad den <em>inte</em> gör. Hittar agenten edge cases? Hanterar den fel konsekvent? Följer den projektets konventioner? Introducerar den dolda beroenden?</p>
<p>Det är arbete som kräver erfarenhet, smak och tålamod. Tre saker AI fortfarande är dålig på.</p>
<p>Verktyg som GitHub Copilot och dess agentiska efterföljare är bra på syntax, mönster och boilerplate. De är sämre på att fråga &#8221;borde vi verkligen bygga det här?&#8221;. Den frågan är din.</p>
<h2>Arkitektur blir viktigare, inte mindre viktigt</h2>
<p>En vanlig missuppfattning är att AI gör arkitektur överflödigt. &#8221;Om kod är billig, bygg bara om när det inte funkar.&#8221;</p>
<p>Det stämmer för enskilda funktioner. Det stämmer inte för system. Datamodeller, API-kontrakt, integrationspunkter, sånt som många komponenter beror på, är fortfarande dyrt att ändra. Inte för att skriva om koden, utan för att migrera data och uppdatera klienter.</p>
<p>Agenter är duktiga på att skriva kod inom en given arkitektur. De är dåliga på att välja arkitektur. Det betyder att utvecklare som kan tänka i systemtermer, vilka komponenter, vilka gränssnitt, vilka antaganden, blir mer värdefulla, inte mindre.</p>
<h2>Säkerhet är fortfarande mänsklig</h2>
<p>En sak som är värd att upprepa: agenter är systematiskt dåliga på säkerhetstänk. De skriver gärna kod som fungerar för ärliga användare och faller sönder vid första angreppet.</p>
<p>Vanliga problem som glider igenom:</p>
<ul>
<li>Användarinput som inte saneras innan databasfrågor</li>
<li>Autentisering som är på men inte korrekt på alla endpoints</li>
<li>Hemligheter som hamnar i loggar eller felmeddelanden</li>
<li>Race conditions som bara märks under belastning</li>
</ul>
<p>Här hjälper det att förstå hur kryptografiska grunder som hash-funktioner och kodning fungerar, och att veta var känslig data faktiskt rör sig genom systemet.</p>
<h2>Den nya arbetsdagen</h2>
<p>Så hur ser en utvecklardag ut när kod är billig?</p>
<p>Mer tid på problem, mindre på syntax. Mer läsande, mindre skrivande. Fler korta cykler där agenten producerar något, du granskar, justerar instruktionen och kör igen. Mer tid att fundera på <em>om</em> funktionen ens ska finnas.</p>
<p>Det låter mindre av kodning och mer av produktarbete. Och det är precis vad det är.</p>
<p>Den utvecklare som klarar sig bäst i det här landskapet är inte den som skriver mest kod. Det är den som vet vilken kod som är värd att skriva, och har smaken att se när agenten gjorde något smart, och när den gjorde något som ser smart ut men inte är det.</p>
<p>Skillnaden är subtil. Den syns inte i diff:en. Men den syns i koden som lever vidare om två år.</p>
<p>Inlägget <a href="https://monc.se/sa-funkar-det/ai-gor-kodning-billigare-forandrar-utvecklare/">Hur AI gör kodning billigare och förändrar utvecklarnas arbetsuppgifter</a> dök först upp på <a href="https://monc.se">MONC</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://monc.se/sa-funkar-det/ai-gor-kodning-billigare-forandrar-utvecklare/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>En kodningsagent på 400 rader shell och varför det är intressant</title>
		<link>https://monc.se/sa-funkar-det/kodningsagent-400-rader-shell/</link>
					<comments>https://monc.se/sa-funkar-det/kodningsagent-400-rader-shell/#respond</comments>
		
		<dc:creator><![CDATA[David Eriksson]]></dc:creator>
		<pubDate>Sat, 02 May 2026 15:57:25 +0000</pubDate>
				<category><![CDATA[Så funkar det]]></category>
		<guid isPermaLink="false">https://monc.se/articles/kodningsagent-400-rader-shell/</guid>

					<description><![CDATA[<p>Pu.sh visar att en AI-kodningsagent inte behöver tunga ramverk. Bara shell, curl och awk räcker för att prata med Claude och OpenAI.</p>
<p>Inlägget <a href="https://monc.se/sa-funkar-det/kodningsagent-400-rader-shell/">En kodningsagent på 400 rader shell och varför det är intressant</a> dök först upp på <a href="https://monc.se">MONC</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Någon byggde nyligen en komplett AI-kodningsagent i 400 rader shell-script. Inga ramverk, inga npm-paket, ingen Python. Bara `sh`, `curl` och `awk`. Den pratar med både Anthropics Claude och OpenAI:s modeller, har sju verktyg inbyggda och fungerar på i princip vilken Unix-maskin som helst.</p>
<p>Projektet heter Pu.sh och dök upp på Hacker News. Det är intressant av en specifik anledning: det visar hur långt du kan komma när du vägrar lägga till beroenden. Och det säger något om hur AI-kodning faktiskt fungerar i praktiken.</p>
<h2>Vad är en kodningsagent egentligen?</h2>
<p>En kodningsagent är ett program som låter en språkmodell skriva och köra kod på din dator. Den läser filer, ändrar dem, kör kommandon i terminalen och rapporterar tillbaka. Tänk <a href="https://monc.se/sa-funkar-det/github-copilot/">GitHub Copilot</a> fast med rättigheter att faktiskt göra saker, inte bara föreslå.</p>
<p>Skillnaden mellan en chattbot och en agent ligger i verktygen. Chattboten svarar med text. Agenten anropar funktioner: `read_file`, `write_file`, `bash`, `grep`. Modellen bestämmer själv när och hur. Resultatet skickas tillbaka som en del av samtalet, och loopen fortsätter tills uppgiften är klar.</p>
<p>Det är därför Pu.sh har sju verktyg: bash, read, write, edit, grep, find, ls. Det är minimibesättningen för att en agent ska kunna jobba i ett kodprojekt. Mer än så är trevligt men inte nödvändigt.</p>
<h2>Varför 400 rader shell är imponerande</h2>
<p>De flesta AI-agenter idag byggs i Python eller TypeScript med tunga ramverk. LangChain. LlamaIndex. AutoGen. De drar in hundratals beroenden och kräver en specifik miljö för att ens starta.</p>
<p>Pu.sh går åt motsatt håll. Regeln var: inga nya beroenden, under 500 rader kod. Bara verktyg som finns på varje Unix-system sedan 80-talet.</p>
<p>Det betyder att utvecklaren tvingades göra obekväma saker. JSON-parsning i `awk` till exempel, ett språk från 1977 som aldrig var tänkt för det. OpenAI:s tool-loop med reasoning-objekt som förs vidare mellan turer, implementerad utan ett enda externt bibliotek.</p>
<p>Det är teknisk envishet snarare än effektivitet. Men poängen är portabiliteten: scriptet kör på en gammal server, en Raspberry Pi, en WSL-installation eller en macOS-laptop. Inget setup-helvete.</p>
<h2>AI som skrev koden den körs på</h2>
<p>Här blir det filosofiskt intressant. Skaparen är öppen med att hen inte själv skrev det mesta av koden. Claude och Codex skrev awk-delarna. Systemprompten är modifierad från andra projekt. Hen erkänner att hen inte ens kan läsa stora delar av sin egen kodbas.</p>
<p>Det här är <a href="https://monc.se/sa-funkar-det/vibe-coding/">vibe coding</a> i renaste form: du beskriver vad du vill ha, AI:n skriver det, du testar att det fungerar. Du går vidare. Förståelsen kommer i andra hand, om alls.</p>
<p>För en del programmerare är det här skrämmande. För andra är det framtiden. Det enda säkra är att det fungerar, Pu.sh kör 90 tester utan API-anrop och har features som auto-komprimering av kontext och checkpoint-funktion.</p>
<h2>Vad du kan lära dig av projektet</h2>
<p>Tre saker är värda att ta med sig, oavsett om du själv vill bygga något liknande:</p>
<p><strong>Beroenden är skuld.</strong> Varje paket du installerar är något som kan gå sönder, behöva uppdateras eller försvinna. Pu.sh visar att du kommer förvånansvärt långt med bara systemets grundverktyg. Det gäller även <a href="https://monc.se/sa-funkar-det/vad-ar-localhost/">vanlig webbutveckling</a>, du behöver sällan så många npm-paket som du tror.</p>
<p><strong>API:er är limmet.</strong> Hela agenten är i grunden ett program som skickar HTTP-anrop till OpenAI och Anthropic, tolkar svaret, kör verktyg lokalt, och skickar tillbaka resultatet. Om du förstår <a href="https://monc.se/sa-funkar-det/vad-ar-api/">hur API:er fungerar</a> förstår du också hur 95 % av AI-verktygen är byggda. Det är ingen magi.</p>
<p><strong>Begränsningar tvingar fram kreativitet.</strong> Regeln &#8221;max 500 rader, inga nya beroenden&#8221; är vad som gjorde projektet intressant. Utan begränsningen hade det blivit ännu en Python-agent bland tusen.</p>
<h2>Begränsningar du inte ska ignorera</h2>
<p>Pu.sh har medvetna luckor. Ingen TUI, ingen streaming, inget bildstöd, ingen OAuth, fungerar inte på Windows. Skaparen själv listar &#8221;dignity&#8221; som något som inte ingår, ett halvt skämt, halvt allvarligt.</p>
<p>Det är ärligt. En 400-rads shell-agent är inte rätt verktyg för ett produktionsteam som behöver granskning, säkerhet och stöd för flera användare. Det är ett verktyg för någon som vill experimentera, lära sig hur agenter fungerar, eller köra något snabbt på en server utan installation.</p>
<p>För svenska utvecklare som vill in i AI-kodning är <a href="https://monc.se/sa-funkar-det/github-copilot/">GitHub Copilot</a> fortfarande den enklaste vägen. Pu.sh är intressant som studieobjekt, inte som dagligt verktyg.</p>
<h2>Vad det säger om läget i AI-utveckling</h2>
<p>För några år sedan hade ett sådant här projekt krävt ett team. Idag bygger en person det på fritiden, med hjälp av just de modeller agenten anropar. Det är en konstig loop: AI hjälper människor bygga verktyg som låter AI bygga mer.</p>
<p>Tröskeln för att skapa egna AI-verktyg har sjunkit dramatiskt. Du behöver inte längre djup kunskap i maskininlärning. Du behöver förstå API-anrop, kunna läsa dokumentation, och ha tålamod att felsöka när modellen genererar trasig kod.</p>
<p>Det här är varför <a href="https://monc.se/sa-funkar-det/generativ-ai/">generativ AI</a> förändrar utveckling så snabbt. Inte för att modellerna är perfekta, det är de inte, utan för att de sänker kostnaden för experiment till nästan noll. En idé som hade tagit en månad tar nu en helg.</p>
<p>Pu.sh kommer förmodligen aldrig bli ett storskaligt projekt. Det behöver inte vara det. Det är ett bevis på koncept: att en kodningsagent inte kräver ett ekosystem av paket. Att shell, curl och awk är tillräckligt mäktiga för att prata med moderna språkmodeller. Och att den största begränsningen i att bygga AI-verktyg år 2026 är fantasin, inte tekniken.</p>
<p>Inlägget <a href="https://monc.se/sa-funkar-det/kodningsagent-400-rader-shell/">En kodningsagent på 400 rader shell och varför det är intressant</a> dök först upp på <a href="https://monc.se">MONC</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://monc.se/sa-funkar-det/kodningsagent-400-rader-shell/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Varför svenska låntagare betalar mer än de behöver</title>
		<link>https://monc.se/ekonomi/svenska-lantagare-betalar-mer/</link>
					<comments>https://monc.se/ekonomi/svenska-lantagare-betalar-mer/#respond</comments>
		
		<dc:creator><![CDATA[David Eriksson]]></dc:creator>
		<pubDate>Wed, 15 Apr 2026 06:37:17 +0000</pubDate>
				<category><![CDATA[Ekonomi]]></category>
		<guid isPermaLink="false">https://monc.se/articles/svenska-lantagare-betalar-mer/</guid>

					<description><![CDATA[<p>Det finns en paradox i den svenska konsumentens förhållande till pengar. Vi jämför priser när vi handlar elektronik, vi läser</p>
<p>Inlägget <a href="https://monc.se/ekonomi/svenska-lantagare-betalar-mer/">Varför svenska låntagare betalar mer än de behöver</a> dök först upp på <a href="https://monc.se">MONC</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Det finns en paradox i den svenska konsumentens förhållande till pengar. Vi jämför priser när vi handlar elektronik, vi läser recensioner innan vi bokar hotell, och vi byter elbolag när prisskillnaderna blir tillräckligt stora. Men när det gäller lån — den enskilt största finansiella transaktionen utöver bostadsköpet — visar undersökningar att en betydande andel av svenska låntagare accepterar det första erbjudande de får utan att jämföra med andra kreditgivare. Det är ett beteende som kostar hushåll tusentals kronor varje år och som har strukturella förklaringar som går djupare än ren bekvämlighet eller lathet. Orsaken handlar delvis om hur den finansiella marknaden historiskt har presenterats för konsumenter, och delvis om psykologiska mekanismer som gör att vi behandlar låneärenden annorlunda än andra ekonomiska beslut trots att de ekonomiska konsekvenserna är avsevärt större.</p>
<h2><a id="_gd275estbmnl"></a>Status quo-bias och banklojalitetens pris</h2>
<p>Konsumentverket har i sina granskningar av kreditmarknaden upprepade gånger konstaterat att konsumenter har svårt att tolka och jämföra kreditvillkor, trots att lagstiftningen kräver att kreditgivare redovisar effektiv ränta och total kreditkostnad i sin marknadsföring. <a href="https://www.konsumentverket.se/for-foretag/regler-per-omrade/kreditregler/">Konsumentverkets information om lån och krediter</a> visar att problemet inte är brist på data utan brist på jämförbarhet i det ögonblick konsumenten faktiskt fattar sitt beslut. En bank presenterar sitt erbjudande i en kontext där kunden redan befinner sig i en etablerad relation med banken — det finns ett inarbetat förtroende, en digital inloggning, en historik av tidigare transaktioner som skapar en känsla av tillhörighet. Att i det läget bryta sig loss och söka alternativ kräver en aktiv ansträngning som de flesta väljer bort, inte av ointresse utan av friktion. Det är vad beteendeekonomin kallar status quo-bias, och dess effekt på kreditmarknaden är kvantifierbar: låntagare som jämför erbjudanden från flera kreditgivare betalar i genomsnitt en lägre effektiv ränta än de som stannar hos sin befintliga bank.</p>
<p>Den digitala utvecklingen har dock skapat verktyg som reducerar just den friktionen och gör det möjligt för konsumenter att agera mer rationellt. Jämförelsetjänster för privatlån fungerar som en motkraft till status quo-bias genom att flytta jämförelseprocessen från konsumenten till plattformen. Istället för att besöka fem olika banker och initiera separata kreditprövningar behöver låntagaren fylla i en enda ansökan, och algoritmerna gör det övriga arbetet med att matcha kreditprofilen mot tillgängliga erbjudanden. Det eliminerar inte den psykologiska tröskeln helt — att påbörja en låneansökan kräver fortfarande ett aktivt beslut och en viss ansträngning — men det minskar den dramatiskt. Resultatet syns i den ökade konkurrensen på privatlanemarknaden, där kreditgivare som tidigare kunde räkna med lojala kunder nu tvingas erbjuda villkor som tål jämförelse i en digital miljö där transparensen är omedelbar och obönhörlig.</p>
<h2><a id="_4iam9ziqeca4"></a>Ränteskillnader som blir konkreta</h2>
<p>Att <a href="https://www.zmarta.se/lana-pengar/privatlan">låna pengar</a> via en jämförelseplattform förändrar inte bara den praktiska processen utan påverkar också det kognitiva ramverket kring själva beslutet. När erbjudanden presenteras sida vid sida blir ränteskillnader konkreta på ett sätt de inte är när man sitter i ett bankkontor och diskuterar med en rådgivare som representerar en enda kreditgivare. En skillnad på två procentenheter i effektiv ränta kan framstå som marginell i ett enskilt samtal men blir omedelbart tydlig och påtaglig i en jämförelsetabell. På ett lån om hundratusen kronor med fem års löptid motsvarar den skillnaden flera tusen kronor i faktisk kostnad, pengar som i praktiken omfördelas från låntagarens hushållsekonomi till bankens marginal utan att låntagaren nödvändigtvis är medveten om det.</p>
<p>Privatlanets ställning i den svenska kreditmarknaden har förändrats markant under det senaste decenniet. Från att ha varit ett relativt standardiserat produkterbjudande med små variationer mellan bankerna har det blivit ett konkurrensutsatt segment där fintech-bolag, nischbanker och traditionella storbanker alla tävlar om samma kundsegment med allt mer differentierade erbjudanden. Den konkurrensen har pressat ned marginalerna och gjort det möjligt för konsumenter med god kreditvärdighet att erhålla villkor som för tio år sedan var förbehållna premiumkunder med omfattande bankengagemang. Samtidigt har den ökade tillgängligheten skapat nya utmaningar — inte minst risken att konsumenter tar på sig mer skuld än de klarar av just för att det blivit friktionsfritt att ansöka.</p>
<h2><a id="_60ms3gbkawdw"></a>Aktivt val mot passivitetens kostnad</h2>
<p>Balansgången mellan tillgänglighet och ansvarsfullt lånande är kreditmarknadens centrala spänning, och den spänningen blir allt tydligare ju enklare det blir att jämföra och ansöka om krediter. Regleringen sätter ramarna, tillsynsmyndigheterna övervakar efterlevnaden, och jämförelsetjänsterna skapar den transparens som gör att marknadskrafterna faktiskt fungerar till konsumentens fördel. Det som återstår är den enskilda låntagarens förmåga att använda dessa verktyg på ett klokt sätt — att inte bara acceptera det första erbjudandet utan att faktiskt jämföra, att förstå skillnaden mellan nominell och effektiv ränta, och att räkna på den totala kostnaden snarare än att bara titta på månadsbeloppet. Det är ingen komplicerad insikt men det är en insikt som skiljer konsumenter som betalar marknadspris för sina lån från dem som betalar ett påslag för sin egen passivitet.</p>
<p>Inlägget <a href="https://monc.se/ekonomi/svenska-lantagare-betalar-mer/">Varför svenska låntagare betalar mer än de behöver</a> dök först upp på <a href="https://monc.se">MONC</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://monc.se/ekonomi/svenska-lantagare-betalar-mer/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Säkerhetsbranschen formar om synen på fastighetsskydd</title>
		<link>https://monc.se/foretag/sakeringsbranschen-formar-fastighetsskydd/</link>
					<comments>https://monc.se/foretag/sakeringsbranschen-formar-fastighetsskydd/#respond</comments>
		
		<dc:creator><![CDATA[David Eriksson]]></dc:creator>
		<pubDate>Wed, 15 Apr 2026 06:22:25 +0000</pubDate>
				<category><![CDATA[Företag]]></category>
		<guid isPermaLink="false">https://monc.se/articles/sakeringsbranschen-formar-fastighetsskydd/</guid>

					<description><![CDATA[<p>Sommaren 2025 rapporterade Svensk Handel att stöldrelaterade förluster i detaljhandeln uppgick till 7,2 miljarder kronor, en ökning med nio procent</p>
<p>Inlägget <a href="https://monc.se/foretag/sakeringsbranschen-formar-fastighetsskydd/">Säkerhetsbranschen formar om synen på fastighetsskydd</a> dök först upp på <a href="https://monc.se">MONC</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><body></p>
<p><span>Sommaren 2025 rapporterade Svensk Handel att stöldrelaterade förluster i detaljhandeln uppgick till 7,2 miljarder kronor, en ökning med nio procent jämfört med året innan. Siffran satte ljus på något som fastighetsägare och näringsidkare redan kände på: att traditionella larm och låsanordningar inte längre räcker som enda skyddslinje. Svaret från säkerhetsbranschen har varit en gradvis övergång mot kombinerade tjänster där fysisk närvaro, digital övervakning och förebyggande riskanalys samverkar i en helhet. Den utvecklingen märks tydligast bland företag som hanterar större fastighetsbestånd, där varje störning innebär direkta ekonomiska konsekvenser och där skyddslösningar måste fungera dygnet runt, oavsett årstid eller personaltillgång. Samtidigt har kraven från försäkringsgivare och myndigheter skärpts, vilket tvingar aktörer i branschen att dokumentera sina insatser med större precision än tidigare. Resultatet är ett landskap där passiva säkerhetssystem snabbt tappar mark till förmån för aktiva, samordnade skyddstjänster.</span></p>
<p><span></span></p>
<p><span>Polismyndighetens statistik för 2025 visar att anmälda inbrott i verksamhetslokaler minskade med elva procent i kommuner där fastighetsägare anlitade kombinerad rondering och kameraövervakning. Enligt en rapport från </span><span><a href="https://www.stoldskyddsforeningen.se/foretag/">Stöldskyddsföreningen</a></span><span> spelar den preventiva effekten av synlig bevakningstjänst en avgörande roll, särskilt i områden med hög genomströmning av människor. Rapporten pekar på att bevakningsinsatser som inkluderar regelbunden patrullering minskar risken för upprepade incidenter med upp till fyrtio procent. Det handlar inte enbart om att reagera när något hänt, utan om att skapa en miljö där risken för brott uppfattas som för hög av potentiella förövare. Den insikten har fått allt fler kommuner att ställa krav på aktiva säkerhetsplaner vid upphandling av lokaler för offentlig verksamhet, och liknande krav börjar synas även i privata hyresavtal för kontors- och lagerfastigheter där hyresvärdar konkurrerar om kvalitetsmedvetna företagshyresgäster.</span></p>
<h2><span>Väktarens förändrade roll</span></h2>
<p><span>Teknikskiftet har gjort att väktarens roll förändrats i grunden. Moderna bevakningsuppdrag innebär ofta att operatörer övervakar kameraflöden i realtid och koordinerar med fältpersonal som kan vara på plats inom minuter vid larm eller avvikelse. Sensorbaserade system registrerar rörelsemönster, temperaturförändringar och ljud som avviker från det normala, och flaggar automatiskt händelser som kräver mänsklig bedömning. Den typen av hybridlösningar har blivit standard hos säkerhetsföretag som erbjuder </span><span><a href="https://sesec.se/bevakning">bevakning</a></span><span> till kommersiella fastigheter, och efterfrågan ökar särskilt från logistikföretag och handelsplatser som opererar utanför kontorstid. Resultatet är en bransch som rör sig bort från timbaserad fakturering mot resultatbaserade avtal där uppdragsgivarens faktiska skyddsnivå står i centrum för avtalsvillkoren snarare än antalet väktartimmar på fakturan.</span></p>
<h2><span>Ekonomiska incitament och försäkringsrabatter</span></h2>
<p><span>Kostnadsfrågan driver också förändringen på ett påtagligt sätt. En fastighetsägare som tidigare anlitade stationär bevakning dygnet runt kan med dagens teknik uppnå motsvarande eller bättre skydd till en bråkdel av kostnaden genom att kombinera rondering med fjärrövervakning och automatiserad incidenthantering. Försäkringsbolagen har börjat anpassa sina villkor efter det: flera svenska försäkringsgivare erbjuder sedan 2025 premierabatter på upp till femton procent för fastigheter som kan dokumentera en aktiv bevakningsplan med certifierad leverantör. Det skapar ett ekonomiskt incitament som accelererar övergången från passiva till aktiva säkerhetslösningar. Samtidigt ställer det nya krav på säkerhetsföretagen, som måste kunna visa mätbara resultat snarare än bara fysisk närvaro, och som förväntas leverera transparenta rapporter till uppdragsgivaren efter varje genomfört skift eller hanterad incident.</span></p>
<p><span></span></p>
<p><span>En faktor som ofta förbises är bevakningens påverkan på hyresgästers trivsel och deras vilja att förnya kontrakt vid periodens slut. Fastighetskonsultföretaget Newsec konstaterade i sin marknadsrapport för fjärde kvartalet 2025 att kontorshyresgäster rankar trygghet som den tredje viktigaste faktorn vid val av lokal, efter läge och hyresnivå. I handelscentrum är effekten ännu tydligare: butiker i anläggningar med synlig och välorganiserad säkerhetstjänst rapporterar genomsnittligt tolv procent högre omsättning per kvadratmeter jämfört med jämförbara lokaler utan dedikerad skyddsinsats. Siffran speglar att kunder stannar längre och handlar mer när de upplever miljön som trygg, och den har fått flera centrumanläggningar att omförhandla sina säkerhetsavtal med tyngdpunkt på synlighet och tillgänglighet snarare än enbart snabb larmrespons vid utlöst larm.</span></p>
<h2><span>Integration med fastighetsdriften</span></h2>
<p><span>Framöver kommer säkerhetsbranschen sannolikt att integreras ännu djupare i den dagliga fastighetsdriften. Gränsen mellan fastighetsförvaltning och säkerhetsförvaltning suddas ut när samma digitala plattformar hanterar energiförbrukning, tillträdeskontroll och incidentrapportering i ett gemensamt gränssnitt. Proptech-bolag som kombinerar fastighetsdata med säkerhetsanalys växer snabbt på den nordiska marknaden, och flera har redan slutit partnerskap med etablerade bevakningsföretag för att erbjuda integrerade tjänstepaket som täcker hela kedjan från riskbedömning till operativ insats. För fastighetsägare som vill ligga steget före handlar det inte om att välja mellan teknik och mänsklig kompetens, utan om att hitta rätt kombination där bägge förstärker varandra och skapar en skyddsnivå som varken tekniken eller personalen hade kunnat uppnå på egen hand. De aktörer som lyckas med den balansen kommer att definiera vad professionellt fastighetsskydd innebär under resten av detta decennium, och sannolikt höja ribban för vad både hyresgäster och försäkringsgivare förväntar sig som grundläggande standard.</span></p>
<p><span></span></p>
<p></body></p>
<p>Inlägget <a href="https://monc.se/foretag/sakeringsbranschen-formar-fastighetsskydd/">Säkerhetsbranschen formar om synen på fastighetsskydd</a> dök först upp på <a href="https://monc.se">MONC</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://monc.se/foretag/sakeringsbranschen-formar-fastighetsskydd/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>CSS-knappar: skapa snygga och responsiva knappar med ren CSS</title>
		<link>https://monc.se/kul-med-teknik/css-knappar/</link>
					<comments>https://monc.se/kul-med-teknik/css-knappar/#respond</comments>
		
		<dc:creator><![CDATA[David Eriksson]]></dc:creator>
		<pubDate>Sat, 04 Apr 2026 13:45:16 +0000</pubDate>
				<category><![CDATA[Kul med teknik]]></category>
		<guid isPermaLink="false">https://monc.se/?p=3115</guid>

					<description><![CDATA[<p>En knapp kan verka enkel — tills du faktiskt ska bygga en som ser bra ut, fungerar på alla skärmstorlekar</p>
<p>Inlägget <a href="https://monc.se/kul-med-teknik/css-knappar/">CSS-knappar: skapa snygga och responsiva knappar med ren CSS</a> dök först upp på <a href="https://monc.se">MONC</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>En knapp kan verka enkel — tills du faktiskt ska bygga en som ser bra ut, fungerar på alla skärmstorlekar och inte skämmer ut sig för skärmläsare. CSS-knappar är en av de första sakerna de flesta webbutvecklare stylar själva, men det är förvånansvärt få som gör det riktigt ordentligt. Och visst, det finns ramverk som ger dig färdiga komponenter, men att förstå hur knappar i CSS fungerar under huven gör dig snabbare när du behöver anpassa, felsöka eller skapa något som inte finns i Bootstrap eller Tailwind.</p>
<p>Här går vi igenom hur du skapar CSS-knappar som håller måttet i produktion — från grundstyling och hover-effekter till responsivitet och tillgänglighet.</p>
<h2>Grundläggande styling av CSS-knappar</h2>
<p>Vi börjar med grunderna. En vanlig <code>&lt;button&gt;</code> utan styling ser rätt trist ut i de flesta webbläsare — grå, platt och med en <code>font-size</code> som varierar beroende på system. Att nollställa det och bygga upp stilen från grunden ger dig full kontroll.</p>
<p>Här är en solid bas att utgå ifrån:</p>
<pre><code class="language-css">.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 0.75em 1.5em;
  font-size: 1rem;
  font-family: inherit;
  font-weight: 600;
  line-height: 1;
  color: #fff;
  background-color: #2563eb;
  border: 2px solid transparent;
  border-radius: 6px;
  cursor: pointer;
  text-decoration: none;
  transition: background-color 0.2s ease, transform 0.15s ease;
}
</code></pre>
<p>Några saker att notera. <code>font-family: inherit</code> ser till att knappen använder samma typsnitt som resten av sidan, vilket inte är standard i alla webbläsare. <code>padding</code> i <code>em</code> istället för <code>px</code> gör att knappens inre avstånd skalas med textstorleken, något som blir viktigt senare när vi pratar om responsivitet. Och <code>inline-flex</code> i kombination med <code>align-items: center</code> ger dig perfekt centrering av text och eventuella ikoner utan att behöva fuska med <code>line-height</code>.</p>
<p>Det är också värt att sätta <code>border: 2px solid transparent</code> redan från start. Det förhindrar att knappen &#8221;hoppar&#8221; i storlek när du senare lägger till en synlig border vid till exempel focus-states.</p>
<h2>Hover-effekter som knappar i CSS förtjänar</h2>
<p>En knapp utan hover-effekt känns död. Användaren behöver visuell feedback för att förstå att elementet är interaktivt. Men det gäller att inte överdriva — subtila förändringar slår flashiga animationer i nästan alla gränssnitt.</p>
<pre><code class="language-css">.btn:hover {
  background-color: #1d4ed8;
  transform: translateY(-1px);
}

.btn:active {
  background-color: #1e40af;
  transform: translateY(0);
}
</code></pre>
<p>Den lätta förflyttningen uppåt med <code>translateY(-1px)</code> vid hover ger en känsla av att knappen &#8221;lyfts&#8221;, och att den studsar tillbaka till normalläget vid <code>active</code> ger en taktil klickkänsla. Det är en klassisk teknik som fungerar bra utan att kännas överdådig.</p>
<p>Vill du skapa en variant med en mer distinkt stil fungerar en ghost-knapp bra som komplement. Den har transparent bakgrund och en synlig ram:</p>
<pre><code class="language-css">.btn--ghost {
  background-color: transparent;
  color: #2563eb;
  border-color: #2563eb;
}

.btn--ghost:hover {
  background-color: #2563eb;
  color: #fff;
}
</code></pre>
<p>Ghost-knappar är praktiska för sekundära actions i ett gränssnitt — de signalerar att det finns ett alternativ utan att konkurrera med primärknappen visuellt. Du kan också experimentera med <code>box-shadow</code> för att ge knappar mer djup vid hover, till exempel <code>box-shadow: 0 4px 12px rgba(37, 99, 235, 0.3)</code>. Det ger en subtil glöd-effekt som fungerar bra på mörka bakgrunder utan att ta fokus från innehållet.</p>
<h2>Responsiva knappar med CSS</h2>
<p>Knappar som ser perfekta ut på en desktop kan bli obrukbara på en mobil. Tummar är inte lika precisa som muspekare, och en knapp som är 32 pixlar hög kan vara direkt frustrerande att träffa på en telefon.</p>
<p>Apples riktlinjer rekommenderar minst 44×44 punkter som tryckyta, och det är en rimlig tumregel. Genom att använda <code>em</code>-baserad padding och <code>clamp()</code> för fontstorleken skapar du knappar som anpassar sig smidigt utan att du behöver skriva mediaqueries för varje breakpoint:</p>
<pre><code class="language-css">.btn-responsive {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 0.75em 1.75em;
  font-size: clamp(0.95rem, 0.8rem + 0.5vw, 1.15rem);
  font-family: inherit;
  font-weight: 600;
  line-height: 1;
  color: #fff;
  background-color: #2563eb;
  border: 2px solid transparent;
  border-radius: 6px;
  cursor: pointer;
  transition: background-color 0.2s ease, transform 0.15s ease;
  min-height: 44px;
}

.btn-responsive:hover {
  background-color: #1d4ed8;
  transform: translateY(-1px);
}

.btn-responsive:active {
  transform: translateY(0);
}
</code></pre>
<p><code>clamp(0.95rem, 0.8rem + 0.5vw, 1.15rem)</code> sätter en nedre gräns på <code>0.95rem</code> och en övre på <code>1.15rem</code>, med flytande skalning däremellan baserat på viewport-bredden. Eftersom <code>padding</code> är satt i <code>em</code> växer hela knappen proportionellt med texten. <code>min-height: 44px</code> fungerar som en sista garanti att tryckytan aldrig blir för liten.</p>
<p>Behöver du knappar som fyller hela bredden i ett mobilt läge räcker det med en enkel mediaquery:</p>
<pre><code class="language-css">@media (max-width: 640px) {
  .btn-responsive {
    width: 100%;
  }
}
</code></pre>
<h3>Responsiva knappar i CSS-grid och flexbox</h3>
<p>Om knapparna sitter i en grupp, till exempel en rad med &#8221;Spara&#8221; och &#8221;Avbryt&#8221;, är <code>flex-wrap</code> en enkel lösning:</p>
<pre><code class="language-css">.btn-group {
  display: flex;
  flex-wrap: wrap;
  gap: 0.75rem;
}
</code></pre>
<p>På stora skärmar ligger knapparna i rad. Blir det trångt radbryts de automatiskt. Inga mediaqueries behövs.</p>
<h2>Tillgänglighet: focus-states och CSS button-beteende</h2>
<p>Det här är det moment som många hoppar över, och det märks. Tangentbordsanvändare, personer med motoriska funktionsnedsättningar och alla som navigerar utan mus förlitar sig på tydliga focus-states för att veta var de befinner sig.</p>
<p>Webbläsarnas inbyggda focus-ring ser olika ut överallt och tas ofta bort med <code>outline: none</code> — utan att ersättas med något bättre. Gör inte det. Använd istället <code>:focus-visible</code>, som bara aktiveras vid tangentbordsnavigering och låter musklickare vara ifred:</p>
<pre><code class="language-css">.btn:focus-visible {
  outline: 3px solid #93c5fd;
  outline-offset: 2px;
}
</code></pre>
<p><code>outline-offset</code> skapar ett litet mellanrum mellan knappen och ringen, vilket gör den mer synlig och snyggare. Och eftersom vi inte rör <code>outline</code> vid <code>:focus</code> utan specifikt <code>:focus-visible</code> slipper du den blå ringen vid vanliga musklick — vilket var anledningen till att folk tog bort den från början.</p>
<p>Se också till att kontrastförhållandet mellan knappens text och bakgrund klarar WCAG AA, det vill säga minst 4.5:1 för normal text. Vit text på <code>#2563eb</code> klarar det med marginal, men om du väljer ljusare nyanser är det värt att dubbelkolla med ett verktyg som WebAIM Contrast Checker. Det gäller inte bara textfärgen — även hover-states och focus-ringen ska vara tillräckligt synliga mot bakgrunden de renderas på.</p>
<h3>Glöm inte disabled-state</h3>
<p>En knapp som inte går att klicka ska se ut som att den inte går att klicka:</p>
<pre><code class="language-css">.btn:disabled {
  opacity: 0.5;
  cursor: not-allowed;
  pointer-events: none;
}
</code></pre>
<p><code>pointer-events: none</code> förhindrar alla musinteraktioner, och <code>opacity: 0.5</code> ger en tydlig visuell signal. Kombinationen gör att hover-effekterna inte aktiveras av misstag.</p>
<h2>Sammanfattning</h2>
<p>CSS-knappar kräver mer omsorg än de flesta ger dem. Här är det viktigaste att ta med sig:</p>
<p>Använd <code>em</code>-baserade mått för padding och <code>clamp()</code> för fontstorlek — det ger dig responsiva knappar utan onödiga mediaqueries. Lägg alltid till hover- och active-states med subtila övergångar. Implementera <code>:focus-visible</code> med en tydlig outline för tangentbordsnavigering, det är inte valfritt. Sätt <code>min-height: 44px</code> för att garantera tillräcklig tryckyta på touchenheter. Och slutligen: börja med en transparent border redan i grundstilen, så slipper du layoutskift när du lägger till synliga ramar i andra states.</p>
<p>Med de här teknikerna på plats har du CSS-knappar som ser professionella ut, fungerar överallt och inte stänger ute någon. Det är ren CSS — inga ramverk behövs. Och nästa gång du ser en <code>&lt;button&gt;</code> utan hover-state eller focus-ring vet du exakt vad som saknas.</p>
<p>Inlägget <a href="https://monc.se/kul-med-teknik/css-knappar/">CSS-knappar: skapa snygga och responsiva knappar med ren CSS</a> dök först upp på <a href="https://monc.se">MONC</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://monc.se/kul-med-teknik/css-knappar/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Vad är localhost – och hur använder du det för webbutveckling?</title>
		<link>https://monc.se/sa-funkar-det/vad-ar-localhost/</link>
					<comments>https://monc.se/sa-funkar-det/vad-ar-localhost/#respond</comments>
		
		<dc:creator><![CDATA[David Eriksson]]></dc:creator>
		<pubDate>Fri, 03 Apr 2026 10:15:36 +0000</pubDate>
				<category><![CDATA[Så funkar det]]></category>
		<guid isPermaLink="false">https://monc.se/?p=3150</guid>

					<description><![CDATA[<p>Om du någonsin startat en lokal utvecklingsserver har du sett localhost eller 127.0.0.1 i adressfältet. Men vad betyder det egentligen,</p>
<p>Inlägget <a href="https://monc.se/sa-funkar-det/vad-ar-localhost/">Vad är localhost – och hur använder du det för webbutveckling?</a> dök först upp på <a href="https://monc.se">MONC</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Om du någonsin startat en lokal utvecklingsserver har du sett <code>localhost</code> eller <code>127.0.0.1</code> i adressfältet. Men vad betyder det egentligen, varför behövs det, och hur använder du det i ditt dagliga arbete som webbutvecklare?</p>
<p>Här förklarar vi vad localhost är, hur det fungerar på nätverksnivå, och hur du använder det praktiskt för lokal webbutveckling.</p>
<h2>Localhost förklarat</h2>
<p>Localhost är ett värdnamn som alltid pekar tillbaka på din egen dator. Det är nätverkets motsvarighet till &#8221;jag själv&#8221;. När du skriver <code>http://localhost</code> i webbläsaren skickar datorn inte iväg någon förfrågan ut på internet — den pratar med sig själv.</p>
<p>Tekniskt sett är localhost mappat till IP-adressen <code>127.0.0.1</code> (för IPv4) och <code>::1</code> (för IPv6). Det definieras i operativsystemets hosts-fil och i nätverksstandarden RFC 5735. Hela IP-intervallet <code>127.0.0.0/8</code> — det vill säga alla adresser från <code>127.0.0.1</code> till <code>127.255.255.254</code> — är reserverat för loopback, men i praktiken används nästan uteslutande <code>127.0.0.1</code>.</p>
<h3>Loopback-interfacet</h3>
<p>Trafik till localhost passerar aldrig nätverkskortet. Operativsystemet fångar upp den via ett virtuellt nätverksinterface som kallas loopback (ofta <code>lo</code> på Linux/Mac). Det innebär att localhost fungerar även utan internetanslutning — du behöver ingen wifi eller nätverkskabel för att köra en lokal utvecklingsserver.</p>
<p>Det innebär också att localhost-trafik inte är synlig för andra enheter på ditt nätverk. Din kollega kan inte nå din lokala server via <code>127.0.0.1</code> — den adressen pekar på <em>deras</em> dator, inte din. Vill du dela din lokala server med andra på samma nätverk behöver du binda den till <code>0.0.0.0</code> eller din lokala IP-adress.</p>
<h2>Portar — localhost:3000, localhost:8080</h2>
<p>Du har förmodligen sett adresser som <code>localhost:3000</code> eller <code>localhost:8080</code>. Siffran efter kolonet är ett portnummer. Portar fungerar som dörrarna till din dator — varje tjänst lyssnar på sin egen port.</p>
<p>Standardportarna som är bra att känna till: port 80 för HTTP, port 443 för HTTPS, port 3000 för Node.js-servrar (Express, Next.js), port 5173 för Vite, port 8000 för Python/Django, port 8080 för diverse Java-baserade servrar.</p>
<p>Varför inte bara använda port 80? Två skäl: portar under 1024 kräver administratörsbehörighet på de flesta system, och du vill kunna köra flera servrar samtidigt — frontend på port 5173 och backend-API på port 3000, till exempel.</p>
<h3>Lösa portkonflikter</h3>
<p>En av de vanligaste frustreringarna vid lokal utveckling är felmeddelandet &#8221;port already in use&#8221;. Det betyder att en annan process redan lyssnar på den porten. På Mac och Linux hittar du den med:</p>
<pre class="codehilite"><code class="language-bash">lsof -i :3000
</code></pre>
<p>Det listar alla processer som använder port 3000. Avsluta processen med <code>kill -9 PID</code> (där PID är processens ID) eller byt port i din utvecklingsserver.</p>
<h2>Lokal server — varför räcker det inte att öppna HTML-filer?</h2>
<p>Du kan visserligen öppna en HTML-fil direkt i webbläsaren via <code>file:///</code>, men det fungerar dåligt för allt utom de enklaste sidorna. Webbläsare begränsar vad som får göras från <code>file://</code>-protokollet — JavaScript-moduler laddas inte, <code>fetch()</code>-anrop blockeras av CORS, och relativa sökvägar beter sig annorlunda.</p>
<p>En lokal utvecklingsserver löser allt detta. Den serverar filerna via HTTP precis som en riktig webbserver, vilket betyder att allt beter sig som det kommer att göra i produktion.</p>
<p>Det enklaste sättet att starta en lokal server beror på ditt verktygsval:</p>
<pre class="codehilite"><code class="language-bash"># Python (finns förinstallerat på Mac/Linux)
python3 -m http.server 8000

# Node.js med npx (kräver Node)
npx serve

# PHP
php -S localhost:8000

# Vite (för moderna JS-projekt)
npm create vite@latest
npm run dev
</code></pre>
<p>Pythons <code>http.server</code> är det snabbaste sättet att servera statiska filer — det kräver inga beroenden utöver en Python-installation. Vite ger dig hot module replacement (HMR) som automatiskt uppdaterar sidan i webbläsaren när du sparar en fil.</p>
<h2>HTTPS på localhost</h2>
<p>Vissa API:er och webbläsarfunktioner kräver HTTPS — geolocation, service workers och kamera/mikrofon fungerar bara över säkra anslutningar. Men localhost har ett specialundantag: de flesta webbläsare behandlar det som en &#8221;secure context&#8221; även utan HTTPS.</p>
<p>Behöver du ändå HTTPS lokalt — exempelvis för att testa med en extern tjänst som kräver det — är <code>mkcert</code> det enklaste verktyget:</p>
<pre class="codehilite"><code class="language-bash">mkcert -install
mkcert localhost
</code></pre>
<p>Det skapar ett lokalt CA-certifikat och genererar ett giltigt TLS-certifikat för localhost. Din webbläsare litar på det automatiskt, utan varningar.</p>
<h2>Localhost vs 0.0.0.0</h2>
<p>En viktig skillnad som ofta skapar förvirring: en server som lyssnar på <code>localhost</code> (127.0.0.1) accepterar bara anslutningar <em>från din egen dator</em>. En server som lyssnar på <code>0.0.0.0</code> accepterar anslutningar från alla nätverksinterface — inklusive andra enheter på ditt lokala nätverk.</p>
<p>Det spelar roll om du vill testa din sida på en mobil. Binder du servern till <code>0.0.0.0</code> kan du öppna din dators lokala IP-adress (t.ex. <code>192.168.1.42:3000</code>) på telefonen och se sidan. Din lokala IP hittar du med <code>ifconfig</code> (Mac/Linux) eller <code>ipconfig</code> (Windows).</p>
<h2>Localhost och miljövariabler</h2>
<p>I de flesta projekt vill du att koden beter sig olika lokalt jämfört med produktion — annan databasadress, andra API-nycklar, debug-läge på. Miljövariabler och <code>.env</code>-filer löser det:</p>
<pre class="codehilite"><code class="language-bash"># .env (lokal utveckling)
DATABASE_URL=postgresql://localhost:5432/myapp_dev
API_BASE_URL=http://localhost:3000/api
DEBUG=true
</code></pre>
<p>Verktyg som <code>dotenv</code> (Node.js) eller <code>python-dotenv</code> (Python) läser <code>.env</code>-filen automatiskt vid uppstart. Se till att <code>.env</code> ligger i <code>.gitignore</code> — den ska aldrig pushas till version control, särskilt inte med produktionslösenord.</p>
<h2>Sammanfattning</h2>
<p>Localhost (<code>127.0.0.1</code>) är ett värdnamn som pekar tillbaka på din egen dator via loopback-interfacet. Trafiken lämnar aldrig din maskin och fungerar utan internetanslutning. Portar identifierar vilken tjänst du pratar med — <code>localhost:3000</code> är inte samma sak som <code>localhost:8080</code>. Alltid kör en lokal utvecklingsserver istället för att öppna filer via <code>file://</code> — det undviker CORS-problem och säkerställer att allt beter sig som i produktion. Och om du behöver dela din lokala server med andra enheter, bind den till <code>0.0.0.0</code> istället för <code>127.0.0.1</code>.</p>
<p>Inlägget <a href="https://monc.se/sa-funkar-det/vad-ar-localhost/">Vad är localhost – och hur använder du det för webbutveckling?</a> dök först upp på <a href="https://monc.se">MONC</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://monc.se/sa-funkar-det/vad-ar-localhost/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Vad är responsiv webbdesign – och varför spelar det roll?</title>
		<link>https://monc.se/kul-med-teknik/responsiv-webbdesign/</link>
					<comments>https://monc.se/kul-med-teknik/responsiv-webbdesign/#respond</comments>
		
		<dc:creator><![CDATA[David Eriksson]]></dc:creator>
		<pubDate>Thu, 02 Apr 2026 09:54:34 +0000</pubDate>
				<category><![CDATA[Kul med teknik]]></category>
		<guid isPermaLink="false">https://monc.se/?p=3147</guid>

					<description><![CDATA[<p>Responsiv webbdesign innebär att en webbsida anpassar sig automatiskt till skärmen den visas på — oavsett om det är en</p>
<p>Inlägget <a href="https://monc.se/kul-med-teknik/responsiv-webbdesign/">Vad är responsiv webbdesign – och varför spelar det roll?</a> dök först upp på <a href="https://monc.se">MONC</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Responsiv webbdesign innebär att en webbsida anpassar sig automatiskt till skärmen den visas på — oavsett om det är en telefon, surfplatta, laptop eller ultrawide-monitor. Det är inte en separat teknik utan ett förhållningssätt till design och utveckling som blivit så grundläggande att det idag är svårt att tänka sig ett alternativ.</p>
<p>Här går vi igenom hur responsiv design fungerar i praktiken, vilka CSS-verktyg du har att arbeta med, och varför mobile first-strategin fortfarande gäller.</p>
<h2>Hur responsiv design fungerar</h2>
<p>Kärnan i responsiv webbdesign är tre saker: flexibla layouter, flexibla bilder och mediaqueries. Begreppet myntades av Ethan Marcotte 2010, och grundprinciperna håller fortfarande — även om verktygslådan har vuxit enormt sedan dess.</p>
<p>Viewport-metataggen är startpunkten. Utan den behandlar mobila webbläsare sidan som om den vore designad för desktop och krymper ner den:</p>
<pre class="codehilite"><code class="language-html">&lt;meta name="viewport" content="width=device-width, initial-scale=1" /&gt;
</code></pre>
<p>Den raden säger: &#8221;Gör viewportens bredd lika med enhetens bredd, och starta utan zoom.&#8221; Det är en rad som måste finnas i <code>&lt;head&gt;</code> på varje responsiv sida.</p>
<h2>Mobile first — varför du bör börja litet</h2>
<p>Mobile first innebär att du designar och kodar för den minsta skärmen först, och sedan lägger till komplexitet för större skärmar med <code>min-width</code>-mediaqueries. Det låter kontraintuitivt, men det tvingar dig att prioritera innehåll och funktion — du kan inte gömma problem bakom en bredare yta.</p>
<pre class="codehilite"><code class="language-css">/* Basstil: gäller alla skärmstorlekar (mobil först) */
.container {
  padding: 1rem;
}

.card-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 1rem;
}

/* Surfplatta och uppåt */
@media (min-width: 768px) {
  .container {
    padding: 2rem;
  }

  .card-grid {
    grid-template-columns: repeat(2, 1fr);
    gap: 1.5rem;
  }
}

/* Desktop */
@media (min-width: 1024px) {
  .container {
    max-width: 1200px;
    margin: 0 auto;
  }

  .card-grid {
    grid-template-columns: repeat(3, 1fr);
  }
}
</code></pre>
<p>Basstilen med <code>1fr</code> ger en enda kolumn på mobil. Vid 768px går vi till två kolumner, vid 1024px till tre. <code>max-width</code> och <code>margin: 0 auto</code> centrerar innehållet på breda skärmar.</p>
<p>En vanlig fråga är vilka breakpoints man ska använda. Det finns inga universella svar, men 640px (stor telefon), 768px (surfplatta), 1024px (liten laptop) och 1280px (desktop) är rimliga utgångspunkter. Det viktigaste är att breakpoints baseras på var din layout <em>behöver</em> ändras, inte på specifika enhetsmodeller — nya enheter släpps hela tiden med nya skärmstorlekar.</p>
<h3>Responsiva enheter: rem, em, vw och clamp()</h3>
<p>Pixlar är fasta. Responsiv design kräver relativa enheter som skalas med sitt sammanhang:</p>
<p><code>rem</code> är relativ till root-elementets fontstorlek (oftast 16px). <code>1.5rem</code> är alltid 24px oavsett var i dokumentet du befinner dig. <code>em</code> är relativ till förälderns fontstorlek. <code>1.5em</code> på ett element inuti en <code>&lt;h2&gt;</code> med <code>font-size: 20px</code> blir 30px. <code>vw</code> och <code>vh</code> är relativ till viewportens bredd respektive höjd. <code>1vw</code> = 1% av viewport-bredden.</p>
<p><code>clamp()</code> kombinerar allt och ger dig responsiva värden utan mediaqueries:</p>
<pre class="codehilite"><code class="language-css">h1 {
  font-size: clamp(1.75rem, 1.5rem + 1.5vw, 3rem);
}

.section {
  padding: clamp(1.5rem, 3vw, 4rem);
}
</code></pre>
<p><code>clamp()</code> tar tre värden: minimum, önskat värde och maximum. Texten skalas flytande med viewport-bredden men går aldrig under 1.75rem eller över 3rem. Det eliminerar behovet av mediaqueries för typografi och spacing.</p>
<h2>Responsiva bilder</h2>
<p>Bilder som inte anpassar sig är det snabbaste sättet att förstöra en mobilupplevelse. Den grundläggande regeln är enkel:</p>
<pre class="codehilite"><code class="language-css">img {
  max-width: 100%;
  height: auto;
}
</code></pre>
<p>Men det räcker inte alltid. En 2000px bred hero-bild som krymps till 375px med CSS laddas fortfarande i full storlek — det är slöseri med data och bandbredd. HTML:s <code>srcset</code>-attribut löser det:</p>
<pre class="codehilite"><code class="language-html">&lt;img
  src="hero-800.jpg"
  srcset="hero-400.jpg 400w, hero-800.jpg 800w, hero-1600.jpg 1600w"
  sizes="(max-width: 600px) 100vw, (max-width: 1024px) 80vw, 1200px"
  alt="Beskrivning av bilden"
/&gt;
</code></pre>
<p>Webbläsaren väljer rätt bildstorlek baserat på viewport-bredden och enhetens pixeldensitet. På en iPhone med 375px viewport och 3x pixeldensitet behövs en bild som är 375 × 3 = 1125 pixlar bred — webbläsaren väljer automatiskt <code>hero-1600.jpg</code> från listan.</p>
<h2>Responsiv typografi</h2>
<p>Textstorlek som är behaglig på desktop kan vara för stor eller för liten på mobil. <code>clamp()</code> är det moderna svaret, men du kan också använda en enkel skala med mediaqueries:</p>
<pre class="codehilite"><code class="language-css">:root {
  font-size: 100%; /* 16px */
}

body {
  font-size: 1rem;
  line-height: 1.7;
}

@media (min-width: 1024px) {
  :root {
    font-size: 112.5%; /* 18px */
  }
}
</code></pre>
<p>Genom att ändra root-fontstorleken skalas allt som använder <code>rem</code> automatiskt. Det ger dig en global typografisk kontroll med en enda ändring.</p>
<h2>Container queries — nästa steg i responsiv design</h2>
<p>Mediaqueries utgår alltid från viewportens bredd. Men vad händer när samma komponent används i en bred huvudkolumn <em>och</em> i en smal sidebar? Med mediaqueries måste du hårdkoda breakpoints per kontext. Container queries löser det:</p>
<pre class="codehilite"><code class="language-css">.card-container {
  container-type: inline-size;
}

.card {
  display: grid;
  grid-template-columns: 1fr;
}

@container (min-width: 400px) {
  .card {
    grid-template-columns: 150px 1fr;
  }
}
</code></pre>
<p>Istället för att fråga &#8221;hur bred är viewporten?&#8221; frågar regeln &#8221;hur bred är min container?&#8221; Det betyder att kortet automatiskt byter layout beroende på var det placeras — bredvid en sidebar blir det stående, i en fullbreddsektion blir det liggande. Samma komponent, inget duplicerat CSS.</p>
<p>Container queries stöds i alla moderna webbläsare sedan 2023 och är redo för produktion.</p>
<h2>Testa responsivitet</h2>
<p>Chrome DevTools responsivläge (Ctrl+Shift+M) låter dig simulera olika enheter och skärmstorlekar. Men simulering ersätter inte riktiga enheter — touch-interaktioner, skärmläsare och verklig nätverksprestanda beter sig annorlunda.</p>
<p>Använd också Lighthouse i DevTools för att kontrollera att viewport-metataggen finns, att texten är läsbar utan zoom och att tryckytor är tillräckligt stora.</p>
<h2>Sammanfattning</h2>
<p>Responsiv webbdesign handlar om att bygga sidor som fungerar på alla skärmstorlekar. Börja med viewport-metataggen och en mobile first-strategi. Använd CSS Grid och Flexbox med relativa enheter istället för fasta pixelvärden. <code>clamp()</code> ger dig flytande skalning utan mediaqueries. <code>srcset</code> och <code>sizes</code> ser till att rätt bildstorlek laddas. Och testa alltid på riktiga enheter — simulatorer visar inte hela bilden.</p>
<p>Inlägget <a href="https://monc.se/kul-med-teknik/responsiv-webbdesign/">Vad är responsiv webbdesign – och varför spelar det roll?</a> dök först upp på <a href="https://monc.se">MONC</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://monc.se/kul-med-teknik/responsiv-webbdesign/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Hur fungerar en webbläsare – från URL till färdig sida</title>
		<link>https://monc.se/sa-funkar-det/hur-fungerar-webblasare/</link>
					<comments>https://monc.se/sa-funkar-det/hur-fungerar-webblasare/#respond</comments>
		
		<dc:creator><![CDATA[David Eriksson]]></dc:creator>
		<pubDate>Wed, 01 Apr 2026 18:20:20 +0000</pubDate>
				<category><![CDATA[Så funkar det]]></category>
		<guid isPermaLink="false">https://monc.se/?p=3144</guid>

					<description><![CDATA[<p>Du skriver en adress i webbläsaren, trycker Enter, och en sekund senare har du en komplett webbsida framför dig. Men</p>
<p>Inlägget <a href="https://monc.se/sa-funkar-det/hur-fungerar-webblasare/">Hur fungerar en webbläsare – från URL till färdig sida</a> dök först upp på <a href="https://monc.se">MONC</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Du skriver en adress i webbläsaren, trycker Enter, och en sekund senare har du en komplett webbsida framför dig. Men under den sekunden händer det enormt mycket — DNS-uppslag, TCP-anslutningar, HTTP-förfrågningar, HTML-parsning, CSS-beräkning, layout, rendering och målning av pixlar på skärmen.</p>
<p>Att förstå vad webbläsaren faktiskt gör är inte bara akademiskt intressant — det gör dig till en bättre webbutvecklare. Här går vi igenom hela kedjan, från URL till färdig sida.</p>
<h2>Steg 1: DNS — hitta serverns adress</h2>
<p>När du skriver <code>monc.se</code> i adressfältet behöver webbläsaren först ta reda på vilken IP-adress som hör till domännamnet. Det sker via DNS (Domain Name System), som fungerar som internets telefonkatalog.</p>
<p>Webbläsaren kollar först sin egen cache — har du besökt sidan nyligen finns svaret redan. Därefter frågar operativsystemets cache, sedan din routers cache, och slutligen din internetleverantörs DNS-server. Om ingen har svaret skickas frågan vidare uppåt i DNS-hierarkin tills rätt IP-adress hittas.</p>
<p>Det här steget tar vanligtvis 20–120 millisekunder. Verktyg som <code>dns-prefetch</code> i HTML låter webbläsaren göra DNS-uppslag i förväg för domäner du vet att sidan kommer att behöva, till exempel CDN:er och tredjeparts-API:er.</p>
<h2>Steg 2: Anslutning — TCP och TLS</h2>
<p>Med IP-adressen i hand upprättar webbläsaren en TCP-anslutning med servern. Det sker via en &#8221;three-way handshake&#8221; — tre meddelanden som bekräftar att båda sidor är redo att kommunicera.</p>
<p>Använder sidan HTTPS (vilket i princip alla gör idag) följer en TLS-handshake ovanpå TCP:n. Webbläsaren och servern förhandlar om krypteringsalgoritm, utbyter nycklar och verifierar serverns SSL-certifikat. Först därefter kan data skickas säkert.</p>
<p>HTTP/2 och HTTP/3 har optimerat den här processen avsevärt. HTTP/2 multiplexar flera förfrågningar över en enda anslutning, och HTTP/3 använder QUIC-protokollet som bygger på UDP istället för TCP, vilket minskar antalet roundtrips som krävs.</p>
<h2>Steg 3: HTTP-förfrågan och svar</h2>
<p>Webbläsaren skickar en HTTP GET-förfrågan till servern med information om vilken resurs den vill ha, vilken webbläsare som frågar och vilka format den accepterar. Servern svarar med en statuskod (200 OK om allt gick bra), HTTP-headers med metadata, och själva HTML-dokumentet.</p>
<p>Headers innehåller viktig information: <code>Content-Type</code> som talar om att svaret är HTML, <code>Cache-Control</code> som styr hur länge resursen får cachas, och <code>Content-Encoding</code> som anger eventuell komprimering (vanligtvis gzip eller Brotli).</p>
<p>Caching spelar en stor roll för prestanda. Om webbläsaren redan har en cachad version av resursen och servern bekräftar att den inte ändrats (via <code>304 Not Modified</code>) behöver hela dokumentet inte laddas ner igen. Det är därför en sida ofta laddar betydligt snabbare vid andra besöket — DNS, anslutning och resurser finns redan i cache.</p>
<h2>Steg 4: HTML-parsning och DOM-konstruktion</h2>
<p>Nu börjar det intressanta. Webbläsaren tar emot HTML-dokumentet som en ström av bytes och börjar parsa det — tecken för tecken, tagg för tagg — till ett DOM-träd (Document Object Model).</p>
<p>DOM:en är en trädstruktur där varje HTML-element blir en nod. <code>&lt;html&gt;</code> är roten, <code>&lt;head&gt;</code> och <code>&lt;body&gt;</code> är barn, och alla element däri grenar vidare neråt. Det är den strukturen som JavaScript sedan interagerar med via metoder som <code>document.querySelector()</code>.</p>
<p>Parsningen är inte helt rak. När webbläsaren stöter på en <code>&lt;script&gt;</code>-tagg pausar den HTML-parsningen, laddar ner scriptet och kör det — det kan ju modifiera DOM:en som håller på att byggas. Det är därför <code>&lt;script&gt;</code>-taggar traditionellt placeras precis före <code>&lt;/body&gt;</code>, och varför <code>defer</code>-attributet finns: det låter scriptet laddas parallellt men väntar med exekveringen tills HTML:en är färdigparsad.</p>
<p><code>&lt;link&gt;</code>-taggar till CSS-filer blockerar inte HTML-parsningen men blockerar renderingen — webbläsaren vägrar visa sidan förrän den vet hur den ska se ut. Det kallas render-blocking, och det är anledningen till att stora, ooptimerade CSS-filer kan fördröja den första visuella rendringen avsevärt.</p>
<p>Moderna webbläsare har en &#8221;preload scanner&#8221; som tittar framåt i HTML:en medan parsern är blockerad, och börjar ladda resurser den vet kommer att behövas — CSS-filer, bilder och scripts. Det är en optimering som sker automatiskt och gör stor skillnad i praktiken.</p>
<h2>Steg 5: CSSOM — webbläsarens stilberäkning</h2>
<p>Parallellt med DOM-konstruktionen bygger webbläsaren ett CSSOM (CSS Object Model) från alla stilmallar. Varje CSS-regel parsas, specificitet beräknas, och arv appliceras. Resultatet är en fullständig stilbeskrivning för varje element i DOM:en.</p>
<p>Det är i det här steget som CSS cascading, specificitet och arv spelar ut — webbläsaren avgör vilka regler som gäller för varje element baserat på de principer vi beskrivit i andra artiklar.</p>
<h2>Steg 6: Render tree, layout och paint</h2>
<p>Med DOM:en och CSSOM på plats kombinerar webbläsaren dem till ett render tree — en träd-struktur som bara innehåller synliga element med deras beräknade stilar. Element med <code>display: none</code> finns i DOM:en men inte i render tree.</p>
<p>Layout-steget (ibland kallat &#8221;reflow&#8221;) beräknar varje elements exakta position och storlek på skärmen. Det är här som CSS-värden som <code>width: 50%</code>, <code>margin: auto</code> och <code>flex: 1</code> omvandlas till konkreta pixelvärden.</p>
<p>Paint-steget konverterar render tree till faktiska pixlar. Webbläsaren ritar text, färger, bilder, ramar och skuggor för varje element. Och slutligen, i compositing-steget, läggs alla lager ihop till den slutliga bilden som visas på skärmen.</p>
<h2>Varför det spelar roll för prestanda</h2>
<p>Varje förändring du gör på sidan triggar potentiellt delar av den här kedjan igen. Ändrar du en elements <code>width</code> i JavaScript triggar det layout (reflow), paint och compositing. Ändrar du <code>color</code> triggar det paint och compositing men inte layout. Ändrar du <code>transform</code> eller <code>opacity</code> triggar det bara compositing — det billigaste steget.</p>
<p>Det är därför CSS-animationer med <code>transform</code> och <code>opacity</code> är så mycket snabbare än animationer med <code>top</code>, <code>left</code>, <code>width</code> eller <code>height</code>. De sista fyra triggar layout-omberäkning för varje animationsframe, medan de första två hanteras helt av GPU:n.</p>
<p>Några praktiska konsekvenser: undvik att ändra layout-triggande egenskaper i animationer. Använd <code>will-change: transform</code> för att hinta till webbläsaren att ett element kommer att animeras. Och batchera DOM-ändringar istället för att göra dem en åt gången — varje enskild ändring kan trigga en ny layout-beräkning.</p>
<h2>Webbläsarens utvecklingsverktyg</h2>
<p>Chrome DevTools Performance-panelen visualiserar hela render-pipelinen. Du kan se exakt hur lång tid varje steg tar — parsning, stilberäkning, layout, paint, compositing — och identifiera flaskhalsar. Network-panelen visar DNS-uppslag, anslutningar och varje enskild resurs som laddas, med timing för varje fas.</p>
<p>Det är en av de mest kraftfulla resurserna du har som webbutvecklare, och det är gratis.</p>
<h2>Sammanfattning</h2>
<p>En webbläsare gör enormt mycket arbete på under en sekund. DNS löser domännamnet till en IP-adress. TCP och TLS upprättar en säker anslutning. HTTP hämtar HTML-dokumentet. Parsern bygger DOM och CSSOM. Render tree, layout och paint producerar de pixlar du ser. Och varje förändring du gör med JavaScript eller CSS triggar delar av kedjan igen — det är därför prestanda-medveten utveckling handlar om att förstå vilka steg som triggas och minimera onödigt arbete.</p>
<p>Inlägget <a href="https://monc.se/sa-funkar-det/hur-fungerar-webblasare/">Hur fungerar en webbläsare – från URL till färdig sida</a> dök först upp på <a href="https://monc.se">MONC</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://monc.se/sa-funkar-det/hur-fungerar-webblasare/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Vad är en API – förklarat på svenska utan krångel</title>
		<link>https://monc.se/sa-funkar-det/vad-ar-api/</link>
					<comments>https://monc.se/sa-funkar-det/vad-ar-api/#respond</comments>
		
		<dc:creator><![CDATA[David Eriksson]]></dc:creator>
		<pubDate>Tue, 31 Mar 2026 12:55:59 +0000</pubDate>
				<category><![CDATA[Så funkar det]]></category>
		<guid isPermaLink="false">https://monc.se/?p=3141</guid>

					<description><![CDATA[<p>API är ett av de mest använda begreppen inom webbutveckling, men det är förvånansvärt dåligt förklarat på svenska. Det beror</p>
<p>Inlägget <a href="https://monc.se/sa-funkar-det/vad-ar-api/">Vad är en API – förklarat på svenska utan krångel</a> dök först upp på <a href="https://monc.se">MONC</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>API är ett av de mest använda begreppen inom webbutveckling, men det är förvånansvärt dåligt förklarat på svenska. Det beror troligen på att de flesta resurser antingen är för tekniska eller för ytliga — de stannar vid restaurangmetaforen med servitören som tar beställningar, utan att gå vidare till hur det faktiskt ser ut i praktiken.</p>
<p>Här förklarar vi vad en API är, hur den fungerar tekniskt, och varför det är ett av de viktigaste koncepten att förstå som webbutvecklare.</p>
<h2>API förklarat — vad det faktiskt innebär</h2>
<p>API står för Application Programming Interface. Det är ett gränssnitt som låter två program prata med varandra enligt överenskomna regler. Istället för att en människa klickar sig igenom ett webbgränssnitt kan ett program skicka en strukturerad förfrågan och få ett strukturerat svar tillbaka.</p>
<p>Tänk på det som en kontraktsspecifikation. API:et säger: &#8221;Om du skickar mig den här typen av förfrågan, med de här parametrarna, så ger jag dig tillbaka den här typen av svar.&#8221; Det är allt — ett avtal om hur kommunikationen ska se ut.</p>
<p>Det finns API:er överallt. Varje gång en mobilapp hämtar data från en server, varje gång du loggar in med Google på en tredjepartssajt, varje gång en webshop beräknar fraktkostnad via PostNord — det går via ett API.</p>
<h2>Hur fungerar ett REST API?</h2>
<p>REST (Representational State Transfer) är det vanligaste sättet att bygga webb-API:er. Ett REST API använder HTTP — samma protokoll som din webbläsare — och kommunicerar med standardmetoderna GET, POST, PUT och DELETE.</p>
<p>Här är ett konkret exempel. Säg att du bygger en app som hanterar böcker. Ett REST API för den tjänsten kan se ut så här:</p>
<pre class="codehilite"><code>GET    /api/books          → Hämta alla böcker
GET    /api/books/42       → Hämta bok med ID 42
POST   /api/books          → Skapa en ny bok
PUT    /api/books/42       → Uppdatera bok 42
DELETE /api/books/42       → Ta bort bok 42
</code></pre>
<p>Varje URL (eller &#8221;endpoint&#8221;) representerar en resurs, och HTTP-metoden bestämmer vad du vill göra med den. GET hämtar data, POST skapar ny data, PUT uppdaterar befintlig data och DELETE tar bort.</p>
<h3>API-svar i JSON</h3>
<p>Data som skickas fram och tillbaka är nästan alltid i JSON-format (JavaScript Object Notation). Det ser ut så här:</p>
<pre class="codehilite"><code class="language-json">{
  "id": 42,
  "title": "Norrlands mörker",
  "author": "Stina Jackson",
  "year": 2018,
  "available": true
}
</code></pre>
<p>JSON är textbaserat, lättläst för människor och enkelt att tolka för datorer. Det är därför det blivit standardformatet för API-kommunikation.</p>
<h2>API-nycklar och autentisering</h2>
<p>De flesta API:er kräver någon form av autentisering — du kan inte bara skicka anrop hur som helst. Det vanligaste mönstret är API-nycklar: en unik sträng som identifierar dig och avgör vad du har tillgång till.</p>
<pre class="codehilite"><code>GET /api/books
Authorization: Bearer din-api-nyckel-här
</code></pre>
<p>API-nyckeln skickas med i varje anrop som en HTTP-header. Servern kontrollerar nyckeln, verifierar att du har rätt att göra den aktuella förfrågan, och returnerar data om allt stämmer.</p>
<p>Andra autentiseringsmetoder inkluderar OAuth (som används när du loggar in med Google eller GitHub) och JWT-tokens (JSON Web Tokens) som är vanliga i moderna webbapplikationer. Gemensamt för alla är att de löser samma grundproblem: vem är du, och vad får du göra?</p>
<h2>Varför API:er är viktiga</h2>
<p>API:er är limmet i modern webbutveckling. Utan dem skulle varje tjänst vara en isolerad ö. Några vardagliga exempel:</p>
<p>Betalningar: Stripe, Klarna och Swish exponerar API:er som låter din webbshop hantera betalningar utan att du bygger ett eget betalningssystem. Kartor: Google Maps API och Mapbox låter dig bädda in kartor och beräkna rutter. E-post: SendGrid och Mailgun hanterar e-postutskick via API-anrop. Väderdata: SMHI har ett öppet API där du kan hämta prognoser och mätdata gratis.</p>
<p>I alla dessa fall slipper du bygga funktionaliteten själv. Du gör ett API-anrop, får tillbaka data, och använder den i din applikation. Det är kärnan i varför API:er är så centrala — de låter dig stå på andras axlar.</p>
<h3>HTTP-statuskoder — API:ets språk</h3>
<p>Varje API-svar innehåller en statuskod som talar om vad som hände. De viktigaste att känna till: <code>200 OK</code> betyder att allt gick bra. <code>201 Created</code> bekräftar att en ny resurs skapades (efter POST). <code>400 Bad Request</code> betyder att din förfrågan var felformaterad. <code>401 Unauthorized</code> att du saknar eller har felaktig autentisering. <code>404 Not Found</code> att resursen inte existerar. Och <code>429 Too Many Requests</code> att du skickat för många anrop — de flesta API:er har rate limiting som begränsar antalet anrop per tidsenhet.</p>
<p>Att hantera dessa koder i din kod är grundläggande — du kan inte anta att varje anrop lyckas.</p>
<h2>Testa ett API i praktiken</h2>
<p>Det enklaste sättet att förstå hur ett API fungerar är att testa ett. SMHIs öppna API kräver ingen registrering:</p>
<pre class="codehilite"><code>GET https://opendata-download-metfcst.smhi.se/api/category/pmp3g/version/2/geotype/point/lon/18.07/lat/59.33/data.json
</code></pre>
<p>Den URL:en ger dig en väderprognos för Stockholm i JSON-format. Klistra in den i din webbläsare och du ser rå API-data direkt.</p>
<p>Vill du experimentera mer strukturerat är Postman ett populärt verktyg som låter dig bygga och skicka HTTP-förfrågningar visuellt. Du kan testa olika metoder, lägga till headers och se svaren formaterat. Alternativt fungerar <code>curl</code> i terminalen:</p>
<pre class="codehilite"><code class="language-bash">curl -s "https://opendata-download-metfcst.smhi.se/api/category/pmp3g/version/2/geotype/point/lon/18.07/lat/59.33/data.json" | head -c 500
</code></pre>
<h2>REST vs GraphQL vs WebSocket</h2>
<p>REST är standard, men det finns alternativ. GraphQL låter klienten specificera exakt vilken data den vill ha — istället för att servern bestämmer vad varje endpoint returnerar. Det minskar problemet med &#8221;överhämtning&#8221; av data men lägger till komplexitet.</p>
<p>WebSockets är en annan teknik som ger tvåvägskommunikation i realtid — servern kan skicka data till klienten utan att klienten frågar. Det används för chattappar, live-uppdateringar och multiplayer-spel.</p>
<p>I de flesta projekt börjar du med REST. Det är enklare, välförstått och har bättre verktyg. GraphQL och WebSockets löser specifika problem som du sannolikt inte har från start.</p>
<h2>Sammanfattning</h2>
<p>En API är ett gränssnitt som låter program kommunicera med varandra. REST API:er använder HTTP-metoder som GET och POST för att hantera resurser, och JSON för att skicka data. Autentisering sker via API-nycklar, OAuth eller JWT-tokens. API:er är grunden för modern webbutveckling — från betalningar och kartor till väderdata och e-post. Och det bästa sättet att lära sig är att testa: öppna SMHIs API i webbläsaren eller installera Postman och börja skicka anrop.</p>
<p>Inlägget <a href="https://monc.se/sa-funkar-det/vad-ar-api/">Vad är en API – förklarat på svenska utan krångel</a> dök först upp på <a href="https://monc.se">MONC</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://monc.se/sa-funkar-det/vad-ar-api/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
