{"id":7332,"date":"2026-10-23T05:27:29","date_gmt":"2026-10-23T05:27:29","guid":{"rendered":"https:\/\/extreemtek.com\/?p=7332"},"modified":"2026-10-23T13:41:42","modified_gmt":"2026-10-23T13:41:42","slug":"hardware-firmware-app-cloud-one-team","status":"publish","type":"post","link":"https:\/\/extreemtek.com\/nl\/hardware-firmware-app-cloud-one-team\/","title":{"rendered":"Hardware, firmware, app en cloud van \u00e9\u00e9n team: zo werkt het"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"7332\" class=\"elementor elementor-7332\">\n\t\t\t\t<div class=\"elementor-element elementor-element-92d13b5 e-con-full e-flex e-con e-parent\" data-id=\"92d13b5\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d8dd5ab elementor-widget__width-inherit elementor-widget elementor-widget-html\" data-id=\"d8dd5ab\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\n@import url('https:\/\/fonts.googleapis.com\/css2?family=Inter+Tight:wght@400;500;600;700;800&display=swap');\n\n#sk-nav{\n  --sk-navy:#0a1a4d;\n  --sk-amber-lite:#F5B01A;\n  --sk-amber-deep:#D86605;\n  --sk-line:#e6e9f0;\n\n  position:relative;\n  z-index:900;\n  background:#fff;\n  border-bottom:1px solid var(--sk-line);\n  font-family:\"Inter Tight\",system-ui,-apple-system,\"Segoe UI\",sans-serif;\n  -webkit-font-smoothing:antialiased;\n}\n#sk-nav *,#sk-nav *::before,#sk-nav *::after{box-sizing:border-box}\n\n#sk-nav .sk-n-bar{\n  display:flex;\n  align-items:center;\n  gap:1rem;\n  max-width:1300px;\n  margin:0 auto;\n  padding:.85rem 1.25rem;\n}\n\n\/* logo *\/\n#sk-nav .sk-n-logo{flex:none;display:inline-flex;align-items:center;line-height:0}\n#sk-nav .sk-n-logo img{\n  display:block;\n  width:auto;\n  height:46px;\n  max-width:none;\n}\n\n\/* desktop links *\/\n#sk-nav .sk-n-links{\n  display:flex;\n  align-items:center;\n  gap:clamp(1.2rem,3vw,2.4rem);\n  margin:0 auto;\n  padding:0;\n  list-style:none;\n}\n#sk-nav .sk-n-links li{margin:0;padding:0;list-style:none}\n#sk-nav .sk-n-links li::marker,#sk-nav .sk-n-links li::before{content:none}\n#sk-nav .sk-n-links a{\n  font-size:1.02rem;\n  font-weight:600;\n  letter-spacing:-.01em;\n  color:var(--sk-navy);\n  text-decoration:none;\n  transition:color .16s ease;\n}\n#sk-nav .sk-n-links a:hover{color:#1a56e8}\n\n\/* cta *\/\n#sk-nav .sk-n-cta{\n  flex:none;\n  display:inline-flex;\n  align-items:center;\n  justify-content:center;\n  padding:.78rem 1.4rem;\n  border:0;\n  border-radius:8px;\n  background:linear-gradient(180deg,var(--sk-amber-lite) 0%,var(--sk-amber-deep) 100%);\n  color:#fff;\n  font-family:inherit;\n  font-size:.95rem;\n  font-weight:700;\n  letter-spacing:-.01em;\n  text-decoration:none;\n  white-space:nowrap;\n  box-shadow:0 6px 18px rgba(216,102,5,.3);\n  transition:transform .18s ease,box-shadow .18s ease;\n}\n#sk-nav .sk-n-cta:hover{\n  transform:translateY(-1px);color:#fff;text-decoration:none;\n  box-shadow:0 10px 24px rgba(216,102,5,.4);\n}\n#sk-nav .sk-n-cta:focus-visible{outline:3px solid var(--sk-navy);outline-offset:3px}\n\n\/* hamburger \u2014 hidden on desktop *\/\n#sk-nav .sk-n-toggle{\n  display:none;\n  flex:none;\n  width:44px;height:44px;\n  padding:0;\n  border:1px solid var(--sk-line);\n  border-radius:10px;\n  background:#fff;\n  color:var(--sk-navy);\n  cursor:pointer;\n  align-items:center;\n  justify-content:center;\n  line-height:0;\n}\n#sk-nav .sk-n-toggle:focus-visible{outline:3px solid var(--sk-navy);outline-offset:2px}\n#sk-nav .sk-n-toggle svg{display:block;flex:none}\n#sk-nav .sk-n-toggle .sk-n-close{display:none}\n#sk-nav .sk-n-toggle[aria-expanded=\"true\"] .sk-n-open{display:none}\n#sk-nav .sk-n-toggle[aria-expanded=\"true\"] .sk-n-close{display:block}\n\n\/* ---------- MOBILE ---------- *\/\n@media (max-width:1024px){\n  #sk-nav .sk-n-bar{gap:.7rem;padding:.7rem 1rem}\n  #sk-nav .sk-n-logo img{height:38px}\n  #sk-nav .sk-n-toggle{display:inline-flex}\n\n  #sk-nav .sk-n-cta{\n    margin-left:auto;\n    padding:.66rem 1rem;\n    font-size:.86rem;\n  }\n\n  \/* links become the drop panel *\/\n  #sk-nav .sk-n-links{\n    position:absolute;\n    left:0;right:0;\n    top:100%;\n    display:grid;\n    gap:0;\n    margin:0;\n    padding:0 1rem .6rem;\n    background:#fff;\n    border-bottom:1px solid var(--sk-line);\n    box-shadow:0 14px 30px rgba(10,26,77,.10);\n    opacity:0;\n    visibility:hidden;\n    transform:translateY(-10px);\n    transition:opacity .22s ease,transform .22s ease,visibility .22s ease;\n  }\n  #sk-nav .sk-n-links.is-open{\n    opacity:1;\n    visibility:visible;\n    transform:translateY(0);\n  }\n  #sk-nav .sk-n-links a{\n    display:block;\n    padding:.95rem .25rem;\n    font-size:1.05rem;\n    border-bottom:1px solid #f2f4f8;\n  }\n  #sk-nav .sk-n-links li:last-child a{border-bottom:0}\n}\n\n@media (max-width:420px){\n  #sk-nav .sk-n-logo img{height:32px}\n  #sk-nav .sk-n-cta{padding:.6rem .8rem;font-size:.8rem}\n  #sk-nav .sk-n-toggle{width:40px;height:40px}\n}\n\n@media (prefers-reduced-motion:reduce){\n  #sk-nav *{transition:none !important}\n}\n<\/style>\n\n<header id=\"sk-nav\">\n  <nav class=\"sk-n-bar\" aria-label=\"Main\">\n\n    <a class=\"sk-n-logo\" href=\"https:\/\/extreemtek.com\/\">\n      <img decoding=\"async\" src=\"https:\/\/extreemtek.com\/wp-content\/uploads\/2026\/09\/Frame.png\" alt=\"ExtreemTek \u2014 Engineering Ideas into Intelligent Reality\">\n    <\/a>\n\n    <ul class=\"sk-n-links\" id=\"skNavLinks\">\n      <li><a href=\"https:\/\/extreemtek.com\/\">Home<\/a><\/li>\n      <li><a href=\"https:\/\/extreemtek.com\/#services\">What We Do<\/a><\/li>\n      <li><a href=\"https:\/\/extreemtek.com\/#case-studies\">Case Studies<\/a><\/li>\n      <li><a href=\"https:\/\/extreemtek.com\/#how-we-work\">How We Work<\/a><\/li><li><a href=\"https:\/\/extreemtek.com\/contact-us\/\">Contact Us<\/a><\/li>\n    <\/ul>\n\n    <a class=\"sk-n-cta\" href=\"#iot-cta\">Discuss Your Product<\/a>\n\n    <button class=\"sk-n-toggle\" id=\"skNavToggle\" type=\"button\" aria-expanded=\"false\" aria-controls=\"skNavLinks\" aria-label=\"Open menu\">\n      <svg class=\"sk-n-open\" width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" aria-hidden=\"true\"><path d=\"M4 7h16M4 12h16M4 17h16\"><\/path><\/svg>\n      <svg class=\"sk-n-close\" width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" aria-hidden=\"true\"><path d=\"M6 6l12 12M18 6L6 18\"><\/path><\/svg>\n    <\/button>\n\n  <\/nav>\n<\/header>\n\n<script>\n(function(){\n  var btn   = document.getElementById('skNavToggle');\n  var links = document.getElementById('skNavLinks');\n  if(!btn || !links) return;\n\n  function setOpen(open){\n    links.classList.toggle('is-open', open);\n    btn.setAttribute('aria-expanded', open);\n    btn.setAttribute('aria-label', open ? 'Close menu' : 'Open menu');\n  }\n\n  btn.addEventListener('click', function(){\n    setOpen(btn.getAttribute('aria-expanded') !== 'true');\n  });\n\n  \/* close after tapping a link *\/\n  links.addEventListener('click', function(e){\n    if(e.target.closest('a')) setOpen(false);\n  });\n\n  \/* close on Escape, and on outside tap *\/\n  document.addEventListener('keydown', function(e){\n    if(e.key === 'Escape') setOpen(false);\n  });\n  document.addEventListener('click', function(e){\n    if(!e.target.closest('#sk-nav')) setOpen(false);\n  });\n})();\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-c154411 e-con-full e-flex e-con e-parent\" data-id=\"c154411\" data-element_type=\"container\" data-e-type=\"container\" id=\"main-content\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7bb649b elementor-widget__width-inherit elementor-widget elementor-widget-html\" data-id=\"7bb649b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!-- ExtreemTek blog post - same theme and style as the FileShift guides (fs-blog). -->\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Bricolage+Grotesque:opsz,wght@12..96,600;12..96,800&family=Figtree:wght@400;500;600;700&display=swap\" rel=\"stylesheet\">\n<style>\r\n.fs-blog{\r\n  \/* Brand colours - change here to match ExtreemTek *\/\r\n  --fs-ink:#15213A;\r\n  --fs-ink-soft:#4A5672;\r\n  --fs-paper:#F3F6FB;\r\n  --fs-blue:#2D5BE3;\r\n  --fs-blue-deep:#1B3C9E;\r\n  --fs-mint:#12A585;\r\n  --fs-line:#DCE3EF;\r\n  \/* Fonts - set both to \"inherit\" to use your theme's fonts instead *\/\r\n  --fs-display:\"Bricolage Grotesque\",\"Figtree\",system-ui,sans-serif;\r\n  --fs-body:\"Figtree\",system-ui,-apple-system,\"Segoe UI\",sans-serif;\r\n\r\n  \/* Type scale - one body size for every paragraph, clear steps for headings *\/\r\n  --fs-text:17px;      \/* all body paragraphs, lists, FAQ answers *\/\r\n  --fs-small:14px;     \/* dates, captions, table headings *\/\r\n  --fs-h1:clamp(38px,4vw,50px);\r\n  --fs-h2:30px;\r\n  --fs-h3:20px;\r\n  --fs-h4:18px;        \/* FAQ questions, download box title *\/\r\n\r\n  color:var(--fs-ink);\r\n  font-family:var(--fs-body);\r\n  font-size:var(--fs-text);\r\n  line-height:1.75;\r\n  -webkit-font-smoothing:antialiased;\r\n}\r\n.fs-blog *,.fs-blog *::before,.fs-blog *::after{box-sizing:border-box}\r\n.fs-blog [id]{scroll-margin-top:110px}\r\nhtml:has(.fs-blog){scroll-behavior:smooth}\r\n@media (prefers-reduced-motion:reduce){html:has(.fs-blog){scroll-behavior:auto}}\r\n.fs-blog a{color:var(--fs-blue)}\r\n.fs-blog a:focus-visible,.fs-blog summary:focus-visible{outline:3px solid var(--fs-blue);outline-offset:3px;border-radius:6px}\r\n.fs-blog p,.fs-blog li{font-size:var(--fs-text);line-height:1.75}\r\n.fs-blog p{margin:0 0 18px}\r\n.fs-blog img{max-width:100%;height:auto;display:block}\r\n\r\n\/* ---------- Headings ---------- *\/\r\n.fs-blog h1,.fs-blog h2,.fs-blog h3{font-family:var(--fs-display);color:var(--fs-ink);text-transform:none}\r\n.fs-blog h2{font-weight:800;font-size:var(--fs-h2);line-height:1.2;letter-spacing:-.02em;margin:56px 0 18px}\r\n.fs-blog h3{font-weight:700;font-size:var(--fs-h3);line-height:1.35;letter-spacing:-.01em;margin:32px 0 8px}\r\n\r\n\/* ---------- Back button ---------- *\/\r\n.fs-blog .fs-back{position:absolute;top:16px;left:var(--fs-hero-x,16px);z-index:1;display:grid;place-items:center;width:46px;height:46px;border-radius:50%;background:#fff;border:1.5px solid var(--fs-line);color:var(--fs-ink);text-decoration:none;margin:0;transition:background .15s,border-color .15s,color .15s}\r\n.fs-blog .fs-back:hover{background:var(--fs-ink);border-color:var(--fs-ink);color:#fff}\r\n.fs-blog .fs-back svg{width:22px;height:22px}\r\n\r\n\/* ---------- Title band ---------- *\/\r\n.fs-blog .fs-hero{\r\n  \/* full-width band: stretches past the page's side margins to the screen edges *\/\r\n  --fs-content:1140px;   \/* your page's content width in Elementor (default 1140px) *\/\r\n  --fs-hero-x:max(24px, calc((100vw - var(--fs-content)) \/ 2 + 10px));\r\n  position:relative;background:var(--fs-paper);border:0;border-bottom:1px solid var(--fs-line);border-radius:0;\r\n  width:100vw;margin:0 0 48px calc(50% - 50vw);\r\n  padding:40px var(--fs-hero-x);\r\n  display:grid;grid-template-columns:minmax(0,1.05fr) minmax(0,.95fr);gap:40px;align-items:center}\r\nbody:has(.fs-blog){overflow-x:clip}\r\n.fs-blog .fs-hero-text{padding-top:40px}\r\n.fs-blog .fs-hero .fs-cover{margin:0;background:#fff}\r\n.fs-blog .fs-hero .fs-cover:has(img[src^=\"PASTE\"]){aspect-ratio:16\/10}\r\n.fs-blog .fs-tag{display:inline-block;background:#fff;border:1px solid var(--fs-line);color:var(--fs-blue-deep);font-weight:700;font-size:var(--fs-small);line-height:1.4;padding:4px 12px;border-radius:999px;margin-bottom:18px}\r\n.fs-blog .fs-hero h1{font-weight:800;font-size:var(--fs-h1);line-height:1.08;letter-spacing:-.03em;margin:0 0 18px}\r\n.fs-blog .fs-meta{display:flex;flex-wrap:wrap;gap:6px 22px;font-size:15px;color:var(--fs-ink-soft);margin:0}\r\n.fs-blog .fs-meta strong{color:var(--fs-ink);font-weight:600}\r\n\r\n\/* ---------- Image slots (show a dashed box until an image URL is added) ---------- *\/\r\n.fs-blog .fs-img{margin:0 0 24px;border-radius:14px;overflow:hidden;background:var(--fs-paper);position:relative}\r\n.fs-blog .fs-img img{width:100%}\r\n.fs-blog .fs-img:has(img[src^=\"PASTE\"]){aspect-ratio:16\/9;border:2px dashed #B9C5DB;display:grid;place-items:center;text-align:center;padding:20px}\r\n.fs-blog .fs-img:has(img[src^=\"PASTE\"])::before{content:\"Image slot: \" attr(data-label);font-size:var(--fs-small);color:var(--fs-ink-soft);max-width:36ch}\r\n.fs-blog .fs-img img[src^=\"PASTE\"]{display:none}\r\n\r\n\/* ---------- Three-column layout: contents | article | related ---------- *\/\r\n.fs-blog .fs-layout{display:grid;grid-template-columns:220px minmax(0,1fr) 250px;grid-template-areas:\"toc article related\";gap:40px;align-items:start}\r\n.fs-blog .fs-toc{grid-area:toc}\r\n\/* Side columns stay on screen while you scroll (sticky). --fs-sticky-top = gap below your site header *\/\r\n.fs-blog .fs-toc,.fs-blog .fs-related{--fs-sticky-top:110px;position:sticky;top:var(--fs-sticky-top);align-self:start;max-height:calc(100vh - var(--fs-sticky-top) - 20px);overflow-y:auto;scrollbar-width:thin}\r\n.fs-blog .fs-article{grid-area:article;min-width:0}\r\n.fs-blog .fs-related{grid-area:related}\r\n.fs-blog .fs-article > h2:first-of-type{margin-top:40px}\r\n\r\n\/* Side panels (shared look for contents + related) *\/\r\n.fs-blog .fs-panel{background:var(--fs-paper);border:1px solid var(--fs-line);border-radius:14px;padding:18px 16px 14px}\r\n.fs-blog .fs-panel-title{font-family:var(--fs-display);font-weight:700;font-size:16px;line-height:1.3;letter-spacing:-.01em;color:var(--fs-ink);margin:0 0 12px;padding:0 4px 12px;border-bottom:1px solid var(--fs-line)}\r\n\r\n\/* Contents list *\/\r\n.fs-blog .fs-toc ol{list-style:none;margin:0;padding:0;counter-reset:fs-toc}\r\n.fs-blog .fs-toc li{margin:0;padding:0;font-size:14px;line-height:1.4;counter-increment:fs-toc}\r\n.fs-blog .fs-toc a{display:flex;gap:10px;padding:8px;border-radius:8px;color:var(--fs-ink-soft);text-decoration:none;font-size:14px;line-height:1.4}\r\n.fs-blog .fs-toc a::before{content:counter(fs-toc);flex:none;width:20px;height:20px;border-radius:50%;background:#fff;border:1px solid var(--fs-line);display:grid;place-items:center;font-size:11px;font-weight:700;color:var(--fs-ink-soft);margin-top:0}\r\n.fs-blog .fs-toc a:hover{background:#fff;color:var(--fs-ink)}\r\n.fs-blog .fs-toc a.is-active{background:#fff;color:var(--fs-blue-deep);font-weight:600}\r\n.fs-blog .fs-toc a.is-active::before{background:var(--fs-blue);border-color:var(--fs-blue);color:#fff}\r\n\r\n\/* Related list *\/\r\n.fs-blog .fs-related-list{display:grid;gap:4px}\r\n.fs-blog .fs-post{display:grid;grid-template-columns:64px minmax(0,1fr);gap:12px;align-items:center;padding:8px;border-radius:10px;text-decoration:none;color:var(--fs-ink)}\r\n.fs-blog .fs-post:hover{background:#fff}\r\n.fs-blog .fs-post-img{width:64px;height:64px;border-radius:8px;overflow:hidden;background:#E3E9F3}\r\n.fs-blog .fs-post-img img{width:100%;height:100%;object-fit:cover}\r\n.fs-blog .fs-post-title{font-family:var(--fs-body);font-weight:600;font-size:14px;line-height:1.35;color:var(--fs-ink);margin:0 0 4px;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}\r\n.fs-blog .fs-post:hover .fs-post-title{color:var(--fs-blue)}\r\n.fs-blog .fs-post-date{font-size:12.5px;line-height:1.3;color:var(--fs-ink-soft);margin:0}\r\n.fs-blog .fs-related-empty[hidden]{display:none}\r\n.fs-blog .fs-related-empty{font-size:14px;line-height:1.5;color:var(--fs-ink-soft);margin:0;padding:4px 4px 6px}\r\n\r\n\/* ---------- Article details ---------- *\/\r\n.fs-blog .fs-article ul{margin:0 0 18px;padding-left:22px}\r\n.fs-blog .fs-article li{margin:4px 0}\r\n.fs-blog .fs-article li::marker{color:var(--fs-blue)}\r\n.fs-blog strong{font-weight:700;color:var(--fs-ink)}\r\n.fs-blog .fs-article p a,.fs-blog .fs-article li a{color:var(--fs-blue);text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:3px}\r\n.fs-blog .fs-article p a:hover{color:var(--fs-blue-deep);text-decoration-thickness:2px}\r\n.fs-blog .fs-cta p a{color:#fff;text-decoration:underline;text-underline-offset:3px}\r\n.fs-blog .fs-note{border-left:4px solid var(--fs-mint);background:#EEF9F6;padding:14px 18px;border-radius:0 10px 10px 0;margin:20px 0}\r\n.fs-blog .fs-note p{margin:0}\r\n\r\n\/* Comparison table *\/\r\n.fs-blog .fs-table-wrap{overflow-x:auto;margin:20px 0 8px;border:1px solid var(--fs-line);border-radius:12px;-webkit-overflow-scrolling:touch}\r\n.fs-blog .fs-table{width:100%;min-width:600px;border-collapse:collapse;border:0;margin:0;font-size:15px;line-height:1.45}\r\n.fs-blog .fs-table th,.fs-blog .fs-table td{text-align:left;padding:12px 14px;border:0;border-bottom:1px solid var(--fs-line);background:#fff;vertical-align:top;color:var(--fs-ink);font-size:15px}\r\n.fs-blog .fs-table thead th{font-size:var(--fs-small);color:var(--fs-ink-soft);font-weight:700;background:var(--fs-paper)}\r\n.fs-blog .fs-table tbody th{font-weight:700;min-width:120px}\r\n.fs-blog .fs-table tbody tr:last-child th,.fs-blog .fs-table tbody tr:last-child td{border-bottom:0}\r\n.fs-blog .fs-table tr.fs-us th,.fs-blog .fs-table tr.fs-us td{background:#EAF0FF}\r\n.fs-blog .fs-table tr.fs-us th{color:var(--fs-blue-deep)}\r\n.fs-blog .fs-table tr.fs-us td{font-weight:700}\r\n.fs-blog .fs-table .fs-good{color:var(--fs-mint);font-weight:700}\r\n.fs-blog .fs-swipe{display:none;font-size:var(--fs-small)}\r\n\r\n\/* Features *\/\r\n.fs-blog .fs-features{border-top:1px solid var(--fs-line)}\r\n.fs-blog .fs-feature{display:grid;grid-template-columns:44px minmax(0,1fr);gap:0 16px;padding:22px 0;border-bottom:1px solid var(--fs-line)}\r\n.fs-blog .fs-ico{width:44px;height:44px;border-radius:12px;background:var(--fs-paper);display:grid;place-items:center;color:var(--fs-blue)}\r\n.fs-blog .fs-ico svg{width:22px;height:22px}\r\n.fs-blog .fs-feature h3{margin:8px 0 6px}\r\n.fs-blog .fs-feature p{margin:0}\r\n.fs-blog .fs-article .fs-connect{list-style:none;padding:0;margin:14px 0 0;display:grid;grid-template-columns:1fr 1fr;gap:10px}\r\n.fs-blog .fs-article .fs-connect li{display:flex;align-items:center;gap:12px;margin:0;padding:12px 14px;border:1.5px solid var(--fs-line);border-radius:12px;font-weight:600;line-height:1.35}\r\n.fs-blog .fs-connect svg{flex:none;width:24px;height:24px;color:var(--fs-blue)}\r\n\r\n\/* Download box *\/\r\n.fs-blog .fs-cta{margin:32px 0 0;padding:28px;border-radius:16px;background:var(--fs-ink);color:#fff}\r\n.fs-blog .fs-cta .fs-cta-title{font-family:var(--fs-display);font-weight:800;font-size:22px;line-height:1.25;letter-spacing:-.01em;margin:0 0 6px;color:#fff}\r\n.fs-blog .fs-cta p{color:#C9D3EA}\r\n.fs-blog .fs-stores{display:flex;flex-wrap:wrap;gap:12px;margin-top:4px}\r\n.fs-blog .fs-store{display:inline-flex;align-items:center;gap:10px;background:#fff;color:var(--fs-ink);text-decoration:none;padding:9px 16px 9px 12px;border-radius:12px;line-height:1.15}\r\n.fs-blog .fs-store:hover{background:#E8EEFF;color:var(--fs-ink)}\r\n.fs-blog .fs-store svg{width:24px;height:24px}\r\n.fs-blog .fs-store small{display:block;font-size:11.5px;color:var(--fs-ink-soft)}\r\n.fs-blog .fs-store b{font-size:16px}\r\n\r\n\/* FAQs *\/\r\n.fs-blog .fs-faq{border-top:1px solid var(--fs-line)}\r\n.fs-blog .fs-faq details{border-bottom:1px solid var(--fs-line);margin:0}\r\n.fs-blog .fs-faq summary{list-style:none;cursor:pointer;display:flex;justify-content:space-between;align-items:center;gap:16px;padding:18px 0;font-family:var(--fs-display);font-weight:700;font-size:var(--fs-h4);line-height:1.35;color:var(--fs-ink)}\r\n.fs-blog .fs-faq summary::-webkit-details-marker{display:none}\r\n.fs-blog .fs-faq summary::after{content:\"\";flex:none;width:10px;height:10px;border-right:2.5px solid var(--fs-blue);border-bottom:2.5px solid var(--fs-blue);transform:rotate(45deg) translate(-3px,-3px);transition:transform .2s}\r\n.fs-blog .fs-faq details[open] summary::after{transform:rotate(225deg) translate(-3px,-3px)}\r\n.fs-blog .fs-faq details p{margin:0 0 20px;color:var(--fs-ink-soft)}\r\n\r\n\/* ---------- Laptop: related panel moves under the article ---------- *\/\r\n@media (max-width:1180px){\r\n  .fs-blog .fs-layout{grid-template-columns:220px minmax(0,1fr);grid-template-areas:\"toc article\" \"toc related\";row-gap:48px}\r\n  .fs-blog .fs-related{position:static;max-height:none;overflow:visible}\r\n  .fs-blog .fs-related-list{grid-template-columns:repeat(auto-fill,minmax(230px,1fr))}\r\n}\r\n\/* ---------- Tablet & phone: one column ---------- *\/\r\n@media (max-width:1024px){\r\n  .fs-blog .fs-layout{grid-template-columns:minmax(0,1fr);grid-template-areas:\"toc\" \"article\" \"related\";gap:0}\r\n  .fs-blog .fs-toc,.fs-blog .fs-related{position:static;max-height:none;overflow:visible}\r\n  .fs-blog .fs-toc{margin-bottom:32px}\r\n  .fs-blog .fs-related{margin-top:48px}\r\n}\r\n@media (max-width:900px){\r\n  .fs-blog .fs-hero{grid-template-columns:1fr;gap:28px}\r\n}\r\n@media (max-width:700px){\r\n  .fs-blog .fs-swipe{display:block}\r\n}\r\n@media (max-width:560px){\r\n  .fs-blog{--fs-text:16px;--fs-h1:32px;--fs-h2:25px;--fs-h3:19px;--fs-h4:17px}\r\n  .fs-blog .fs-hero{--fs-hero-x:20px;padding-top:28px;padding-bottom:28px}\r\n  .fs-blog .fs-hero-text{padding-top:46px}\r\n  .fs-blog .fs-back{top:12px}\r\n  .fs-blog h2{margin-top:44px}\r\n  .fs-blog .fs-article .fs-connect{grid-template-columns:1fr}\r\n  .fs-blog .fs-cta{padding:24px 20px}\r\n}\r\n@media (prefers-reduced-motion:reduce){\r\n  .fs-blog .fs-faq summary::after,.fs-blog .fs-back{transition:none}\r\n}\r\n\n\/* ---------- Extra blocks used by guide posts (same look as above) ---------- *\/\n.fs-blog .fs-hero h1 em{font-style:normal;color:var(--fs-blue)}\n.fs-blog .fs-article ol:not(.fs-steps){margin:0 0 18px;padding-left:22px}\n.fs-blog .fs-article ol:not(.fs-steps) li::marker{color:var(--fs-blue);font-weight:700}\n.fs-blog .fs-article > .fs-note:first-child{margin-top:0}\n.fs-blog .fs-steps{list-style:none;margin:20px 0 8px;padding:0;counter-reset:fs-step;border-top:1px solid var(--fs-line)}\n.fs-blog .fs-article .fs-steps li{counter-increment:fs-step;position:relative;margin:0;padding:22px 0 22px 60px;border-bottom:1px solid var(--fs-line)}\n.fs-blog .fs-steps li::before{content:counter(fs-step);position:absolute;left:0;top:22px;width:44px;height:44px;border-radius:12px;background:var(--fs-paper);color:var(--fs-blue);display:grid;place-items:center;font-family:var(--fs-display);font-weight:800;font-size:18px;line-height:1}\n.fs-blog .fs-steps h3{margin:8px 0 6px}\n.fs-blog .fs-cards{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin:20px 0 8px}\n.fs-blog .fs-card{background:var(--fs-paper);border:1px solid var(--fs-line);border-radius:14px;padding:20px}\n.fs-blog .fs-card .fs-tag{margin-bottom:10px}\n.fs-blog .fs-card h3{margin:0 0 6px}\n.fs-blog .fs-card p{margin:0}\n.fs-blog .fs-btns{display:flex;flex-wrap:wrap;gap:12px;margin:26px 0 8px}\n.fs-blog .fs-article .fs-btn{display:inline-flex;align-items:center;gap:8px;background:var(--fs-blue);color:#fff;text-decoration:none;font-weight:700;font-size:16px;padding:13px 22px;border-radius:12px;line-height:1.3;transition:background .15s}\n.fs-blog .fs-article .fs-btn:hover{background:var(--fs-blue-deep);color:#fff}\n@media (max-width:560px){ .fs-blog .fs-cards{grid-template-columns:1fr} .fs-blog .fs-article .fs-steps li{padding-left:56px} }\n<\/style>\n<script type=\"application\/ld+json\">{\"@context\":\"https:\/\/schema.org\",\"@type\":\"FAQPage\",\"mainEntity\":[{\"@type\":\"Question\",\"name\":\"What does end-to-end IoT development mean?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"End-to-end IoT development means one team designs and builds every layer of a connected product: the hardware, the firmware, the mobile or desktop apps and the cloud platform, including the interfaces between them and updates after launch.\"}},{\"@type\":\"Question\",\"name\":\"Why use one team for hardware, firmware, app and cloud?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Most problems in connected products happen at the boundaries between layers, such as the Bluetooth link between device and app. One team designs, tests and fixes those boundaries together, which usually reduces integration bugs, delays and total cost.\"}},{\"@type\":\"Question\",\"name\":\"Can ExtreemTek work with hardware we already have?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Yes. We can take over an existing device and build or modernise the firmware, apps and cloud around it, or improve an existing app that has connection problems.\"}},{\"@type\":\"Question\",\"name\":\"Which connectivity options do you work with?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Bluetooth Low Energy (BLE) and Wi-Fi are the most common in our projects, combined with iOS, Android and desktop apps and cloud back ends for data, accounts and over-the-air updates.\"}},{\"@type\":\"Question\",\"name\":\"Where is ExtreemTek based?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"ExtreemTek is based at the AI Innovation Center on the High Tech Campus in Eindhoven, the Netherlands, and works with clients across Europe.\"}}]}<\/script>\n<div class=\"fs-blog\">\n  <header class=\"fs-hero\">\n    <div class=\"fs-hero-text\">\n      <!-- BACK BUTTON: goes to the home page -->\n      <a class=\"fs-back\" href=\"https:\/\/extreemtek.com\/\" aria-label=\"Back to home page\" title=\"Back to home page\">\n        <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M19 12H5\"\/><path d=\"M12 19l-7-7 7-7\"\/><\/svg>\n      <\/a>\n      <span class=\"fs-tag\">Blog \u00b7 Product Engineering<\/span>\n      <h1>Hardware, Firmware, App and Cloud From One Team: <em>How It Works<\/em><\/h1>\n      <p class=\"fs-meta\">\n        <span>By <strong>Aqeel Wahlah<\/strong>, Founder and CEO of ExtreemTek<\/span>\n        <span><time datetime=\"2026-10-23\">October 23, 2026<\/time><\/span>\n        <span>6 min read<\/span>\n      <\/p>\n    <\/div>\n    <figure class=\"fs-img fs-cover\" data-label=\"Cover image\">\n      <img fetchpriority=\"high\" decoding=\"async\" src=\"https:\/\/extreemtek.com\/wp-content\/uploads\/2026\/10\/hardware-firmware-app-cloud-one-team.jpg\" alt=\"Hardware, firmware, app and cloud layers built by one team\" width=\"1600\" height=\"900\">\n    <\/figure>\n  <\/header>\n\n  <div class=\"fs-layout\">\n    <nav class=\"fs-toc\" aria-label=\"Table of Contents\">\n      <div class=\"fs-panel\">\n        <p class=\"fs-panel-title\">Table of Contents<\/p>\n        <ol>\n          <li><a href=\"#layers\">The four layers of a connected product<\/a><\/li>\n          <li><a href=\"#why\">Why the joins cause most problems<\/a><\/li>\n          <li><a href=\"#process\">How one team works, step by step<\/a><\/li>\n          <li><a href=\"#compare\">One team vs separate vendors<\/a><\/li>\n          <li><a href=\"#faq\">FAQ<\/a><\/li>\n        <\/ol>\n      <\/div>\n    <\/nav>\n\n    <article class=\"fs-article\">\n        <div class=\"fs-note\"><p><strong>Short answer:<\/strong> a connected product has four layers that must work as one: the device hardware, the firmware that runs on it, the mobile or desktop app, and the cloud that stores data and sends updates. When one team designs all four, the interfaces between them are planned together, tested together and fixed by the same people. That usually means fewer integration bugs, faster releases and lower total cost than splitting the work across separate vendors.<\/p><\/div>\n\n        <h2 id=\"layers\">The four layers of a connected product<\/h2>\n\n        <div class=\"fs-cards\">\n          <div class=\"fs-card\"><span class=\"fs-tag\">Layer 1<\/span><h3>Hardware<\/h3><p>Sensors, chips, battery, antenna and enclosure. Decisions here fix power use, range and cost per unit.<\/p><\/div>\n          <div class=\"fs-card\"><span class=\"fs-tag\">Layer 2<\/span><h3>Firmware<\/h3><p>The embedded software on the device: sensor processing, power management, security and over-the-air updates.<\/p><\/div>\n          <div class=\"fs-card\"><span class=\"fs-tag\">Layer 3<\/span><h3>App<\/h3><p>iOS, Android, desktop or web apps that pair with the device over BLE or Wi-Fi and show the data to users.<\/p><\/div>\n          <div class=\"fs-card\"><span class=\"fs-tag\">Layer 4<\/span><h3>Cloud<\/h3><p>Accounts, data storage, dashboards, analytics, AI features and fleet-wide firmware updates.<\/p><\/div>\n        <\/div>\n\n        <h2 id=\"why\">Why the joins between layers cause most problems<\/h2>\n\n        <p>Each layer can be built well on its own and the product can still fail. The risk sits in the interfaces: the Bluetooth protocol between device and app, the data format between app and cloud, and the update path from cloud back to the device. When different vendors own different layers, a bug at the boundary often turns into a discussion about whose side is wrong. With one team, the same engineers can trace the problem from the sensor to the dashboard and fix it in one place.<\/p>\n\n        <h2 id=\"process\">How one team builds all four layers, step by step<\/h2>\n\n        <ol class=\"fs-steps\">\n<li><h3>Discovery and architecture<\/h3>We define the problem, users, data and target markets, then design the full system: which chip and radio, which data the device sends, how the app pairs, and how the cloud stores and updates everything.<\/li>\n<li><h3>Risk-reduction sprints<\/h3>We test the riskiest assumptions first, such as battery life, data rates or pairing reliability on different phones, before building features.<\/li>\n<li><h3>Working prototype<\/h3>A first end-to-end link on real hardware: device to firmware to app to cloud, so everyone sees real data early.<\/li>\n<li><h3>MVP in short cycles<\/h3>Firmware, app and cloud are developed in parallel with shared priorities, regular demos and shared code access.<\/li>\n<li><h3>Testing and certification<\/h3>Integration testing across devices, phone models and OS versions, plus the security and certification work your markets require.<\/li>\n<li><h3>Launch, updates and scale<\/h3>Secure deployment, over-the-air firmware updates, monitoring, security patches and new features as the user base grows.<\/li>\n<\/ol>\n\n        <h2 id=\"compare\">One team vs separate vendors<\/h2>\n\n        <div class=\"fs-table-wrap\" role=\"region\" aria-label=\"One team vs separate vendors\" tabindex=\"0\">\n          <table class=\"fs-table\">\n            <thead>\n              <tr><th scope=\"col\"><\/th><th scope=\"col\">One end-to-end team<\/th><th scope=\"col\">Separate vendors per layer<\/th><\/tr>\n            <\/thead>\n            <tbody>\n              <tr><td><strong>Accountability<\/strong><\/td><td>One team owns the whole product<\/td><td>Each vendor owns its own part<\/td><\/tr>\n              <tr><td><strong>Interfaces<\/strong><\/td><td>Designed and tested together from day one<\/td><td>Agreed in documents, tested late<\/td><\/tr>\n              <tr><td><strong>Bug fixing<\/strong><\/td><td>Traced end to end by the same engineers<\/td><td>Often slowed by handovers between vendors<\/td><\/tr>\n              <tr><td><strong>Coordination<\/strong><\/td><td>Handled inside the team<\/td><td>Handled by you<\/td><\/tr>\n              <tr><td><strong>Hourly rate<\/strong><\/td><td>Can look higher<\/td><td>Can look lower per vendor<\/td><\/tr>\n              <tr><td><strong>Total cost and time<\/strong><\/td><td>Usually lower, with fewer integration surprises<\/td><td>Often higher once rework and delays are counted<\/td><\/tr>\n            <\/tbody>\n          <\/table>\n        <\/div>\n        <p class=\"fs-swipe\">Swipe the table sideways to see every column.<\/p>\n\n        <p>Separate vendors can make sense when one layer is already finished and stable, for example a proven device that only needs a new app. Even then, the new team must understand the firmware and cloud well enough to work with them.<\/p>\n\n        <h2 id=\"example\">Example: the RyseUp wellness ecosystem<\/h2>\n\n        <p>For a European client, ExtreemTek built <a href=\"https:\/\/extreemtek.com\/case-studies\/#ryseup\">RyseUp<\/a>, a \u20ac2 million connected wellness ecosystem. One team delivered the iOS and Android apps, desktop apps, BLE and Wi-Fi connectivity, cloud services and an online store. Learn more about our <a href=\"https:\/\/extreemtek.com\/iot-and-connected-products\/\">IoT and connected products<\/a>, <a href=\"https:\/\/extreemtek.com\/ble-connected-device-app-development\/\">BLE and connected device app development<\/a> and <a href=\"https:\/\/extreemtek.com\/cloud-operations\/\">cloud and backend<\/a> services, or read <a href=\"https:\/\/extreemtek.com\/iot-development-partner-checklist\/\">how to choose an IoT development partner<\/a>.<\/p>\n\n        <div class=\"fs-btns\"><a class=\"fs-btn\" href=\"https:\/\/calendly.com\/aqeel-extreemtek\/30min\" target=\"_blank\" rel=\"noopener\">Plan your connected product \u2192<\/a><\/div>\n\n        <h2 id=\"faq\">FAQ<\/h2>\n\n        <div class=\"fs-faq\">\n          <details open=\"\"><summary>What does end-to-end IoT development mean?<\/summary><p>End-to-end IoT development means one team designs and builds every layer of a connected product: the hardware, the firmware, the mobile or desktop apps and the cloud platform, including the interfaces between them and updates after launch.<\/p><\/details>\n          <details><summary>Why use one team for hardware, firmware, app and cloud?<\/summary><p>Most problems in connected products happen at the boundaries between layers, such as the Bluetooth link between device and app. One team designs, tests and fixes those boundaries together, which usually reduces integration bugs, delays and total cost.<\/p><\/details>\n          <details><summary>Can ExtreemTek work with hardware we already have?<\/summary><p>Yes. We can take over an existing device and build or modernise the firmware, apps and cloud around it, or improve an existing app that has connection problems.<\/p><\/details>\n          <details><summary>Which connectivity options do you work with?<\/summary><p>Bluetooth Low Energy (BLE) and Wi-Fi are the most common in our projects, combined with iOS, Android and desktop apps and cloud back ends for data, accounts and over-the-air updates.<\/p><\/details>\n          <details><summary>Where is ExtreemTek based?<\/summary><p>ExtreemTek is based at the AI Innovation Center on the High Tech Campus in Eindhoven, the Netherlands, and works with clients across Europe.<\/p><\/details>\n        <\/div>\n    <\/article>\n\n    <aside class=\"fs-related\" aria-labelledby=\"fs-related-title\">\n      <div class=\"fs-panel\">\n        <h2 class=\"fs-panel-title\" id=\"fs-related-title\">Related Articles<\/h2>\n        <div class=\"fs-related-list\" id=\"fs-related-list\"><\/div>\n        <p class=\"fs-related-empty\" id=\"fs-related-empty\" hidden>More articles coming soon.<\/p>\n      <\/div>\n    <\/aside>\n  <\/div>\n<\/div>\n<script>\r\n\/* Highlights the current section in the Table of Contents while scrolling *\/\r\n(function(){\r\n  var links = document.querySelectorAll('.fs-blog .fs-toc a');\r\n  if (!('IntersectionObserver' in window) || !links.length) return;\r\n  var byId = {};\r\n  links.forEach(function(a){ byId[a.getAttribute('href').slice(1)] = a; });\r\n  var obs = new IntersectionObserver(function(entries){\r\n    entries.forEach(function(e){\r\n      if (!e.isIntersecting) return;\r\n      links.forEach(function(l){ l.classList.remove('is-active'); });\r\n      if (byId[e.target.id]) byId[e.target.id].classList.add('is-active');\r\n    });\r\n  }, { rootMargin: '-20% 0px -70% 0px' });\r\n  Object.keys(byId).forEach(function(id){\r\n    var el = document.getElementById(id);\r\n    if (el) obs.observe(el);\r\n  });\r\n})();\r\n\r\n\/* Related Articles: lists the newest posts from your Blog category (skipping this one).\r\n   The heading always shows; if there are no other posts yet, \"More articles coming soon.\" shows instead. *\/\r\n(function(){\r\n  var HOW_MANY = 4;\r\n  var CATEGORY_SLUG = 'blog';   \/* the category's slug, from Posts > Categories *\/\r\n  var list = document.getElementById('fs-related-list');\r\n  var empty = document.getElementById('fs-related-empty');\r\n  if (!list || !window.fetch) return;\r\n\r\n  function toText(html){\r\n    return new DOMParser().parseFromString(html || '', 'text\/html').body.textContent.trim();\r\n  }\r\n  function samePage(link){\r\n    try { return new URL(link).pathname.replace(\/\\\/$\/, '') === location.pathname.replace(\/\\\/$\/, ''); }\r\n    catch(e){ return false; }\r\n  }\r\n  function getJSON(url){\r\n    return fetch(url).then(function(r){ if (!r.ok) throw new Error(r.status); return r.json(); });\r\n  }\r\n\r\n  getJSON('\/wp-json\/wp\/v2\/categories?slug=' + encodeURIComponent(CATEGORY_SLUG))\r\n    .then(function(cats){\r\n      if (!cats.length) return [];\r\n      return getJSON('\/wp-json\/wp\/v2\/posts?per_page=' + (HOW_MANY + 1) + '&categories=' + cats[0].id + '&_embed=wp:featuredmedia');\r\n    })\r\n    .then(function(posts){\r\n      posts = posts.filter(function(p){ return !samePage(p.link); }).slice(0, HOW_MANY);\r\n      if (!posts.length) return;\r\n\r\n      list.innerHTML = '';\n      posts.forEach(function(p){\r\n        var a = document.createElement('a');\r\n        a.className = 'fs-post';\r\n        a.href = p.link;\r\n\r\n        var imgBox = document.createElement('div');\r\n        imgBox.className = 'fs-post-img';\r\n        var media = p._embedded && p._embedded['wp:featuredmedia'] && p._embedded['wp:featuredmedia'][0];\r\n        if (media && media.source_url){\r\n          var img = document.createElement('img');\r\n          var sizes = media.media_details && media.media_details.sizes;\r\n          img.src = (sizes && (sizes.thumbnail || sizes.medium) || media).source_url;\r\n          img.alt = '';\r\n          img.loading = 'lazy';\r\n          imgBox.appendChild(img);\r\n        }\r\n\r\n        var text = document.createElement('div');\r\n        var title = document.createElement('h3');\r\n        title.className = 'fs-post-title';\r\n        title.textContent = toText(p.title && p.title.rendered);\r\n        var date = document.createElement('p');\r\n        date.className = 'fs-post-date';\r\n        date.textContent = new Date(p.date).toLocaleDateString('en-US', { year:'numeric', month:'long', day:'numeric' });\r\n        text.appendChild(title);\r\n        text.appendChild(date);\r\n\r\n        a.appendChild(imgBox);\r\n        a.appendChild(text);\r\n        list.appendChild(a);\r\n      });\r\n      if (empty) empty.hidden = true;\r\n    })\r\n    .catch(function(){ \/* keeps the heading and the \"coming soon\" line *\/ });\r\n})();\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-6f441df e-con-full e-flex e-con e-parent\" data-id=\"6f441df\" data-element_type=\"container\" data-e-type=\"container\" id=\"iot-cta\">\n\t\t\t\t<div class=\"elementor-element elementor-element-243289e elementor-widget__width-inherit elementor-widget elementor-widget-html\" data-id=\"243289e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!-- ============================================================\r\n     \"START A CONVERSATION\" SECTION + PROJECT DETAILS MODAL\r\n     Paste the whole thing into one Elementor HTML widget.\r\n     Form submissions are emailed to you via Web3Forms.\r\n     ============================================================ -->\r\n\r\n<style>\r\n@import url('https:\/\/fonts.googleapis.com\/css2?family=Inter+Tight:wght@400;500;600;700;800&display=swap');\r\n\r\n#sk-talk,#sk-modal{\r\n  --sk-navy:#0b1b3d;\r\n  --sk-blue:#1a8cff;\r\n  --sk-amber-lite:#F5B01A;\r\n  --sk-amber-deep:#D86605;\r\n  --sk-grey:#6b7280;\r\n  --sk-line:#e6e9f0;\r\n\r\n  --sk-avatar:url(\"https:\/\/extreemtek.com\/wp-content\/uploads\/2026\/09\/ChatGPT-Image-Sep-9-2026-11_35_51-AM.png\");\r\n  --sk-modal-bg:url(\"https:\/\/extreemtek.com\/wp-content\/uploads\/2026\/09\/modal-bg.jpg\");\r\n}\r\n\r\n#sk-talk{\r\n  position:relative;\r\n  background:#fff;\r\n  padding:clamp(3.5rem,8vw,5.5rem) 1.25rem;\r\n  font-family:\"Inter Tight\",system-ui,-apple-system,\"Segoe UI\",sans-serif;\r\n  color:var(--sk-navy);\r\n  text-align:center;\r\n  -webkit-font-smoothing:antialiased;\r\n\r\n  \/* --- OPTIONAL full-bleed, uncomment if the theme still boxes it in ---\r\n  width:100vw;\r\n  margin-left:calc(50% - 50vw);\r\n  *\/\r\n}\r\n#sk-talk *,#sk-talk *::before,#sk-talk *::after{box-sizing:border-box}\r\n#sk-talk .sk-t-inner{max-width:1120px;margin:0 auto}\r\n\r\n\/* header *\/\r\n#sk-talk .sk-t-eyebrow{\r\n  display:inline-block;\r\n  margin:0;\r\n  padding:.36rem .85rem;\r\n  border-radius:6px;\r\n  background:#dceafd;\r\n  color:var(--sk-blue);\r\n  font-size:.72rem;\r\n  font-weight:700;\r\n  letter-spacing:.06em;\r\n  text-transform:uppercase;\r\n  line-height:1.25;\r\n}\r\n#sk-talk h2{\r\n  margin:1rem 0 0;\r\n  padding:0;\r\n  font-family:inherit;\r\n  font-size:clamp(1.7rem,4.2vw,2.65rem);\r\n  font-weight:800;\r\n  line-height:1.16;\r\n  letter-spacing:-.03em;\r\n  color:var(--sk-navy);\r\n}\r\n#sk-talk h2 .sk-t-accent{color:var(--sk-blue)}\r\n#sk-talk .sk-t-sub{\r\n  max-width:58ch;\r\n  margin:.9rem auto 0;\r\n  font-size:clamp(1.2rem,2vw,1.12rem);\r\n  font-weight: 500;\r\n  line-height:1.6;\r\n  color:var(--sk-grey);\r\n}\r\n\r\n\/* panel *\/\r\n#sk-talk .sk-t-panel{\r\n  display:grid;\r\n  grid-template-columns:minmax(0,.85fr) minmax(0,1.15fr);\r\n  align-items:center;\r\n  gap:clamp(1.5rem,4vw,3rem);\r\n  margin-top:clamp(2rem,4.5vw,3rem);\r\n  padding:clamp(1.6rem,4vw,2.6rem);\r\n  border:1px solid var(--sk-line);\r\n  border-radius:12px;\r\n  background:#f7f9fc;\r\n  text-align:left;\r\n}\r\n\r\n\/* founder *\/\r\n#sk-talk .sk-t-person{text-align:center}\r\n#sk-talk .sk-t-avatar{\r\n  width:min(200px,60%);\r\n  margin:0 auto;\r\n  aspect-ratio:1\/1;\r\n  border:2px solid var(--sk-blue);\r\n  border-radius:50%;\r\n  background:var(--sk-avatar,none) center\/cover no-repeat,#e6eef8;\r\n}\r\n#sk-talk .sk-t-person b{\r\n  display:block;\r\n  margin-top:1.1rem;\r\n  font-size:1.22rem;\r\n  font-weight:700;\r\n  letter-spacing:-.02em;\r\n  color:#111827;\r\n}\r\n#sk-talk .sk-t-role{\r\n  display:block;\r\n  margin-top:.25rem;\r\n  font-size:.95rem;\r\n  font-weight:700;\r\n  color:var(--sk-amber-lite);\r\n}\r\n#sk-talk .sk-t-place{\r\n  display:block;\r\n  margin-top:.2rem;\r\n  font-size:.92rem;\r\n  color:var(--sk-grey);\r\n}\r\n\r\n\/* quote + actions *\/\r\n#sk-talk blockquote{\r\n  margin:0;\r\n  padding:.1rem 0 .1rem 1.1rem;\r\n  border:0;\r\n  border-left:3px solid var(--sk-blue);\r\n  quotes:none;\r\n  font-size:clamp(.98rem,2vw,1.06rem);\r\n  line-height:1.62;\r\n  color:#1c2b45;\r\n}\r\n#sk-talk .sk-t-label{\r\n  margin:1.7rem 0 .8rem;\r\n  font-size:.82rem;\r\n  font-weight:700;\r\n  letter-spacing:.02em;\r\n  text-transform:uppercase;\r\n  color:#111827;\r\n}\r\n#sk-talk .sk-t-actions{display:flex;flex-wrap:wrap;gap:.85rem}\r\n#sk-talk .sk-t-btn{\r\n  display:inline-flex;\r\n  align-items:center;\r\n  gap:.55rem;\r\n  padding:.9rem 1.5rem;\r\n  border:0;\r\n  border-radius:8px;\r\n  font-family:inherit;\r\n  font-size:.98rem;\r\n  font-weight:700;\r\n  letter-spacing:-.01em;\r\n  text-decoration:none;\r\n  cursor:pointer;\r\n  transition:transform .18s ease,box-shadow .18s ease;\r\n}\r\n#sk-talk .sk-t-btn:hover{transform:translateY(-1px);text-decoration:none}\r\n#sk-talk .sk-t-btn svg{transition:transform .18s ease}\r\n#sk-talk .sk-t-btn:hover svg{transform:translateX(3px)}\r\n#sk-talk .sk-t-btn--amber,#sk-talk .sk-t-btn--amber:visited{\r\n  background:linear-gradient(90deg,var(--sk-amber-lite) 0%,var(--sk-amber-deep) 100%);\r\n  color:#fff;\r\n  box-shadow:0 8px 22px rgba(216,102,5,.32);\r\n}\r\n#sk-talk .sk-t-btn--amber:hover{color:#fff;box-shadow:0 13px 30px rgba(216,102,5,.42)}\r\n#sk-talk .sk-t-btn--blue{\r\n  background:linear-gradient(90deg,#2b8fff 0%,#0a63d8 100%);\r\n  color:#fff;\r\n  box-shadow:0 8px 22px rgba(10,99,216,.3);\r\n}\r\n#sk-talk .sk-t-btn--blue:hover{color:#fff;box-shadow:0 13px 30px rgba(10,99,216,.4)}\r\n#sk-talk .sk-t-btn:focus-visible{outline:3px solid var(--sk-blue);outline-offset:3px}\r\n\r\n@media (max-width:820px){\r\n  #sk-talk .sk-t-panel{grid-template-columns:1fr}\r\n  #sk-talk .sk-t-avatar{width:min(160px,50%)}\r\n}\r\n@media (max-width:520px){\r\n  #sk-talk .sk-t-btn{width:100%;justify-content:center}\r\n}\r\n\r\n\/* ============ MODAL ============ *\/\r\n#sk-modal{\r\n  position:fixed;\r\n  inset:0;\r\n  z-index:99999;\r\n  display:none;\r\n  align-items:center;\r\n  justify-content:center;\r\n  padding:1.25rem;\r\n  font-family:\"Inter Tight\",system-ui,-apple-system,\"Segoe UI\",sans-serif;\r\n  text-align:left;\r\n  -webkit-font-smoothing:antialiased;\r\n}\r\n#sk-modal.is-open{display:flex}\r\n#sk-modal *,#sk-modal *::before,#sk-modal *::after{box-sizing:border-box}\r\n#sk-modal .sk-m-veil{\r\n  position:absolute;\r\n  inset:0;\r\n  background:rgba(4,10,22,.72);\r\n  -webkit-backdrop-filter:blur(3px);\r\n  backdrop-filter:blur(3px);\r\n}\r\n#sk-modal .sk-m-box{\r\n  position:relative;\r\n  isolation:isolate;\r\n  overflow:hidden auto;\r\n  width:min(550px,100%);\r\n  max-height:min(92vh,780px);\r\n  padding:clamp(1.4rem,4vw,2rem);\r\n  border:1px solid #2a7fd4;\r\n  border-radius:12px;\r\n  background:#111b2c;\r\n  color:#fff;\r\n  box-shadow:0 30px 70px rgba(0,0,0,.55);\r\n\r\n  \/* hide the scrollbar chrome \u2014 it still scrolls if it truly must *\/\r\n  scrollbar-width:none;\r\n  -ms-overflow-style:none;\r\n}\r\n#sk-modal .sk-m-box::-webkit-scrollbar{width:0;height:0;display:none}\r\n#sk-modal .sk-m-box::before{\r\n  content:\"\";\r\n  position:absolute;\r\n  inset:0;\r\n  z-index:-1;\r\n  background:var(--sk-modal-bg,none) center\/cover no-repeat;\r\n  opacity:.22;\r\n}\r\n#sk-modal .sk-m-close{\r\n  position:absolute;\r\n  top:.7rem;\r\n  right:.7rem;\r\n  display:flex;\r\n  align-items:center;\r\n  justify-content:center;\r\n  width:32px;\r\n  height:32px;\r\n  min-width:0;\r\n  min-height:0;\r\n  padding:0 !important;\r\n  margin:0;\r\n  border:0;\r\n  border-radius:50%;\r\n  line-height:0;\r\n  font-size:0;\r\n  background:rgba(255,255,255,.12);\r\n  color:#fff;\r\n  cursor:pointer;\r\n  -webkit-appearance:none;\r\n  appearance:none;\r\n  transition:background .18s ease;\r\n}\r\n#sk-modal .sk-m-close:hover{background:rgba(255,255,255,.24)}\r\n#sk-modal .sk-m-close:focus-visible{outline:3px solid var(--sk-amber-lite);outline-offset:2px}\r\n#sk-modal .sk-m-close svg{display:block}\r\n\r\n#sk-modal .sk-m-icon{\r\n  display:grid;\r\n  place-items:center;\r\n  width:58px;\r\n  height:58px;\r\n  border-radius:10px;\r\n  background:#2b3648;\r\n  color:var(--sk-amber-lite);\r\n}\r\n#sk-modal h2{\r\n  margin:1.3rem 0 0;\r\n  padding:0;\r\n  font-family:inherit;\r\n  font-size:clamp(1.6rem,5vw,2.1rem);\r\n  font-weight:800;\r\n  line-height:1.14;\r\n  letter-spacing:-.03em;\r\n  color:#fff;\r\n}\r\n#sk-modal h2 .sk-m-accent{color:var(--sk-amber-lite)}\r\n#sk-modal .sk-m-sub{\r\n  margin:.7rem 0 0;\r\n  font-size:.98rem;\r\n  line-height:1.5;\r\n  color:#c4d2e4;\r\n}\r\n\r\n#sk-modal .sk-m-field{position:relative;margin-top:.85rem}\r\n#sk-modal .sk-m-field:first-of-type{margin-top:1.5rem}\r\n#sk-modal .sk-m-field svg{\r\n  position:absolute;\r\n  top:50%;\r\n  left:1rem;\r\n  transform:translateY(-50%);\r\n  color:#6b7a90;\r\n  pointer-events:none;\r\n}\r\n#sk-modal .sk-m-field .sk-m-chev{left:auto;right:1rem}\r\n\/* textarea icon pins to the first line, not the middle *\/\r\n#sk-modal .sk-m-field--area svg{top:1.15rem;transform:none}\r\n#sk-modal input,#sk-modal select,#sk-modal textarea{\r\n  width:100%;\r\n  height:56px;\r\n  margin:0;\r\n  padding:0 1rem 0 3rem;\r\n  border:1px solid #dbe2ec;\r\n  border-radius:9px;\r\n  background:#fff;\r\n  font-family:inherit;\r\n  font-size:1rem;\r\n  color:#111827;\r\n  appearance:none;\r\n  -webkit-appearance:none;\r\n}\r\n#sk-modal textarea{\r\n  height:auto;\r\n  min-height:108px;\r\n  padding:1rem 1rem 1rem 3rem;\r\n  line-height:1.5;\r\n  resize:vertical;\r\n}\r\n#sk-modal select{padding-right:2.8rem;color:#111827}\r\n#sk-modal select:invalid{color:#8a94a4}\r\n#sk-modal input::placeholder,#sk-modal textarea::placeholder{color:#8a94a4}\r\n#sk-modal input:focus,#sk-modal select:focus,#sk-modal textarea:focus{\r\n  outline:0;\r\n  border-color:var(--sk-blue);\r\n  box-shadow:0 0 0 3px rgba(26,140,255,.25);\r\n}\r\n#sk-modal .sk-m-hint{\r\n  display:block;\r\n  margin:.4rem 0 0 .15rem;\r\n  font-size:.8rem;\r\n  color:#9fb1c8;\r\n}\r\n\/* hidden spam trap \u2014 people never see it, bots fill it in *\/\r\n#sk-modal .sk-m-trap{\r\n  position:absolute !important;\r\n  left:-9999px !important;\r\n  width:1px;\r\n  height:1px;\r\n  overflow:hidden;\r\n}\r\n\r\n#sk-modal .sk-m-submit{\r\n  display:flex;\r\n  align-items:center;\r\n  justify-content:center;\r\n  gap:.7rem;\r\n  width:100%;\r\n  margin-top:1.5rem;\r\n  padding:1.05rem 1.5rem;\r\n  border:0;\r\n  border-radius:9px;\r\n  background:linear-gradient(90deg,var(--sk-amber-lite) 0%,var(--sk-amber-deep) 100%);\r\n  color:#fff;\r\n  font-family:inherit;\r\n  font-size:1.22rem;\r\n  font-weight:700;\r\n  letter-spacing:-.02em;\r\n  cursor:pointer;\r\n  box-shadow:0 10px 26px rgba(216,102,5,.35);\r\n  transition:transform .18s ease,box-shadow .18s ease;\r\n}\r\n#sk-modal .sk-m-submit:hover{transform:translateY(-1px);box-shadow:0 15px 34px rgba(216,102,5,.45)}\r\n#sk-modal .sk-m-submit:focus-visible{outline:3px solid #fff;outline-offset:3px}\r\n#sk-modal .sk-m-submit[disabled]{opacity:.65;cursor:default;transform:none}\r\n#sk-modal .sk-m-submit svg{transition:transform .18s ease}\r\n#sk-modal .sk-m-submit:hover svg{transform:translateX(3px)}\r\n\r\n#sk-modal .sk-m-note{\r\n  display:flex;\r\n  align-items:center;\r\n  gap:.55rem;\r\n  margin:1.1rem 0 0;\r\n  font-size:.9rem;\r\n  color:#c4d2e4;\r\n}\r\n#sk-modal .sk-m-note svg{flex:none;color:#c4d2e4}\r\n#sk-modal .sk-m-status{\r\n  margin:1.1rem 0 0;\r\n  font-size:.95rem;\r\n  line-height:1.5;\r\n  color:#8ee7a8;\r\n}\r\n#sk-modal .sk-m-status:empty{display:none}\r\n#sk-modal .sk-m-status[data-state=\"error\"]{color:#ffb4b4}\r\n\r\n\/* once a status message shows, the note has done its job \u2014\r\n   swapping one for the other keeps the panel height constant *\/\r\n#sk-modal .sk-m-form--sent .sk-m-note{display:none}\r\n\r\n@media (prefers-reduced-motion:reduce){\r\n  #sk-talk *,#sk-modal *{transition:none !important;animation:none !important}\r\n}\r\n<\/style>\r\n\r\n<section id=\"sk-talk\">\r\n  <div class=\"sk-t-inner\">\r\n\r\n    <p class=\"sk-t-eyebrow\">Start a conversation<\/p>\r\n\r\n    <h2><span class=\"sk-t-accent\">Let's Discuss<\/span> What You Are Building<\/h2>\r\n\r\n    <p class=\"sk-t-sub\">\r\n      Tell us where you are in your product journey and what is preventing you from\r\n      moving forward. We will help you identify a practical next step.\r\n    <\/p>\r\n\r\n    <div class=\"sk-t-panel\">\r\n\r\n      <div class=\"sk-t-person\">\r\n        <div class=\"sk-t-avatar\" role=\"img\" aria-label=\"Aqeel Wahlah\"><\/div>\r\n        <b>Aqeel Wahlah<\/b>\r\n        <span class=\"sk-t-role\">Founder and CEO<\/span>\r\n        <span class=\"sk-t-place\">ExtreemTek, Eindhoven, Netherlands<\/span>\r\n      <\/div>\r\n\r\n      <div>\r\n        <blockquote>\r\n          I personally join the initial conversation to understand your product goals\r\n          and ensure we bring the right technical expertise to the discussion.\r\n        <\/blockquote>\r\n\r\n        <p class=\"sk-t-label\">Select how you want to reach out:<\/p>\r\n\r\n        <div class=\"sk-t-actions\">\r\n          <a class=\"sk-t-btn sk-t-btn--amber\" href=\"https:\/\/calendly.com\/aqeel-extreemtek\/30min\">\r\n            Schedule a Discovery Call\r\n            <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M5 12h14M13 6l6 6-6 6\"\/><\/svg>\r\n          <\/a>\r\n          <button class=\"sk-t-btn sk-t-btn--blue\" type=\"button\" data-sk-open-modal>\r\n            Send Project Details\r\n            <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M5 12h14M13 6l6 6-6 6\"\/><\/svg>\r\n          <\/button>\r\n        <\/div>\r\n      <\/div>\r\n\r\n    <\/div>\r\n  <\/div>\r\n<\/section>\r\n\r\n<!-- ===== modal ===== -->\r\n<div id=\"sk-modal\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"sk-m-title\" hidden>\r\n  <div class=\"sk-m-veil\" data-sk-close><\/div>\r\n\r\n  <div class=\"sk-m-box\">\r\n    <button class=\"sk-m-close\" type=\"button\" data-sk-close aria-label=\"Close\">\r\n      <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" aria-hidden=\"true\"><path d=\"M6 6l12 12M18 6L6 18\"\/><\/svg>\r\n    <\/button>\r\n\r\n    <div class=\"sk-m-icon\" aria-hidden=\"true\">\r\n      <svg width=\"30\" height=\"30\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21.5 2.5 2.5 9.8l7.2 2.9 2.6 8 9.2-18.2Z\"\/><path d=\"M9.7 12.7 21.5 2.5\"\/><\/svg>\r\n    <\/div>\r\n\r\n    <h2 id=\"sk-m-title\">Let's Explore <span class=\"sk-m-accent\">Your Product Idea!<\/span><\/h2>\r\n\r\n    <p class=\"sk-m-sub\">Tell us what you're building. Our engineering team will help you define the next step.<\/p>\r\n\r\n    <form id=\"sk-m-form\" novalidate>\r\n      <div class=\"sk-m-field\">\r\n        <svg width=\"19\" height=\"19\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"8\" r=\"3.5\"\/><path d=\"M4.5 20a7.5 7.5 0 0 1 15 0\"\/><\/svg>\r\n        <input id=\"sk-name\" name=\"name\" type=\"text\" placeholder=\"Your Name*\" aria-label=\"Your name\" required autocomplete=\"name\">\r\n      <\/div>\r\n\r\n      <div class=\"sk-m-field\">\r\n        <svg width=\"19\" height=\"19\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"2.5\" y=\"5\" width=\"19\" height=\"14\" rx=\"2.5\"\/><path d=\"M3 7l9 6 9-6\"\/><\/svg>\r\n        <input id=\"sk-email\" name=\"email\" type=\"email\" placeholder=\"Work Email*\" aria-label=\"Work email\" required autocomplete=\"email\">\r\n      <\/div>\r\n\r\n      <!-- phone: digits and phone punctuation only -->\r\n      <div class=\"sk-m-field\">\r\n        <svg width=\"19\" height=\"19\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M6.3 3.5h3.1l1.6 4-2 1.2a10.5 10.5 0 0 0 4.8 4.8l1.2-2 4 1.6v3.1a1.8 1.8 0 0 1-2 1.8A15.6 15.6 0 0 1 4.5 5.5a1.8 1.8 0 0 1 1.8-2Z\"\/><\/svg>\r\n        <input id=\"sk-phone\" name=\"phone\" type=\"tel\"\r\n               placeholder=\"Phone Number*\"\r\n               aria-label=\"Phone number\"\r\n               required\r\n               inputmode=\"tel\"\r\n               autocomplete=\"tel\"\r\n               maxlength=\"20\"\r\n               pattern=\"[0-9+()\\-\\s]{7,20}\"\r\n               title=\"Digits only \u2014 you may also use + ( ) - and spaces\">\r\n        <small class=\"sk-m-hint\">Digits only. You may use +, (), - and spaces.<\/small>\r\n      <\/div>\r\n\r\n      <div class=\"sk-m-field\">\r\n        <svg width=\"19\" height=\"19\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"m12 2.8 8 4.3v9.8l-8 4.3-8-4.3V7.1Z\"\/><path d=\"m4 7.1 8 4.3 8-4.3M12 11.4V21\"\/><\/svg>\r\n        <svg class=\"sk-m-chev\" width=\"19\" height=\"19\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"m6 9 6 6 6-6\"\/><\/svg>\r\n        <select id=\"sk-type\" name=\"project_type\" aria-label=\"What do you want to build?\" required>\r\n          <option value=\"\" selected disabled>What do you want to build?*<\/option>\r\n          <option>Mobile app (iOS \/ Android)<\/option>\r\n          <option>Web platform or SaaS<\/option>\r\n          <option>IoT or connected device<\/option>\r\n          <option>AI-powered feature<\/option>\r\n          <option>Back end, cloud or integrations<\/option>\r\n          <option>Not sure yet<\/option>\r\n        <\/select>\r\n      <\/div>\r\n\r\n      <!-- optional short summary -->\r\n      <div class=\"sk-m-field sk-m-field--area\">\r\n        <svg width=\"19\" height=\"19\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M4.5 5.5h15M4.5 10h15M4.5 14.5h10\"\/><\/svg>\r\n        <textarea id=\"sk-brief\" name=\"project_brief\"\r\n                  placeholder=\"Briefly, what are you building? (optional)\"\r\n                  aria-label=\"Short summary of your project or idea\"\r\n                  maxlength=\"600\" rows=\"3\"><\/textarea>\r\n        <small class=\"sk-m-hint\">A sentence or two is plenty \u2014 we'll ask the rest on the call.<\/small>\r\n      <\/div>\r\n\r\n      <!-- spam trap: leave empty -->\r\n      <div class=\"sk-m-trap\" aria-hidden=\"true\">\r\n        <input type=\"checkbox\" name=\"botcheck\" tabindex=\"-1\" autocomplete=\"off\">\r\n      <\/div>\r\n\r\n      <button class=\"sk-m-submit\" type=\"submit\">\r\n        Let's Discuss Your Idea\r\n        <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M5 12h14M13 6l6 6-6 6\"\/><\/svg>\r\n      <\/button>\r\n\r\n      <p class=\"sk-m-note\">\r\n        <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"4.5\" y=\"10.5\" width=\"15\" height=\"10\" rx=\"2\"\/><path d=\"M8 10.5V7.8a4 4 0 0 1 8 0v2.7\"\/><\/svg>\r\n        No obligation. We'll get back to you within 1-2 business days.\r\n      <\/p>\r\n\r\n      <p class=\"sk-m-status\" role=\"status\" aria-live=\"polite\"><\/p>\r\n    <\/form>\r\n  <\/div>\r\n<\/div>\r\n\r\n<script>\r\n\/* Popup form \u2014 sends submissions to your email via Web3Forms *\/\r\n(function(){\r\n  var FORM_ENDPOINT = \"https:\/\/api.web3forms.com\/submit\";\r\n  var ACCESS_KEY    = \"d16be941-4049-42a1-aac1-c0025927fe85\";\r\n\r\n  var modal  = document.getElementById('sk-modal');\r\n  var form   = document.getElementById('sk-m-form');\r\n  if(!modal || !form) return;\r\n\r\n  \/* move the popup to <body> so no Elementor wrapper can clip or offset it *\/\r\n  document.body.appendChild(modal);\r\n\r\n  var status = modal.querySelector('.sk-m-status');\r\n  var phone  = document.getElementById('sk-phone');\r\n  var opener = null;\r\n\r\n  \/* ---- phone field: allow only digits and phone punctuation ---- *\/\r\n  if(phone){\r\n    var ALLOWED = \/[^0-9+()\\-\\s]\/g;\r\n\r\n    \/* block disallowed characters as they are typed *\/\r\n    phone.addEventListener('keypress', function(e){\r\n      if(e.ctrlKey || e.metaKey || e.altKey) return;\r\n      if(e.key && e.key.length === 1 && ALLOWED.test(e.key)){\r\n        e.preventDefault();\r\n      }\r\n    });\r\n\r\n    \/* strip anything that slips through (paste, autofill, mobile keyboards) *\/\r\n    function clean(){\r\n      var start = phone.selectionStart;\r\n      var before = phone.value;\r\n      var after = before.replace(ALLOWED, '');\r\n      if(after !== before){\r\n        phone.value = after;\r\n        var drop = before.length - after.length;\r\n        try{ phone.setSelectionRange(Math.max(0, start - drop), Math.max(0, start - drop)); }catch(err){}\r\n      }\r\n    }\r\n    phone.addEventListener('input', clean);\r\n    phone.addEventListener('paste', function(){ setTimeout(clean, 0); });\r\n  }\r\n\r\n  function open(trigger){\r\n    opener = trigger || null;\r\n    modal.hidden = false;\r\n    modal.classList.add('is-open');\r\n    document.body.style.overflow = 'hidden';\r\n    var first = modal.querySelector('input:not([name=\"botcheck\"]),select,textarea');\r\n    if(first) first.focus();\r\n  }\r\n\r\n  function close(){\r\n    modal.classList.remove('is-open');\r\n    modal.hidden = true;\r\n    document.body.style.overflow = '';\r\n\r\n    \/* clear every field so reopening starts fresh *\/\r\n    form.reset();\r\n    if(phone) phone.setCustomValidity('');\r\n\r\n    say('', 'ok');\r\n    if(opener) opener.focus();\r\n  }\r\n\r\n  document.addEventListener('click', function(e){\r\n    var btn = e.target.closest('[data-sk-open-modal]');\r\n    if(btn){ e.preventDefault(); open(btn); }\r\n  });\r\n\r\n  modal.querySelectorAll('[data-sk-close]').forEach(function(el){\r\n    el.addEventListener('click', close);\r\n  });\r\n\r\n  document.addEventListener('keydown', function(e){\r\n    if(e.key === 'Escape' && modal.classList.contains('is-open')) close();\r\n  });\r\n\r\n  \/* keep tab focus inside the popup while it is open *\/\r\n  modal.addEventListener('keydown', function(e){\r\n    if(e.key !== 'Tab') return;\r\n    var f = modal.querySelectorAll('button,input:not([name=\"botcheck\"]),select,textarea,a[href]');\r\n    if(!f.length) return;\r\n    var first = f[0], last = f[f.length - 1];\r\n    if(e.shiftKey && document.activeElement === first){ e.preventDefault(); last.focus(); }\r\n    else if(!e.shiftKey && document.activeElement === last){ e.preventDefault(); first.focus(); }\r\n  });\r\n\r\n  function say(msg, state){\r\n    status.textContent = msg;\r\n    status.setAttribute('data-state', state || 'ok');\r\n    form.classList.toggle('sk-m-form--sent', !!msg);\r\n  }\r\n\r\n  form.addEventListener('submit', function(e){\r\n    e.preventDefault();\r\n    say('', 'ok');\r\n\r\n    \/* phone must hold at least 7 digits once punctuation is ignored *\/\r\n    if(phone){\r\n      var digits = phone.value.replace(\/\\D\/g, '');\r\n      if(digits.length < 7){\r\n        phone.setCustomValidity('Please enter a valid phone number (at least 7 digits).');\r\n      } else {\r\n        phone.setCustomValidity('');\r\n      }\r\n    }\r\n\r\n    if(!form.checkValidity()){\r\n      form.reportValidity();\r\n      return;\r\n    }\r\n\r\n    var btn = form.querySelector('.sk-m-submit');\r\n    var payload = new FormData(form);\r\n    payload.append('access_key', ACCESS_KEY);\r\n    payload.append('subject', 'New project inquiry from extreemtek.com (contact section)');\r\n    payload.append('from_name', 'ExtreemTek Website');\r\n\r\n    btn.disabled = true;\r\n    say('Sending\u2026', 'ok');\r\n\r\n    fetch(FORM_ENDPOINT, {\r\n      method:'POST',\r\n      headers:{ 'Accept':'application\/json' },\r\n      body:payload\r\n    })\r\n      .then(function(r){ return r.json(); })\r\n      .then(function(res){\r\n        if(!res.success) throw new Error(res.message || 'failed');\r\n        form.reset();\r\n        say('Thanks. We will get back to you within 1-2 business days.', 'ok');\r\n      })\r\n      .catch(function(){\r\n        say('Something went wrong. Please try again or email us directly.', 'error');\r\n      })\r\n      .finally(function(){ btn.disabled = false; });\r\n  });\r\n})();\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-3cefe4d e-con-full e-flex e-con e-parent\" data-id=\"3cefe4d\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-fba1911 elementor-widget__width-inherit elementor-widget elementor-widget-html\" data-id=\"fba1911\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\n@import url('https:\/\/fonts.googleapis.com\/css2?family=Inter+Tight:wght@400;500;600;700;800&display=swap');\n\nhtml{scroll-behavior:smooth}\n\n#sk-foot{\n  --sk-amber:#F5B01A;\n  --sk-ink:#101c30;\n\n  position:relative;\n  font-family:\"Inter Tight\",system-ui,-apple-system,\"Segoe UI\",sans-serif;\n  -webkit-font-smoothing:antialiased;\n}\n#sk-foot *,#sk-foot *::before,#sk-foot *::after{box-sizing:border-box}\n#sk-foot .sk-f-inner{max-width:1120px;margin:0 auto;padding:0 1.5rem}\n\n\/* ---------- orange band ---------- *\/\n#sk-foot .sk-f-top{\n  position:relative;\n  padding:clamp(4.5rem,11vw,8rem) 0 clamp(2rem,5vw,3rem);\n  background:url(\"https:\/\/extreemtek.com\/wp-content\/uploads\/2026\/09\/waves-transparent-1920x464-1.png\") center top\/cover no-repeat;\n  color:#fff;\n}\n#sk-foot .sk-f-grid{\n  display:grid;\n  grid-template-columns:minmax(0,1.5fr) minmax(0,1fr);\n  gap:clamp(1.6rem,4vw,3rem);\n  padding-top:clamp(1rem,2vw,1.5rem);\n}\n#sk-foot .sk-f-logo{\n  display:block;\n  width:auto;\n  max-width:230px;\n  height:auto;\n}\n#sk-foot .sk-f-blurb{\n  margin:1.4rem 0 0;\n  max-width:42ch;\n  font-size:.95rem;\n  font-weight:500;\n  line-height:1.55;\n  color:#fff;\n}\n#sk-foot .sk-f-addr{\n  margin:1.2rem 0 0;\n  max-width:44ch;\n  font-size:.88rem;\n  font-style:normal;\n  line-height:1.5;\n  color:rgba(255,255,255,.92);\n}\n#sk-foot .sk-f-contact{\n  margin:0;\n  padding:0;\n  list-style:none;\n  align-self:center;\n}\n#sk-foot .sk-f-contact li{\n  display:flex;\n  align-items:center;\n  gap:.7rem;\n  margin:0 0 .95rem;\n  padding:0;\n  list-style:none;\n  font-size:.95rem;\n}\n#sk-foot .sk-f-contact li:last-child{margin-bottom:0}\n#sk-foot .sk-f-contact li::marker{content:none}\n#sk-foot .sk-f-contact svg{flex:none;color:rgba(255,255,255,.9)}\n#sk-foot .sk-f-contact a{\n  color:#fff;\n  text-decoration:none;\n  border-bottom:1px solid transparent;\n  transition:border-color .18s ease;\n}\n#sk-foot .sk-f-contact a:hover{color:#fff;border-bottom-color:rgba(255,255,255,.7)}\n#sk-foot .sk-f-contact a:focus-visible{outline:3px solid #fff;outline-offset:3px}\n\n\/* ---------- dark band ---------- *\/\n#sk-foot .sk-f-bottom{\n  background:var(--sk-ink);\n  color:#dbe3ee;\n  padding:clamp(2.4rem,5vw,3.4rem) 0 0;\n}\n#sk-foot .sk-f-nav{\n  display:grid;\n  grid-template-columns:repeat(3,minmax(0,1fr));\n  gap:1.5rem;\n  max-width:820px;\n  margin:0 auto;\n}\n#sk-foot .sk-f-nav h3{\n  margin:0 0 1.3rem;\n  padding:0;\n  font-family:inherit;\n  font-size:.82rem;\n  font-weight:700;\n  letter-spacing:.05em;\n  text-transform:uppercase;\n  color:var(--sk-amber);\n}\n#sk-foot .sk-f-nav ul{margin:0;padding:0;list-style:none}\n#sk-foot .sk-f-nav li{margin:0 0 .9rem;padding:0;list-style:none}\n#sk-foot .sk-f-nav li::marker{content:none}\n#sk-foot .sk-f-nav a{\n  color:#dbe3ee;\n  font-size:.95rem;\n  line-height:1.45;\n  text-decoration:none;\n  transition:color .18s ease;\n}\n#sk-foot .sk-f-nav a:hover{color:var(--sk-amber);text-decoration:none}\n#sk-foot .sk-f-nav a:focus-visible{outline:3px solid var(--sk-amber);outline-offset:3px;border-radius:3px}\n\n#sk-foot .sk-f-legal{\n  display:flex;\n  flex-wrap:wrap;\n  align-items:center;\n  justify-content:space-between;\n  gap:1rem;\n  margin-top:clamp(2rem,4vw,3rem);\n  padding:1.3rem 0;\n  border-top:1px solid rgba(255,255,255,.08);\n  font-size:.88rem;\n  color:#9aa8bd;\n}\n#sk-foot .sk-f-legal b{font-weight:600;color:var(--sk-amber)}\n#sk-foot .sk-f-legal ul{display:flex;gap:1.6rem;margin:0;padding:0;list-style:none}\n#sk-foot .sk-f-legal li{margin:0;padding:0;list-style:none}\n#sk-foot .sk-f-legal li::marker{content:none}\n#sk-foot .sk-f-legal a{color:#9aa8bd;text-decoration:none;transition:color .18s ease}\n#sk-foot .sk-f-legal a:hover{color:#fff;text-decoration:none}\n#sk-foot .sk-f-legal a:focus-visible{outline:3px solid var(--sk-amber);outline-offset:3px;border-radius:3px}\n\n\/* ---------- back to top ---------- *\/\n#sk-top-btn{\n  position:fixed;\n  right:24px;bottom:24px;\n  z-index:9999;\n\n  width:48px;height:48px;\n  display:flex;align-items:center;justify-content:center;\n  border:0;border-radius:12px;\n  background:#F5B01A;\n  color:#101c30;\n  cursor:pointer;\n\n  opacity:0;\n  visibility:hidden;\n  transform:translateY(12px);\n  transition:opacity .25s ease, transform .25s ease, visibility .25s, background-color .2s ease, color .2s ease;\n}\n#sk-top-btn.is-visible{\n  opacity:1;\n  visibility:visible;\n  transform:translateY(0);\n}\n#sk-top-btn svg{\n  width:20px;height:20px;\n  fill:none;stroke:currentColor;stroke-width:2.4;\n  stroke-linecap:round;stroke-linejoin:round;\n}\n@media (hover:hover){\n  #sk-top-btn:hover,\n  #sk-top-btn:focus,\n  #sk-top-btn:active{\n    background:#007CF9 !important;\n    color:#fff !important;\n  }\n}\n#sk-top-btn:focus-visible{outline:3px solid #007CF9;outline-offset:3px}\n\n@media (max-width:760px){\n  #sk-foot .sk-f-grid{grid-template-columns:1fr;gap:1.8rem}\n  #sk-foot .sk-f-nav{grid-template-columns:repeat(2,minmax(0,1fr));gap:1.8rem}\n  #sk-foot .sk-f-legal{justify-content:flex-start}\n}\n@media (max-width:600px){\n  #sk-top-btn{right:16px;bottom:16px;width:44px;height:44px;border-radius:11px}\n  #sk-top-btn svg{width:18px;height:18px}\n}\n@media (max-width:460px){\n  #sk-foot .sk-f-nav{grid-template-columns:1fr}\n}\n@media (prefers-reduced-motion:reduce){\n  html{scroll-behavior:auto}\n  #sk-foot *{transition:none !important;animation:none !important}\n  #sk-top-btn{transition:opacity .01s}\n}\n<\/style>\n\n<footer id=\"sk-foot\">\n\n  <div class=\"sk-f-top\">\n    <div class=\"sk-f-inner\">\n      <div class=\"sk-f-grid\">\n\n        <div>\n          <img class=\"sk-f-logo\" src=\"https:\/\/extreemtek.com\/wp-content\/uploads\/2026\/09\/Group-2.png\" alt=\"ExtreemTek \u2014 Engineering Ideas into Intelligent Reality\" loading=\"lazy\" decoding=\"async\">\n\n          <p class=\"sk-f-blurb\">\n            High-quality product engineering bringing AI, IoT, web,\n            mobile and cloud together for scalability.\n          <\/p>\n\n          <address class=\"sk-f-addr\">\n            AI Innovation Center,  High Tech Campus, 5656 AE,<br>\n            Eindhoven, the Netherlands.\n          <\/address>\n        <\/div>\n\n        <ul class=\"sk-f-contact\">\n          <li>\n            <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M4.98 3.5a2.5 2.5 0 1 0 0 5 2.5 2.5 0 0 0 0-5ZM3 9.75h4v10.75H3ZM9.5 9.75h3.83v1.47h.05a4.2 4.2 0 0 1 3.78-2.08c4.04 0 4.79 2.66 4.79 6.12v4.24h-4v-3.76c0-.9-.02-2.05-1.25-2.05-1.25 0-1.44.98-1.44 1.99v3.82h-4Z\"><\/path><\/svg>\n            <a href=\"https:\/\/www.linkedin.com\/company\/extreemtek\" target=\"_blank\" rel=\"noopener\">@extreemtek<\/a>\n          <\/li>\n          <li>\n            <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"7\" y=\"2.5\" width=\"10\" height=\"19\" rx=\"2.5\"><\/rect><path d=\"M11 18.5h2\"><\/path><\/svg>\n            <a href=\"tel:+31641166735\">+31641166735<\/a>\n          <\/li>\n          <li>\n            <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"2.5\" y=\"5\" width=\"19\" height=\"14\" rx=\"2.5\"><\/rect><path d=\"M3 7l9 6 9-6\"><\/path><\/svg>\n            <a href=\"mailto:hello@extreemtek.nl\">hello@extreemtek.nl<\/a>\n          <\/li>\n        <\/ul>\n\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <div class=\"sk-f-bottom\">\n    <div class=\"sk-f-inner\">\n\n      <nav class=\"sk-f-nav\" aria-label=\"Footer\">\n        <div>\n          <h3>Case Studies<\/h3>\n          <ul>\n            <li><a href=\"https:\/\/extreemtek.com\/case-studies\/#clawleaf\">Clawleaf<\/a><\/li>\n            <li><a href=\"https:\/\/extreemtek.com\/fileshift_fast_file_transfer\/\">Fileshift<\/a><\/li>\n          <li><a href=\"https:\/\/extreemtek.com\/plantcare\/\">Plantcare<\/a><\/li>\n            <!--<li><a href=\"#path-modernize\">Deepfake<\/a><\/li> -->\n          <\/ul>\n        <\/div>\n\n        <div>\n          <h3 href=\"#services\">Services<\/h3>\n          <ul>\n            <li><a href=\"https:\/\/extreemtek.com\/ai-solution\/\">AI Solutions<\/a><\/li>\n            <li><a href=\"https:\/\/extreemtek.com\/iot-and-connected-products\/\">IoT Firmware<\/a><\/li>\n            <li><a href=\"https:\/\/extreemtek.com\/website-and-mobile-app-development\/\">Web &amp; App Development<\/a><\/li>\n            <li><a href=\"https:\/\/extreemtek.com\/cloud-operations\/\">Cloud Operations<\/a><\/li><li><a href=\"https:\/\/extreemtek.com\/ble-connected-device-app-development\/\">BLE &amp; Device Apps<\/a><\/li><li><a href=\"https:\/\/extreemtek.com\/mvp-development\/\">MVP Development<\/a><\/li>\n          <\/ul>\n        <\/div>\n\n        <div>\n          <h3>Company<\/h3>\n          <ul>\n            <li><a href=\"https:\/\/extreemtek.com\/\">Home<\/a><\/li><li><a href=\"https:\/\/extreemtek.com\/#case-studies\">Case Studies<\/a><\/li>\n            <li><a href=\"https:\/\/extreemtek.com\/#how-we-work\">How We Work<\/a><\/li>\n            <li><a href=\"https:\/\/extreemtek.com\/contact-us\/\">Contact Us<\/a><\/li>\n          <\/ul>\n        <\/div>\n      <\/nav>\n\n      <div class=\"sk-f-legal\">\n        <p style=\"margin:0\">\u00a9 2026 <b>ExtreemTek<\/b>. All rights reserved. Registered in Eindhoven, the Netherlands.<\/p>\n        <ul>\n          <li><a href=\"https:\/\/extreemtek.com\/privacy-policy\/\">Privacy Policy<\/a><\/li>\n          \n        <\/ul>\n      <\/div>\n\n    <\/div>\n  <\/div>\n\n<\/footer>\n\n<button id=\"sk-top-btn\" type=\"button\" aria-label=\"Back to top\">\n  <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M6 15l6-6 6 6\"><\/path><\/svg>\n<\/button>\n\n<script>\n(function () {\n  function init() {\n    var btn = document.getElementById('sk-top-btn');\n    if (!btn) return;\n\n    var SHOW_AFTER = 400;\n\n    function scrolled() {\n      return window.pageYOffset\n          || document.documentElement.scrollTop\n          || document.body.scrollTop\n          || 0;\n    }\n\n    function check() {\n      btn.classList.toggle('is-visible', scrolled() > SHOW_AFTER);\n    }\n\n    \/\/ scroll, resize, and the tail of any smooth-scroll from an anchor click\n    window.addEventListener('scroll', check, { passive: true });\n    window.addEventListener('resize', check, { passive: true });\n    window.addEventListener('hashchange', function () {\n      setTimeout(check, 100);\n      setTimeout(check, 700);\n    });\n    document.addEventListener('click', function (e) {\n      var a = e.target.closest && e.target.closest('a[href*=\"#\"]');\n      if (!a) return;\n      setTimeout(check, 100);\n      setTimeout(check, 700);\n    }, true);\n\n    \/\/ safety net for page builders that animate scroll without firing events\n    setInterval(check, 800);\n\n    check();\n\n    btn.addEventListener('click', function () {\n      var reduce = window.matchMedia('(prefers-reduced-motion:reduce)').matches;\n      if (window.scrollTo && !reduce) {\n        window.scrollTo({ top: 0, behavior: 'smooth' });\n      } else {\n        window.scrollTo(0, 0);\n      }\n    });\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init);\n  } else {\n    init();\n  }\n})();\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>How one engineering team builds a connected product across hardware, firmware, mobile app and cloud, and why it reduces cost, risk and time to market.<\/p>","protected":false},"author":1,"featured_media":7368,"comment_status":"open","ping_status":"open","sticky":false,"template":"elementor_canvas","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-7332","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Hardware, Firmware, App &amp; Cloud From One Team | ExtreemTek<\/title>\n<meta name=\"description\" content=\"How one team builds a connected product across hardware, firmware, mobile app and cloud, and why it cuts integration bugs, cost and time to market.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/extreemtek.com\/nl\/hardware-firmware-app-cloud-one-team\/\" \/>\n<meta property=\"og:locale\" content=\"nl_NL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Hardware, Firmware, App &amp; Cloud From One Team | ExtreemTek\" \/>\n<meta property=\"og:description\" content=\"How one team builds a connected product across hardware, firmware, mobile app and cloud, and why it cuts integration bugs, cost and time to market.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/extreemtek.com\/nl\/hardware-firmware-app-cloud-one-team\/\" \/>\n<meta property=\"og:site_name\" content=\"ExtreemTek\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/extreemtek\/\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-23T05:27:29+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-23T13:41:42+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/extreemtek.com\/wp-content\/uploads\/2026\/10\/hardware-firmware-app-cloud-one-team.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1600\" \/>\n\t<meta property=\"og:image:height\" content=\"900\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Aqeel Wahlah\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Geschreven door\" \/>\n\t<meta name=\"twitter:data1\" content=\"Aqeel Wahlah\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/extreemtek.com\\\/hardware-firmware-app-cloud-one-team\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/extreemtek.com\\\/hardware-firmware-app-cloud-one-team\\\/\"},\"author\":{\"name\":\"Aqeel Wahlah\",\"@id\":\"https:\\\/\\\/extreemtek.com\\\/#\\\/schema\\\/person\\\/9114767463e89dd6db95ab4d0fffd4fd\"},\"headline\":\"Hardware, Firmware, App and Cloud From One Team: How It Works\",\"datePublished\":\"2026-10-23T05:27:29+00:00\",\"dateModified\":\"2026-10-23T13:41:42+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/extreemtek.com\\\/hardware-firmware-app-cloud-one-team\\\/\"},\"wordCount\":1111,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/extreemtek.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/extreemtek.com\\\/hardware-firmware-app-cloud-one-team\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/extreemtek.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/hardware-firmware-app-cloud-one-team.jpg\",\"articleSection\":[\"Blog\"],\"inLanguage\":\"nl-NL\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/extreemtek.com\\\/hardware-firmware-app-cloud-one-team\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/extreemtek.com\\\/hardware-firmware-app-cloud-one-team\\\/\",\"url\":\"https:\\\/\\\/extreemtek.com\\\/hardware-firmware-app-cloud-one-team\\\/\",\"name\":\"Hardware, Firmware, App & Cloud From One Team | ExtreemTek\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/extreemtek.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/extreemtek.com\\\/hardware-firmware-app-cloud-one-team\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/extreemtek.com\\\/hardware-firmware-app-cloud-one-team\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/extreemtek.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/hardware-firmware-app-cloud-one-team.jpg\",\"datePublished\":\"2026-10-23T05:27:29+00:00\",\"dateModified\":\"2026-10-23T13:41:42+00:00\",\"description\":\"How one team builds a connected product across hardware, firmware, mobile app and cloud, and why it cuts integration bugs, cost and time to market.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/extreemtek.com\\\/hardware-firmware-app-cloud-one-team\\\/#breadcrumb\"},\"inLanguage\":\"nl-NL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/extreemtek.com\\\/hardware-firmware-app-cloud-one-team\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\\\/\\\/extreemtek.com\\\/hardware-firmware-app-cloud-one-team\\\/#primaryimage\",\"url\":\"https:\\\/\\\/extreemtek.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/hardware-firmware-app-cloud-one-team.jpg\",\"contentUrl\":\"https:\\\/\\\/extreemtek.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/hardware-firmware-app-cloud-one-team.jpg\",\"width\":1600,\"height\":900,\"caption\":\"Hardware, firmware, app and cloud layers built by one team\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/extreemtek.com\\\/hardware-firmware-app-cloud-one-team\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/extreemtek.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Hardware, Firmware, App and Cloud From One Team: How It Works\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/extreemtek.com\\\/#website\",\"url\":\"https:\\\/\\\/extreemtek.com\\\/\",\"name\":\"ExtreemTek\",\"description\":\"Engineering Ideas into Intelligent Reality\",\"publisher\":{\"@id\":\"https:\\\/\\\/extreemtek.com\\\/#organization\"},\"alternateName\":\"Extreemtek\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/extreemtek.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"nl-NL\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/extreemtek.com\\\/#organization\",\"name\":\"ExtreemTek\",\"alternateName\":\"Extreemtek\",\"url\":\"https:\\\/\\\/extreemtek.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\\\/\\\/extreemtek.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/extreemtek.com\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/extreemtek-new-logol-horizontal-white.svg\",\"contentUrl\":\"https:\\\/\\\/extreemtek.com\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/extreemtek-new-logol-horizontal-white.svg\",\"width\":634,\"height\":106,\"caption\":\"ExtreemTek\"},\"image\":{\"@id\":\"https:\\\/\\\/extreemtek.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/extreemtek\\\/\",\"https:\\\/\\\/www.instagram.com\\\/extreemtek\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/extreemtek\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/extreemtek.com\\\/#\\\/schema\\\/person\\\/9114767463e89dd6db95ab4d0fffd4fd\",\"name\":\"Aqeel Wahlah\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/da87ad6cb3fcf4c775081e38e4741ac764394446763073d002c27b598b4b8437?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/da87ad6cb3fcf4c775081e38e4741ac764394446763073d002c27b598b4b8437?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/da87ad6cb3fcf4c775081e38e4741ac764394446763073d002c27b598b4b8437?s=96&d=mm&r=g\",\"caption\":\"Aqeel Wahlah\"},\"description\":\"Aqeel Wahlah is the founder and CEO of ExtreemTek, a product engineering company at High Tech Campus Eindhoven that builds AI solutions, IoT and connected devices, web and mobile apps and cloud back ends.\",\"sameAs\":[\"https:\\\/\\\/extreemtek.com\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Hardware, Firmware, App & Cloud From One Team | ExtreemTek","description":"How one team builds a connected product across hardware, firmware, mobile app and cloud, and why it cuts integration bugs, cost and time to market.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/extreemtek.com\/nl\/hardware-firmware-app-cloud-one-team\/","og_locale":"nl_NL","og_type":"article","og_title":"Hardware, Firmware, App & Cloud From One Team | ExtreemTek","og_description":"How one team builds a connected product across hardware, firmware, mobile app and cloud, and why it cuts integration bugs, cost and time to market.","og_url":"https:\/\/extreemtek.com\/nl\/hardware-firmware-app-cloud-one-team\/","og_site_name":"ExtreemTek","article_publisher":"https:\/\/www.facebook.com\/extreemtek\/","article_published_time":"2026-10-23T05:27:29+00:00","article_modified_time":"2026-10-23T13:41:42+00:00","og_image":[{"width":1600,"height":900,"url":"https:\/\/extreemtek.com\/wp-content\/uploads\/2026\/10\/hardware-firmware-app-cloud-one-team.jpg","type":"image\/jpeg"}],"author":"Aqeel Wahlah","twitter_card":"summary_large_image","twitter_misc":{"Geschreven door":"Aqeel Wahlah"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/extreemtek.com\/hardware-firmware-app-cloud-one-team\/#article","isPartOf":{"@id":"https:\/\/extreemtek.com\/hardware-firmware-app-cloud-one-team\/"},"author":{"name":"Aqeel Wahlah","@id":"https:\/\/extreemtek.com\/#\/schema\/person\/9114767463e89dd6db95ab4d0fffd4fd"},"headline":"Hardware, Firmware, App and Cloud From One Team: How It Works","datePublished":"2026-10-23T05:27:29+00:00","dateModified":"2026-10-23T13:41:42+00:00","mainEntityOfPage":{"@id":"https:\/\/extreemtek.com\/hardware-firmware-app-cloud-one-team\/"},"wordCount":1111,"commentCount":0,"publisher":{"@id":"https:\/\/extreemtek.com\/#organization"},"image":{"@id":"https:\/\/extreemtek.com\/hardware-firmware-app-cloud-one-team\/#primaryimage"},"thumbnailUrl":"https:\/\/extreemtek.com\/wp-content\/uploads\/2026\/10\/hardware-firmware-app-cloud-one-team.jpg","articleSection":["Blog"],"inLanguage":"nl-NL","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/extreemtek.com\/hardware-firmware-app-cloud-one-team\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/extreemtek.com\/hardware-firmware-app-cloud-one-team\/","url":"https:\/\/extreemtek.com\/hardware-firmware-app-cloud-one-team\/","name":"Hardware, Firmware, App & Cloud From One Team | ExtreemTek","isPartOf":{"@id":"https:\/\/extreemtek.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/extreemtek.com\/hardware-firmware-app-cloud-one-team\/#primaryimage"},"image":{"@id":"https:\/\/extreemtek.com\/hardware-firmware-app-cloud-one-team\/#primaryimage"},"thumbnailUrl":"https:\/\/extreemtek.com\/wp-content\/uploads\/2026\/10\/hardware-firmware-app-cloud-one-team.jpg","datePublished":"2026-10-23T05:27:29+00:00","dateModified":"2026-10-23T13:41:42+00:00","description":"How one team builds a connected product across hardware, firmware, mobile app and cloud, and why it cuts integration bugs, cost and time to market.","breadcrumb":{"@id":"https:\/\/extreemtek.com\/hardware-firmware-app-cloud-one-team\/#breadcrumb"},"inLanguage":"nl-NL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/extreemtek.com\/hardware-firmware-app-cloud-one-team\/"]}]},{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/extreemtek.com\/hardware-firmware-app-cloud-one-team\/#primaryimage","url":"https:\/\/extreemtek.com\/wp-content\/uploads\/2026\/10\/hardware-firmware-app-cloud-one-team.jpg","contentUrl":"https:\/\/extreemtek.com\/wp-content\/uploads\/2026\/10\/hardware-firmware-app-cloud-one-team.jpg","width":1600,"height":900,"caption":"Hardware, firmware, app and cloud layers built by one team"},{"@type":"BreadcrumbList","@id":"https:\/\/extreemtek.com\/hardware-firmware-app-cloud-one-team\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/extreemtek.com\/"},{"@type":"ListItem","position":2,"name":"Hardware, Firmware, App and Cloud From One Team: How It Works"}]},{"@type":"WebSite","@id":"https:\/\/extreemtek.com\/#website","url":"https:\/\/extreemtek.com\/","name":"ExtreemTek","description":"Engineering Ideas into Intelligent Reality","publisher":{"@id":"https:\/\/extreemtek.com\/#organization"},"alternateName":"Extreemtek","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/extreemtek.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"nl-NL"},{"@type":"Organization","@id":"https:\/\/extreemtek.com\/#organization","name":"ExtreemTek","alternateName":"Extreemtek","url":"https:\/\/extreemtek.com\/","logo":{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/extreemtek.com\/#\/schema\/logo\/image\/","url":"https:\/\/extreemtek.com\/wp-content\/uploads\/2026\/07\/extreemtek-new-logol-horizontal-white.svg","contentUrl":"https:\/\/extreemtek.com\/wp-content\/uploads\/2026\/07\/extreemtek-new-logol-horizontal-white.svg","width":634,"height":106,"caption":"ExtreemTek"},"image":{"@id":"https:\/\/extreemtek.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/extreemtek\/","https:\/\/www.instagram.com\/extreemtek\/","https:\/\/www.linkedin.com\/company\/extreemtek"]},{"@type":"Person","@id":"https:\/\/extreemtek.com\/#\/schema\/person\/9114767463e89dd6db95ab4d0fffd4fd","name":"Aqeel Wahlah","image":{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/secure.gravatar.com\/avatar\/da87ad6cb3fcf4c775081e38e4741ac764394446763073d002c27b598b4b8437?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/da87ad6cb3fcf4c775081e38e4741ac764394446763073d002c27b598b4b8437?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/da87ad6cb3fcf4c775081e38e4741ac764394446763073d002c27b598b4b8437?s=96&d=mm&r=g","caption":"Aqeel Wahlah"},"description":"Aqeel Wahlah is the founder and CEO of ExtreemTek, a product engineering company at High Tech Campus Eindhoven that builds AI solutions, IoT and connected devices, web and mobile apps and cloud back ends.","sameAs":["https:\/\/extreemtek.com"]}]}},"amp_enabled":false,"_links":{"self":[{"href":"https:\/\/extreemtek.com\/nl\/wp-json\/wp\/v2\/posts\/7332","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/extreemtek.com\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/extreemtek.com\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/extreemtek.com\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/extreemtek.com\/nl\/wp-json\/wp\/v2\/comments?post=7332"}],"version-history":[{"count":3,"href":"https:\/\/extreemtek.com\/nl\/wp-json\/wp\/v2\/posts\/7332\/revisions"}],"predecessor-version":[{"id":7344,"href":"https:\/\/extreemtek.com\/nl\/wp-json\/wp\/v2\/posts\/7332\/revisions\/7344"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/extreemtek.com\/nl\/wp-json\/wp\/v2\/media\/7368"}],"wp:attachment":[{"href":"https:\/\/extreemtek.com\/nl\/wp-json\/wp\/v2\/media?parent=7332"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/extreemtek.com\/nl\/wp-json\/wp\/v2\/categories?post=7332"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/extreemtek.com\/nl\/wp-json\/wp\/v2\/tags?post=7332"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}