<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
  <title>The NoWayOS Journal</title>
  <subtitle>How NoWayOS is built, and why: stories from building a Single Purpose OS, each one true and most of them checkable.</subtitle>
  <link href="https://www.nowayos.com/journal/feed.xml" rel="self"/>
  <link href="https://www.nowayos.com/journal"/>
  <id>https://www.nowayos.com/journal</id>
  <updated>2026-11-13T00:00:00Z</updated>
  <author><name>NoWayOS</name><uri>https://www.nowayos.com/</uri></author>
  <entry>
    <title>React in, Rust out</title>
    <link href="https://www.nowayos.com/journal/react-in-rust-out"/>
    <id>https://www.nowayos.com/journal/react-in-rust-out</id>
    <published>2026-11-13T00:00:00Z</published>
    <updated>2026-11-13T00:00:00Z</updated>
    <summary>Designers keep React. Devices get native Rust. How the Screen Compiler turns screens into code at build time, so there's no browser on the device to attack.</summary>
    <content type="html">&lt;p&gt;Modern interfaces are designed in React. So a great many dedicated devices, from control panels to ticket machines, ship a whole browser engine, one of the largest and most attacked programs there is, to draw a few buttons and the words &amp;quot;Touch Start to begin&amp;quot;.&lt;/p&gt;
&lt;p&gt;We wanted the modern design workflow without the browser. So we built the &lt;strong&gt;Screen Compiler&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;write-the-screen-in-react&quot;&gt;Write the screen in React&lt;/h2&gt;
&lt;p&gt;Your designers and front-end developers keep their tools: components, props, design tokens, their editor. They write the screen in TSX (this one is shortened from one of the Screen Compiler&amp;#39;s test screens):&lt;/p&gt;
&lt;pre tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-tsx&quot;&gt;&amp;lt;Column gap={SPACE_SM} padding={SPACE_LG}&amp;gt;
  &amp;lt;Text id=&amp;quot;title&amp;quot;&amp;gt;Welcome&amp;lt;/Text&amp;gt;
  &amp;lt;Text&amp;gt;Touch Start to begin.&amp;lt;/Text&amp;gt;
  &amp;lt;Spacer /&amp;gt;
  &amp;lt;Button id=&amp;quot;start&amp;quot; onPress={onStart}&amp;gt;Start&amp;lt;/Button&amp;gt;
&amp;lt;/Column&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;ship-plain-rust&quot;&gt;Ship plain Rust&lt;/h2&gt;
&lt;p&gt;At build time, on your machine or in CI, the Screen Compiler turns that into Rust for NoWayOS&amp;#39;s user interface runtime:&lt;/p&gt;
&lt;pre tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-rust&quot;&gt;let n1 = b.text(&amp;quot;Welcome&amp;quot;)?; // welcome.tsx:17:9 &amp;lt;Text&amp;gt;
let n2 = b.text(&amp;quot;Touch Start to begin.&amp;quot;)?; // welcome.tsx:18:9 &amp;lt;Text&amp;gt;
let n4 = b.spacer(None)?; // welcome.tsx:20:9 &amp;lt;Spacer&amp;gt;
let n5 = b.button(&amp;quot;Start&amp;quot;, actions::START)?; // welcome.tsx:21:9 &amp;lt;Button&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Every line points back to the TSX it came from. The device gets that code and nothing else: no JavaScript engine, no browser, no web page to attack. The Screen Compiler itself never ships.&lt;/p&gt;
&lt;!-- slot --&gt;&lt;h2 id=&quot;exact-or-nothing&quot;&gt;Exact, or nothing&lt;/h2&gt;
&lt;p&gt;A converter that guesses is a converter you can&amp;#39;t trust. The Screen Compiler converts its declared subset of TSX exactly, and refuses everything else with the file, line and column. It never approximates. The Rust it writes has no &lt;code&gt;unsafe&lt;/code&gt;, no &lt;code&gt;unwrap&lt;/code&gt; and no &lt;code&gt;panic&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Then every converted screen is drawn by NoWayOS&amp;#39;s renderer and compared, pixel for pixel, with its approved image. If a single pixel moves, the build says so.&lt;/p&gt;
&lt;h2 id=&quot;where-it-stands&quot;&gt;Where it stands&lt;/h2&gt;
&lt;p&gt;The Screen Compiler is in development: its first subset is built and the next is under way. It&amp;#39;s open source under MIT, on GitHub beside NoWayOS. If your team designs in React and builds devices that matter, &lt;a href=&quot;mailto:partners@nowayos.com&quot;&gt;we&amp;#39;d like to hear from you&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>The backup that wasn't a copy</title>
    <link href="https://www.nowayos.com/journal/the-backup-that-wasnt-a-copy"/>
    <id>https://www.nowayos.com/journal/the-backup-that-wasnt-a-copy</id>
    <published>2026-11-13T00:00:00Z</published>
    <updated>2026-11-13T00:00:00Z</updated>
    <summary>Apollo 11 flew two guidance systems built on different principles, and needed both. Ariane 5 flew two identical ones, and one fault stopped both. That difference has a name, and NoWayOS is built to be on the right side of it.</summary>
    <content type="html">&lt;p&gt;Everybody knows you should have a backup. Fewer people ask the awkward follow-up: a backup of &lt;em&gt;what&lt;/em&gt;, exactly?&lt;/p&gt;
&lt;h2 id=&quot;five-alarms&quot;&gt;Five alarms&lt;/h2&gt;
&lt;p&gt;On 20 July 1969, Apollo 11&amp;#39;s lunar module was a few minutes from the surface of the Moon when its guidance computer raised an alarm the crew had to ask Mission Control about. Then another. Five in all, in the last stretch of the descent.&lt;/p&gt;
&lt;p&gt;The computer was overloaded. What it did next is one of the great pieces of engineering in the story: each time, it restarted, dropped the work that could wait and picked the work that couldn&amp;#39;t straight back up. The landing went on.&lt;/p&gt;
&lt;p&gt;That&amp;#39;s the part everyone tells. The part worth telling next happened the following day.&lt;/p&gt;
&lt;h2 id=&quot;the-second-system&quot;&gt;The second system&lt;/h2&gt;
&lt;p&gt;The lunar module carried a second guidance system, and it was not a spare copy of the first. A different company built it, on a different principle. The main system kept its bearings with a platform that swung freely on gimbals. The second had no gimbals at all: its sensors were bolted straight to the spacecraft, and it worked out which way was up by arithmetic.&lt;/p&gt;
&lt;p&gt;It was there to fly the crew back to orbit if the main system ever stopped. During the landing it wasn&amp;#39;t called on.&lt;/p&gt;
&lt;p&gt;Then, on the way back up to dock with the command module, a run of manoeuvres took the main system&amp;#39;s platform into the one position a gimballed platform can&amp;#39;t cope with, and it lost its attitude reference. The crew switched to the second system to hold the spacecraft steady, and docked.&lt;/p&gt;
&lt;p&gt;The second system could not have failed the same way. It didn&amp;#39;t have the part.&lt;/p&gt;
&lt;h2 id=&quot;two-of-the-same&quot;&gt;Two of the same&lt;/h2&gt;
&lt;p&gt;Now the other story. In 1996 the first Ariane 5 lifted off with two inertial reference units to tell it which way it was pointing: one working, one standing by. They were identical, down to the software.&lt;/p&gt;
&lt;p&gt;Thirty-seven seconds in, a number inside that software grew too large for the space set aside for it. The stand-by unit stopped. The working unit, running the same code on the same flight, stopped as well. The inquiry&amp;#39;s report is public, and it is blunt: there was nothing to switch to, because the backup had already gone the same way.&lt;/p&gt;
&lt;p&gt;Two copies. One fault. Nothing left.&lt;/p&gt;
&lt;h2 id=&quot;what-engineers-call-it&quot;&gt;What engineers call it&lt;/h2&gt;
&lt;p&gt;A fault that takes out a system and its spare together is a &lt;em&gt;common-cause failure&lt;/em&gt;. The defence against it is &lt;em&gt;diverse redundancy&lt;/em&gt;: a second system built differently enough that what stops the first isn&amp;#39;t in the second.&lt;/p&gt;
&lt;p&gt;The Space Shuttle flew this way. Four of its flight computers ran one company&amp;#39;s software; the fifth ran software written separately by another. Four copies protect you from a computer that breaks. They don&amp;#39;t protect you from a program that&amp;#39;s wrong, because all four are running it.&lt;/p&gt;
&lt;p&gt;It isn&amp;#39;t free. The Shuttle&amp;#39;s first launch was called off when the fifth computer and the other four couldn&amp;#39;t agree on the time. Two designs are more work than one, and they have to be made to meet.&lt;/p&gt;
&lt;h2 id=&quot;where-nowayos-comes-in&quot;&gt;Where NoWayOS comes in&lt;/h2&gt;
&lt;p&gt;Most dedicated devices today run one of a very small number of general-purpose operating systems. So do their backups. When a flaw turns up in a browser engine, a desktop or a kernel of tens of millions of lines, or when a bad update goes out, it turns up everywhere that software runs, on the same day.&lt;/p&gt;
&lt;p&gt;A NoWayOS device is different underneath. Its kernel is seL4, about 10,000 lines. Everything of ours above it is written in Rust. It has no browser engine, no desktop and no shell, so a flaw in one of those is not in it.&lt;/p&gt;
&lt;p&gt;That means NoWayOS doesn&amp;#39;t have to replace what you run to be useful. It can stand beside it: a second way to do one essential job, built on a different principle.&lt;/p&gt;
&lt;h2 id=&quot;what-it-doesnt-do&quot;&gt;What it doesn&amp;#39;t do&lt;/h2&gt;
&lt;p&gt;Diversity has limits, and we&amp;#39;d rather you heard them from us.&lt;/p&gt;
&lt;p&gt;It gives a NoWayOS device different faults, not none. It does nothing for what two systems share: the power, the network, the services behind them, or a mistake in what the job was meant to be. And some of NoWayOS&amp;#39;s open-source parts are used in other software too, which is why every image lists every component it contains, so you can read what it has in common with the system next to it.&lt;/p&gt;
&lt;p&gt;NoWayOS is in development, so this is a role it is designed for, not one it has filled yet. &lt;a href=&quot;/security#diverse-redundancy&quot;&gt;The Security page says what it rests on&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Apollo&amp;#39;s engineers didn&amp;#39;t carry a second system because they expected the first to fail. They carried it because they couldn&amp;#39;t prove it wouldn&amp;#39;t, and they made sure that whatever stopped the first would find nothing familiar in the second.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>We attack our own build on every change</title>
    <link href="https://www.nowayos.com/journal/we-attack-our-own-build"/>
    <id>https://www.nowayos.com/journal/we-attack-our-own-build</id>
    <published>2026-11-13T00:00:00Z</published>
    <updated>2026-11-13T00:00:00Z</updated>
    <summary>A security test that can't fail proves nothing. So NoWayOS's tests come with versions built to fail, and its gates live where a pull request can't reach them.</summary>
    <content type="html">&lt;p&gt;Here&amp;#39;s an uncomfortable question for any security test: has it ever failed? A test that has never failed might be passing because the system is sound, or because the test can&amp;#39;t see anything at all. From the outside, the two look exactly the same.&lt;/p&gt;
&lt;p&gt;So NoWayOS doesn&amp;#39;t just test its security. It attacks it, on every change, and checks that the attacks are caught.&lt;/p&gt;
&lt;h2 id=&quot;reaching-for-what-isnt-yours&quot;&gt;Reaching for what isn&amp;#39;t yours&lt;/h2&gt;
&lt;p&gt;Each part of a NoWayOS system runs in its own compartment on seL4, holding only what it was granted. The isolation tests send probes across those boundaries on purpose. One reads an address it was never given. One writes to a page it may only read. One, holding exactly what the user interface holds, tries to write the display&amp;#39;s control page, which the interface may only read. Another, holding exactly what the network client holds, tries to write into the network driver&amp;#39;s memory.&lt;/p&gt;
&lt;p&gt;seL4 must stop every one of them, and a bystander part must carry on running, untouched.&lt;/p&gt;
&lt;h2 id=&quot;a-test-built-to-fail&quot;&gt;A test built to fail&lt;/h2&gt;
&lt;p&gt;Then comes the twist. Beside the user interface&amp;#39;s isolation test sits a variant with one grant widened on purpose: the interface&amp;#39;s stand-in is given the display&amp;#39;s private page. That variant&amp;#39;s test &lt;strong&gt;must fail&lt;/strong&gt;. If it ever passed, the isolation test would be blind, and the build would say so.&lt;/p&gt;
&lt;p&gt;The same idea runs through the rest of the checks. Every decoder of messages between parts has bounded proofs, from the Kani model checker, that it never panics, overflows or reads out of bounds. Mutation checks then break the decoders deliberately, to show the proofs notice. Every parser of outside input is fuzzed with hostile data.&lt;/p&gt;
&lt;p&gt;All of it is part of &lt;code&gt;make ci&lt;/code&gt;, the gate every change must pass. The isolation tests run every time; a proof or a fuzz run is repeated whenever the code it covers changes.&lt;/p&gt;
&lt;!-- slot --&gt;&lt;h2 id=&quot;gates-out-of-reach&quot;&gt;Gates out of reach&lt;/h2&gt;
&lt;p&gt;A gate is only as strong as the hand that can change it. So the checks every contribution to NoWayOS must pass are defined in &lt;strong&gt;Defence Agent&lt;/strong&gt;, a public repository of their own. A pull request that touches a gate is flagged for the maintainer.&lt;/p&gt;
&lt;p&gt;Defence Agent tests itself the same way: twenty planted pull requests, each hiding something a reviewer could miss. There&amp;#39;s hidden right-to-left text in a comment, a letter swapped for its Cyrillic look-alike, a dependency fetched straight from a git repository, a workflow that would run untrusted code. Each must be caught, while three real past changes must pass.&lt;/p&gt;
&lt;h2 id=&quot;proof-not-adjectives&quot;&gt;Proof, not adjectives&lt;/h2&gt;
&lt;p&gt;None of this makes a device “unhackable”. Nothing does, and we&amp;#39;ll never say it. What it gives you is evidence: a record of what was tried, what was stopped, and the command that shows it. Read &lt;a href=&quot;/security#read-one-images-evidence&quot;&gt;one real image&amp;#39;s evidence&lt;/a&gt;, or &lt;a href=&quot;https://github.com/NoWayOS/defence-agent&quot;&gt;the gates themselves&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>What a proof can promise</title>
    <link href="https://www.nowayos.com/journal/what-a-proof-can-promise"/>
    <id>https://www.nowayos.com/journal/what-a-proof-can-promise</id>
    <published>2026-11-13T00:00:00Z</published>
    <updated>2026-11-13T00:00:00Z</updated>
    <summary>A test tries the cases someone thought of. A proof covers all of them. What seL4's mathematical proofs say, what they assume, and where NoWayOS stands beside them.</summary>
    <content type="html">&lt;p&gt;Software is usually trusted because it was tested. Somebody thought of the ways it might go wrong, tried them, and watched it cope. That works well, right up to the case nobody thought of.&lt;/p&gt;
&lt;p&gt;A proof starts from the other end. It doesn&amp;#39;t try cases. It shows, by mathematics, that a statement holds for all of them.&lt;/p&gt;
&lt;h2 id=&quot;every-case-not-the-ones-we-tried&quot;&gt;Every case, not the ones we tried&lt;/h2&gt;
&lt;p&gt;Take a small promise: this code never reads past the end of its buffer. A test can feed it a thousand inputs, or a billion, and report that none of them broke it. A proof says something of a different kind: there is no input that breaks it. Not one was found, and not one exists.&lt;/p&gt;
&lt;p&gt;The price is rigour. A proof needs an exact statement of what the code should do, called its specification, and an argument that connects every line of the code to it. For real software that argument is far too long for a person to check by eye. So a computer checks it.&lt;/p&gt;
&lt;!-- slot --&gt;&lt;h2 id=&quot;checked-by-machine&quot;&gt;Checked by machine&lt;/h2&gt;
&lt;p&gt;That is what “machine-checked” means. The proof is written out in full, in a language a program called a proof assistant can read, and the program checks each step against the rules of logic. It doesn&amp;#39;t get tired on page nine hundred, and it doesn&amp;#39;t take anyone&amp;#39;s word for anything.&lt;/p&gt;
&lt;p&gt;seL4&amp;#39;s proofs are checked this way, in a proof assistant called Isabelle/HOL. They are public, and anyone can run them again.&lt;/p&gt;
&lt;h2 id=&quot;what-sel4s-proofs-say&quot;&gt;What seL4&amp;#39;s proofs say&lt;/h2&gt;
&lt;p&gt;seL4 is the kernel every NoWayOS system runs on: about 10,000 lines of code, and the only code with total control of the device. Its size is the point. An argument about ten thousand lines can be finished. An argument about tens of millions cannot, not yet.&lt;/p&gt;
&lt;p&gt;The seL4 Foundation &lt;a href=&quot;https://sel4.systems/Verification/proofs.html&quot;&gt;sets the proofs out&lt;/a&gt; in layers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The code does what the specification says, and nothing more.&lt;/strong&gt; From that follows a list of things the kernel cannot do: overrun a buffer, follow a null pointer, leak memory, divide by zero.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The program that runs matches the code that was proved.&lt;/strong&gt; A compiler sits between the two, so a further proof checks its output.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The kernel can keep the parts of a system apart.&lt;/strong&gt; One part cannot change another&amp;#39;s data, read it, or take the resources it needs, unless it was granted the right to.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A system can start in the state it was designed to have,&lt;/strong&gt; with exactly the grants its description lists.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Not every layer is finished for every processor and every configuration. That matters, and we will come back to it.&lt;/p&gt;
&lt;h2 id=&quot;what-a-proof-takes-for-granted&quot;&gt;What a proof takes for granted&lt;/h2&gt;
&lt;p&gt;A proof is exactly as wide as its statement, and it stands on its assumptions. seL4 writes its own down: that the hardware behaves as its model says, that a few hundred lines of the lowest-level code are right, that the code which runs before the kernel starts has done its job. The proof of secrecy does not cover timing.&lt;/p&gt;
&lt;p&gt;It says nothing about whether the specification asks for the right thing, and nothing about the software above the kernel. A proved kernel will faithfully isolate a program that has a bug in it. The bug is still there. It just can&amp;#39;t reach anything else.&lt;/p&gt;
&lt;p&gt;That is not a weakness in the proofs. It is what makes them worth having: they say precisely what they cover, so you know precisely what is left.&lt;/p&gt;
&lt;h2 id=&quot;where-nowayos-stands&quot;&gt;Where NoWayOS stands&lt;/h2&gt;
&lt;p&gt;Here is the plain position. NoWayOS runs on seL4, but no NoWayOS image is inside seL4&amp;#39;s completed proofs today. NoWayOS uses seL4&amp;#39;s mixed-criticality configuration, whose proofs for our processors are in progress. And seL4&amp;#39;s proofs never did cover NoWayOS&amp;#39;s own code. So we don&amp;#39;t call NoWayOS “formally verified”, and we won&amp;#39;t.&lt;/p&gt;
&lt;p&gt;Every image says where it stands. A file beside it lists its kernel&amp;#39;s configuration, option by option, against the one seL4 has proved. &lt;a href=&quot;/security#what-sel4s-proofs-cover-and-what-they-dont&quot;&gt;Security&lt;/a&gt; shows a real one.&lt;/p&gt;
&lt;h2 id=&quot;smaller-proofs-of-our-own&quot;&gt;Smaller proofs of our own&lt;/h2&gt;
&lt;p&gt;NoWayOS&amp;#39;s code gets its assurance another way: Rust, isolation, review, testing, and proofs of a more modest kind.&lt;/p&gt;
&lt;p&gt;Every decoder of the messages that pass between parts of a system has &lt;strong&gt;bounded proofs&lt;/strong&gt;, made with a model checker called Kani. A bounded proof covers every input up to a stated size, here the longest record a decoder accepts. Inside that bound it is a real proof: no input makes the decoder panic, overflow or read out of bounds. Beyond the bound it says nothing, which is why the bound is the longest input there is.&lt;/p&gt;
&lt;p&gt;Then we break the decoders on purpose, to make sure the proofs notice. A proof that can&amp;#39;t fail is no better than &lt;a href=&quot;/journal/we-attack-our-own-build&quot;&gt;a test that can&amp;#39;t&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;the-honest-size-of-it&quot;&gt;The honest size of it&lt;/h2&gt;
&lt;p&gt;A proof doesn&amp;#39;t make anything “unhackable”. It makes one statement true, in every case, under assumptions you can read. Know the statement and the assumptions, and you know what you have.&lt;/p&gt;
&lt;p&gt;That is why NoWayOS is built on the kernel that has them, and why it tells you, image by image, how far they reach.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Why a NoWayOS device has no shell</title>
    <link href="https://www.nowayos.com/journal/why-a-nowayos-device-has-no-shell"/>
    <id>https://www.nowayos.com/journal/why-a-nowayos-device-has-no-shell</id>
    <published>2026-11-13T00:00:00Z</published>
    <updated>2026-11-13T00:00:00Z</updated>
    <summary>Most dedicated devices run a general-purpose computer with one job on top and everything else still underneath. We took the other road: build each device from only what its job needs, and leave the rest out.</summary>
    <content type="html">&lt;p&gt;Most attacks on a dedicated device don&amp;#39;t go after the job it does. They go after the rest of the computer it runs on: the shell left in for maintenance, the remote-access service nobody switched off, the browser behind the application, the desktop one crash away.&lt;/p&gt;
&lt;p&gt;That &amp;quot;rest of the computer&amp;quot; is everywhere. The gateway that carries readings out of a water works, the terminal in a power network&amp;#39;s control room, the devices a hospital relies on, the panel on the side of a machine, the screen in a station concourse: many of them run a general-purpose operating system with one job on top, and everything else still there underneath, switched off by settings. Kiosk mode is the simplest version. Every compromise is someone finding the one setting that was missed.&lt;/p&gt;
&lt;h2 id=&quot;leave-it-out-instead&quot;&gt;Leave it out instead&lt;/h2&gt;
&lt;p&gt;NoWayOS starts from the other end. A NoWayOS image holds the device&amp;#39;s application, the drivers that application uses, and the seL4 microkernel. That&amp;#39;s the whole list.&lt;/p&gt;
&lt;p&gt;There&amp;#39;s no shell to drop into, because no shell was ever built in. No remote login to guess a password for. No desktop to escape to. No browser engine waiting for a malicious page. You can&amp;#39;t misconfigure a setting for software that isn&amp;#39;t there.&lt;/p&gt;
&lt;p&gt;All of that is about the operating system. The application on top is another matter: it can sign its users in, and sign in to other systems, whenever its job calls for it. What it doesn&amp;#39;t sit on is an operating system anyone can log in to.&lt;/p&gt;
&lt;p&gt;We call that a &lt;strong&gt;Single Purpose OS&lt;/strong&gt;: a computer with nothing else to do.&lt;/p&gt;
&lt;h2 id=&quot;and-what-is-there-is-sealed&quot;&gt;And what is there is sealed&lt;/h2&gt;
&lt;p&gt;Leaving things out is half of it. Each part that remains (the network, the screen, the input, the application) runs in a compartment of its own, a &lt;em&gt;protection domain&lt;/em&gt; in seL4&amp;#39;s terms, and reaches only what it was granted. The network driver moves packets. The display driver draws. The application talks to each through fixed-size messages.&lt;/p&gt;
&lt;p&gt;Every grant is written down in a file, one fact per line, and the build fails if the system and the file disagree. It&amp;#39;s built so that a fault in one part stays in that part.&lt;/p&gt;
&lt;h2 id=&quot;but-how-do-you-fix-it-without-a-shell&quot;&gt;&amp;quot;But how do you fix it without a shell?&amp;quot;&lt;/h2&gt;
&lt;p&gt;Engineers ask this first, and fairly. You don&amp;#39;t log in to the operating system of a NoWayOS device: it has no accounts, so there&amp;#39;s no one to log in as. You build a new image and replace the old one. Today that means building it and loading it onto the board; signed updates, checked by the device and able to fall back safely, are designed and on their way.&lt;/p&gt;
&lt;p&gt;What you get in return is a device that starts straight into its one job, with far less to patch and far less to attack. For the systems a country runs on, that trade is the whole point.&lt;/p&gt;
&lt;h2 id=&quot;see-for-yourself&quot;&gt;See for yourself&lt;/h2&gt;
&lt;p&gt;The evidence for one real NoWayOS image, its grants file, its bill of materials and its seL4 configuration record, is on our &lt;a href=&quot;/security#read-one-images-evidence&quot;&gt;security page&lt;/a&gt;. No sign-up, no script. Just the files.&lt;/p&gt;
</content>
  </entry>
</feed>
