Open-source VS Code AI coding agent for Nordic nRF and Espressif ESP32 firmware, with hardware-verified expert knowledge and one-click EU CRA readiness.
Put a secure, working IoT product in front of customers in weeks, not quarters. Prove its value early.
Adsum IoT Coder is an AI coding agent for embedded IoT, augmented with expert knowledge that was verified on real hardware by engineers who have shipped. It reads your whole bench, not only your code, and you approve every step. Try it now, with no key, no account and no card.
One open agent in your editor, plus expert knowledge that loads only for the task in front of it. That knowledge was written and verified on real boards by named engineers. It is not a chatbot reading a datasheet. See the architecture.Found on the bench, not in the field. A gateway build that compiled clean and heard nothing. Thirty-six advertisements on the air, none received, and every log read fine. The radio front end had never been switched on. See how it was found.
Flash a signed image, to judge itYours: a licence to run it on your own network, with your own devices and your own broker, and prove its value before you spend anything.
Under 30 min
Flash and start testing the same image, to deploy itYours: a licence to deploy it as it is, with no firmware work at all. It stays your deployment.
Under 2 hours
Build and start customising from licensed sourceYours: the source, module by module, to change and to ship. Your changes stay yours.
A few hours
Build it from scratchYours: the architecture as well as the code. You decided how it works.
Each time is to a first working version on real hardware. Start anywhere, and move between them.
Signed images and licensed source are for the Fanstel gateways today. Building from scratch works on any board built on a supported chip. The demo firmware is free to flash. For the BLG20x and LBG20x, production licences are priced per relay at www.adsumnetworks.com; for the other gateways, ask us. Row by row.
Any board built on these chips, your own design included. Open a folder and the agent says what it found and what is still missing before you write a line. Supported hardware.
Start a prototype, add a feature, debug BLE or Wi-Fi against the running board, bring a modem or a LoRa radio up, or run a CRA readiness check on a real build. Every workflow.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Adsum IoT Coder","description":"An open-source VS Code AI coding agent for Nordic nRF and Espressif ESP32 firmware, with hardware-verified expert knowledge, gateway firmware, and one-click EU CRA readiness.","colors":{"primary":"#D76947","light":"#E89478","dark":"#C2562F"},"logo":{"light":"https://mintcdn.com/adsumnetworks/5oq22Vr6_IxYgZXr/logo/adsum-networks-light.svg?fit=max\u0026auto=format\u0026n=5oq22Vr6_IxYgZXr\u0026q=85\u0026s=11327ef8767d0cc889ffaf6eee2decf4","dark":"https://mintcdn.com/adsumnetworks/5oq22Vr6_IxYgZXr/logo/adsum-networks-dark.svg?fit=max\u0026auto=format\u0026n=5oq22Vr6_IxYgZXr\u0026q=85\u0026s=dc117186e265933c45a637860ce915f9","href":"https://www.adsumnetworks.com"},"favicon":"https://mintcdn.com/adsumnetworks/gfAMtGNaT6MiJTU7/logo/icon.png?fit=max\u0026auto=format\u0026n=gfAMtGNaT6MiJTU7\u0026q=85\u0026s=22093a3de723db8e8d7401c5541419d7","appearance":{"default":"system"},"background":{"decoration":"grid"},"navbar":{"links":[{"icon":"satellite-dish","href":"https://www.adsumnetworks.com/","label":"NTN Relay"},{"icon":"github","href":"https://github.com/adsumnetworks/Adsum-IoT-Coder","label":"GitHub"},{"icon":"youtube","href":"https://www.youtube.com/@adsumnetworks","label":"YouTube"}],"primary":{"type":"button","label":"Install","href":"https://marketplace.visualstudio.com/items?itemName=AdsumNetwork.nrf-ai-debugger"}},"footer":{"socials":{"github":"https://github.com/adsumnetworks/Adsum-IoT-Coder","youtube":"https://www.youtube.com/@adsumnetworks","linkedin":"https://www.linkedin.com/company/adsum-networks"}},"search":{"prompt":"Search the Adsum IoT Coder docs..."},"seo":{"metatags":{"og:image":"https://docs.adsumnetworks.com/images/og-image.png","og:image:width":"1200","og:image:height":"630","og:site_name":"Adsum IoT Coder","og:type":"website","twitter:card":"summary_large_image","twitter:image":"https://docs.adsumnetworks.com/images/og-image.png"},"organization":{"id":"https://docs.adsumnetworks.com/#organization","name":"Adsum Networks","url":"https://www.adsumnetworks.com","logo":"https://docs.adsumnetworks.com/logo/icon.png","sameAs":["https://www.linkedin.com/company/adsum-networks/","https://github.com/adsumnetworks/Adsum-IoT-Coder","https://www.youtube.com/@adsumnetworks"]},"indexing":"navigable"},"fonts":{"heading":{"family":"Archivo","weight":700},"body":{"family":"IBM Plex Sans","weight":400}},"styling":{"latex":false},"banner":{"content":"New: the Adsum NTN Relay, BLG20x and LBG20x. Your Bluetooth devices over satellite, licensed per relay, the demo free. [Prices and datasheets](https://www.adsumnetworks.com/)","dismissible":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"adsumnetworks","hasAudioNarration":false,"actualSubdomain":"adsumnetworks","customDomains":["docs.adsumnetworks.com"],"gitSource":{"type":"github","owner":"adsumnetworks","repo":"adsumcoder-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"collectionId":"2af7b464-d8e8-4c77-bb51-1b409b1ae34d","liveDeploymentHistoryId":"6acdf6b4a71bd07e07fff0be","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6acdf6b4a71bd07e07fff0be"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6acdf6b4a71bd07e07fff0be","clientVersion":"0.0.4021","searchFilterCounts":[{"language":"default","tag":"Documentation","count":37},{"language":"default","tag":"Build on partner open hardware","count":13},{"language":"default","tag":"What it does","count":6},{"language":"default","tag":"Get started","count":5},{"language":"default","tag":"Reference","count":5},{"language":"default","tag":"How it works","count":3},{"language":"default","tag":"BWG840x · BLE to Wi-Fi","count":3},{"language":"default","tag":"Supported hardware","count":3},{"language":"default","tag":"BLG20x · NTN Relay, indoors","count":3},{"language":"default","tag":"LBG20x · NTN Relay, outdoors","count":3}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":true},"customCss":[{"filePath":"styles.css","content":"/* cyrillic-ext */\n@font-face {\n font-family: 'IBM Plex Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/ibmplexmono/v20/-F63fjptAgt5VM-kVkqdyU8n1iIq129k.woff2) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n font-family: 'IBM Plex Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/ibmplexmono/v20/-F63fjptAgt5VM-kVkqdyU8n1isq129k.woff2) format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* vietnamese */\n@font-face {\n font-family: 'IBM Plex Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/ibmplexmono/v20/-F63fjptAgt5VM-kVkqdyU8n1iAq129k.woff2) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n font-family: 'IBM Plex Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/ibmplexmono/v20/-F63fjptAgt5VM-kVkqdyU8n1iEq129k.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'IBM Plex Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/ibmplexmono/v20/-F63fjptAgt5VM-kVkqdyU8n1i8q1w.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n/* cyrillic-ext */\n@font-face {\n font-family: 'IBM Plex Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/ibmplexmono/v20/-F6qfjptAgt5VM-kVkqdyU8n3twJwl1FgtIU.woff2) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n font-family: 'IBM Plex Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/ibmplexmono/v20/-F6qfjptAgt5VM-kVkqdyU8n3twJwlRFgtIU.woff2) format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* vietnamese */\n@font-face {\n font-family: 'IBM Plex Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/ibmplexmono/v20/-F6qfjptAgt5VM-kVkqdyU8n3twJwl9FgtIU.woff2) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n font-family: 'IBM Plex Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/ibmplexmono/v20/-F6qfjptAgt5VM-kVkqdyU8n3twJwl5FgtIU.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'IBM Plex Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/ibmplexmono/v20/-F6qfjptAgt5VM-kVkqdyU8n3twJwlBFgg.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n/* cyrillic-ext */\n@font-face {\n font-family: 'IBM Plex Mono';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/ibmplexmono/v20/-F6qfjptAgt5VM-kVkqdyU8n3vAOwl1FgtIU.woff2) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n font-family: 'IBM Plex Mono';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/ibmplexmono/v20/-F6qfjptAgt5VM-kVkqdyU8n3vAOwlRFgtIU.woff2) format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* vietnamese */\n@font-face {\n font-family: 'IBM Plex Mono';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/ibmplexmono/v20/-F6qfjptAgt5VM-kVkqdyU8n3vAOwl9FgtIU.woff2) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n font-family: 'IBM Plex Mono';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/ibmplexmono/v20/-F6qfjptAgt5VM-kVkqdyU8n3vAOwl5FgtIU.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'IBM Plex Mono';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/ibmplexmono/v20/-F6qfjptAgt5VM-kVkqdyU8n3vAOwlBFgg.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n/* cyrillic-ext */\n@font-face {\n font-family: 'Source Serif 4';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/sourceserif4/v15/vEFI2_tTDB4M7-auWDN0ahZJW1gW8tenXg.woff2) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n font-family: 'Source Serif 4';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/sourceserif4/v15/vEFI2_tTDB4M7-auWDN0ahZJW1gf8tenXg.woff2) format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* greek */\n@font-face {\n font-family: 'Source Serif 4';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/sourceserif4/v15/vEFI2_tTDB4M7-auWDN0ahZJW1gY8tenXg.woff2) format('woff2');\n unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;\n}\n/* vietnamese */\n@font-face {\n font-family: 'Source Serif 4';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/sourceserif4/v15/vEFI2_tTDB4M7-auWDN0ahZJW1gU8tenXg.woff2) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n font-family: 'Source Serif 4';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/sourceserif4/v15/vEFI2_tTDB4M7-auWDN0ahZJW1gV8tenXg.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'Source Serif 4';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/sourceserif4/v15/vEFI2_tTDB4M7-auWDN0ahZJW1gb8tc.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n/* cyrillic-ext */\n@font-face {\n font-family: 'Source Serif 4';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/sourceserif4/v15/vEFI2_tTDB4M7-auWDN0ahZJW1gW8tenXg.woff2) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n font-family: 'Source Serif 4';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/sourceserif4/v15/vEFI2_tTDB4M7-auWDN0ahZJW1gf8tenXg.woff2) format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* greek */\n@font-face {\n font-family: 'Source Serif 4';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/sourceserif4/v15/vEFI2_tTDB4M7-auWDN0ahZJW1gY8tenXg.woff2) format('woff2');\n unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;\n}\n/* vietnamese */\n@font-face {\n font-family: 'Source Serif 4';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/sourceserif4/v15/vEFI2_tTDB4M7-auWDN0ahZJW1gU8tenXg.woff2) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n font-family: 'Source Serif 4';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/sourceserif4/v15/vEFI2_tTDB4M7-auWDN0ahZJW1gV8tenXg.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'Source Serif 4';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/sourceserif4/v15/vEFI2_tTDB4M7-auWDN0ahZJW1gb8tc.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n/* cyrillic-ext */\n@font-face {\n font-family: 'Source Serif 4';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/sourceserif4/v15/vEFI2_tTDB4M7-auWDN0ahZJW1gW8tenXg.woff2) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n font-family: 'Source Serif 4';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/sourceserif4/v15/vEFI2_tTDB4M7-auWDN0ahZJW1gf8tenXg.woff2) format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* greek */\n@font-face {\n font-family: 'Source Serif 4';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/sourceserif4/v15/vEFI2_tTDB4M7-auWDN0ahZJW1gY8tenXg.woff2) format('woff2');\n unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;\n}\n/* vietnamese */\n@font-face {\n font-family: 'Source Serif 4';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/sourceserif4/v15/vEFI2_tTDB4M7-auWDN0ahZJW1gU8tenXg.woff2) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n font-family: 'Source Serif 4';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/sourceserif4/v15/vEFI2_tTDB4M7-auWDN0ahZJW1gV8tenXg.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'Source Serif 4';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/sourceserif4/v15/vEFI2_tTDB4M7-auWDN0ahZJW1gb8tc.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\nheader img,nav img{height:70px!important;max-height:70px!important;width:auto!important}body:has(.adsum-hide-page-title) h1{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}body:has(.adsum-hide-page-title) #header>div.prose{display:none!important}.callout[class*=bg-blue-50]{border-color:#00a9ce!important;background-color:rgba(0,169,206,.08)!important}.callout[class*=bg-blue-50] [class*=text-blue]{color:#0089a8!important}.dark .callout[class*=bg-blue-50]{border-color:#00a9ce!important;background-color:rgba(0,169,206,.16)!important}.dark .callout[class*=bg-blue-50] [class*=text-blue]{color:#6fd2e6!important}.adsum-gal{scroll-padding-inline:0;scroll-behavior:smooth;padding-bottom:4px;scrollbar-width:thin;scrollbar-color:#cfd7de transparent}.adsum-gal>div{flex:0 0 93%!important;width:auto!important}@media (min-width:1024px){.adsum-gal>div{flex-basis:94%!important}}@media (max-width:640px){.adsum-gal>div{flex-basis:90%!important}}.adsum-gal::-webkit-scrollbar{height:6px}.adsum-gal::-webkit-scrollbar-track{background:0 0}.adsum-gal::-webkit-scrollbar-thumb{background:#cfd7de;border-radius:3px}.dark .adsum-gal{scrollbar-color:#3a4551 transparent}.dark .adsum-gal::-webkit-scrollbar-thumb{background:#3a4551}.adsum-gal img,.adsum-gal+p img{cursor:zoom-in}.adsum-gal a[href^=\"#\"]{display:inline-flex;align-items:center;padding:3px 10px;border:1px solid #e3e8ed;border-radius:6px;color:#007e9c;font-weight:500;transition:border-color .15s,color .15s,background-color .15s}.adsum-gal a[href^=\"#\"]:hover{border-color:#00a9ce;background-color:rgba(0,169,206,.07)}.dark .adsum-gal a[href^=\"#\"]{border-color:#2b3742;color:#6fd2e6}.dark .adsum-gal a[href^=\"#\"]:hover{border-color:#00a9ce;background-color:rgba(0,169,206,.14)}.adsum-gal .font-mono{font-weight:600;letter-spacing:.14em}.adsum-gal video{display:block;width:100%;border-radius:.75rem}@media (prefers-reduced-motion:reduce){.adsum-gal{scroll-behavior:auto}.adsum-gal a[href^=\"#\"]{transition:none}}.adsum-fig{--af-rule:#e6e9ee;--af-ink:#16202b;--af-mut:#667382;--af-faint:#667382;--af-accent:#C2562F;--af-soft:#fafbfc;margin:1.75rem 0;font-feature-settings:\"tnum\" 1}.dark .adsum-byline,.dark .adsum-fig,.dark .adsum-lanes,.dark .adsum-mast,.dark .adsum-order,.dark .adsum-readout,.dark .adsum-roles,.dark .adsum-track{--af-rule:#262f3a;--af-ink:#e9eef4;--af-mut:#94a1ae;--af-faint:#7d8a97;--af-accent:#E89478;--af-soft:#141a21}.adsum-fig *{line-height:1.45}.adsum-ladder{border-top:1px solid var(--af-rule)}.adsum-tier{display:grid;grid-template-columns:8.25rem 1fr;gap:0 1.1rem;padding:.95rem 0;border-bottom:1px solid var(--af-rule);align-items:start}.adsum-when{font-weight:650!important;text-transform:uppercase;color:var(--af-accent)!important;padding-top:.18rem;white-space:nowrap}.adsum-what{min-width:0}.adsum-what b{display:block;font-size:.975rem!important;font-weight:600!important;color:var(--af-ink)!important;margin-bottom:.18rem}.adsum-what span{display:block;font-size:.855rem!important;color:var(--af-mut)!important}@media (max-width:540px){.adsum-tier{grid-template-columns:1fr;gap:.3rem}.adsum-when{padding-top:0}}.adsum-pipe{position:relative;padding-left:1.4rem}.adsum-pipe::before{content:\"\";position:absolute;left:.3rem;top:.55rem;bottom:3.1rem;width:1px;background:var(--af-rule)}.adsum-return,.adsum-step{position:relative;padding:0 0 1.05rem}.adsum-step::before{content:\"\";position:absolute;left:-1.4rem;top:.42rem;width:.44rem;height:.44rem;border-radius:50%;background:var(--af-faint);box-shadow:0 0 0 3px var(--af-soft)}.adsum-step b{display:block;font-size:.95rem!important}.adsum-step span{display:block;margin-top:.1rem}.adsum-step.is-key::before{background:var(--af-accent);width:.56rem;height:.56rem;left:-1.46rem;top:.38rem}.adsum-hop-b .adsum-hop-s.is-live,.adsum-step.is-key b{color:var(--af-accent)!important}.adsum-return{margin-top:.25rem;padding:.7rem .9rem;border:1px dashed var(--af-rule);border-radius:.45rem;background:var(--af-soft);font-size:.855rem!important;color:var(--af-mut)!important}.adsum-return::before{content:\"\\2191\";position:absolute;left:-1.52rem;top:.62rem;font-size:.82rem;color:var(--af-accent);line-height:1}.adsum-lane b,.adsum-return b,.adsum-step b{color:var(--af-ink)!important;font-weight:600!important}.adsum-lanes{border-top:1px solid var(--af-rule)}.adsum-lane,.adsum-mast>div{border-bottom:1px solid var(--af-rule)}.adsum-lane{display:grid;grid-template-columns:8.25rem 1fr;gap:0 1.1rem;padding:.7rem 0;align-items:baseline}.adsum-lane b{font-weight:650!important}.adsum-lane span,.adsum-step span{font-size:.855rem!important;color:var(--af-mut)!important}.adsum-verdict{margin-top:.85rem;padding-left:.9rem;border-left:2px solid var(--af-accent);font-size:.9rem!important;color:var(--af-ink)!important}.adsum-verdict b{color:var(--af-accent)!important;font-weight:600!important}@media (max-width:540px){.adsum-lane{grid-template-columns:1fr;gap:.2rem}}.adsum-cap{margin-top:.8rem;font-size:.8rem!important;color:var(--af-faint)!important}.adsum-byline,.adsum-lanes,.adsum-mast,.adsum-order,.adsum-readout,.adsum-roles,.adsum-track{--af-rule:#e6e9ee;--af-ink:#16202b;--af-mut:#667382;--af-faint:#667382;--af-accent:#C2562F;--af-soft:#fafbfc;font-feature-settings:\"tnum\" 1}.adsum-mono{font-family:ui-monospace,SFMono-Regular,\"SF Mono\",Menlo,Consolas,monospace}.adsum-mast{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));border-top:1px solid var(--af-rule);border-left:1px solid var(--af-rule);margin:1.5rem 0}.adsum-mast>div{border-right:1px solid var(--af-rule);padding:.78rem .9rem .85rem;min-width:0}.adsum-mast-k{display:block;font-size:.645rem!important;font-weight:650!important;letter-spacing:.1em;text-transform:uppercase;color:var(--af-faint)!important;margin-bottom:.45rem;line-height:1.3!important}.adsum-mast-v{display:block;font-family:ui-monospace,SFMono-Regular,\"SF Mono\",Menlo,Consolas,monospace;font-size:1.12rem!important;font-weight:600!important;color:var(--af-ink)!important;line-height:1.15!important;letter-spacing:-.01em}.adsum-mast-n{display:block;font-size:.72rem!important;color:var(--af-mut)!important;margin-top:.34rem;line-height:1.35!important}.adsum-byline{display:flex;flex-wrap:wrap;gap:.3rem 1.1rem;margin:1.1rem 0 0;font-family:ui-monospace,SFMono-Regular,\"SF Mono\",Menlo,Consolas,monospace;font-size:.715rem!important;color:var(--af-faint)!important;line-height:1.5!important}.adsum-byline b{color:var(--af-mut)!important;font-weight:500!important}.adsum-roles{border-top:1px solid var(--af-rule);margin:1.5rem 0}.adsum-role{padding:.85rem 0 .9rem;border-bottom:1px solid var(--af-rule)}.adsum-role b{display:block;font-size:.675rem!important;font-weight:650!important;letter-spacing:.095em;text-transform:uppercase;color:var(--af-accent)!important;margin-bottom:.3rem}.adsum-hop-b>span,.adsum-role span,.adsum-trk-t span{display:block;font-size:.875rem!important;color:var(--af-mut)!important}.adsum-order{border-top:1px solid var(--af-rule);margin:1.5rem 0}.adsum-hop{display:grid;grid-template-columns:1.5rem minmax(0,1fr);gap:0 .85rem;padding:.78rem 0 .82rem;border-bottom:1px solid var(--af-rule);align-items:start}.adsum-hop-b .adsum-hop-s,.adsum-hop-n{font-family:ui-monospace,SFMono-Regular,\"SF Mono\",Menlo,Consolas,monospace;font-weight:600!important}.adsum-hop-n{font-size:.8rem!important;color:var(--af-accent)!important;padding-top:.1rem}.adsum-hop-b{min-width:0}.adsum-hop-b b,.adsum-trk-t b{font-size:.95rem!important;font-weight:600!important;color:var(--af-ink)!important}.adsum-hop-b .adsum-hop-s{display:inline!important;margin-top:0!important;font-size:.625rem!important;letter-spacing:.09em;text-transform:uppercase;margin-left:.55rem;white-space:nowrap}.adsum-hop-b>span,.adsum-trk-t span{font-size:.845rem!important;margin-top:.18rem}.adsum-hop-b .adsum-hop-s,.adsum-hop.is-absent .adsum-hop-b b,.adsum-hop.is-absent .adsum-hop-n,.adsum-trk.is-skipped .adsum-trk-n,.adsum-trk.is-skipped .adsum-trk-t b{color:var(--af-faint)!important}.adsum-track{border-top:1px solid var(--af-rule);margin:1.5rem 0}.adsum-trk{display:grid;grid-template-columns:1.5rem minmax(0,1fr) auto;gap:0 .85rem;padding:.72rem 0 .76rem;border-bottom:1px solid var(--af-rule);align-items:baseline}.adsum-trk-n{font-family:ui-monospace,SFMono-Regular,\"SF Mono\",Menlo,Consolas,monospace;font-size:.8rem!important;font-weight:600!important;color:var(--af-accent)!important}.adsum-trk-t{min-width:0}.adsum-trk-t b{display:block;font-size:.925rem!important}.adsum-trk-t span{font-size:.835rem!important;margin-top:.14rem}.adsum-trk-h{font-family:ui-monospace,SFMono-Regular,\"SF Mono\",Menlo,Consolas,monospace;font-size:.615rem!important;font-weight:650!important;letter-spacing:.09em;text-transform:uppercase;color:var(--af-accent)!important;white-space:nowrap;padding-top:.16rem}.adsum-readout{border:1px solid var(--af-rule);border-left:2px solid var(--af-accent);margin:1.5rem 0}.adsum-readout-h,.adsum-readout-row{border-bottom:1px solid var(--af-rule)}.adsum-readout-h{display:block;padding:.58rem .95rem;background:var(--af-soft);font-size:.655rem!important;font-weight:650!important;letter-spacing:.095em;text-transform:uppercase;color:var(--af-mut)!important}.adsum-readout-row{display:grid;grid-template-columns:minmax(0,10.5rem) minmax(0,1fr);gap:0 1rem;margin:0 .95rem}.adsum-readout-row:last-child{border-bottom:0}.adsum-readout-k{font-size:.845rem!important;color:var(--af-mut)!important;padding:.52rem 0}.adsum-lanes.is-ports .adsum-lane b,.adsum-readout-v{font-family:ui-monospace,SFMono-Regular,\"SF Mono\",Menlo,Consolas,monospace}.adsum-readout-v{font-size:.8rem!important;color:var(--af-ink)!important;padding:.52rem 0}.adsum-lanes.is-ports .adsum-lane{grid-template-columns:4.6rem minmax(0,1fr)}.adsum-lanes.is-ports .adsum-lane b{font-size:.78rem!important}@media (max-width:540px){.adsum-mast{grid-template-columns:minmax(0,1fr)}.adsum-readout-row{grid-template-columns:1fr;gap:0}.adsum-readout-k{padding-bottom:0}.adsum-readout-v{padding-top:.12rem}.adsum-trk{grid-template-columns:1.5rem minmax(0,1fr)}.adsum-trk-h{grid-column:2;padding-top:.25rem}.adsum-lanes.is-ports .adsum-lane{grid-template-columns:1fr;gap:.2rem}}:root{--ad-serif:\"Source Serif 4\", Georgia, \"Times New Roman\", serif;--ad-mono:\"IBM Plex Mono\", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;--ad-sans:\"Archivo\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif}#content h2,#content-area h1#page-title{font-weight:700!important;text-wrap:balance}#content-area h1#page-title{letter-spacing:-.028em!important;line-height:1.08!important;max-width:22ch}#content h2{letter-spacing:-.02em!important;line-height:1.15!important;margin-top:3rem!important}#content h3{font-weight:650!important;letter-spacing:-.012em!important;margin-top:2.2rem!important}#header .eyebrow{font-family:var(--ad-mono)!important;font-size:.68rem!important;font-weight:600!important;letter-spacing:.14em!important;text-transform:uppercase!important}#header .prose p{font-family:var(--ad-serif)!important;font-size:1.2rem!important;line-height:1.5!important;max-width:60ch;text-wrap:pretty}#content>blockquote p,#content>blockquote span[data-as=p],#content>ol>li,#content>p,#content>span[data-as=p],#content>ul>li{font-family:var(--ad-serif)!important;font-size:1.075rem!important;line-height:1.62!important;text-wrap:pretty}#content>p,#content>span[data-as=p]{max-width:66ch}#content>ol>li strong,#content>p strong,#content>span[data-as=p] strong,#content>ul>li strong{font-weight:600}#content code:not(pre code){font-family:var(--ad-mono)!important;font-size:.86em!important}#content table{font-family:var(--ad-sans);font-size:.9rem}#content thead th{font-family:var(--ad-mono)!important;font-size:.64rem!important;font-weight:600!important;letter-spacing:.11em;text-transform:uppercase;color:#667382!important;padding-top:.55rem!important;padding-bottom:.55rem!important}.dark #content .adsum-fine,.dark #content thead th,.dark #content>p.adsum-fine{color:#94a1ae!important}#content tbody td{padding-top:.62rem!important;padding-bottom:.62rem!important;vertical-align:top}#content tbody td:first-child,#content tbody td:first-child strong{font-weight:600}#content table code{font-size:.8rem!important}#content [class*=caption],#content figcaption{font-family:var(--ad-sans);font-size:.82rem;line-height:1.45}#content .callout,#content a[class*=card],#content div[class*=card]{border-radius:6px!important}#content .steps [class*=step] h3,#content .steps h3{font-weight:600!important}#content table code,.adsum-byline,.adsum-hop-b .adsum-hop-s,.adsum-hop-n,.adsum-lane b,.adsum-lanes.is-ports .adsum-lane b,.adsum-mast-k,.adsum-mast-v,.adsum-mono,.adsum-readout-h,.adsum-readout-v,.adsum-trk-h,.adsum-trk-n,.adsum-when{font-family:var(--ad-mono)!important}.adsum-when{letter-spacing:.1em;font-size:.68rem!important}.adsum-lane b{font-size:.74rem!important;letter-spacing:.06em;text-transform:uppercase}.adsum-cap,.adsum-hop-b b,.adsum-hop-b>span,.adsum-lane span,.adsum-mast-n,.adsum-readout-k,.adsum-return,.adsum-role b,.adsum-role span,.adsum-step b,.adsum-step span,.adsum-trk-t b,.adsum-trk-t span,.adsum-verdict,.adsum-what b,.adsum-what span{font-family:var(--ad-sans)!important}#content thead tr:not(:has(th:not(:empty))){display:none}#content .adsum-fine,#content>p.adsum-fine{font-family:var(--ad-sans)!important;font-size:.82rem!important;line-height:1.5!important;color:#667382!important;max-width:66ch}#banner{background-color:#007e9c!important}.adsum-cta{display:flex;flex-wrap:wrap;gap:.75rem;margin:1.35rem 0 1.9rem}.adsum-cta a{display:inline-flex;align-items:center;padding:.62rem 1.05rem;border-radius:.75rem;font-size:.95rem;font-weight:600;line-height:1.2;text-decoration:none!important;border-bottom:none!important;transition:background-color .15s ease,border-color .15s ease}.adsum-cta a.adsum-cta-primary{background:#007e9c;color:#fff!important;border:1px solid #007e9c!important}.adsum-cta a.adsum-cta-primary:hover{background:#006b85;border-color:#006b85!important}.adsum-cta a.adsum-cta-ghost{color:#007e9c!important;border:1px solid #007e9c!important}.adsum-cta a.adsum-cta-ghost:hover{background:rgba(0,126,156,.08)}.dark .adsum-cta a.adsum-cta-ghost{color:#6fd2e6!important;border-color:#2f8ea3!important}.dark .adsum-cta a.adsum-cta-ghost:hover{background:rgba(111,210,230,.08)}.adsum-cta a:focus-visible{outline:2px solid #6fd2e6;outline-offset:2px}@media (prefers-reduced-motion:reduce){.adsum-cta a{transition:none}}.adsum-hero{margin:1.5rem 0 2rem;border:1px solid #22323d;border-radius:14px;overflow:hidden;background:#0d161b;outline:0}.adsum-hero:focus-visible{box-shadow:0 0 0 2px #6fd2e6}.adsum-hero-screen{aspect-ratio:16/9;background:#0d161b}.adsum-hero-screen img{display:block;width:100%;height:100%;margin:0!important;border-radius:0!important}.adsum-hero-ctl{display:flex;align-items:center;gap:.4rem;padding:.55rem .7rem;background:#101b22;border-top:1px solid #22323d}.adsum-hero-btn{flex:none;width:2rem;height:2rem;border-radius:.55rem;border:1px solid #2a3b46;background:0 0;color:#c3d0d8;font-size:1rem;line-height:1;cursor:pointer;display:inline-flex;align-items:center;justify-content:center}.adsum-hero-btn:hover{background:#1a2a33;color:#fff}.adsum-hero-btn.is-play{background:#007e9c;border-color:#007e9c;color:#fff;font-size:.7rem;letter-spacing:.05em}.adsum-hero-btn.is-play:hover{background:#006b85}.adsum-hero-btn:focus-visible,.adsum-hero-dot:focus-visible{outline:2px solid #6fd2e6;outline-offset:2px}.adsum-hero-dots{display:flex;gap:.3rem;flex:1;margin-left:.45rem;min-width:0;align-items:center}.adsum-hero-dot{flex:1;min-width:0;height:1.6rem;padding:0;border:0;background:0 0;cursor:pointer;position:relative}.adsum-hero-dot::after{content:\"\";position:absolute;left:0;right:0;top:50%;height:4px;margin-top:-2px;border-radius:2px;background:#22323d}.adsum-hero-dot:hover::after{background:#4b6472}.adsum-hero-dot.is-on::after{background:#e8714f}.adsum-hero-now{flex:none;margin:0 .5rem 0 .6rem;font-size:.78rem;color:#c3d0d8;white-space:nowrap}.adsum-hero-now b{color:#e8714f;font-weight:600;margin-right:.3rem;font-variant-numeric:tabular-nums}.adsum-hero:fullscreen{display:flex;flex-direction:column;justify-content:center;border:0;border-radius:0;background:#0d161b}.adsum-hero:fullscreen .adsum-hero-screen{aspect-ratio:auto;flex:1;min-height:0;display:flex;align-items:center;justify-content:center}.adsum-hero:fullscreen .adsum-hero-screen img{width:auto;height:auto;max-width:100%;max-height:100%}@media (max-width:640px){.adsum-hero-now{display:none}}#content a.link{color:#00798f;border-bottom-color:rgba(0,121,143,.45)}#content a.link:hover{color:#00677a;border-bottom-color:#00677a}html.dark #content a.link{color:#3db8cc;border-bottom-color:rgba(61,184,204,.45)}html.dark #content a.link:hover{color:#62c8d8;border-bottom-color:#62c8d8}#navbar span.bg-primary-dark{background-color:#00798f!important}.adsum-gw{display:grid;gap:20px;margin:24px 0 0}.adsum-gw-feature{grid-template-columns:repeat(2,minmax(0,1fr))}.adsum-gw-more{grid-template-columns:repeat(3,minmax(0,1fr));margin-top:20px}@media (max-width:900px){.adsum-gw-more{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (max-width:640px){.adsum-gw-feature,.adsum-gw-more{grid-template-columns:minmax(0,1fr)}}a.adsum-gw-card{display:flex;flex-direction:column;overflow:hidden;border:1px solid rgba(15,26,32,.12)!important;border-radius:12px;background:#fff;text-decoration:none!important;color:inherit;transition:border-color .15s,box-shadow .15s}a.adsum-gw-card:focus-visible,a.adsum-gw-card:hover{border-color:#00798f!important;box-shadow:0 6px 22px rgba(15,26,32,.1)}a.adsum-gw-card img{display:block;width:100%;height:auto;margin:0!important;border:0;border-radius:0;background:#f6f8f9}.adsum-gw-text{display:flex;flex-direction:column;gap:3px;padding:14px 16px 16px;border-top:1px solid rgba(15,26,32,.08)}.adsum-gw-text b{font-family:Archivo,\"IBM Plex Sans\",sans-serif;font-weight:800;font-size:19px;letter-spacing:-.01em;color:#13181c}.adsum-gw-text>span:last-child{font-size:14px;line-height:1.5;color:#4b5661}.adsum-gw-tag{font:600 10.5px/1.2 \"IBM Plex Mono\",ui-monospace,monospace;letter-spacing:.12em;text-transform:uppercase;color:#c75b37}.adsum-gw-more .adsum-gw-text b{font-size:16px}.adsum-gw-note{margin:10px 0 0!important;font:400 12px/1.4 \"IBM Plex Mono\",ui-monospace,monospace;color:#69757f}html.dark a.adsum-gw-card{background:#111c22;border-color:rgba(233,238,241,.14)!important}html.dark a.adsum-gw-card:focus-visible,html.dark a.adsum-gw-card:hover{border-color:#3db8cc!important}html.dark .adsum-gw-text{border-top-color:rgba(233,238,241,.1)}html.dark .adsum-gw-text b{color:#e9eef1}html.dark .adsum-gw-text>span:last-child{color:#b4c0c7}html.dark .adsum-gw-tag{color:#e3825f}html.dark .adsum-gw-note{color:#8d9ca5}@media (max-width:640px){.adsum-gw-more a.adsum-gw-card{flex-direction:row;align-items:center}.adsum-gw-more a.adsum-gw-card img{width:120px;height:90px;object-fit:contain;flex:none}.adsum-gw-more .adsum-gw-text{border-top:0;border-left:1px solid rgba(15,26,32,.08);align-self:stretch;justify-content:center}html.dark .adsum-gw-more .adsum-gw-text{border-left-color:rgba(233,238,241,.1)}.adsum-gw-more{gap:12px}}"}],"page":{"pagePath":"index","slug":"/","pageMetadata":{"title":"AI coding agent for embedded IoT firmware","sidebarTitle":"Adsum IoT Coder","description":"Open-source VS Code AI coding agent for Nordic nRF and Espressif ESP32 firmware, with hardware-verified expert knowledge and one-click EU CRA readiness.","href":"/index"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Open-source VS Code AI coding agent for Nordic nRF and Espressif ESP32 firmware, with hardware-verified expert knowledge and one-click EU CRA readiness.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];const HeroStepper=()=>{const SCENES=[{name:`The promise`,frames:[[0,1600],[1,1400],[2,2800]],alt:`Put a secure, working IoT product in front of customers in weeks, not quarters. Prove its value early.`},{name:`It knows the board`,frames:[[3,1100],[4,3700]],alt:`Adsum IoT Coder recognises the BLG20x and offers ready firmware.`},{name:`You approve every step`,frames:[[5,1100],[6,3700]],alt:`The agent asks before anything is written to the hardware.`},{name:`Verified firmware`,frames:[[7,1100],[8,3700]],alt:`Every image is checked against its hash before it is flashed.`},{name:`From a browser`,frames:[[9,1100],[10,3700]],alt:`The unit is commissioned from a browser and reads every value back.`},{name:`Secure by design`,frames:[[11,1100],[12,3700]],alt:`The unit refuses a bad setting and says what to do instead.`},{name:`Your platform`,frames:[[13,1100],[14,3700]],alt:`The first readings arrive on your own data platform.`},{name:`Weeks, not quarters`,frames:[[15,6e3]],alt:`A working product in weeks, not quarters. Prove its value early on open industrial hardware.`}];const src=n=>`/images/hero/hero-${String(n).padStart(2,`0`)}.webp`;const still=typeof window!==`undefined`\u0026\u0026window.matchMedia\u0026\u0026window.matchMedia(`(prefers-reduced-motion: reduce)`).matches;const[scene,setScene]=useState(0);const[frame,setFrame]=useState(0);const[playing,setPlaying]=useState(!still);const[held,setHeld]=useState(false);useEffect(()=>{if(!playing||held)return;const[,ms]=SCENES[scene].frames[frame];const t=setTimeout(()=>{if(frame+1\u003cSCENES[scene].frames.length)setFrame(frame+1);else{setScene((scene+1)%SCENES.length);setFrame(0)}},ms);return()=>clearTimeout(t)},[scene,frame,playing,held]);const go=i=>{const k=(i+SCENES.length)%SCENES.length;setPlaying(false);setScene(k);setFrame(SCENES[k].frames.length-1)};const onKey=e=>{if(e.key===`ArrowRight`){e.preventDefault();go(scene+1)}if(e.key===`ArrowLeft`){e.preventDefault();go(scene-1)}if(e.key===` `){e.preventDefault();setPlaying(!playing)}};const cur=SCENES[scene];const box=useRef(null);const full=()=>{const el=box.current;if(!el)return;if(document.fullscreenElement)document.exitFullscreen();else if(el.requestFullscreen)el.requestFullscreen()};return _jsxs(`div`,{ref:box,className:`adsum-hero`,role:`group`,\"aria-roledescription\":`carousel`,\"aria-label\":`One real run on the Fanstel BLG20x, step by step`,tabIndex:0,onKeyDown:onKey,onMouseEnter:()=>setHeld(true),onMouseLeave:()=>setHeld(false),children:[_jsxs(`div`,{className:`adsum-hero-screen`,children:[_jsx(`img`,{src:src(cur.frames[frame][0]),alt:cur.alt,style:{pointerEvents:`none`}}),_jsx(`img`,{src:src(SCENES[(scene+1)%SCENES.length].frames[0][0]),alt:``,\"aria-hidden\":`true`,style:{display:`none`}})]}),_jsxs(`div`,{className:`adsum-hero-ctl`,children:[_jsx(`button`,{type:`button`,className:`adsum-hero-btn`,onClick:()=>go(scene-1),\"aria-label\":`Previous step`,children:`‹`}),_jsx(`button`,{type:`button`,className:`adsum-hero-btn is-play`,onClick:()=>setPlaying(!playing),\"aria-label\":playing?`Pause`:`Play`,children:playing?`❚❚`:`▶`}),_jsx(`button`,{type:`button`,className:`adsum-hero-btn`,onClick:()=>go(scene+1),\"aria-label\":`Next step`,children:`›`}),_jsx(`div`,{className:`adsum-hero-dots`,children:SCENES.map((s,i)=>_jsx(`button`,{type:`button`,className:`adsum-hero-dot`+(i===scene?` is-on`:``),onClick:()=>go(i),\"aria-label\":`Step ${i+1}: ${s.name}`,\"aria-current\":i===scene?`true`:undefined,title:s.name},i))}),_jsxs(`div`,{className:`adsum-hero-now`,\"aria-live\":`polite`,children:[_jsxs(`b`,{children:[scene+1,`/`,SCENES.length]}),` `,cur.name]}),_jsx(`button`,{type:`button`,className:`adsum-hero-btn`,onClick:full,\"aria-label\":`Full screen`,title:`Full screen`,children:`⤢`})]})]})};function _createMdxContent(props){const _components={a:`a`,hr:`hr`,p:`p`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,..._provideComponents(),...props.components},{Heading,OptimizedImage,Table,_MdxComponentBoundary}=_components;if(!Heading)_missingMdxReference(`Heading`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Table)_missingMdxReference(`Table`,true);if(!_MdxComponentBoundary)_missingMdxReference(`_MdxComponentBoundary`,true);return _jsxs(_Fragment,{children:[_jsx(`div`,{className:`adsum-hide-page-title`}),`\n`,_jsx(OptimizedImage,{className:`mint-block dark:mint-hidden mint-w-full`,src:`https://mintcdn.com/adsumnetworks/VxzM9Hecq_o9i_Ol/images/banner-light.png?fit=max\u0026auto=format\u0026n=VxzM9Hecq_o9i_Ol\u0026q=85\u0026s=fa701e63e51eb1ea28c693d964c5456d`,alt:`Work with Adsum IoT Coder`,\"data-og-width\":`4285`,width:`4285`,\"data-og-height\":`1113`,height:`1113`,\"data-path\":`images/banner-light.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/adsumnetworks/VxzM9Hecq_o9i_Ol/images/banner-light.png?w=280\u0026fit=max\u0026auto=format\u0026n=VxzM9Hecq_o9i_Ol\u0026q=85\u0026s=c8fd4a882a72fce89e0570a3a76d5c55 280w, https://mintcdn.com/adsumnetworks/VxzM9Hecq_o9i_Ol/images/banner-light.png?w=560\u0026fit=max\u0026auto=format\u0026n=VxzM9Hecq_o9i_Ol\u0026q=85\u0026s=ff479f60fb6d4f3666c74cb18bb31495 560w, https://mintcdn.com/adsumnetworks/VxzM9Hecq_o9i_Ol/images/banner-light.png?w=840\u0026fit=max\u0026auto=format\u0026n=VxzM9Hecq_o9i_Ol\u0026q=85\u0026s=beb99643bdaa38a7b983087ddc181d21 840w, https://mintcdn.com/adsumnetworks/VxzM9Hecq_o9i_Ol/images/banner-light.png?w=1100\u0026fit=max\u0026auto=format\u0026n=VxzM9Hecq_o9i_Ol\u0026q=85\u0026s=d1da3e50e1d21dd3b329bab90416af10 1100w, https://mintcdn.com/adsumnetworks/VxzM9Hecq_o9i_Ol/images/banner-light.png?w=1650\u0026fit=max\u0026auto=format\u0026n=VxzM9Hecq_o9i_Ol\u0026q=85\u0026s=66eb5d3561d7387a20e148e80913680e 1650w, https://mintcdn.com/adsumnetworks/VxzM9Hecq_o9i_Ol/images/banner-light.png?w=2500\u0026fit=max\u0026auto=format\u0026n=VxzM9Hecq_o9i_Ol\u0026q=85\u0026s=f6849ec0f011e1ce57cabf7a6c496847 2500w`}),`\n`,_jsx(OptimizedImage,{className:`mint-hidden dark:mint-block mint-w-full`,src:`https://mintcdn.com/adsumnetworks/VxzM9Hecq_o9i_Ol/images/banner-dark.png?fit=max\u0026auto=format\u0026n=VxzM9Hecq_o9i_Ol\u0026q=85\u0026s=96da1585aeee72c0fb6b5f13049f1534`,alt:`Work with Adsum IoT Coder`,\"data-og-width\":`4285`,width:`4285`,\"data-og-height\":`1113`,height:`1113`,\"data-path\":`images/banner-dark.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/adsumnetworks/VxzM9Hecq_o9i_Ol/images/banner-dark.png?w=280\u0026fit=max\u0026auto=format\u0026n=VxzM9Hecq_o9i_Ol\u0026q=85\u0026s=984b953675cf0534915b61b381ec5bae 280w, https://mintcdn.com/adsumnetworks/VxzM9Hecq_o9i_Ol/images/banner-dark.png?w=560\u0026fit=max\u0026auto=format\u0026n=VxzM9Hecq_o9i_Ol\u0026q=85\u0026s=f39cb53caa4f3c0c4f35a88f17d9b8a4 560w, https://mintcdn.com/adsumnetworks/VxzM9Hecq_o9i_Ol/images/banner-dark.png?w=840\u0026fit=max\u0026auto=format\u0026n=VxzM9Hecq_o9i_Ol\u0026q=85\u0026s=3d8da4437c84cee18ebd4951202772d6 840w, https://mintcdn.com/adsumnetworks/VxzM9Hecq_o9i_Ol/images/banner-dark.png?w=1100\u0026fit=max\u0026auto=format\u0026n=VxzM9Hecq_o9i_Ol\u0026q=85\u0026s=8598cde990cc831904e31ee036493baf 1100w, https://mintcdn.com/adsumnetworks/VxzM9Hecq_o9i_Ol/images/banner-dark.png?w=1650\u0026fit=max\u0026auto=format\u0026n=VxzM9Hecq_o9i_Ol\u0026q=85\u0026s=3a0109f8161a7bc71a653b87a0ca0ec8 1650w, https://mintcdn.com/adsumnetworks/VxzM9Hecq_o9i_Ol/images/banner-dark.png?w=2500\u0026fit=max\u0026auto=format\u0026n=VxzM9Hecq_o9i_Ol\u0026q=85\u0026s=5d1dbc5a9f2ff992a513f662846751ff 2500w`}),`\n`,_jsx(Heading,{level:`2`,id:`put-a-secure-working-iot-product-in-front-of-customers-in-weeks-not-quarters-prove-its-value-early`,children:`Put a secure, working IoT product in front of customers in weeks, not quarters. Prove its value early.`}),`\n`,_jsxs(`p`,{className:`mint-mt-4 mint-text-lg mint-text-gray-500 dark:mint-text-gray-400`,children:[`Adsum IoT Coder is an AI coding agent for embedded IoT, augmented with expert knowledge that was verified on real hardware by engineers who have shipped. It reads your whole bench, not only your code, and you approve every step. Try it now, with no key, no account and no card. `,_jsx(`a`,{href:`https://marketplace.visualstudio.com/items?itemName=AdsumNetwork.nrf-ai-debugger`,target:`_blank`,rel:`noopener noreferrer`,className:`mint-no-underline`,style:{textDecoration:`none`,borderBottom:`none`},children:_jsx(OptimizedImage,{src:`https://badgen.net/vs-marketplace/i/AdsumNetwork.nrf-ai-debugger?label=VS%20Code\u0026color=007ACC`,alt:`VS Code Marketplace installs`,className:`!mint-my-0 mint-inline-block mint-align-middle mint-h-5`,style:{pointerEvents:`none`}})}),` `,_jsx(`a`,{href:`https://open-vsx.org/extension/AdsumNetwork/nrf-ai-debugger`,target:`_blank`,rel:`noopener noreferrer`,className:`mint-no-underline`,style:{textDecoration:`none`,borderBottom:`none`},children:_jsx(OptimizedImage,{src:`https://badgen.net/open-vsx/d/AdsumNetwork/nrf-ai-debugger?label=Open%20VSX\u0026color=C160EF`,alt:`Open VSX installs`,className:`!mint-my-0 mint-inline-block mint-align-middle mint-h-5`,style:{pointerEvents:`none`}})})]}),`\n`,_jsxs(`div`,{className:`adsum-cta`,children:[_jsx(`a`,{className:`adsum-cta-primary`,href:`https://marketplace.visualstudio.com/items?itemName=AdsumNetwork.nrf-ai-debugger`,target:`_blank`,rel:`noopener noreferrer`,children:`Install from the VS Code Marketplace →`}),_jsx(_components.a,{className:`adsum-cta-ghost`,href:`/getting-started`,children:`Run the free sample →`})]}),`\n`,_jsx(`div`,{id:`run`,children:_jsx(_MdxComponentBoundary,{name:`HeroStepper`,children:_jsx(HeroStepper,{})})}),`\n`,_jsxs(`div`,{className:`adsum-mast`,children:[_jsxs(`div`,{children:[_jsx(`span`,{className:`adsum-mast-k`,children:`How fast, from nothing?`}),_jsx(`span`,{className:`adsum-mast-v`,children:`Under 2 hours`}),_jsx(`span`,{className:`adsum-mast-n`,children:`From an empty folder to a working LEW840x gateway on the real board.`})]}),_jsxs(`div`,{children:[_jsx(`span`,{className:`adsum-mast-k`,children:`How fast, from a signed image?`}),_jsx(`span`,{className:`adsum-mast-v`,children:`About 3 minutes`}),_jsx(`span`,{className:`adsum-mast-n`,children:`Flash it and watch live data reach your own broker.`})]}),_jsxs(`div`,{children:[_jsx(`span`,{className:`adsum-mast-k`,children:`Better than a general agent?`}),_jsx(`span`,{className:`adsum-mast-v`,children:`4× the bugs fixed`}),_jsx(`span`,{className:`adsum-mast-n`,children:`On the first flash, same model, real hardware. Open benchmark.`})]}),_jsxs(`div`,{children:[_jsx(`span`,{className:`adsum-mast-k`,children:`What does it cost to try?`}),_jsx(`span`,{className:`adsum-mast-v`,children:`Nothing`}),_jsx(`span`,{className:`adsum-mast-n`,children:`No key, no account, no card.`})]})]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`five-open-hardware-gateways-built-this-way-and-more-coming`,children:`Five open-hardware gateways built this way, and more coming`}),`\n`,_jsxs(`div`,{className:`adsum-gw adsum-gw-feature`,children:[_jsxs(_components.a,{className:`adsum-gw-card`,href:`/supported-hardware/fanstel/blg20x`,children:[_jsx(OptimizedImage,{src:`https://mintcdn.com/adsumnetworks/afduMwBU8gsXmj5m/images/gateways/blg20x.jpg?fit=max\u0026auto=format\u0026n=afduMwBU8gsXmj5m\u0026q=85\u0026s=36dd2026869aee9af2b24dddeb611c8b`,alt:`The BLG20x enclosure, 90 mm wide, with its Adsum firmware label and the board inside, drawn to the same scale as the LBG20x`,width:`1749`,height:`1146`,\"data-og-width\":`1749`,\"data-og-height\":`1146`,\"data-path\":`images/gateways/blg20x.jpg`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/adsumnetworks/afduMwBU8gsXmj5m/images/gateways/blg20x.jpg?w=280\u0026fit=max\u0026auto=format\u0026n=afduMwBU8gsXmj5m\u0026q=85\u0026s=bf3ebec2f4949be47b2a36d01cd5bcc0 280w, https://mintcdn.com/adsumnetworks/afduMwBU8gsXmj5m/images/gateways/blg20x.jpg?w=560\u0026fit=max\u0026auto=format\u0026n=afduMwBU8gsXmj5m\u0026q=85\u0026s=d6c52f9ea9b3eb7b05a1936599422541 560w, https://mintcdn.com/adsumnetworks/afduMwBU8gsXmj5m/images/gateways/blg20x.jpg?w=840\u0026fit=max\u0026auto=format\u0026n=afduMwBU8gsXmj5m\u0026q=85\u0026s=5810532a8ac2f5de6f9e09b6bda8607a 840w, https://mintcdn.com/adsumnetworks/afduMwBU8gsXmj5m/images/gateways/blg20x.jpg?w=1100\u0026fit=max\u0026auto=format\u0026n=afduMwBU8gsXmj5m\u0026q=85\u0026s=de2128e81c4964cc6db0f61906aa1a91 1100w, https://mintcdn.com/adsumnetworks/afduMwBU8gsXmj5m/images/gateways/blg20x.jpg?w=1650\u0026fit=max\u0026auto=format\u0026n=afduMwBU8gsXmj5m\u0026q=85\u0026s=8ab19d9fb628ce7caeb67c15cc99bf3b 1650w, https://mintcdn.com/adsumnetworks/afduMwBU8gsXmj5m/images/gateways/blg20x.jpg?w=2500\u0026fit=max\u0026auto=format\u0026n=afduMwBU8gsXmj5m\u0026q=85\u0026s=7800f8c46cf85e2eb608bc4c821d27ee 2500w`}),_jsxs(`span`,{className:`adsum-gw-text`,children:[_jsx(`span`,{className:`adsum-gw-tag`,children:`Adsum NTN Relay · indoors`}),_jsx(`b`,{children:`BLG20x`}),_jsx(`span`,{children:`Bluetooth LE and Edge AI to Wi-Fi, cellular and satellite NB-NTN, at a fixed site.`})]})]}),_jsxs(_components.a,{className:`adsum-gw-card`,href:`/supported-hardware/fanstel/lbg20x`,children:[_jsx(OptimizedImage,{src:`https://mintcdn.com/adsumnetworks/afduMwBU8gsXmj5m/images/gateways/lbg20x.jpg?fit=max\u0026auto=format\u0026n=afduMwBU8gsXmj5m\u0026q=85\u0026s=fd4be4dd2cb166a74cc238f8778f843e`,alt:`The LBG20x enclosure, 141 mm wide, with its Adsum firmware label and its M.2 radio card, drawn to the same scale as the BLG20x`,width:`1749`,height:`1146`,\"data-og-width\":`1749`,\"data-og-height\":`1146`,\"data-path\":`images/gateways/lbg20x.jpg`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/adsumnetworks/afduMwBU8gsXmj5m/images/gateways/lbg20x.jpg?w=280\u0026fit=max\u0026auto=format\u0026n=afduMwBU8gsXmj5m\u0026q=85\u0026s=1579c09a750be7212d6bc45d7b35b1fb 280w, https://mintcdn.com/adsumnetworks/afduMwBU8gsXmj5m/images/gateways/lbg20x.jpg?w=560\u0026fit=max\u0026auto=format\u0026n=afduMwBU8gsXmj5m\u0026q=85\u0026s=b2175db1d8525d0dbab015a29551fdb9 560w, https://mintcdn.com/adsumnetworks/afduMwBU8gsXmj5m/images/gateways/lbg20x.jpg?w=840\u0026fit=max\u0026auto=format\u0026n=afduMwBU8gsXmj5m\u0026q=85\u0026s=3fdc7bc378b3cac288e7058078a1ebe6 840w, https://mintcdn.com/adsumnetworks/afduMwBU8gsXmj5m/images/gateways/lbg20x.jpg?w=1100\u0026fit=max\u0026auto=format\u0026n=afduMwBU8gsXmj5m\u0026q=85\u0026s=1abc44343caaa56cbd3aa4803e773234 1100w, https://mintcdn.com/adsumnetworks/afduMwBU8gsXmj5m/images/gateways/lbg20x.jpg?w=1650\u0026fit=max\u0026auto=format\u0026n=afduMwBU8gsXmj5m\u0026q=85\u0026s=1596a15623758c50ef3ddd3469808634 1650w, https://mintcdn.com/adsumnetworks/afduMwBU8gsXmj5m/images/gateways/lbg20x.jpg?w=2500\u0026fit=max\u0026auto=format\u0026n=afduMwBU8gsXmj5m\u0026q=85\u0026s=f7c7b751c62a912fca83709cde79e1a8 2500w`}),_jsxs(`span`,{className:`adsum-gw-text`,children:[_jsx(`span`,{className:`adsum-gw-tag`,children:`Adsum NTN Relay · outdoors`}),_jsx(`b`,{children:`LBG20x`}),_jsx(`span`,{children:`The same, IP67, fixed or on the move, with its own GNSS position.`})]})]})]}),`\n`,_jsx(`div`,{className:`adsum-gw-note`,children:`Both relays drawn to the same scale, each with the board inside.`}),`\n`,_jsxs(`div`,{className:`adsum-gw adsum-gw-more`,children:[_jsxs(_components.a,{className:`adsum-gw-card`,href:`/supported-hardware/fanstel/lew840x`,children:[_jsx(OptimizedImage,{src:`https://mintcdn.com/adsumnetworks/afduMwBU8gsXmj5m/images/gateways/lew840x.jpg?fit=max\u0026auto=format\u0026n=afduMwBU8gsXmj5m\u0026q=85\u0026s=b5ae09f0efdbd45c66246ca3fc3a26af`,alt:`The Fanstel LEW840x gateway, BLE to Wi-Fi and Ethernet`,width:`1200`,height:`900`,\"data-og-width\":`1200`,\"data-og-height\":`900`,\"data-path\":`images/gateways/lew840x.jpg`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/adsumnetworks/afduMwBU8gsXmj5m/images/gateways/lew840x.jpg?w=280\u0026fit=max\u0026auto=format\u0026n=afduMwBU8gsXmj5m\u0026q=85\u0026s=121bb17c934bd5693c2091fd96682752 280w, https://mintcdn.com/adsumnetworks/afduMwBU8gsXmj5m/images/gateways/lew840x.jpg?w=560\u0026fit=max\u0026auto=format\u0026n=afduMwBU8gsXmj5m\u0026q=85\u0026s=a2f4bff5f35f807cb59cfb8283d08f6b 560w, https://mintcdn.com/adsumnetworks/afduMwBU8gsXmj5m/images/gateways/lew840x.jpg?w=840\u0026fit=max\u0026auto=format\u0026n=afduMwBU8gsXmj5m\u0026q=85\u0026s=c2caa36d29d1d9d5c0882334a214e3cb 840w, https://mintcdn.com/adsumnetworks/afduMwBU8gsXmj5m/images/gateways/lew840x.jpg?w=1100\u0026fit=max\u0026auto=format\u0026n=afduMwBU8gsXmj5m\u0026q=85\u0026s=fd9a1813f36ea3936c1accd0e7fbf8f2 1100w, https://mintcdn.com/adsumnetworks/afduMwBU8gsXmj5m/images/gateways/lew840x.jpg?w=1650\u0026fit=max\u0026auto=format\u0026n=afduMwBU8gsXmj5m\u0026q=85\u0026s=09c0239c19f4285712e8725fbe92f632 1650w, https://mintcdn.com/adsumnetworks/afduMwBU8gsXmj5m/images/gateways/lew840x.jpg?w=2500\u0026fit=max\u0026auto=format\u0026n=afduMwBU8gsXmj5m\u0026q=85\u0026s=c62d90776b453670b91698be66964172 2500w`}),_jsxs(`span`,{className:`adsum-gw-text`,children:[_jsx(`b`,{children:`LEW840x`}),_jsx(`span`,{children:`BLE to Wi-Fi and Ethernet.`})]})]}),_jsxs(_components.a,{className:`adsum-gw-card`,href:`/supported-hardware/fanstel/lew840x-cellular`,children:[_jsx(OptimizedImage,{src:`https://mintcdn.com/adsumnetworks/afduMwBU8gsXmj5m/images/gateways/lew840x-cellular.jpg?fit=max\u0026auto=format\u0026n=afduMwBU8gsXmj5m\u0026q=85\u0026s=56bd66e526028692a1cc653a528d2171`,alt:`The Fanstel LEW840x gateway with the cellular card fitted`,width:`1200`,height:`900`,\"data-og-width\":`1200`,\"data-og-height\":`900`,\"data-path\":`images/gateways/lew840x-cellular.jpg`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/adsumnetworks/afduMwBU8gsXmj5m/images/gateways/lew840x-cellular.jpg?w=280\u0026fit=max\u0026auto=format\u0026n=afduMwBU8gsXmj5m\u0026q=85\u0026s=f5bb6de41006a4c31c27f34035062d22 280w, https://mintcdn.com/adsumnetworks/afduMwBU8gsXmj5m/images/gateways/lew840x-cellular.jpg?w=560\u0026fit=max\u0026auto=format\u0026n=afduMwBU8gsXmj5m\u0026q=85\u0026s=1fec1110fabf88533dd562c4ff8a5a00 560w, https://mintcdn.com/adsumnetworks/afduMwBU8gsXmj5m/images/gateways/lew840x-cellular.jpg?w=840\u0026fit=max\u0026auto=format\u0026n=afduMwBU8gsXmj5m\u0026q=85\u0026s=c8f8238bac86cb52ddd83f34559518bb 840w, https://mintcdn.com/adsumnetworks/afduMwBU8gsXmj5m/images/gateways/lew840x-cellular.jpg?w=1100\u0026fit=max\u0026auto=format\u0026n=afduMwBU8gsXmj5m\u0026q=85\u0026s=a78c525b502b1172866045ad3778c577 1100w, https://mintcdn.com/adsumnetworks/afduMwBU8gsXmj5m/images/gateways/lew840x-cellular.jpg?w=1650\u0026fit=max\u0026auto=format\u0026n=afduMwBU8gsXmj5m\u0026q=85\u0026s=f2f63ac54a4a40374d3206d31585240d 1650w, https://mintcdn.com/adsumnetworks/afduMwBU8gsXmj5m/images/gateways/lew840x-cellular.jpg?w=2500\u0026fit=max\u0026auto=format\u0026n=afduMwBU8gsXmj5m\u0026q=85\u0026s=e7b2287028107f0ad5f1cede901e2a94 2500w`}),_jsxs(`span`,{className:`adsum-gw-text`,children:[_jsx(`b`,{children:`LEW840x with cellular`}),_jsx(`span`,{children:`BLE to Wi-Fi and Ethernet, plus cellular.`})]})]}),_jsxs(_components.a,{className:`adsum-gw-card`,href:`/ble-wifi-gateway`,children:[_jsx(OptimizedImage,{src:`https://mintcdn.com/adsumnetworks/afduMwBU8gsXmj5m/images/gateways/bwg840x.jpg?fit=max\u0026auto=format\u0026n=afduMwBU8gsXmj5m\u0026q=85\u0026s=31403490e96d20a1e48cfe20142b4245`,alt:`The Fanstel BWG840x gateway, BLE to Wi-Fi`,width:`1200`,height:`900`,\"data-og-width\":`1200`,\"data-og-height\":`900`,\"data-path\":`images/gateways/bwg840x.jpg`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/adsumnetworks/afduMwBU8gsXmj5m/images/gateways/bwg840x.jpg?w=280\u0026fit=max\u0026auto=format\u0026n=afduMwBU8gsXmj5m\u0026q=85\u0026s=5771f0b56f2bcb597ae842b781076bd1 280w, https://mintcdn.com/adsumnetworks/afduMwBU8gsXmj5m/images/gateways/bwg840x.jpg?w=560\u0026fit=max\u0026auto=format\u0026n=afduMwBU8gsXmj5m\u0026q=85\u0026s=caab0a5c1cc48378fa32e61063c33e8d 560w, https://mintcdn.com/adsumnetworks/afduMwBU8gsXmj5m/images/gateways/bwg840x.jpg?w=840\u0026fit=max\u0026auto=format\u0026n=afduMwBU8gsXmj5m\u0026q=85\u0026s=650a3f2069552873acbfed69c0b50533 840w, https://mintcdn.com/adsumnetworks/afduMwBU8gsXmj5m/images/gateways/bwg840x.jpg?w=1100\u0026fit=max\u0026auto=format\u0026n=afduMwBU8gsXmj5m\u0026q=85\u0026s=2353541e28b7f94fc64a764494d35352 1100w, https://mintcdn.com/adsumnetworks/afduMwBU8gsXmj5m/images/gateways/bwg840x.jpg?w=1650\u0026fit=max\u0026auto=format\u0026n=afduMwBU8gsXmj5m\u0026q=85\u0026s=928a3b5b29b845ac98dbec66daa9ee35 1650w, https://mintcdn.com/adsumnetworks/afduMwBU8gsXmj5m/images/gateways/bwg840x.jpg?w=2500\u0026fit=max\u0026auto=format\u0026n=afduMwBU8gsXmj5m\u0026q=85\u0026s=850e3e9b9af098f3ae5e5acc75ecba05 2500w`}),_jsxs(`span`,{className:`adsum-gw-text`,children:[_jsx(`b`,{children:`BWG840x`}),_jsx(`span`,{children:`BLE to Wi-Fi.`})]})]})]}),`\n`,_jsxs(_components.p,{children:[`Each runs firmware the agent built on the real board, with the developer approving each step. The BLG20x and the LBG20x are new: they are the `,_jsx(_components.a,{href:`https://www.adsumnetworks.com/`,children:`Adsum NTN Relay`}),`, with a `,_jsx(_components.a,{href:`/supported-hardware/fanstel/blg20x-first-run`,children:`first run you can follow step by step`}),`, and more are coming. `,_jsx(_components.a,{href:`/gateway-firmware`,children:`Every way to have it`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`how-it-works`,children:`How it works`}),`\n`,_jsxs(_components.p,{children:[`One open agent in your editor, plus expert knowledge that loads only for the task in front of it. That knowledge was written and verified on real boards by named engineers. It is not a chatbot reading a datasheet. `,_jsx(_components.a,{href:`/architecture`,children:`See the architecture`}),`.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Found on the bench, not in the field.`}),` A gateway build that compiled clean and heard nothing. Thirty-six advertisements on the air, none received, and every log read fine. The radio front end had never been switched on. `,_jsx(_components.a,{href:`/ble-debug`,children:`See how it was found`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`what-you-can-have-and-when`,children:`What you can have, and when`}),`\n`,_jsxs(`div`,{className:`adsum-fig`,children:[_jsxs(`div`,{className:`adsum-ladder`,children:[_jsxs(`div`,{className:`adsum-tier`,children:[_jsx(`div`,{className:`adsum-when`,children:`Minutes`}),_jsxs(`div`,{className:`adsum-what`,children:[_jsx(`b`,{children:`Flash a signed image, to judge it`}),_jsx(`span`,{children:`Yours: a licence to run it on your own network, with your own devices and your own broker, and prove its value before you spend anything.`})]})]}),_jsxs(`div`,{className:`adsum-tier`,children:[_jsx(`div`,{className:`adsum-when`,children:`Under 30 min`}),_jsxs(`div`,{className:`adsum-what`,children:[_jsx(`b`,{children:`Flash and start testing the same image, to deploy it`}),_jsx(`span`,{children:`Yours: a licence to deploy it as it is, with no firmware work at all. It stays your deployment.`})]})]}),_jsxs(`div`,{className:`adsum-tier`,children:[_jsx(`div`,{className:`adsum-when`,children:`Under 2 hours`}),_jsxs(`div`,{className:`adsum-what`,children:[_jsx(`b`,{children:`Build and start customising from licensed source`}),_jsx(`span`,{children:`Yours: the source, module by module, to change and to ship. Your changes stay yours.`})]})]}),_jsxs(`div`,{className:`adsum-tier`,children:[_jsx(`div`,{className:`adsum-when`,children:`A few hours`}),_jsxs(`div`,{className:`adsum-what`,children:[_jsx(`b`,{children:`Build it from scratch`}),_jsx(`span`,{children:`Yours: the architecture as well as the code. You decided how it works.`})]})]})]}),_jsx(`p`,{className:`adsum-cap`,children:`Each time is to a first working version on real hardware. Start anywhere, and move between them.`})]}),`\n`,_jsxs(_components.p,{children:[`Signed images and licensed source are for the Fanstel gateways today. Building from scratch works on any board built on a supported chip. The demo firmware is free to flash. For the BLG20x and LBG20x, production licences are priced per relay at `,_jsx(_components.a,{href:`https://www.adsumnetworks.com/licensing/`,children:`www.adsumnetworks.com`}),`; for the other gateways, `,_jsx(_components.a,{href:`https://www.adsumnetworks.com/contact/`,children:`ask us`}),`. `,_jsx(_components.a,{href:`/gateway-firmware`,children:`Row by row`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`your-chip`,children:`Your chip`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{style:{textAlign:`left`},children:`Family`}),_jsx(_components.th,{style:{textAlign:`left`},children:`Chips`}),_jsx(_components.th,{style:{textAlign:`left`},children:`Radios`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:`Nordic, nRF Connect SDK`}),_jsx(_components.td,{style:{textAlign:`left`},children:`nRF52, nRF53, nRF54L, nRF91`}),_jsx(_components.td,{style:{textAlign:`left`},children:`BLE, LTE-M, NB-IoT, GNSS, satellite NB-NTN`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:`Espressif, ESP-IDF`}),_jsx(_components.td,{style:{textAlign:`left`},children:`ESP32, including S3 and C6`}),_jsx(_components.td,{style:{textAlign:`left`},children:`Wi-Fi, BLE`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:`Semtech, on either host`}),_jsx(_components.td,{style:{textAlign:`left`},children:`SX126x, SX127x, LR2021`}),_jsx(_components.td,{style:{textAlign:`left`},children:`LoRa / LoRaWAN, over SPI`})]})]})]}),`\n`,_jsxs(_components.p,{children:[`Any board built on these chips, your own design included. Open a folder and the agent says what it found and what is still missing before you write a line. `,_jsx(_components.a,{href:`/supported-hardware`,children:`Supported hardware`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`what-it-does`,children:`What it does`}),`\n`,_jsxs(_components.p,{children:[`Start a prototype, add a feature, debug BLE or Wi-Fi against the running board, bring a modem or a LoRa radio up, or run a CRA readiness check on a real build. `,_jsx(_components.a,{href:`/workflows`,children:`Every workflow`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`measured-not-claimed`,children:`Measured, not claimed`}),`\n`,_jsxs(_components.p,{children:[`Adsum IoT Coder and Claude Code, head to head on the same model, on six BLE bugs, on real nRF hardware. Adsum fixed more of them on the first flash, on fewer tokens, and anyone can rerun it. `,_jsx(_components.a,{href:`/benchmark`,children:`The benchmark`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`Evaluating this for a regulated product? `,_jsx(_components.a,{href:`/privacy-and-security`,children:`What stays on your machine, and what a CRA readiness check is and is not`}),`.`]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsxs(_components.p,{children:[`Already using it? `,_jsx(_components.a,{href:`/workflows`,children:`Workflows`}),`, `,_jsx(_components.a,{href:`/models`,children:`models`}),`, `,_jsx(_components.a,{href:`/troubleshooting`,children:`troubleshooting`}),`.`]}),`\n`,_jsxs(_components.p,{children:[_jsxs(_components.strong,{children:[_jsx(_components.a,{href:`/getting-started`,children:`Run the free sample`}),`.`]}),` No board, no key, no account, no card.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{HeroStepper,default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"AI coding agent for embedded IoT firmware","sidebarTitle":"Adsum IoT Coder","description":"Open-source VS Code AI coding agent for Nordic nRF and Espressif ESP32 firmware, with hardware-verified expert knowledge and one-click EU CRA readiness.","href":"/index"}}},"mdxSourceWithNoJs":null,"noJsSplices":[[150,3860,"null;function _creat"]]},"mdxExtracts":{"tableOfContents":[{"title":"Put a secure, working IoT product in front of customers in weeks, not quarters. Prove its value early.","slug":"put-a-secure-working-iot-product-in-front-of-customers-in-weeks-not-quarters-prove-its-value-early","depth":2,"children":[]},{"title":"Five open-hardware gateways built this way, and more coming","slug":"five-open-hardware-gateways-built-this-way-and-more-coming","depth":2,"children":[]},{"title":"How it works","slug":"how-it-works","depth":2,"children":[]},{"title":"What you can have, and when","slug":"what-you-can-have-and-when","depth":2,"children":[]},{"title":"Your chip","slug":"your-chip","depth":2,"children":[]},{"title":"What it does","slug":"what-it-does","depth":2,"children":[]},{"title":"Measured, not claimed","slug":"measured-not-claimed","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"dynamicCss":".\\!mint-my-0 {\n margin-top: 0px !important;\n margin-bottom: 0px !important\n}\n.mint-mt-4 {\n margin-top: 1rem\n}\n.mint-block {\n display: block\n}\n.mint-inline-block {\n display: inline-block\n}\n.mint-hidden {\n display: none\n}\n.mint-h-5 {\n height: 1.25rem\n}\n.mint-w-full {\n width: 100%\n}\n.mint-align-middle {\n vertical-align: middle\n}\n.mint-text-lg {\n font-size: 1.125rem;\n line-height: 1.75rem\n}\n.mint-text-gray-500 {\n --tw-text-opacity: 1;\n color: rgb(107 114 128 / var(--tw-text-opacity, 1))\n}\n.mint-no-underline {\n text-decoration-line: none\n}\n.dark\\:mint-block:is(.dark *) {\n display: block\n}\n.dark\\:mint-hidden:is(.dark *) {\n display: none\n}\n.dark\\:mint-text-gray-400:is(.dark *) {\n --tw-text-opacity: 1;\n color: rgb(156 163 175 / var(--tw-text-opacity, 1))\n}","subdomain":"adsumnetworks","siteName":"Adsum IoT Coder","title":"AI coding agent for embedded IoT firmware - Adsum IoT Coder","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-12T20:02:04.331Z","originalFileLocation":"index.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Open-source VS Code AI coding agent for Nordic nRF and Espressif ESP32 firmware, with hardware-verified expert knowledge and one-click EU CRA readiness.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Adsum IoT Coder\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/adsumnetworks/doP62vkyazS5XDDz/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/adsumnetworks/doP62vkyazS5XDDz/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/adsumnetworks/doP62vkyazS5XDDz/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/adsumnetworks/doP62vkyazS5XDDz/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/adsumnetworks/doP62vkyazS5XDDz/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/adsumnetworks/doP62vkyazS5XDDz/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/adsumnetworks/doP62vkyazS5XDDz/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/adsumnetworks/doP62vkyazS5XDDz/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/adsumnetworks/doP62vkyazS5XDDz/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"AI coding agent for embedded IoT firmware - Adsum IoT Coder\">\u003cmeta data-mint-head property=\"og:description\" content=\"Open-source VS Code AI coding agent for Nordic nRF and Espressif ESP32 firmware, with hardware-verified expert knowledge and one-click EU CRA readiness.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Adsum IoT Coder\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.adsumnetworks.com\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://docs.adsumnetworks.com/images/og-image.png\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"AI coding agent for embedded IoT firmware - Adsum IoT Coder\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Open-source VS Code AI coding agent for Nordic nRF and Espressif ESP32 firmware, with hardware-verified expert knowledge and one-click EU CRA readiness.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://docs.adsumnetworks.com/images/og-image.png\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/adsumnetworks/doP62vkyazS5XDDz/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Adsum IoT Coder\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#D76947\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.adsumnetworks.com\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/index.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.adsumnetworks.com/#organization\",\"name\":\"Adsum Networks\",\"url\":\"https://www.adsumnetworks.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://docs.adsumnetworks.com/logo/icon.png\"},\"sameAs\":[\"https://www.linkedin.com/company/adsum-networks/\",\"https://github.com/adsumnetworks/Adsum-IoT-Coder\",\"https://www.youtube.com/@adsumnetworks\"]},{\"@type\":\"WebSite\",\"@id\":\"https://docs.adsumnetworks.com#website\",\"name\":\"Adsum IoT Coder\",\"url\":\"https://docs.adsumnetworks.com\",\"publisher\":{\"@id\":\"https://docs.adsumnetworks.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.adsumnetworks.com/#webpage\",\"url\":\"https://docs.adsumnetworks.com/\",\"name\":\"AI coding agent for embedded IoT firmware\",\"description\":\"Open-source VS Code AI coding agent for Nordic nRF and Espressif ESP32 firmware, with hardware-verified expert knowledge and one-click EU CRA readiness.\",\"dateModified\":\"2026-10-12T20:02:04.331Z\",\"isPartOf\":{\"@id\":\"https://docs.adsumnetworks.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.adsumnetworks.com/#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.adsumnetworks.com/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Get started\",\"item\":\"https://docs.adsumnetworks.com/index\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"AI coding agent for embedded IoT firmware\",\"item\":\"https://docs.adsumnetworks.com/\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.adsumnetworks.com/#article\",\"headline\":\"AI coding agent for embedded IoT firmware\",\"name\":\"AI coding agent for embedded IoT firmware\",\"description\":\"Open-source VS Code AI coding agent for Nordic nRF and Espressif ESP32 firmware, with hardware-verified expert knowledge and one-click EU CRA readiness.\",\"url\":\"https://docs.adsumnetworks.com/\",\"mainEntityOfPage\":{\"@id\":\"https://docs.adsumnetworks.com/#webpage\"},\"image\":\"https://docs.adsumnetworks.com/images/og-image.png\",\"dateModified\":\"2026-10-12T20:02:04.331Z\",\"publisher\":{\"@id\":\"https://docs.adsumnetworks.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.adsumnetworks.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Adsum IoT Coder\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Adsum IoT Coder","nav":{"global":null,"tabs":[{"tab":"Documentation","groups":[{"group":"Get started","pages":[{"title":"AI coding agent for embedded IoT firmware","sidebarTitle":"Adsum IoT Coder","href":""},{"title":"Install Adsum IoT Coder for VS Code","sidebarTitle":"Getting started","description":"Install the Adsum IoT Coder VS Code extension and watch it work a real nRF firmware bug in your first minute. No board, no API key, no account.","href":"/getting-started"},{"title":"Sessions: the rail and the tabs","sidebarTitle":"Sessions","href":"/sessions"},{"title":"Free tier: no key, no account, no card","sidebarTitle":"Free tier","href":"/free-tier"},{"title":"Free account: cellular, LoRa and gateways","sidebarTitle":"Free account","href":"/account"}]},{"group":"How it works","pages":[{"title":"Why embedded firmware fails late","sidebarTitle":"Why it exists","href":"/why-it-exists"},{"title":"How Adsum IoT Coder works","sidebarTitle":"Architecture","href":"/architecture"},{"title":"Embedded firmware AI agent benchmark","sidebarTitle":"Benchmark","href":"/benchmark"}]},{"group":"What it does","pages":[{"title":"Firmware workflows: build, flash, debug","sidebarTitle":"Workflows","href":"/workflows"},{"title":"EU CRA readiness for firmware: SBOM, CVEs","sidebarTitle":"CRA readiness","href":"/cra-readiness"},{"title":"3-layer BLE debug: log, bus, air","sidebarTitle":"3-layer debug","href":"/ble-debug"},{"title":"Cellular IoT on nRF91: LTE-M, NB-IoT, GNSS","sidebarTitle":"Cellular LTE-M and NB-IoT","href":"/cellular"},{"title":"Satellite IoT: NB-NTN on nRF9151","sidebarTitle":"Satellite NB-NTN IoT","href":"/satellite-ntn"},{"title":"LoRa and LoRaWAN IoT on nRF and ESP32","sidebarTitle":"LoRa and LoRaWAN IoT","href":"/lora"}]},{"group":"Supported hardware","pages":[{"title":"Supported chips: Nordic nRF and ESP32","sidebarTitle":"Chips and protocols","href":"/supported-hardware/index"},{"title":"Partner open hardware: Fanstel gateways","sidebarTitle":"Partner open hardware","href":"/supported-hardware/partner-open-hardware"},{"title":"Platforms and roadmap","sidebarTitle":"Roadmap","href":"/platforms-and-roadmap"}]},{"group":"Build on partner open hardware","pages":[{"title":"BLE gateway firmware, signed and licensed","sidebarTitle":"Gateway firmware","href":"/gateway-firmware"},{"group":"BLG20x · NTN Relay, indoors","pages":[{"title":"BLG20x: the Adsum NTN Relay for an indoor site","sidebarTitle":"Overview","href":"/supported-hardware/fanstel/blg20x"},{"title":"BLG20x gateway firmware specification","sidebarTitle":"Firmware specification","href":"/supported-hardware/fanstel/blg20x-specification"},{"title":"BLG20x first run, step by step","sidebarTitle":"First run guide","tag":"NEW","href":"/supported-hardware/fanstel/blg20x-first-run"}]},{"group":"LBG20x · NTN Relay, outdoors","pages":[{"title":"LBG20x: the Adsum NTN Relay for outdoors","sidebarTitle":"Overview","href":"/supported-hardware/fanstel/lbg20x"},{"title":"LBG20x gateway firmware specification","sidebarTitle":"Firmware specification","href":"/supported-hardware/fanstel/lbg20x-specification"},{"title":"LBG20x first run, step by step","sidebarTitle":"First run guide","tag":"NEW","href":"/supported-hardware/fanstel/lbg20x-first-run"}]},{"group":"LEW840x · BLE to Wi-Fi and Ethernet","pages":[{"title":"LEW840x gateway firmware: BLE to Wi-Fi and Ethernet","sidebarTitle":"Build from scratch","href":"/supported-hardware/fanstel/lew840x"},{"title":"LEW840x gateway firmware: BLE to Wi-Fi and Ethernet, plus cellular (nRF9160)","sidebarTitle":"Plus cellular (nRF9160)","href":"/supported-hardware/fanstel/lew840x-cellular"},{"title":"LEW840x gateway firmware specification","sidebarTitle":"Firmware specification","href":"/supported-hardware/fanstel/lew840x-specification"}]},{"group":"BWG840x · BLE to Wi-Fi","pages":[{"title":"BWG840x gateway firmware: BLE to Wi-Fi, built in 30 minutes","sidebarTitle":"Build from scratch","href":"/ble-wifi-gateway"},{"title":"BWG840x BLE to Wi-Fi: troubleshooting the bug the code could not show","sidebarTitle":"Troubleshoot it over the air","href":"/ble-wifi-gateway/troubleshooting"},{"title":"CRA readiness on a real gateway build","sidebarTitle":"CRA readiness check","href":"/ble-wifi-gateway/cra"}]}]},{"group":"Reference","pages":[{"title":"AI models: free tier or bring your key","sidebarTitle":"Models","href":"/models"},{"title":"Troubleshooting nRF and ESP32 setup","sidebarTitle":"Troubleshooting","href":"/troubleshooting"},{"title":"FAQ: cost, accounts, models and boards","sidebarTitle":"FAQ","href":"/faq"},{"title":"Privacy: what leaves your machine","sidebarTitle":"Privacy \u0026 security","href":"/privacy-and-security"},{"title":"Limitations of an AI firmware agent","sidebarTitle":"Limitations","href":"/legal/limitations"}]},{"group":"About","pages":[{"title":"About Adsum Networks","sidebarTitle":"About \u0026 contact","href":"/about-and-contact"},{"title":"Contribute firmware knowledge or code","sidebarTitle":"Contribute","href":"/contribute"}]}]}]},"title":"AI coding agent for embedded IoT firmware - Adsum IoT Coder","buildId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","deploymentId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","dynamics":["10e4515597","a74be98ba7"],"chunks":["BannerMarkdown-m8-xYP3Y.js","dist-1ms6tsT-.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","clsx-DMKzROTp.js","html-void-elements-mCSPHezU.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","zoom-image-lightbox-CVZVK4hN.js","lightbox-handle-r17bVUz3.js"]}