[{"data":1,"prerenderedAt":875},["ShallowReactive",2],{"navigation":3,"index":14,"mdc-54miwf-key":110,"mdc-7o5d97-key":123,"mdc--4qi9jv-key":132,"index-blogs":141,"index-topics":468,"index-engagements":794,"index-ventures":848,"index-featured-oss":864},[4],{"title":5,"path":6,"stem":7,"children":8,"page":13},"Blog","\u002Fblog","blog",[9],{"title":10,"path":11,"stem":12},"Kubernetes 101","\u002Fblog\u002Fkubernetes-introduction","blog\u002Fkubernetes-introduction",false,{"id":15,"title":16,"blog":17,"body":20,"cta":21,"description":24,"engage":25,"engagements":62,"extension":65,"hero":66,"meta":73,"navigation":74,"path":75,"pillars":76,"principles":79,"proof":93,"seo":102,"stem":105,"ventures":106,"__hash__":109},"index\u002Findex.yml","Mathieu Sabatier",{"title":18,"description":19},"Writing","Notes from systems that had to work.",null,{"title":22,"description":23},"Working on something in this space?","If you are building a data backbone, an edge platform, or a planning system that has to survive contact with a plant, I would like to hear about it.","Lead tech and architect for manufacturing systems. Co-founder and CTO at Start-Alpha. Unified namespaces, edge apps delivered HA, observability and models optimised for the GPU on the line — shipped to production.",{"title":26,"description":27,"categories":28},"How I work","What an engagement usually looks like.",[29,41,53],{"title":30,"questions":31},"Engagements",[32,35,38],{"label":33,"content":34},"What do you actually do?","Three things, usually in combination. Architecture and technical direction for OT\u002FIT integration — unified namespaces, data contracts, edge platforms. Hands-on delivery, where I build and ship the system rather than hand over a deck. And technical advisory for teams who have already decided what to build and want the approach pressure-tested.\n",{"label":36,"content":37},"Do you build, or just advise?","Both, and I prefer engagements where advice is backed by delivery. The architectures I trust most are the ones I have had to operate. If you only need a review, that is fine too — but I will tell you what I would build.\n",{"label":39,"content":40},"What does a first conversation look like?","Thirty minutes, no deck. You describe the system and the constraint you are stuck on; I tell you whether I think I can help and what I would look at first. If it is not a fit I will usually know within that call and say so.\n",{"title":42,"questions":43},"Working together",[44,47,50],{"label":45,"content":46},"How do engagements usually start?","With a scoped piece of work that produces something real within a few weeks — a proof of value, an architecture the team can argue with, or a first integration in production. Long discovery phases tend to produce documents rather than decisions.\n",{"label":48,"content":49},"Can you work with our existing team?","That is the normal case. Most of what I do involves an internal team, an integrator, and an OT organisation who all have to agree. Structuring that is part of the work, not an obstacle to it.\n",{"label":51,"content":52},"What about confidentiality?","Most of my client work cannot be named, which is why the engagements on this site are anonymised. I hold the same line for your work.\n",{"title":54,"questions":55},"Fit",[56,59],{"label":57,"content":58},"When are you not the right person?","If you need a full delivery team, a licensed product, or 24\u002F7 operations, I am the wrong shape. I am most useful where the architecture is undecided or the integration is the hard part.\n",{"label":60,"content":61},"Where are you based?","France, working with industrial groups across Europe. Most engagements are remote with on-site time when commissioning or plant work requires it.\n",{"title":63,"description":64},"Selected work","Client engagements, anonymised.","yml",{"headline":67,"links":68},"Small, open, reversible",[69],{"label":70,"icon":71,"color":72},"Schedule a call","i-lucide-calendar","neutral",{},true,"\u002F",{"title":77,"description":78},"What I work on","Six areas where I build, and where I have opinions worth arguing about.",{"title":26,"description":80,"items":81},"Four ideas that shape which projects I take on and how I build them.",[82,84,87,90],{"title":67,"description":83},"The plant already works. Whatever I add should fit the hardware that is there, run on standards anyone can read, and be removable by the team that comes after me.",{"title":85,"description":86},"Standards outlive vendors","MQTT, OPC UA, OpenTelemetry. Building on a standard is slower at the start and cheaper over the life of the system. Where a proprietary layer stays, it is a decision, not a default.",{"title":88,"description":89},"Product engineer, not ticket taker","Scope, feasibility and what not to build are part of the job. I would rather work out the problem with the people running the line than implement a specification written without them.",{"title":91,"description":92},"Observability is a requirement","Healthy metrics on either side of an invisible hop tell you nothing. From sensor to model to screen, I trace the full path before deciding what to optimise.",[94,97,100],{"value":95,"label":96},"10+","sites in a UNS backbone architecture",{"value":98,"label":99},"100+","hosts under performance-optimised observability",{"value":95,"label":101},"planners and operations users using the tool in production",{"title":103,"description":104},"Mathieu Sabatier — Lead Tech, Architect, Manufacturing","I design and build the layer between OT and IT — unified namespaces, edge fleets, observability and planning systems that run in production. Small, open, reversible.","index",{"title":107,"description":108},"Ventures and tools","What I am building, and the one I maintain in the open.","7qVtAe0vE_x9v_rUKROGM8c8SlgXAlEjBMRz-Mq3Gpw",{"data":111,"body":112},{},{"type":113,"children":114},"root",[115],{"type":116,"tag":117,"props":118,"children":119},"element","p",{},[120],{"type":121,"value":122},"text","Three things, usually in combination. Architecture and technical direction for OT\u002FIT integration — unified namespaces, data contracts, edge platforms. Hands-on delivery, where I build and ship the system rather than hand over a deck. And technical advisory for teams who have already decided what to build and want the approach pressure-tested.",{"data":124,"body":125},{},{"type":113,"children":126},[127],{"type":116,"tag":117,"props":128,"children":129},{},[130],{"type":121,"value":131},"Both, and I prefer engagements where advice is backed by delivery. The architectures I trust most are the ones I have had to operate. If you only need a review, that is fine too — but I will tell you what I would build.",{"data":133,"body":134},{},{"type":113,"children":135},[136],{"type":116,"tag":117,"props":137,"children":138},{},[139],{"type":121,"value":140},"Thirty minutes, no deck. You describe the system and the constraint you are stuck on; I tell you whether I think I can help and what I would look at first. If it is not a fit I will usually know within that call and say so.",[142],{"id":143,"title":10,"body":144,"canonical":20,"date":456,"description":457,"draft":13,"extension":458,"featured":13,"format":459,"image":20,"meta":460,"minRead":452,"navigation":74,"path":11,"pillar":461,"seo":462,"series":20,"slides":74,"stem":12,"tags":463,"updated":20,"__hash__":467},"blog\u002Fblog\u002Fkubernetes-introduction.md",{"type":145,"value":146,"toc":438},"minimark",[147,150,155,158,162,191,194,214,218,221,224,227,231,234,237,241,244,247,251,254,268,271,274,278,289,343,347,352,376,380,406,410,428,432,435],[117,148,149],{},"A short primer before anything edge-specific.",[151,152,154],"h2",{"id":153},"what-it-is","What it is",[117,156,157],{},"Kubernetes is an open-source container orchestrator. It joins several machines into one cluster and takes care of deploying, scaling and managing containerised applications through a standard API.",[151,159,161],{"id":160},"why-use-it-and-when-not-to-use-it","Why use it, and when not to use it",[163,164,165,173,179,185],"ul",{},[166,167,168,172],"li",{},[169,170,171],"strong",{},"Resilience."," With several nodes, workloads move elsewhere when a machine fails.",[166,174,175,178],{},[169,176,177],{},"Scaling."," An application runs as one or many containers behind the same API.",[166,180,181,184],{},[169,182,183],{},"Service discovery."," Workloads find each other by name, not by hand-managed IP addresses.",[166,186,187,190],{},[169,188,189],{},"Consistency."," The same manifests deploy on-premise, in the cloud, or across both.",[117,192,193],{},"And when not to:",[163,195,196,202,208],{},[166,197,198,201],{},[169,199,200],{},"One app on one box."," Docker Compose or systemd is simpler and enough.",[166,203,204,207],{},[169,205,206],{},"Nobody to run it."," Kubernetes is a platform to operate, not a tool to install. The learning curve is real, and so is the day-two work.",[166,209,210,213],{},[169,211,212],{},"Hard real time."," It schedules containers. It does not replace a PLC or a real-time OS.",[151,215,217],{"id":216},"brief-history","Brief history",[117,219,220],{},"Kubernetes grew out of a decade of running containers inside Google, went open source in 2014, and was handed to a vendor-neutral foundation a year later. That last move is what turned it into an industry standard rather than a Google product.",[222,223],"k8s-history",{},[117,225,226],{},"One of the 3 most mature projects in the CNCF.",[151,228,230],{"id":229},"an-extensible-product","An extensible product...",[117,232,233],{},"The API is the contract. Every object has a path on it, operators add their own kinds, and runtime, network and storage are swappable behind standard interfaces. Like Linux, it comes in many distributions.",[235,236],"k8s-api-path",{},[151,238,240],{"id":239},"based-on-a-reconciliation-principle","...based on a reconciliation principle",[117,242,243],{},"You tell Kubernetes what you want, not how to get there: \"two copies of this container, reachable on this port\". The cluster stores that desired state and keeps comparing it with what is actually running. When a pod crashes or a node disappears, the gap is noticed and closed without anyone being paged. The same loop applies your changes: edit the desired state, and the cluster converges to it.",[245,246],"k8s-reconcile",{},[151,248,250],{"id":249},"control-plane-and-data-plane","Control plane and data plane",[117,252,253],{},"A cluster has two halves.",[163,255,256,262],{},[166,257,258,261],{},[169,259,260],{},"The control plane"," holds the desired state. It is made of the API server, the scheduler, the controller managers, and a datastore (etcd, or SQLite in a default k3s install).",[166,263,264,267],{},[169,265,266],{},"The data plane"," is the worker nodes. They run the containers the control plane assigns to them.",[269,270],"k8s-architecture",{},[117,272,273],{},"Operators and tooling talk to the API server. End users never see it; they reach the applications running on the nodes.",[151,275,277],{"id":276},"hands-on","Hands-on",[117,279,280,281,288],{},"Exercises in ",[282,283,287],"a",{"href":284,"rel":285},"https:\u002F\u002Fgithub.com\u002Fmathieu-sabatier\u002Fk8s-101-exercices",[286],"nofollow","k8s-101-exercices",": a folder each, with README, manifests and a check script. Work in your own namespace on the shared k3s cluster.",[290,291,292,303,313,323,333],"ol",{},[166,293,294,302],{},[169,295,296,301],{},[282,297,300],{"href":298,"rel":299},"https:\u002F\u002Fgithub.com\u002Fmathieu-sabatier\u002Fk8s-101-exercices\u002Ftree\u002Fmain\u002F00-hello",[286],"Hello","."," Two replicas. Delete a pod by hand, watch it come back.",[166,304,305,312],{},[169,306,307,301],{},[282,308,311],{"href":309,"rel":310},"https:\u002F\u002Fgithub.com\u002Fmathieu-sabatier\u002Fk8s-101-exercices\u002Ftree\u002Fmain\u002F01-service",[286],"Service"," A NodePort in front, reached from outside and by name inside.",[166,314,315,322],{},[169,316,317,301],{},[282,318,321],{"href":319,"rel":320},"https:\u002F\u002Fgithub.com\u002Fmathieu-sabatier\u002Fk8s-101-exercices\u002Ftree\u002Fmain\u002F02-configmap",[286],"ConfigMap"," Config out of the image. Which changes need a rollout?",[166,324,325,332],{},[169,326,327,301],{},[282,328,331],{"href":329,"rel":330},"https:\u002F\u002Fgithub.com\u002Fmathieu-sabatier\u002Fk8s-101-exercices\u002Ftree\u002Fmain\u002F03-initcontainer",[286],"Init containers"," Wait for a dependency, seed a volume, then start.",[166,334,335,342],{},[169,336,337,301],{},[282,338,341],{"href":339,"rel":340},"https:\u002F\u002Fgithub.com\u002Fmathieu-sabatier\u002Fk8s-101-exercices\u002Ftree\u002Fmain\u002F04-break-it",[286],"Break it"," Wrong image tag, failing probe. Describe, logs, events, fix.",[151,344,346],{"id":345},"key-tools","Key tools",[348,349,351],"h3",{"id":350},"cli","CLI:",[163,353,354,362],{},[166,355,356,361],{},[282,357,360],{"href":358,"rel":359},"https:\u002F\u002Fkubernetes.io\u002Fdocs\u002Freference\u002Fkubectl\u002F",[286],"kubectl",", the go-to for quick debug and inspection.",[166,363,364,369,370,375],{},[282,365,368],{"href":366,"rel":367},"https:\u002F\u002Fk9scli.io\u002F",[286],"k9s",", ",[282,371,374],{"href":372,"rel":373},"https:\u002F\u002Flenshq.io\u002F",[286],"lens",", tool to visualise cluster state",[348,377,379],{"id":378},"application-packaging","Application packaging:",[163,381,382,390,398],{},[166,383,384,389],{},[282,385,388],{"href":386,"rel":387},"https:\u002F\u002Fkustomize.io\u002F",[286],"kustomize"," native templates",[166,391,392,397],{},[282,393,396],{"href":394,"rel":395},"https:\u002F\u002Fhelm.sh\u002Fdocs\u002F",[286],"helm"," app templating, client side",[166,399,400,405],{},[282,401,404],{"href":402,"rel":403},"https:\u002F\u002Fkro.run\u002F",[286],"kro"," app templating, server side",[348,407,409],{"id":408},"gitops","GitOps",[163,411,412,420],{},[166,413,414,419],{},[282,415,418],{"href":416,"rel":417},"https:\u002F\u002Ffluxcd.io\u002F",[286],"flux",", unix-style & lighweight controllers",[166,421,422,427],{},[282,423,426],{"href":424,"rel":425},"https:\u002F\u002Fargo-cd.readthedocs.io\u002Fen\u002Fstable\u002F",[286],"argocd",", dev friendly app & UI",[151,429,431],{"id":430},"what-gitops-is-exactly","What GitOps is exactly?",[117,433,434],{},"Instead of pointing kubectl at the cluster, you push manifests to a Git repository and an agent inside the cluster pulls them and applies them through the API server. The repository becomes the source of truth: every change is a reviewed commit, the whole cluster can be rebuilt from it, and rolling back is a revert.",[436,437],"k8s-gitops",{},{"title":439,"searchDepth":440,"depth":440,"links":441},"",2,[442,443,444,445,446,447,448,449,455],{"id":153,"depth":440,"text":154},{"id":160,"depth":440,"text":161},{"id":216,"depth":440,"text":217},{"id":229,"depth":440,"text":230},{"id":239,"depth":440,"text":240},{"id":249,"depth":440,"text":250},{"id":276,"depth":440,"text":277},{"id":345,"depth":440,"text":346,"children":450},[451,453,454],{"id":350,"depth":452,"text":351},3,{"id":378,"depth":452,"text":379},{"id":408,"depth":452,"text":409},{"id":430,"depth":440,"text":431},"2026-09-25","What Kubernetes is, what problems it solves, and how it is composed and start using it.","md","guide",{},"edge",{"title":10,"description":457},[464,465,466],"kubernetes","k3s","primer","2FT5iJNmj4lFDtUu7noSIWC_iMV6MpwPA4mFEmCKtiM",[469,532,583,636,689,742],{"id":470,"title":471,"body":472,"description":519,"draftNotice":74,"extension":458,"meta":520,"navigation":74,"order":521,"path":522,"pillar":523,"related":524,"seo":529,"stem":530,"__hash__":531},"topics\u002Ftopics\u002Fbackbone.md","UNS at the edge",{"type":145,"value":473,"toc":512},[474,477,481,484,488,491,495,498,502,505,509],[117,475,476],{},"Every plant already moves data. Ask where the meaning lives and the answer is usually a spreadsheet, a tag naming convention nobody wrote down, and one integrator's head.",[151,478,480],{"id":479},"the-broker-is-the-easy-part","The broker is the easy part",[117,482,483],{},"Choosing MQTT or picking a broker is a weekend decision. The hard part is agreeing what a topic means, who owns it, and what breaks when it changes.",[151,485,487],{"id":486},"contracts-not-conventions","Contracts, not conventions",[117,489,490],{},"A namespace without a schema and an owner is a naming convention with better marketing. This is the argument for treating the information model as a reviewable artefact in git.",[151,492,494],{"id":493},"opc-ua-information-models-without-the-xml","OPC UA information models without the XML",[117,496,497],{},"Hand-written NodeSet2.xml is why most companion-spec work stalls. Authoring in YAML and compiling to the standard output changes who can participate.",[151,499,501],{"id":500},"i3x-and-mcp","i3X and MCP",[117,503,504],{},"Two emerging standards that matter for discoverability, and why betting on them reduced proprietary software reliance by 90% on one fleet.",[151,506,508],{"id":507},"what-it-cost","What it cost",[117,510,511],{},"The honest accounting: what replacing proprietary middleware actually took, where it was harder than promised, and what stayed proprietary on purpose.",{"title":439,"searchDepth":440,"depth":440,"links":513},[514,515,516,517,518],{"id":479,"depth":440,"text":480},{"id":486,"depth":440,"text":487},{"id":493,"depth":440,"text":494},{"id":500,"depth":440,"text":501},{"id":507,"depth":440,"text":508},"A UNS is a contract, not a broker. What actually makes plant data usable — and what it costs to stop paying for proprietary middleware.",{},1,"\u002Ftopics\u002Fbackbone","backbone",{"ventures":525,"oss":527},[526],"start-alpha",[528],"twin-model",{"title":471,"description":519},"topics\u002Fbackbone","J0qxmXdCFRpR5scSuhE-zfAvpd_S6rpc6Yf3TO6Bneg",{"id":533,"title":534,"body":535,"description":574,"draftNotice":74,"extension":458,"meta":575,"navigation":74,"order":440,"path":576,"pillar":461,"related":577,"seo":580,"stem":581,"__hash__":582},"topics\u002Ftopics\u002Fedge.md","Fleet management",{"type":145,"value":536,"toc":568},[537,540,544,547,551,554,558,561,565],[117,538,539],{},"One cluster is a tutorial. A hundred clusters in a hundred buildings, half of them behind a firewall an OT team controls, is a different discipline.",[151,541,543],{"id":542},"intermittent-is-the-normal-case","Intermittent is the normal case",[117,545,546],{},"Designing for a link that is usually up is how you build something that fails badly. Reconciliation has to be the default behaviour, not the recovery path.",[151,548,550],{"id":549},"the-commissioning-window","The commissioning window",[117,552,553],{},"Line commissioning is when infrastructure decisions get made under time pressure by people who will never touch them again. What you ship has to survive that.",[151,555,557],{"id":556},"resource-budgets-are-a-design-constraint","Resource budgets are a design constraint",[117,559,560],{},"If it needs a datacenter, it does not belong at the edge. What that rules out, and what it forces you to do better.",[151,562,564],{"id":563},"the-handover-test","The handover test",[117,566,567],{},"We built the fleet. Another supplier runs it now. Reversibility is not a licensing claim, it is whether the next team can actually take over — and most architectures fail this test the first time it is applied.",{"title":439,"searchDepth":440,"depth":440,"links":569},[570,571,572,573],{"id":542,"depth":440,"text":543},{"id":549,"depth":440,"text":550},{"id":556,"depth":440,"text":557},{"id":563,"depth":440,"text":564},"Running k3s across a hundred sites with intermittent connectivity — and the test almost nobody applies to their own architecture, which is whether someone else can take it over.",{},"\u002Ftopics\u002Fedge",{"ventures":578,"oss":579},[526],[465],{"title":534,"description":574},"topics\u002Fedge","H4aYowyeNQMS3ibcx-uLRmRz8wngi6JE2iK7a4UADxk",{"id":584,"title":585,"body":586,"description":625,"draftNotice":74,"extension":458,"meta":626,"navigation":74,"order":452,"path":627,"pillar":628,"related":629,"seo":633,"stem":634,"__hash__":635},"topics\u002Ftopics\u002Fobservability.md","Observability",{"type":145,"value":587,"toc":619},[588,591,595,598,602,605,609,612,616],[117,589,590],{},"A distributed application watching a critical manufacturing process across a hundred hosts generates enormous amounts of telemetry and, usually, very little understanding.",[151,592,594],{"id":593},"which-metrics-earn-their-storage","Which metrics earn their storage",[117,596,597],{},"Most metrics are collected because collecting them was easy. Cardinality is a budget, and spending it without a decision in mind is how observability bills get out of control.",[151,599,601],{"id":600},"tagsets-across-independent-modules","Tagsets across independent modules",[117,603,604],{},"The moment more than one team emits telemetry, labels drift. Enforcement has to happen at ingestion or at CI — asking politely does not work at scale.",[151,606,608],{"id":607},"the-missing-spans","The missing spans",[117,610,611],{},"Industrial systems trace almost nothing. A camera triggers, inference runs, a result reaches a display, and the only evidence is three unrelated metrics. End-to-end latency is a span problem, and treating it as a metrics problem is why bottlenecks stay invisible.",[151,613,615],{"id":614},"instrumenting-the-whole-chain","Instrumenting the whole chain",[117,617,618],{},"What it took to instrument camera to inference to display, and what surfaced immediately once the chain was visible.",{"title":439,"searchDepth":440,"depth":440,"links":620},[621,622,623,624],{"id":593,"depth":440,"text":594},{"id":600,"depth":440,"text":601},{"id":607,"depth":440,"text":608},{"id":614,"depth":440,"text":615},"Industrial systems are all metrics and no traces. Cost-controlled OpenTelemetry, tagset governance across independent modules, and knowing which signals earn their storage.",{},"\u002Ftopics\u002Fobservability","observability",{"oss":630},[631,632],"opentelemetry","opamp",{"title":585,"description":625},"topics\u002Fobservability","dTp_hinKxNWnB_kT2iwSyoTSugoq5xC5ZLtNZD9xcTc",{"id":637,"title":638,"body":639,"description":678,"draftNotice":74,"extension":458,"meta":679,"navigation":74,"order":680,"path":681,"pillar":682,"related":683,"seo":686,"stem":687,"__hash__":688},"topics\u002Ftopics\u002Fdecisions.md","Planning optimization",{"type":145,"value":640,"toc":672},[641,644,648,651,655,658,662,665,669],[117,642,643],{},"Planning and scheduling has an unusual failure pattern: the mathematics works, the pilot looks convincing, and the tool is abandoned within a year.",[151,645,647],{"id":646},"constraint-granularity-is-where-projects-die","Constraint granularity is where projects die",[117,649,650],{},"Almost everything written about planning is about algorithms. The decision that actually determines success is how finely constraints are modelled — too coarse and the plan is ignored, too fine and it cannot be maintained.",[151,652,654],{"id":653},"optimisation-against-live-state","Optimisation against live state",[117,656,657],{},"An optimisation API integrated with SCADA and PLCs under real-time constraints is a different engineering problem from one that reads a nightly extract.",[151,659,661],{"id":660},"mlops-at-the-edge","MLOps at the edge",[117,663,664],{},"Shipping a model where R&D can iterate daily, on infrastructure that is not allowed to be down.",[151,666,668],{"id":667},"planners-are-your-users","Planners are your users",[117,670,671],{},"Ten planners using something in production beats a better algorithm nobody opens. Change management is engineering work, and treating it as a phase afterwards is how tools die.",{"title":439,"searchDepth":440,"depth":440,"links":673},[674,675,676,677],{"id":646,"depth":440,"text":647},{"id":653,"depth":440,"text":654},{"id":660,"depth":440,"text":661},{"id":667,"depth":440,"text":668},"The solver was never the problem. Constraint granularity, real-time integration with ERP, MES & SCADA, and why planners are the users you actually have to convince.",{},4,"\u002Ftopics\u002Fdecisions","decisions",{"ventures":684},[685],"nexiplan",{"title":638,"description":678},"topics\u002Fdecisions","jZj0VVkeFMYGJFfpVG2HQGO_XXPPgZUCCot3w4QHIqQ",{"id":690,"title":691,"body":692,"description":731,"draftNotice":74,"extension":458,"meta":732,"navigation":74,"order":733,"path":734,"pillar":735,"related":736,"seo":739,"stem":740,"__hash__":741},"topics\u002Ftopics\u002Fml.md","Models under a latency budget",{"type":145,"value":693,"toc":725},[694,697,701,704,708,711,715,718,722],[117,695,696],{},"On a production line the cycle time is fixed. The model either answers inside it or it does not ship, and no amount of accuracy on a validation set changes that.",[151,698,700],{"id":699},"measure-before-you-optimise","Measure before you optimise",[117,702,703],{},"Most slow pipelines are slow in pre-processing, copies between host and device, or a Python loop around the model — not in the model itself. Profiling the whole path first is how you avoid spending a week quantising something that was never the bottleneck.",[151,705,707],{"id":706},"every-optimisation-has-a-price","Every optimisation has a price",[117,709,710],{},"FP16, INT8, pruning, distillation, smaller input resolutions. Each one trades accuracy, engineering time or maintainability for latency. The skill is knowing which trade the use case can afford, and proving it on real plant data rather than a benchmark.",[151,712,714],{"id":713},"batching-versus-latency","Batching versus latency",[117,716,717],{},"Throughput and latency pull in opposite directions. A camera triggering per part and a batch inspection of a full tray are different serving problems, and the right batch size is a property of the process, not of the GPU.",[151,719,721],{"id":720},"mlops-that-survives-the-plant","MLOps that survives the plant",[117,723,724],{},"Shipping a model where R&D can iterate daily, on infrastructure that is not allowed to be down. Versioned models, reproducible exports, and a rollback that takes seconds.",{"title":439,"searchDepth":440,"depth":440,"links":726},[727,728,729,730],{"id":699,"depth":440,"text":700},{"id":706,"depth":440,"text":707},{"id":713,"depth":440,"text":714},{"id":720,"depth":440,"text":721},"A model that is accurate in a notebook and too slow on the line is not a model, it is a demo. ML engineering for performance — and knowing which optimisation is worth what it costs.",{},5,"\u002Ftopics\u002Fml","ml",{"ventures":737,"oss":738},[],[],{"title":691,"description":731},"topics\u002Fml","ukInvv4VI67lz4vDb1AahLVUzt6Qs82UZjbJvqUR8eg",{"id":743,"title":744,"body":745,"description":784,"draftNotice":74,"extension":458,"meta":785,"navigation":74,"order":786,"path":787,"pillar":788,"related":789,"seo":791,"stem":792,"__hash__":793},"topics\u002Ftopics\u002Finference.md","GPUs on the line",{"type":145,"value":746,"toc":778},[747,750,754,757,761,764,768,771,775],[117,748,749],{},"Getting a model to run on a GPU takes an afternoon. Keeping it running on dozens of edge nodes, through driver updates and hardware refreshes, is the actual job.",[151,751,753],{"id":752},"the-driver-is-part-of-the-application","The driver is part of the application",[117,755,756],{},"Driver, CUDA, cuDNN and TensorRT versions form one compatibility matrix, and an engine built against one combination does not load on another. Treating the host driver as someone else's problem is how an OS patch takes a line down.",[151,758,760],{"id":759},"knowing-when-to-reach-for-the-nvidia-stack","Knowing when to reach for the NVIDIA stack",[117,762,763],{},"TensorRT, DeepStream and Triton are the right answer for some workloads and a heavy dependency for others. ONNX Runtime or a plain CPU path is sometimes the better call — and the decision should be made on measured latency, not on which SDK is fashionable.",[151,765,767],{"id":766},"serving-on-kubernetes-at-the-edge","Serving on Kubernetes at the edge",[117,769,770],{},"The GPU operator, device plugins, time-slicing and MIG: how several models share one card on a k3s node without starving each other, and how that gets rolled out through GitOps like everything else.",[151,772,774],{"id":773},"engines-are-build-artefacts","Engines are build artefacts",[117,776,777],{},"A TensorRT engine is tied to the GPU it was built on. Building, caching and shipping engines per hardware target belongs in the pipeline, not in a startup script that silently takes ten minutes on first boot.",{"title":439,"searchDepth":440,"depth":440,"links":779},[780,781,782,783],{"id":752,"depth":440,"text":753},{"id":759,"depth":440,"text":760},{"id":766,"depth":440,"text":767},{"id":773,"depth":440,"text":774},"Accelerated inference in production is mostly a driver problem. CUDA versions, TensorRT engines, Triton serving and GPU sharing on edge nodes that nobody is allowed to reboot.",{},6,"\u002Ftopics\u002Finference","inference",{"oss":790},[465],{"title":744,"description":784},"topics\u002Finference","qXpEvPvjEaeEUYaL3gBH9Th3s3ZM9QDCVJ0QVNxT0vs",[795,812,829],{"id":796,"alias":797,"caseStudy":20,"confidential":74,"extension":65,"meta":798,"order":521,"outcomes":799,"period":802,"scope":803,"sector":804,"slug":805,"stack":806,"stem":810,"__hash__":811},"engagements\u002Fwork\u002Fengagements\u002Funs-backbone.yml","CAC40 industrial group",{},[800,801],"Architecture accepted as the group-wide target for plant data","Proof of value delivered against real site constraints rather than a lab","Recent","Design and first proof of value for a unified namespace backbone spanning more than one hundred sites worldwide, including the reference architecture and modelling layer.","Multi-sector manufacturing","uns-backbone",[807,808,809],"MQTT","OPC-UA","i3X","work\u002Fengagements\u002Funs-backbone","GYr4JkQO8devZHVhn8HYK0glFf_OGH4ed9Mb0b7QgWM",{"id":813,"alias":814,"caseStudy":20,"confidential":74,"extension":65,"meta":815,"order":440,"outcomes":816,"period":802,"scope":821,"sector":822,"slug":823,"stack":824,"stem":827,"__hash__":828},"engagements\u002Fwork\u002Fengagements\u002Fedge-observability.yml","CAC40 process manufacturer",{},[817,818,819,820],"Cost-optimised observability across 100+ hosts, instrumenting camera, ML inference and display latency end to end","Resource-efficient UNS on edge infrastructure, reducing proprietary software reliance by 90%","Optimisation algorithm deployed to edge, integrated with SCADA and PLCs under real-time constraints, with yield improvements validated by R&D","Planning and scheduling tool in production use by 10+ planners and operations users","Observability, unified namespace and optimisation delivery across an edge estate supporting a critical manufacturing process, plus end-to-end delivery of a multi-plant planning and scheduling tool.","Manufacturing — critical process","edge-observability",[465,825,807,808,826],"OpenTelemetry","Python","work\u002Fengagements\u002Fedge-observability","GrCaNKTwj4w3mjD1aLa6w0_3dxye_q9UU4MT2FI0SyM",{"id":830,"alias":831,"caseStudy":20,"confidential":74,"extension":65,"meta":832,"order":452,"outcomes":833,"period":802,"scope":837,"sector":838,"slug":839,"stack":840,"stem":846,"__hash__":847},"engagements\u002Fwork\u002Fengagements\u002Fgreenfield-ipaas.yml","CAC40 car manufacturer",{},[834,835,836],"Platform provider scoped and selected, first integrations delivered across ERP, PLM, PLC and SCADA","Integration costs reduced by 40%","First validation app proved out data contracts and was used during line commissioning ahead of full MES rollout","Launched integration platform foundations and defined the target architecture for the OT-to-MES-to-Cloud integration layer.","Greenfield Electric Vehicle components","greenfield-ipaas",[841,842,843,844,845],"iPaaS","PLC\u002FSCADA","MES","ERP","PLM","work\u002Fengagements\u002Fgreenfield-ipaas","hB5k5QyhO3kO13YTbJ_cYxOgyMcY4abXZBmSKLLYMkg",[849],{"id":850,"description":851,"extension":65,"meta":852,"name":853,"order":521,"period":854,"role":855,"slug":526,"stack":856,"stem":860,"tagline":861,"url":862,"__hash__":863},"ventures\u002Fwork\u002Fventures\u002Fstart-alpha.yml","A sovereign control plane for fleets that cannot assume connectivity. A single declarative blueprint covers workloads, OS configuration, cloud resources, security policy and disaster recovery; agents reconcile it across every site autonomously. Built on Kubernetes and OpenTelemetry, with export so the definition stays yours.",{},"Start-Alpha","2026 — present","Co-founder & CTO",[857,465,858,825,859],"Kubernetes","Go","SPIFFE\u002FSPIRE","work\u002Fventures\u002Fstart-alpha","One blueprint to deploy, govern and recover distributed infrastructure — from edge to cloud. Secure software supply-chain, from OS to applications.","https:\u002F\u002Fstart-alpha.io","bUXmRvaZL5nHtGzSaPvPBx-GogtjN6x367nKeLKxgs8",[865],{"id":866,"description":867,"extension":65,"featured":74,"language":858,"meta":868,"name":869,"order":521,"repo":870,"role":871,"slug":528,"stem":872,"why":873,"__hash__":874},"oss\u002Fwork\u002Foss\u002Ftwin-model.yml","A toolkit for authoring ontology. Compact YAML transpiles to OPC-UA ModelDesign.xml, CESMII i3X 1.0 JSON.  Embedded catalog of companion specifications and MCP server.",{},"twinmodel","https:\u002F\u002Fgithub.com\u002Fmathieu-sabatier\u002Ftwin-model","author","work\u002Foss\u002Ftwin-model","It deliberately does not emit NodeSet2.xml itself — Part 5 compliance is the ModelCompiler's job. The point is to make the information model a reviewable artefact in git instead of hand-written XML, so the data contract can be argued about like any other code.","ts1e2Dx3E3cspcOUQ9dhtdLiFvj8F7GuizHH0Ud7ZrU",1791414105734]