<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>Releases of modus</title>
<subtitle>Every release of modus, newest first, with the changes of each one.</subtitle>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md</id>
<updated>2026-11-12T00:00:00Z</updated>
<author><name>modus</name><uri>https://github.com/sachahjkl/kernel</uri></author>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html"/>
<link rel="self" type="application/atom+xml" href="https://modus.froment.software/releases.xml"/>
<icon>https://modus.froment.software/pictures/heron_192.png</icon>
<entry>
<title>modus 0.86.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-86-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-86-0"/>
<published>2026-11-12T00:00:00Z</published>
<updated>2026-11-12T00:00:00Z</updated>
<summary>The desktop names things in B612 too. The buttons of the bar, its menus, the titles of the windows and the launcher are in the interface font B612, and the clock, the date and what the person types stay in Paper Mono; the buttons are as wide as their names in that font. The display of the boot, after its first screen, has its titles and names in B612 too.</summary>
<content type="html">&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The desktop names things in B612 too.&lt;/strong&gt; The buttons of the bar, its menus, the titles of the windows and the launcher are in the interface font B612, and the clock, the date and what the person types stay in Paper Mono; the buttons are as wide as their names in that font. The display of the boot, after its first screen, has its titles and names in B612 too.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.85.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-85-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-85-0"/>
<published>2026-11-12T00:00:00Z</published>
<updated>2026-11-12T00:00:00Z</updated>
<summary>A QUIC server frees the connection of a client that went silent at its idle timeout: a client that vanished while the server had data in flight kept its connection, and its place in the table of quic_echo, for about two hours, because each unanswered probe pushed the idle timeout further. It now ends after 30 s, whatever the probes. A replayed packet can no longer keep a silent connection alive, a server can no longer be started with no idle timeout, and quic_echo logs how long each idle end took against its bound.</summary>
<content type="html">&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;A QUIC server frees the connection of a client that went silent at its idle timeout&lt;/strong&gt;: a client that vanished while the server had data in flight kept its connection, and its place in the table of &lt;code&gt;quic_echo&lt;/code&gt;, for about two hours, because each unanswered probe pushed the idle timeout further. It now ends after 30 s, whatever the probes. A replayed packet can no longer keep a silent connection alive, a server can no longer be started with no idle timeout, and &lt;code&gt;quic_echo&lt;/code&gt; logs how long each idle end took against its bound.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.84.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-84-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-84-0"/>
<published>2026-11-12T00:00:00Z</published>
<updated>2026-11-12T00:00:00Z</updated>
<summary>No text of the system is cut in silence: a log line longer than 512 bytes was cut with no sign, and so was each text that a program formats in a buffer too small; the log now takes a text whole, in several lines, and a text that a place cannot hold ends with &quot;... and N bytes more&quot;. The console refuses a program name longer than 31 bytes, which the root service cut before.</summary>
<content type="html">&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;No text of the system is cut in silence&lt;/strong&gt;: a log line longer than 512 bytes was cut with no sign, and so was each text that a program formats in a buffer too small; the log now takes a text whole, in several lines, and a text that a place cannot hold ends with &amp;quot;... and N bytes more&amp;quot;. The console refuses a program name longer than 31 bytes, which the root service cut before.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.83.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-83-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-83-0"/>
<published>2026-11-12T00:00:00Z</published>
<updated>2026-11-12T00:00:00Z</updated>
<summary>The console keeps its line history across a stop: after each line, the history goes to a store of its own in the storage service (4 blocks, apart from the store of the person), and at the next start Up and Control-R find the lines of before, also after a stop of the machine. history_clear() forgets it, in memory and on the disk.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The console keeps its line history across a stop&lt;/strong&gt;: after each line, the history goes to a store of its own in the storage service (4 blocks, apart from the store of the person), and at the next start Up and Control-R find the lines of before, also after a stop of the machine. history_clear() forgets it, in memory and on the disk.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The console prints a long result whole&lt;/strong&gt;: a result of more than 256 bytes was cut in the terminal and in the log with no sign, and a line of more than 192 bytes was cut in the log; the console now prints each result at any length.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.82.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-82-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-82-0"/>
<published>2026-11-12T00:00:00Z</published>
<updated>2026-11-12T00:00:00Z</updated>
<summary>Windows name things in B612. The titles, captions, labels, buttons and lists of every window drawn with the interface package are in the interface font B612, and their values (numbers, typed text, tables, terminals) stay in Paper Mono; a window with no interface font draws everything in Paper Mono with the same layout.</summary>
<content type="html">&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Windows name things in B612.&lt;/strong&gt; The titles, captions, labels, buttons and lists of every window drawn with the interface package are in the interface font B612, and their values (numbers, typed text, tables, terminals) stay in Paper Mono; a window with no interface font draws everything in Paper Mono with the same layout.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.81.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-81-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-81-0"/>
<published>2026-11-12T00:00:00Z</published>
<updated>2026-11-12T00:00:00Z</updated>
<summary>Programs can use AVX and AVX-512: the kernel saves the extended state of each thread with xsaveopt (x87, SSE, AVX, and AVX-512 when the processor has it; one save writes at most 832 bytes with AVX and 2688 with AVX-512, and each thread entry of the kernel holds an area of 2688 bytes), sets CR4 and XCR0 itself on each processor, and logs what it saves at boot. A processor without xsave keeps the save with fxsave. A program reads what it can use with support/instruction_sets, and the program extended_state shows that each register of each thread is kept.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Programs can use AVX and AVX-512&lt;/strong&gt;: the kernel saves the extended state of each thread with &lt;code&gt;xsaveopt&lt;/code&gt; (x87, SSE, AVX, and AVX-512 when the processor has it; one save writes at most 832 bytes with AVX and 2688 with AVX-512, and each thread entry of the kernel holds an area of 2688 bytes), sets &lt;code&gt;CR4&lt;/code&gt; and &lt;code&gt;XCR0&lt;/code&gt; itself on each processor, and logs what it saves at boot. A processor without &lt;code&gt;xsave&lt;/code&gt; keeps the save with &lt;code&gt;fxsave&lt;/code&gt;. A program reads what it can use with &lt;code&gt;support/instruction_sets&lt;/code&gt;, and the program &lt;code&gt;extended_state&lt;/code&gt; shows that each register of each thread is kept.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;A kernel entry no longer saves the vector registers of a program&lt;/strong&gt;: the kernel saves and restores the x87, SSE and AVX registers of a thread only when a processor leaves it for another thread, and the kernel itself has no instruction that uses them, which the build proves on each kernel that it makes. One kernel entry takes 120 to 124 ns where it took 176 to 178 ns (the machine of the test, two runs each), and one hand-over between two threads takes 125 to 133 ns with the registers saved and restored.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;A program that used AVX no longer gets the high halves of its ymm registers from another thread&lt;/strong&gt;: before, the kernel saved only 512 bytes with &lt;code&gt;fxsave&lt;/code&gt; and kept the &lt;code&gt;XCR0&lt;/code&gt; that the firmware left, so AVX could work with wrong values and no error. Now a register state component is enabled only when the kernel saves it.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A reset QUIC stream no longer closes the whole connection&lt;/strong&gt;: when a stream was reset while flow control still held back some of its bytes, the reset named the bytes written instead of the bytes sent, and a correct peer closed the connection. The bytes of a stream are now erased from memory when the stream ends.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.80.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-80-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-80-0"/>
<published>2026-11-12T00:00:00Z</published>
<updated>2026-11-12T00:00:00Z</updated>
<summary>Several streams in one QUIC connection: a client of quic_echo can open 4 streams at once, and each one is echoed on its own, with its own flow control and its own reset; a lost datagram of one stream no longer holds the others. kerneltool test quic runs one client with 4 streams.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Several streams in one QUIC connection&lt;/strong&gt;: a client of &lt;code&gt;quic_echo&lt;/code&gt; can open 4 streams at once, and each one is echoed on its own, with its own flow control and its own reset; a lost datagram of one stream no longer holds the others. &lt;code&gt;kerneltool test quic&lt;/code&gt; runs one client with 4 streams.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Security&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;A QUIC server can no longer be stopped by a few dozen real addresses&lt;/strong&gt;: the budget of Initial checks of each address can no longer be renewed by addresses that take turns, so 33 hosts no longer stop every new client of &lt;code&gt;quic_echo&lt;/code&gt;. A new address gets no check while the table of 1024 addresses is busy, and &lt;code&gt;quic_echo&lt;/code&gt; counts it.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.79.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-79-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-79-0"/>
<published>2026-11-12T00:00:00Z</published>
<updated>2026-11-12T00:00:00Z</updated>
<summary>The interface font is drawn. The program interface_font shows B612 Regular and Bold placed with their pairs at a third of a pixel: a paragraph, three pairs with and without their adjustment, one word at the three positions of a pixel, the digits in columns, and the time of one line.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The interface font is drawn.&lt;/strong&gt; The program &lt;code&gt;interface_font&lt;/code&gt; shows B612 Regular and Bold placed with their pairs at a third of a pixel: a paragraph, three pairs with and without their adjustment, one word at the three positions of a pixel, the digits in columns, and the time of one line.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The zero of the system is slashed.&lt;/strong&gt; Every window, the console and the terminal draw the character 0 as the slashed zero of Paper Mono, which its feature zero gives, so a 0 no longer looks like the capital O.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The caches of the interface font come with the system.&lt;/strong&gt; The two glyph caches of B612 are in the boot image, checked once by the root service and shared read-only by every program with a window, and a program learns which shared ranges it received from one value of its context; the program &lt;code&gt;interface_font&lt;/code&gt; no longer builds its own caches.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.78.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-78-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-78-0"/>
<published>2026-11-12T00:00:00Z</published>
<updated>2026-11-12T00:00:00Z</updated>
<summary>The time of one key of the completion list is measured: measure_completion() in the console gives the collect, the rank and the rows of one key, for the names of the console and for 512 names of 128 bytes; in the quotes of connect and stop, a key no longer reads the programs that run again.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The time of one key of the completion list is measured&lt;/strong&gt;: measure_completion() in the console gives the collect, the rank and the rows of one key, for the names of the console and for 512 names of 128 bytes; in the quotes of connect and stop, a key no longer reads the programs that run again.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The text of the console no longer moves when the line under the input comes or goes&lt;/strong&gt;: the terminal keeps one free row under the edit line, and draws the hint there; a hint that is too long for the window shows its short form.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The status line of a terminal names the lines of the text in view&lt;/strong&gt;: after a clear it said &amp;quot;line 738 of 737&amp;quot;, because it counted the edit line as a line of the text; it now says &amp;quot;lines 709 to 736 of 737&amp;quot;, or &amp;quot;none in view&amp;quot;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;An export that fails in a sandboxed program or a service no longer changes a table of the console&lt;/strong&gt;: the console copied back the rows that a failed export wrote in a Change table; it now copies back only the table of error details, as the contract says.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A completion list shows only the rows that its program gave for it&lt;/strong&gt;: a list with no rows of its own showed the rows of the list before; when more names exist than the list reads, the line under the input says so.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A failed isolated call keeps the reason of its failure&lt;/strong&gt;: when the table of error details came back wrong, the error record of the export was replaced by a record about the table; it now stays, and a separate status says that the details are missing.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Security&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Long names of one length no longer slow each key of the console&lt;/strong&gt;: the order of two names in the completion list read whole names, up to 64 times for each name, so a service with long export names of one length made each key slow; it now reads at most 256 bytes of a name, and one key has a fixed bound.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.77.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-77-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-77-0"/>
<published>2026-11-12T00:00:00Z</published>
<updated>2026-11-12T00:00:00Z</updated>
<summary>The mark in the system: the heron is at the left of the bar of the desktop, in the place of the word &quot;kernel&quot;, and the heron with the name modus is in the head of the boot display. Both are drawn from the data of support/mark, with no picture file in the boot image.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The mark in the system&lt;/strong&gt;: the heron is at the left of the bar of the desktop, in the place of the word &amp;quot;kernel&amp;quot;, and the heron with the name modus is in the head of the boot display. Both are drawn from the data of &lt;code&gt;support/mark&lt;/code&gt;, with no picture file in the boot image.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Security&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The program &lt;code&gt;settings&lt;/code&gt; can no longer make the keys of the person get lost.&lt;/strong&gt; A new count of changes on the settings page with the same values made the compositor send one record into the ring of each window, the ring that also carries the keys and the pointer; it now tells the windows only when the values differ from the values that it told last.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.76.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-76-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-76-0"/>
<published>2026-11-12T00:00:00Z</published>
<updated>2026-11-12T00:00:00Z</updated>
<summary>A QUIC server on the network: quic_echo listens on the UDP port 4433 with QUIC in the program, writes back each stream, shows its public key, its connections and what it refused in its window, and makes no key when the random seed of the program is weak; kerneltool test quic runs a client of the host against it through the network service, with loss, many clients and a flood of forged packets.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;A QUIC server on the network&lt;/strong&gt;: &lt;code&gt;quic_echo&lt;/code&gt; listens on the UDP port 4433 with QUIC in the program, writes back each stream, shows its public key, its connections and what it refused in its window, and makes no key when the random seed of the program is weak; &lt;code&gt;kerneltool test quic&lt;/code&gt; runs a client of the host against it through the network service, with loss, many clients and a flood of forged packets.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A program can listen on a UDP port&lt;/strong&gt;: the network service gives a listen grant of UDP, which answers only the remotes that sent a datagram of 1200 bytes at least to the port, as the listen grant of TCP does for a SYN.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A test of QUIC against OpenSSL&lt;/strong&gt;: &lt;code&gt;kerneltool test quic-real&lt;/code&gt; connects &lt;code&gt;openssl s_client -quic&lt;/code&gt; of the host to &lt;code&gt;quic_echo&lt;/code&gt; through QEMU user networking, pins the key that the machine printed, and checks the echo; the development shell has OpenSSL.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;kerneltool test quic-real&lt;/code&gt; reaches the machine through the peer of the tool&lt;/strong&gt;: QEMU user networking dropped every UDP datagram of the machine, so OpenSSL never received the Retry. The test now goes through a UDP relay of the peer on the loopback of the host, and on a failure prints each datagram that the relay carried and the close of the connection.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;quic_echo&lt;/code&gt; logs why a connection ended&lt;/strong&gt;: the error code and the frame type of the close, and the reason phrase that the client gave.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;quic_echo&lt;/code&gt; resists a flood of new connections better&lt;/strong&gt;: one host with a valid token can no longer stop the new clients of others, each token of a Retry takes a connection once, and the budgets of work for new connections refill continuously, so a burst at the turn of a second no longer gets twice the budget. Its log and its window count the Initials over the budget of one address and the tokens used again.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Two datagrams of a new QUIC connection that arrive together are both taken&lt;/strong&gt;: &lt;code&gt;quic_echo&lt;/code&gt; lost the second one, and the client waited for its probe timeout. A connection whose client came back just after the server released it is now validated by the network service, so it is no longer held to 3 times the bytes that its client sent.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Security&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;A QUIC server keeps nothing for a client that did not prove its address&lt;/strong&gt;: &lt;code&gt;quic_echo&lt;/code&gt; answers a first Initial with a Retry and takes a connection only for a client that came back with its token, so forged source addresses no longer hold its handshake places; the work of new connections has a budget in each second.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The network service limits what a UDP listen grant sends to an unproven address&lt;/strong&gt;: at most 3 times the bytes that came from the remote, until the program marks it validated with the new command &lt;code&gt;Validate&lt;/code&gt;; a send no longer keeps a remote admitted.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.75.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-75-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-75-0"/>
<published>2026-11-12T00:00:00Z</published>
<updated>2026-11-12T00:00:00Z</updated>
<summary>The mark of the system: a heron of square cells with one gradient in each part, and the name modus under it. kerneltool logo writes its files in resources/logo from the data of support/mark, at 1024 pixels on a dark and on a light background and at the sizes 24 to 768.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The mark of the system&lt;/strong&gt;: a heron of square cells with one gradient in each part, and the name modus under it. &lt;code&gt;kerneltool logo&lt;/code&gt; writes its files in &lt;code&gt;resources/logo&lt;/code&gt; from the data of &lt;code&gt;support/mark&lt;/code&gt;, at 1024 pixels on a dark and on a light background and at the sizes 24 to 768.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Text over a gradient or a picture is drawn with the SSE2 blend.&lt;/strong&gt; The text of every window over a title bar or a picture takes the SSE2 form of the blend, with the same pixels as before.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Security&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;No program chooses where another program reads its glyph caches.&lt;/strong&gt; The program &lt;code&gt;settings&lt;/code&gt; could write the address and the size of the glyph caches on the settings page, and so make each program that started later read and draw memory that &lt;code&gt;settings&lt;/code&gt; controlled; the caches are now at fixed addresses with their sizes in the context that the root service writes, mapped read-only for every program. A program also no longer waits for ever on a settings page left in the middle of a change.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A hostile font file no longer stops the reader.&lt;/strong&gt; A glyph made of thousands of empty parts made the font reader run for an unbounded time; the reader now stops at 64 parts, and a glyph cache whose monospace glyphs leave their cells, or whose header has unknown flags or a name with no end, is refused.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.74.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-74-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-74-0"/>
<published>2026-11-11T00:00:00Z</published>
<updated>2026-11-11T00:00:00Z</updated>
<summary>The pointer theme and the grid fit are settings. The window settings and settings.set(&quot;pointer_theme&quot;, &quot;system&quot;) or settings.set(&quot;grid_fit&quot;, &quot;off&quot;) change them while every program runs.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The pointer theme and the grid fit are settings.&lt;/strong&gt; The window &lt;code&gt;settings&lt;/code&gt; and &lt;code&gt;settings.set(&amp;quot;pointer_theme&amp;quot;, &amp;quot;system&amp;quot;)&lt;/code&gt; or &lt;code&gt;settings.set(&amp;quot;grid_fit&amp;quot;, &amp;quot;off&amp;quot;)&lt;/code&gt; change them while every program runs.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Settings survive a stop.&lt;/strong&gt; The font, the order of the color stripes, the pointer theme and the grid fit of the text are kept in the store of the program &lt;code&gt;settings&lt;/code&gt; and come back at the next boot; a loss of power gives the old settings or the new ones, never a mix.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A module of text shaping, and the interface font B612 as data.&lt;/strong&gt; The module &lt;code&gt;text_shaping&lt;/code&gt; places the characters of a text with the advances and the pair adjustments of a proportional font, and measures many texts in one call; the build makes the glyph caches of B612 Regular and Bold, which no window draws yet.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The titles of the cards are bold.&lt;/strong&gt; Each card of a window and of the boot display draws its title in the SemiBold weight of the font of the system.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Text on cards and in the console draws faster.&lt;/strong&gt; A glyph of the vector font over a plain background costs 109 ns in place of 181 ns on the host (the least of many runs), with the same pixels.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Paper Mono is the font of the system.&lt;/strong&gt; The console, the terminal and every window draw their text in Paper Mono on the same grid of 8 x 16 pixels, in place of JetBrains Mono, and the titles of the cards in Paper Mono SemiBold.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.73.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-73-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-73-0"/>
<published>2026-11-11T00:00:00Z</published>
<updated>2026-11-11T00:00:00Z</updated>
<summary>A caret in the line of the console: Left, Right, Home, End, Delete and Backspace edit the line at the caret, and a character goes in at the caret.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;A caret in the line of the console&lt;/strong&gt;: Left, Right, Home, End, Delete and Backspace edit the line at the caret, and a character goes in at the caret.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A completion list in the console&lt;/strong&gt;: while the person types, a list under the line shows the commands, the exports, the services, the variables and the modules that match by a fuzzy match (&lt;code&gt;mcnt&lt;/code&gt; finds &lt;code&gt;monitor.count&lt;/code&gt;), the matched letters lit, each name with its signature; Tab or Enter takes one, and the line under the input shows the signature of the call at the caret.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A longer line history in the console, with a search&lt;/strong&gt;: 256 lines in place of 8; Control-R opens a search over them with the same fuzzy match, Control-R and Control-S move to an older and a newer line, and Enter puts the line in the input.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;A terminal gives its program the modifiers of each key&lt;/strong&gt;, so that Control with a key reaches the console; a cell of the text grid of the interface package can have a fill color (draw record version 5).&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.72.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-72-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-72-0"/>
<published>2026-11-11T00:00:00Z</published>
<updated>2026-11-11T00:00:00Z</updated>
<summary>BLAKE3 hashes four chunks at a time: in an input of more than 4096 bytes, the four chunks of each subtree of four chunks are compressed side by side in the SSE2 registers, with the same hash as before. The root service checks the hash of each module and resource at its start with it.</summary>
<content type="html">&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;BLAKE3 hashes four chunks at a time&lt;/strong&gt;: in an input of more than 4096 bytes, the four chunks of each subtree of four chunks are compressed side by side in the SSE2 registers, with the same hash as before. The root service checks the hash of each module and resource at its start with it.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The text of the vector font is blended four pixels at a time&lt;/strong&gt;: the blend of a glyph over a pixel, in linear light with the three subpixel bands, runs in the SSE2 registers and gives the same pixels as before.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The pointer picture is blended four pixels at a time&lt;/strong&gt;, in the SSE2 registers, with the same pixels as before.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.71.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-71-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-71-0"/>
<published>2026-11-11T00:00:00Z</published>
<updated>2026-11-11T00:00:00Z</updated>
<summary>A table of error details: an export can give each thing that went wrong, not only the first, in an optional table of error records that the caller gives. A caller with no table gets the one error record of before. monitor.counts_named names each row that names no count, and the console and kerneltool call print each detail on its own line after the error.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;A table of error details&lt;/strong&gt;: an export can give each thing that went wrong, not only the first, in an optional table of error records that the caller gives. A caller with no table gets the one error record of before. &lt;code&gt;monitor.counts_named&lt;/code&gt; names each row that names no count, and the console and &lt;code&gt;kerneltool call&lt;/code&gt; print each detail on its own line after the error.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A load names each missing import&lt;/strong&gt;: when &lt;code&gt;load&lt;/code&gt; in the console fails because a module is missing or has the wrong hash, it prints a line for each import of the whole graph that is missing or wrong, not only the first.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The call request of &lt;code&gt;remote&lt;/code&gt; has 112 bytes&lt;/strong&gt;: it names the place of the table of error details, and the answer of a failed call carries the details and their count. The remote service refuses a request of a tool built before this change.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.70.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-70-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-70-0"/>
<published>2026-11-11T00:00:00Z</published>
<updated>2026-11-11T00:00:00Z</updated>
<summary>A cryptography module: the module cryptography gives ChaCha20-Poly1305, AES-128-GCM, SHA-256, HMAC, HKDF, X25519 and Ed25519 to each program, from the code of Odin&#39;s core:crypto with a check that proves each changed line; a tag or a signature that does not verify is an error with no byte given, and the program cryptography_vectors runs the published vectors through it and shows the speed of each primitive.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;A cryptography module&lt;/strong&gt;: the module &lt;code&gt;cryptography&lt;/code&gt; gives ChaCha20-Poly1305, AES-128-GCM, SHA-256, HMAC, HKDF, X25519 and Ed25519 to each program, from the code of Odin&amp;#39;s &lt;code&gt;core:crypto&lt;/code&gt; with a check that proves each changed line; a tag or a signature that does not verify is an error with no byte given, and the program &lt;code&gt;cryptography_vectors&lt;/code&gt; runs the published vectors through it and shows the speed of each primitive.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;QUIC packet protection&lt;/strong&gt;: the library &lt;code&gt;support/quic&lt;/code&gt; reads QUIC version 1 packet headers as hostile input, derives the Initial keys of a connection, and seals and opens packets with header protection, with AES-128-GCM or ChaCha20-Poly1305 from the module &lt;code&gt;cryptography&lt;/code&gt;; it gives the packets of RFC 9001 appendix A byte for byte.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A program chooses how strong its random seed must be&lt;/strong&gt;: a key drawn with &lt;code&gt;random.fill_for_a_key&lt;/code&gt; names the least seed strength that the program accepts (weak, processor or entropy), and a weaker seed gives the error &amp;quot;the random seed of this program has the strength ...&amp;quot; with nothing made; QUIC and TLS ask for processor at least.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;TLS 1.3 for QUIC with raw public keys&lt;/strong&gt;: &lt;code&gt;support/quic&lt;/code&gt; runs the handshake of TLS 1.3 for a client and a server, with X25519, Ed25519 and ChaCha20-Poly1305, and a client accepts the server only when it proves the public key that its caller pinned; no certificate authority and no X.509 are used.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A QUIC connection over memory&lt;/strong&gt;: &lt;code&gt;support/quic&lt;/code&gt; runs one connection of QUIC with acknowledgements, loss detection, the probe timeout, flow control, one bidirectional stream, the idle timeout, the anti-amplification limit and the close, with the TLS 1.3 handshake inside; a test sends 1 MiB each way through a channel that loses 5 % of the datagrams.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The context of a program has 24 values&lt;/strong&gt;: the values 16 to 23 are for the roles that the system fixes for every program, and the strength of the random seed is the value 16. The 16 values before were full, and two roles wanted one number.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;TLS for QUIC refuses a configuration that would accept a weak seed or that pins no key, and takes a large ClientHello&lt;/strong&gt;: a least seed strength under processor, or a client pinned key of zeros, stops the start with an error; the transcript holds 8192 bytes; handshake bytes left at a level whose keys were replaced close the connection.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;A QUIC packet no longer stops the program with its header protection sample&lt;/strong&gt;: a ChaCha20 sample that starts with &lt;code&gt;ff ff ff ff&lt;/code&gt; gives its mask, and an Initial packet with a token of up to 2008 bytes is sealed and opened.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A thread with a short stack stops at its guard page&lt;/strong&gt;: the erasure of the stack after a cryptographic call writes from the top down, so no memory under the stack is written first; a thread that calls the module &lt;code&gt;cryptography&lt;/code&gt; or draws random bytes needs 24 KiB of stack.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A QUIC connection no longer stops for ever when its data has many holes, and a forged Initial no longer takes a server&lt;/strong&gt;: data that had no place is not acknowledged, so the peer sends it again; a server takes a client only with an Initial that opens, and a handshake that does not complete within 10 s ends; an old packet whose number was forgotten is refused; a peer cannot move a timer into the past.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Security&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;One datagram could stop a program that uses ChaCha20 for QUIC header protection&lt;/strong&gt;: the ChaCha20 code taken from Odin refused the block with the last counter, and the sender of a packet chooses that counter. The taken file has the correction as listed adjustments, and the correction is offered to Odin. No program used this path yet.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.69.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-69-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-69-0"/>
<published>2026-11-11T00:00:00Z</published>
<updated>2026-11-11T00:00:00Z</updated>
<summary>A line in the draw table: a straight line between two points with a thickness of 1 to 32 pixels. rings, threads, workers and processors now draw through the interface package.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;A line in the draw table&lt;/strong&gt;: a straight line between two points with a thickness of 1 to 32 pixels. &lt;code&gt;rings&lt;/code&gt;, &lt;code&gt;threads&lt;/code&gt;, &lt;code&gt;workers&lt;/code&gt; and &lt;code&gt;processors&lt;/code&gt; now draw through the interface package.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;The window of &lt;code&gt;crowd&lt;/code&gt; has the same margin at its right as at its left.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A dragged window stays reachable&lt;/strong&gt;: a window dragged to an edge of the screen keeps 8 pixels of its title on the screen, so a person can always take it again. Before, a drag to the right or bottom edge could put the whole window off the screen. A window wider than the screen now opens with its close button on the screen.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A new font reaches every window&lt;/strong&gt;: after a change of the font in &lt;code&gt;settings&lt;/code&gt;, the terminal, the console and the manual draw their whole window again. Before, these windows mixed the old font and the new one.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The status line of a terminal stays readable&lt;/strong&gt;: in a terminal with no rates, the keys hint no longer runs over the status of the program, and a status with a very large total no longer gives a wrong bar.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;No old pixels after a full command ring&lt;/strong&gt;: when a window cannot send its picture to the compositor, its next picture is drawn whole, so the screen never keeps the old pixels of that part.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Security&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The compositor takes only a surface that the program gave&lt;/strong&gt;: a program could name, in its command to create a surface, a handle that the compositor holds for another program. The compositor then showed the memory of the other program and closed its handle. The compositor now asks the kernel to prove that the handle came through the ring of the program, and closes each handle that it was given, also when it refuses the command.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.68.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-68-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-68-0"/>
<published>2026-11-11T00:00:00Z</published>
<updated>2026-11-11T00:00:00Z</updated>
<summary>A build in an empty folder could fail: two module processes of the parallel build made the same folder at the same time, and one of them stopped with &quot;cannot create ... Exist&quot;.</summary>
<content type="html">&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;A build in an empty folder could fail: two module processes of the parallel build made the same folder at the same time, and one of them stopped with &amp;quot;cannot create ... Exist&amp;quot;.&lt;/li&gt;&lt;li&gt;The report of a fault of the kernel no longer reads through the &lt;code&gt;gs&lt;/code&gt; register (with the &lt;code&gt;gs&lt;/code&gt; of a program that read faulted again, with no end and no report), a fault inside the report stops the machine with one line, and the wait for a line of another processor is bounded in time, not in loops.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Security&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;One program could stop the machine&lt;/strong&gt;: a thread made with a first instruction that is not an address of a program made the processor fault in the kernel when the thread first ran, and the kernel stopped the machine. The kernel now refuses such a thread, and such a stack.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.67.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-67-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-67-0"/>
<published>2026-11-11T00:00:00Z</published>
<updated>2026-11-11T00:00:00Z</updated>
<summary>Every program gets versions of its data. The storage service keeps the state of an object before each change, with no save action and no code in the program: a program, or the person through the console or the host, lists the versions of an object, reads one, compares two, restores one (the state before the restore stays a version) and clones an object, which shares its blocks until one side changes. Each version is kept for 10 minutes, then one an hour for a day, then one a day, by the smaller of its age by the date and its age in running time, so a clock that was wrong on one start thins nothing; at the limit of a store the oldest versions go first, and a change that cannot fit with no version is refused. A version that a damaged block makes unreadable is dropped at the next change of its object, which still works. A disk of the earlier format is not read.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Every program gets versions of its data.&lt;/strong&gt; The storage service keeps the state of an object before each change, with no save action and no code in the program: a program, or the person through the console or the host, lists the versions of an object, reads one, compares two, restores one (the state before the restore stays a version) and clones an object, which shares its blocks until one side changes. Each version is kept for 10 minutes, then one an hour for a day, then one a day, by the smaller of its age by the date and its age in running time, so a clock that was wrong on one start thins nothing; at the limit of a store the oldest versions go first, and a change that cannot fit with no version is refused. A version that a damaged block makes unreadable is dropped at the next change of its object, which still works. A disk of the earlier format is not read.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Undo to any earlier note in notes.&lt;/strong&gt; Up and Down step through the versions of the note, with the date of each, Enter restores the version shown, and Escape goes back to the current note.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The system knows the date.&lt;/strong&gt; The bar shows the date and the time of day in UTC, the HTTP server sends the field Date, and each version keeps the date of its change. The date comes from the clock of the machine, read again each 10 seconds; the service date gives it to a caller with now(). The clock gives the years 2020 to 2099; a clock with an empty battery, or a reading that is not a date, gives no date, and the bar then shows the time since the start.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.66.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-66-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-66-0"/>
<published>2026-11-11T00:00:00Z</published>
<updated>2026-11-11T00:00:00Z</updated>
<summary>A program drives its own virtual memory: a memory object made Uncommitted holds a range of addresses (1 GiB in one mapping) and its budget pays only for the pages that the program commits; Memory_Commit commits and decommits tables of ranges, and a decommit gives the pages back to the budget at once; Memory_Protect changes the protection of pages, with No_Access for a guard page; an object made Large_Pages is mapped with pages of 2 MiB. The program address_space shows each case with its numbers.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;A program drives its own virtual memory&lt;/strong&gt;: a memory object made &lt;code&gt;Uncommitted&lt;/code&gt; holds a range of addresses (1 GiB in one mapping) and its budget pays only for the pages that the program commits; &lt;code&gt;Memory_Commit&lt;/code&gt; commits and decommits tables of ranges, and a decommit gives the pages back to the budget at once; &lt;code&gt;Memory_Protect&lt;/code&gt; changes the protection of pages, with &lt;code&gt;No_Access&lt;/code&gt; for a guard page; an object made &lt;code&gt;Large_Pages&lt;/code&gt; is mapped with pages of 2 MiB. The program &lt;code&gt;address_space&lt;/code&gt; shows each case with its numbers.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A test of the real shortage of page frames&lt;/strong&gt;: a machine of the test gives one program nearly all the memory; its four threads take every frame, the kernel takes back the frames that sit in the stacks of the processors, and every frame returns.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Two new kernel operations and a narrow right on budgets&lt;/strong&gt;: the kernel has 29 operations (&lt;code&gt;Memory_Commit&lt;/code&gt; 28, &lt;code&gt;Memory_Protect&lt;/code&gt; 29). A commit names the budget that pays for the object; the new right &lt;code&gt;Commit&lt;/code&gt; on a budget handle lets another program commit pages of that object and nothing else, so a program can let another one grow its object without letting it create objects on its budget.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;A program that maps and unmaps no longer grows its page tables&lt;/strong&gt;: a mapping with no address takes the first free range between the mappings of the program; before, each such mapping took a new range and new page tables until the budget refused (a call host refused its 61st call).&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.65.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-65-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-65-0"/>
<published>2026-11-11T00:00:00Z</published>
<updated>2026-11-11T00:00:00Z</updated>
<summary>Tables and bytes as parameters: an export takes a table of records or a run of bytes, to read, to change or to append to, in memory of the caller. The same description works in a direct call, in a call host and in a service; the console, kerneltool call and remote take a table as an argument. A table of 65536 records can pass as a memory object, with no copy.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Tables and bytes as parameters&lt;/strong&gt;: an export takes a table of records or a run of bytes, to read, to change or to append to, in memory of the caller. The same description works in a direct call, in a call host and in a service; the console, &lt;code&gt;kerneltool call&lt;/code&gt; and &lt;code&gt;remote&lt;/code&gt; take a table as an argument. A table of 65536 records can pass as a memory object, with no copy.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The interface package as a module&lt;/strong&gt;: &lt;code&gt;interface_module&lt;/code&gt; gives the elements of the interface through exports that append to the draw table of the caller, and &lt;code&gt;interface_through_module&lt;/code&gt; draws its window with it.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;A picture or a text grid that changed its index in the draw table, with the same size, was not drawn again.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.64.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-64-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-64-0"/>
<published>2026-11-11T00:00:00Z</published>
<updated>2026-11-11T00:00:00Z</updated>
<summary>The compiler runs on all its threads, with no patch: with the release dev-2026-11a of Odin, the same source gives the same module for any count of compiler threads (20 builds of each of the 64 modules, one result each). The patch of 0.59.0 and the option -thread-count:1 are removed.</summary>
<content type="html">&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The compiler runs on all its threads, with no patch&lt;/strong&gt;: with the release dev-2026-11a of Odin, the same source gives the same module for any count of compiler threads (20 builds of each of the 64 modules, one result each). The patch of 0.59.0 and the option &lt;code&gt;-thread-count:1&lt;/code&gt; are removed.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.63.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-63-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-63-0"/>
<published>2026-11-11T00:00:00Z</published>
<updated>2026-11-11T00:00:00Z</updated>
<summary>The compiler is Odin dev-2026-11a, pinned by the flake itself: the system used the release of May through Nixpkgs. The instructions rdrand and rdseed are asm templates of the new compiler, inline in the code, and the copied ChaCha20 is taken again from the new release.</summary>
<content type="html">&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The compiler is Odin dev-2026-11a&lt;/strong&gt;, pinned by the flake itself: the system used the release of May through Nixpkgs. The instructions &lt;code&gt;rdrand&lt;/code&gt; and &lt;code&gt;rdseed&lt;/code&gt; are &lt;code&gt;asm&lt;/code&gt; templates of the new compiler, inline in the code, and the copied ChaCha20 is taken again from the new release.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.62.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-62-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-62-0"/>
<published>2026-11-11T00:00:00Z</published>
<updated>2026-11-11T00:00:00Z</updated>
<summary>The changelog: CHANGELOG.md lists what each release of the system brings, from the first milestone (0.0.0) to step 59 (0.59.0). A branch adds one fragment in changelog.d/ for each change; kerneltool changelog new, check, assemble, release and notes write, check and release them, and kerneltool release_number prints the release number.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The changelog&lt;/strong&gt;: &lt;code&gt;CHANGELOG.md&lt;/code&gt; lists what each release of the system brings, from the first milestone (0.0.0) to step 59 (0.59.0). A branch adds one fragment in &lt;code&gt;changelog.d/&lt;/code&gt; for each change; &lt;code&gt;kerneltool changelog new&lt;/code&gt;, &lt;code&gt;check&lt;/code&gt;, &lt;code&gt;assemble&lt;/code&gt;, &lt;code&gt;release&lt;/code&gt; and &lt;code&gt;notes&lt;/code&gt; write, check and release them, and &lt;code&gt;kerneltool release_number&lt;/code&gt; prints the release number.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;kerneltool build&lt;/code&gt; builds the modules in parallel&lt;/strong&gt;: one process of the tool for each module, each with one compiler on one thread, as many at once as the processors. The modules and the boot image are the same bytes as with one process.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The kernel reports its own fault as whole lines&lt;/strong&gt;: the report took no lock, and a line of another processor arrived mixed with it on the serial port, so nobody could read the fault. The processor that reports is now the only writer.&lt;/li&gt;&lt;li&gt;The machine test lost typed keys on a loaded host (&lt;code&gt;start(&amp;quot;fetch&amp;quot;)&lt;/code&gt; arrived as &lt;code&gt;start(&amp;quot;ETCH&amp;quot;)&lt;/code&gt;). The tool now sends a key only after the compositor received the key before it.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.61.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-61-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-61-0"/>
<published>2026-11-11T00:00:00Z</published>
<updated>2026-11-11T00:00:00Z</updated>
<summary>kerneltool measure windows starts each window of the interface package alone and prints the time of its pictures with the load of the host; above a load of 8 it says that the table is not valid.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;kerneltool measure windows&lt;/code&gt; starts each window of the interface package alone and prints the time of its pictures with the load of the host; above a load of 8 it says that the table is not valid.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The compositor draws its screen as one draw table&lt;/strong&gt; of the interface package: the frame of each window, its surface, the bar and the menus. The terminal draws its view as one text grid, and &lt;code&gt;paint&lt;/code&gt;, &lt;code&gt;plasma&lt;/code&gt;, &lt;code&gt;temple&lt;/code&gt; and the boot display use the package too.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Windows sit on the grid of 8 pixels&lt;/strong&gt;: a new window, and a window that the person moves, has its corner on the grid.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;The terminal showed rows of two frames: with two pictures, a frame presented only its difference with its own picture, and the screen showed the other one.&lt;/li&gt;&lt;li&gt;A card cuts its caption to the room between its title and its count, and the boot display cuts a fact after its last whole word.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.60.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-60-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-60-0"/>
<published>2026-11-11T00:00:00Z</published>
<updated>2026-11-11T00:00:00Z</updated>
<summary>Each program has a random generator: ChaCha20 with fast key erasure, in the memory of the program. A draw makes no kernel entry and no call. The starter of a program writes its seed of 32 bytes in the context values 9 to 12, and a start with a seed of zeros is refused.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Each program has a random generator&lt;/strong&gt;: ChaCha20 with fast key erasure, in the memory of the program. A draw makes no kernel entry and no call. The starter of a program writes its seed of 32 bytes in the context values 9 to 12, and a start with a seed of zeros is refused.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The seed of the system&lt;/strong&gt;: the root service gathers it at its start from &lt;code&gt;rdseed&lt;/code&gt;, &lt;code&gt;rdrand&lt;/code&gt; and samples of the cycle counter, mixed with BLAKE3, and logs its strength: &amp;quot;entropy&amp;quot;, &amp;quot;processor&amp;quot; or &amp;quot;weak&amp;quot;. A machine with neither instruction starts and says &amp;quot;weak&amp;quot;. The program &lt;code&gt;randomness&lt;/code&gt; shows these facts.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;ChaCha20 from &lt;code&gt;core:crypto&lt;/code&gt; of Odin&lt;/strong&gt;, copied into &lt;code&gt;support/cryptography&lt;/code&gt; with only its imports changed. &lt;code&gt;kerneltool cryptography-origin&lt;/code&gt;, which the check runs, proves that each copied file is its origin, pinned by its hash, with the listed changes only.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.59.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-59-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-59-0"/>
<published>2026-11-11T00:00:00Z</published>
<updated>2026-11-11T00:00:00Z</updated>
<summary>kerneltool repeat all &lt;count&gt; builds every module and the boot program again and again, and gives one row for each: the count of distinct modules, LLVM IR files and objects. kerneltool check and kerneltool repeat keep each distinct result beside the first one.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;kerneltool repeat all &amp;lt;count&amp;gt;&lt;/code&gt; builds every module and the boot program again and again, and gives one row for each: the count of distinct modules, LLVM IR files and objects. &lt;code&gt;kerneltool check&lt;/code&gt; and &lt;code&gt;kerneltool repeat&lt;/code&gt; keep each distinct result beside the first one.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;The rewrite of the LLVM IR of 0.53.0, which fixed the names of static variables, is removed: the cause is corrected.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;One source gives one module&lt;/strong&gt;: the Odin compiler started one worker thread beside its main thread also with &lt;code&gt;-thread-count:1&lt;/code&gt;, and the two threads changed the order of the declarations. A module could differ from one build to the next (&lt;code&gt;host&lt;/code&gt; in 1 build of 12 to 39, &lt;code&gt;console&lt;/code&gt; with 3 distinct LLVM IR files in 60 builds). The flake applies a patch of 91 lines to the compiler: with &lt;code&gt;-thread-count:1&lt;/code&gt; the main thread runs each task. &lt;code&gt;kerneltool repeat all 100&lt;/code&gt; gave one module, one LLVM IR file and one object for each of the 61 modules and the boot program.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.58.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-58-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-58-0"/>
<published>2026-11-11T00:00:00Z</published>
<updated>2026-11-11T00:00:00Z</updated>
<summary>A vector font is the text of the system: every window, the console, the terminal and the boot display draw JetBrains Mono (SIL OFL 1.1) with subpixel bands, blended in linear light. The font is monospace on the grid of 8 by 16 pixels, so no window changes its size; the scales 2 and 3 are drawn from the outline.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;A vector font is the text of the system&lt;/strong&gt;: every window, the console, the terminal and the boot display draw JetBrains Mono (SIL OFL 1.1) with subpixel bands, blended in linear light. The font is monospace on the grid of 8 by 16 pixels, so no window changes its size; the scales 2 and 3 are drawn from the outline.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A glyph cache in the boot image&lt;/strong&gt;: the build draws each character 32 to 126 at three scales, in fixed point, into one file of 390 624 bytes. The root service checks its hash once and maps it read-only into each program. One glyph from the cache takes 309 ns, against 35 ns for Spleen 8x16 (in the machine of the test).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The program &lt;code&gt;settings&lt;/code&gt;&lt;/strong&gt;: the person chooses the font (the vector font or Spleen 8x16) and the order of the subpixel bands (&lt;code&gt;rgb&lt;/code&gt;, &lt;code&gt;bgr&lt;/code&gt;, &lt;code&gt;none&lt;/code&gt;), and every window draws again while it runs. &lt;code&gt;settings.set(&amp;quot;font&amp;quot;, ...)&lt;/code&gt; does the same from the console. The setting is not kept across a stop of the machine.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;kerneltool vector_fonts&lt;/code&gt;&lt;/strong&gt; makes ASCII subsets of six candidate fonts (14 to 21 KB each, with their licenses in &lt;code&gt;resources/fonts&lt;/code&gt;) and a picture that compares them.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The default font is the vector font&lt;/strong&gt; (owner, 2026-11-11). Spleen 8x16 is the fallback and a choice of the person. The value 13 of the context of each program with a surface names the settings page.&lt;/li&gt;&lt;li&gt;The rasterizer of the vector font works in fixed point. It replaces the prototype in floating point of 0.51.0.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.57.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-57-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-57-0"/>
<published>2026-11-11T00:00:00Z</published>
<updated>2026-11-11T00:00:00Z</updated>
<summary>A loss of power, tested: the kernel tool serves the data disk over NBD and sees each write and each flush. At a loss of power during the commits of notes, it builds the 306 images that a real disk can hold (72 with a torn write) and opens each one on the host: 227 give the last durable commit, 79 the commit in flight, none a mix. A second machine starts on a hard image, and notes restores its text. kerneltool test power runs it.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;A loss of power, tested&lt;/strong&gt;: the kernel tool serves the data disk over NBD and sees each write and each flush. At a loss of power during the commits of &lt;code&gt;notes&lt;/code&gt;, it builds the 306 images that a real disk can hold (72 with a torn write) and opens each one on the host: 227 give the last durable commit, 79 the commit in flight, none a mix. A second machine starts on a hard image, and &lt;code&gt;notes&lt;/code&gt; restores its text. &lt;code&gt;kerneltool test power&lt;/code&gt; runs it.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Error records in the other calls&lt;/strong&gt;: a ring completion that fails holds an error record (the block, frame, datagram, network control and root rings), and the wrappers &lt;code&gt;display.open&lt;/code&gt;, &lt;code&gt;terminal.open&lt;/code&gt; and &lt;code&gt;system.ring_open&lt;/code&gt; take one. &lt;code&gt;start&lt;/code&gt;, &lt;code&gt;stop&lt;/code&gt;, &lt;code&gt;connect&lt;/code&gt; and &lt;code&gt;revoke&lt;/code&gt; in the console write the cause of a refusal of the root service.&lt;/li&gt;&lt;li&gt;&lt;code&gt;errors&lt;/code&gt; has 25 cases on two pages: one case for each family of calls.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;paint.line&lt;/code&gt;, &lt;code&gt;paint.write&lt;/code&gt; and &lt;code&gt;tally.add&lt;/code&gt; refuse with an error record what they cut or dropped with no word before.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;log.records&lt;/code&gt; (0.47.0) left places of its result empty. It fills each place now, and a long text comes in two rows with a continuation mark.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.56.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-56-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-56-0"/>
<published>2026-11-11T00:00:00Z</published>
<updated>2026-11-11T00:00:00Z</updated>
<summary>server accepts the absolute form of a target, reads HTTP/1.2 as HTTP/1.1, and ignores two empty lines before the request line (RFC 9112). Each answer says X-Content-Type-Options: nosniff, and an answer to HTTP/1.0 with keep-alive says Connection: keep-alive.</summary>
<content type="html">&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;server&lt;/code&gt; accepts the absolute form of a target, reads HTTP/1.2 as HTTP/1.1, and ignores two empty lines before the request line (RFC 9112). Each answer says &lt;code&gt;X-Content-Type-Options: nosniff&lt;/code&gt;, and an answer to HTTP/1.0 with keep-alive says &lt;code&gt;Connection: keep-alive&lt;/code&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;The body of a request that is not &lt;code&gt;/sink&lt;/code&gt; was read as the next request. The server now ends that connection after its answer.&lt;/li&gt;&lt;li&gt;A refused &lt;code&gt;server.put&lt;/code&gt; changed the bytes that the server served, and a refused &lt;code&gt;server.remove&lt;/code&gt; gave 404. Both now ask the store first.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Security&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;One segment held a connection record of &lt;code&gt;server&lt;/code&gt; for ever&lt;/strong&gt;: a whole request and one more byte. 24 such connections from each of two addresses took the 48 records. The bytes left after an answer now start the time limit of the next head: 408 after 10 s.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A &lt;code&gt;server.put&lt;/code&gt; or &lt;code&gt;server.remove&lt;/code&gt; while a remote read that page&lt;/strong&gt; made the server read past the page and stop, or serve mixed bytes. Each page has a generation now, and an answer whose page changed ends with a RST.&lt;/li&gt;&lt;li&gt;A connection that the server had closed had no time limit. The limits now run until its last byte leaves.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.55.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-55-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-55-0"/>
<published>2026-11-11T00:00:00Z</published>
<updated>2026-11-11T00:00:00Z</updated>
<summary>Pointer pictures: the compositor draws the pointer from a theme file, with its hot spot, and chooses the shape from what is under the pointer. A program asks for a shape over its own surface (display.pointer_shape_set). The program pointers shows each shape of a theme.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Pointer pictures&lt;/strong&gt;: the compositor draws the pointer from a theme file, with its hot spot, and chooses the shape from what is under the pointer. A program asks for a shape over its own surface (&lt;code&gt;display.pointer_shape_set&lt;/code&gt;). The program &lt;code&gt;pointers&lt;/code&gt; shows each shape of a theme.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Posy&amp;#39;s Cursor is the default pointer theme.&lt;/strong&gt; The build converts it from an input of the flake; no file of it is in the repository, because its license is CC BY-NC 4.0. The theme of the system, 15 shapes as grids of squares, is the fallback.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Resources of the boot image&lt;/strong&gt;: a file with a name and a hash, which the root service checks and gives read-only to one program. The pointer themes are the first ones.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;kerneltool pointers&lt;/code&gt;&lt;/strong&gt; converts a text manifest (&lt;code&gt;resources/pointers/*.manifest&lt;/code&gt;) and a folder of Xcursor files to a pointer theme file. It reads the Xcursor files as hostile input.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;The log keeps 2047 records (1023 before).&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.54.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-54-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-54-0"/>
<published>2026-11-11T00:00:00Z</published>
<updated>2026-11-11T00:00:00Z</updated>
<summary>Draw records version 2: Folded_Gap, and Picture (the pixels of a picture of the program, with a generation that the damage sees). life draws its board as one picture, and a frame with no change draws nothing.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Draw records version 2: &lt;code&gt;Folded_Gap&lt;/code&gt;, and &lt;code&gt;Picture&lt;/code&gt; (the pixels of a picture of the program, with a generation that the damage sees). &lt;code&gt;life&lt;/code&gt; draws its board as one picture, and a frame with no change draws nothing.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The interface package draws the windows of 19 more programs&lt;/strong&gt;: &lt;code&gt;inspect&lt;/code&gt;, &lt;code&gt;scheduler&lt;/code&gt;, &lt;code&gt;manual&lt;/code&gt;, &lt;code&gt;life&lt;/code&gt;, and &lt;code&gt;locks&lt;/code&gt;, &lt;code&gt;net&lt;/code&gt;, &lt;code&gt;errors&lt;/code&gt;, &lt;code&gt;monitor&lt;/code&gt;, &lt;code&gt;budget&lt;/code&gt;, &lt;code&gt;rights&lt;/code&gt;, &lt;code&gt;origin&lt;/code&gt;, &lt;code&gt;limits&lt;/code&gt;, &lt;code&gt;frames&lt;/code&gt;, &lt;code&gt;imports&lt;/code&gt;, &lt;code&gt;flow&lt;/code&gt;, &lt;code&gt;crowd&lt;/code&gt;, &lt;code&gt;disk&lt;/code&gt;, &lt;code&gt;tally&lt;/code&gt;, &lt;code&gt;notes&lt;/code&gt;. None of them has a direct drawing call left.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;In a text input, Enter after typed characters now activates the text so far, and the keys after Enter in the same frame are not taken.&lt;/li&gt;&lt;li&gt;A frame with more than 16 keys lost the keys after the 16th. They now wait for the next frame.&lt;/li&gt;&lt;li&gt;A &lt;code&gt;Present&lt;/code&gt; of the whole surface from a place of its own damaged the screen past the window. It damages the window only.&lt;/li&gt;&lt;li&gt;The prototype of the vector font wrote a cell outside its row for a vertical edge on the last column.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.53.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-53-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-53-0"/>
<published>2026-11-11T00:00:00Z</published>
<updated>2026-11-11T00:00:00Z</updated>
<summary>A cache of free page frames on each processor: a stack of at most 256 frames under its own lock, so a page on first use takes its frame with no frame lock. With 4 programs that work at once, the waits on the frame lock fell from 303 382 to 405 521 to under 2 000, and pages on first use rose from 4.79 to 6.49 million to 7.3 to 8.1 million in one second (locks, the machine of the test).</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;A cache of free page frames on each processor&lt;/strong&gt;: a stack of at most 256 frames under its own lock, so a page on first use takes its frame with no frame lock. With 4 programs that work at once, the waits on the frame lock fell from 303 382 to 405 521 to under 2 000, and pages on first use rose from 4.79 to 6.49 million to 7.3 to 8.1 million in one second (&lt;code&gt;locks&lt;/code&gt;, the machine of the test).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;kerneltool measure scheduler N&lt;/code&gt;&lt;/strong&gt; runs the program &lt;code&gt;scheduler&lt;/code&gt; alone N times. &lt;code&gt;kerneltool measure without_checks&lt;/code&gt; and &lt;code&gt;kerneltool run without_checks&lt;/code&gt; build the kernel with no check of the lock order and of the sums of the frames.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;The test build checks the sums of the frames at each report; the measure build has none of the checks of the kernel. The checks cost about 30 % of the rate of system reports.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;The name of a static variable changed from one build to the next, so two builds of one source could give two &lt;code&gt;kernel.module&lt;/code&gt; files. It is the same now.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.52.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-52-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-52-0"/>
<published>2026-11-11T00:00:00Z</published>
<updated>2026-11-11T00:00:00Z</updated>
<summary>An HTTP/1.1 server: server keeps connections open, answers pipelined requests in order, answers HEAD, and gives the statuses 400, 404, 405, 408, 413, 414, 431, 501 and 505. Its pages are in its private store: server.put and server.remove change them from the console, for a caller that acts for the person. PUT and DELETE over the network give 405, because the network has no authentication. No TLS, no chunked body, no ranges.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;An HTTP/1.1 server&lt;/strong&gt;: &lt;code&gt;server&lt;/code&gt; keeps connections open, answers pipelined requests in order, answers &lt;code&gt;HEAD&lt;/code&gt;, and gives the statuses 400, 404, 405, 408, 413, 414, 431, 501 and 505. Its pages are in its private store: &lt;code&gt;server.put&lt;/code&gt; and &lt;code&gt;server.remove&lt;/code&gt; change them from the console, for a caller that acts for the person. &lt;code&gt;PUT&lt;/code&gt; and &lt;code&gt;DELETE&lt;/code&gt; over the network give 405, because the network has no authentication. No TLS, no chunked body, no ranges.&lt;/li&gt;&lt;li&gt;&lt;code&gt;web.request_read&lt;/code&gt; reads a request head as hostile input (8192 bytes, 64 fields, 1024 bytes of target at most), with host tests of each bound and of 50 000 damaged heads.&lt;/li&gt;&lt;li&gt;The window of &lt;code&gt;server&lt;/code&gt; has a table of the last requests, and each request has a log record.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;GET /hello&lt;/code&gt; from &lt;code&gt;fetch&lt;/code&gt; took 43 ms: &lt;code&gt;fetch&lt;/code&gt; waited for its own ACK timer of 40 ms. It takes 2.7 ms.&lt;/li&gt;&lt;li&gt;A full command ring lost places in &lt;code&gt;server&lt;/code&gt; and &lt;code&gt;fetch&lt;/code&gt;. A command that the ring does not take now waits for the next pass.&lt;/li&gt;&lt;li&gt;A simultaneous open never ended, and a passive open that a RST ended gave no event.&lt;/li&gt;&lt;li&gt;A SYN to a full table of connections now takes the oldest record in TIME-WAIT at once. With a new connection for each request, &lt;code&gt;server&lt;/code&gt; answers 239 to 250 requests in one second, against 4 before.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Security&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;A listen port could be closed for good&lt;/strong&gt;: any segment admitted its sender, so a bare RST from 64 source ports took the 64 places of the admitted remotes. Now a remote is admitted only on a SYN, when a Receive waits, from an address that can answer. A place with no segment for 60 s serves again.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;32 silent connections from one host filled &lt;code&gt;server&lt;/code&gt;&lt;/strong&gt;: it never freed a connection that made no progress. It now ends one after 10 s, and one address holds at most 24 of its 48 records.&lt;/li&gt;&lt;li&gt;A RST with data was accepted after the cut, zero-window probes never gave up, and a half-open connection held a record for about 243 s. Each is closed; 18 host tests cover the hostile cases, and 15 of them failed before their correction.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.51.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-51-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-51-0"/>
<published>2026-11-11T00:00:00Z</published>
<updated>2026-11-11T00:00:00Z</updated>
<summary>The interface package (support/interface): a program describes each frame as a table of draw records of 40 bytes in its own memory. The damage is the difference of two tables, the layout is one pass on the grid, and Tab, Enter and the arrows reach each element. clock, the window of remote and the launcher use it: clock draws one picture in 12 to 14 us, against 109 us before.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The interface package&lt;/strong&gt; (&lt;code&gt;support/interface&lt;/code&gt;): a program describes each frame as a table of draw records of 40 bytes in its own memory. The damage is the difference of two tables, the layout is one pass on the grid, and Tab, Enter and the arrows reach each element. &lt;code&gt;clock&lt;/code&gt;, the window of &lt;code&gt;remote&lt;/code&gt; and the launcher use it: &lt;code&gt;clock&lt;/code&gt; draws one picture in 12 to 14 us, against 109 us before.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The program &lt;code&gt;interface_elements&lt;/code&gt;&lt;/strong&gt; shows each element of the package live, the draw table of the last frame, and the damage of each frame.&lt;/li&gt;&lt;li&gt;&lt;code&gt;display.present_rectangle&lt;/code&gt;: a program names the part of its surface that changed, and the compositor draws only that part again.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A prototype of a vector font&lt;/strong&gt;, as research: the program &lt;code&gt;vector_glyphs&lt;/code&gt; shows DejaVu Sans Mono at 13, 16 and 32 pixels beside Spleen 8x16, from a reader of a TrueType subset that checks each read.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The close button of a window is a deep red&lt;/strong&gt; (&lt;code&gt;0xB82232&lt;/code&gt;), brighter under the pointer and quiet on a window that is not in front: the color of the concept &amp;quot;stop a program&amp;quot; (owner, 2026-11-11).&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.50.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-50-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-50-0"/>
<published>2026-11-11T00:00:00Z</published>
<updated>2026-11-11T00:00:00Z</updated>
<summary>The developer tool inspect shows one program live: its address space as a band with folded gaps, its mappings with the pages that have a frame, its modules with their hashes, its threads with the fields of the scheduler, the stop report of a stopped program as module + offset, and a hex view of its own memory. It reads no byte of another program. A sample takes 34 to 63 us.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The developer tool &lt;code&gt;inspect&lt;/code&gt;&lt;/strong&gt; shows one program live: its address space as a band with folded gaps, its mappings with the pages that have a frame, its modules with their hashes, its threads with the fields of the scheduler, the stop report of a stopped program as &lt;code&gt;module + offset&lt;/code&gt;, and a hex view of its own memory. It reads no byte of another program. A sample takes 34 to 63 us.&lt;/li&gt;&lt;li&gt;Four reports of the kernel for the right Inspect: &lt;code&gt;Program_Mappings&lt;/code&gt;, &lt;code&gt;Threads&lt;/code&gt;, &lt;code&gt;Stop&lt;/code&gt; and &lt;code&gt;Pages&lt;/code&gt;. The exports &lt;code&gt;inspect.mappings&lt;/code&gt;, &lt;code&gt;inspect.threads&lt;/code&gt; and &lt;code&gt;inspect.modules&lt;/code&gt; give the same facts to &lt;code&gt;kerneltool call&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;&lt;code&gt;errors&lt;/code&gt; keeps its stopped program &lt;code&gt;fault&lt;/code&gt; until the next run of its case, so that a developer tool can show its stop report.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.49.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-49-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-49-0"/>
<published>2026-11-11T00:00:00Z</published>
<updated>2026-11-11T00:00:00Z</updated>
<summary>The system has its own copy and fill of memory (runtime/memory.asm) in every module, in the kernel and in the boot program: copy_bytes_without_overlap, copy_bytes_with_overlap and fill_bytes_with_value, with forms chosen by measure. A copy of 4096 bytes takes 34 ns in the machine, against 1170 ns with the loop of 0.45.0. The first use of a page went from 830 ns to about 700 ns.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The system has its own copy and fill of memory&lt;/strong&gt; (&lt;code&gt;runtime/memory.asm&lt;/code&gt;) in every module, in the kernel and in the boot program: &lt;code&gt;copy_bytes_without_overlap&lt;/code&gt;, &lt;code&gt;copy_bytes_with_overlap&lt;/code&gt; and &lt;code&gt;fill_bytes_with_value&lt;/code&gt;, with forms chosen by measure. A copy of 4096 bytes takes 34 ns in the machine, against 1170 ns with the loop of 0.45.0. The first use of a page went from 830 ns to about 700 ns.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;20 programs take the colors of the design rules from &lt;code&gt;support/graphics&lt;/code&gt;.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.48.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-48-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-48-0"/>
<published>2026-11-11T00:00:00Z</published>
<updated>2026-11-11T00:00:00Z</updated>
<summary>TCP, as a library in the program (support/tcp): an open from each side, reassembly, the retransmission timer of RFC 6298, Reno with NewReno, zero-window probes, the FIN states, RST, and the challenge ACKs of RFC 5961. A connection is one record of 400 bytes in the memory of the program, and one call tcp.step serves a batch.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;TCP, as a library in the program&lt;/strong&gt; (&lt;code&gt;support/tcp&lt;/code&gt;): an open from each side, reassembly, the retransmission timer of RFC 6298, Reno with NewReno, zero-window probes, the FIN states, RST, and the challenge ACKs of RFC 5961. A connection is one record of 400 bytes in the memory of the program, and one call &lt;code&gt;tcp.step&lt;/code&gt; serves a batch.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A segment endpoint&lt;/strong&gt; in the network service, with a client grant (one remote, 64 local ports) or a listen grant (one port, and the remotes that send to it). The network service checks the TCP checksum and the ports of each segment, and keeps no state of a connection.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The programs &lt;code&gt;server&lt;/code&gt; and &lt;code&gt;fetch&lt;/code&gt;&lt;/strong&gt;: a small HTTP server (&lt;code&gt;GET /&lt;/code&gt;, &lt;code&gt;GET /large&lt;/code&gt;, &lt;code&gt;POST /sink&lt;/code&gt;) and a client with eight cases. The TCP of the host fetches 1 MiB from &lt;code&gt;server&lt;/code&gt; through QEMU user networking (libslirp), a stack that this project did not write.&lt;/li&gt;&lt;li&gt;The test runs a TCP client in the kernel tool against &lt;code&gt;server&lt;/code&gt;, with seeded loss, reorder and duplicates. 1 MiB from &lt;code&gt;server&lt;/code&gt; took 52.9 ms in one run, under load.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;The network service is also on the data path of TCP segments (one copy, the IPv4 header, the checksum, the grant). The note of property 5 says so.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.47.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-47-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-47-0"/>
<published>2026-11-11T00:00:00Z</published>
<updated>2026-11-11T00:00:00Z</updated>
<summary>The compositor is a service: compositor.pointer() and compositor.windows() give the place of the pointer, the windows, the focus, the keys, the open menu and the launcher. The kernel tool reads the pointer before each press of the test, and moves it again until it is at the place of the step.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The compositor is a service&lt;/strong&gt;: &lt;code&gt;compositor.pointer()&lt;/code&gt; and &lt;code&gt;compositor.windows()&lt;/code&gt; give the place of the pointer, the windows, the focus, the keys, the open menu and the launcher. The kernel tool reads the pointer before each press of the test, and moves it again until it is at the place of the step.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;log.records(after)&lt;/code&gt;&lt;/strong&gt; gives the log as a table of typed records. The test reads 11 of its checks through it.&lt;/li&gt;&lt;li&gt;&lt;code&gt;monitor.counts()&lt;/code&gt; gives the scheduling strategy and its changes.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;kerneltool call&lt;/code&gt; reads and hashes each module file one time: a call that confirms the place of the pointer takes 0.3 ms, not 3.7 ms.&lt;/li&gt;&lt;li&gt;&lt;code&gt;monitor&lt;/code&gt; writes no log line for each call, and &lt;code&gt;remote&lt;/code&gt; writes one sentence for a refusal.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.46.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-46-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-46-0"/>
<published>2026-11-11T00:00:00Z</published>
<updated>2026-11-11T00:00:00Z</updated>
<summary>Three scheduling strategies behind one interface of six functions: round robin, fair (the idea of CFS: a virtual time and weights) and EEVDF. A program with the right Schedule changes the strategy while the machine runs (Strategy_Set, operation 27).</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Three scheduling strategies&lt;/strong&gt; behind one interface of six functions: round robin, fair (the idea of CFS: a virtual time and weights) and EEVDF. A program with the right &lt;code&gt;Schedule&lt;/code&gt; changes the strategy while the machine runs (&lt;code&gt;Strategy_Set&lt;/code&gt;, operation 27).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Wake preemption&lt;/strong&gt;, also on another processor: a woken thread no longer waits for the end of a slice of 10 ms when each processor is busy.&lt;/li&gt;&lt;li&gt;A thread has a weight and a request, given at &lt;code&gt;Thread_Create&lt;/code&gt;. A program can only lower its weight.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The program &lt;code&gt;scheduler&lt;/code&gt;&lt;/strong&gt; measures four cases under each strategy and changes the strategy 100 times under load. Two threads that wake each other beside a spinner on each processor: round robin 80 to 84, fair 461 732 to 498 800, EEVDF 313 601 to 332 954 wakes in one second (three runs, while other tests ran on the host).&lt;/li&gt;&lt;li&gt;&lt;code&gt;docs/SCHEDULING.md&lt;/code&gt;: the research note on CFS, EEVDF and &lt;code&gt;sched_ext&lt;/code&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;EEVDF is the strategy at boot.&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;The machine handle has one more right, &lt;code&gt;Schedule&lt;/code&gt;. The kernel has 27 operations.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.45.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-45-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-45-0"/>
<published>2026-11-11T00:00:00Z</published>
<updated>2026-11-11T00:00:00Z</updated>
<summary>The launcher: the left Super key opens a panel, each typed key narrows the list of programs, the arrows move the choice, Enter starts the program, and Escape closes it.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The launcher&lt;/strong&gt;: the left Super key opens a panel, each typed key narrows the list of programs, the arrows move the choice, Enter starts the program, and Escape closes it.&lt;/li&gt;&lt;li&gt;The title bar of the window in front goes from the blue &lt;code&gt;0x3F7CC4&lt;/code&gt; to a darker blue at its right.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The desktop follows the design rules&lt;/strong&gt;: the bar, the menus as cards, the window frame, the pointer and the background are rectangles on the grid, in the colors of one table (&lt;code&gt;support/graphics/rules.odin&lt;/code&gt;). The close button is no longer red, because red means &amp;quot;failed&amp;quot; in the rules.&lt;/li&gt;&lt;li&gt;&lt;code&gt;support/launcher&lt;/code&gt; is now &lt;code&gt;support/bar&lt;/code&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;graphics.copy&lt;/code&gt; called the &lt;code&gt;memcpy&lt;/code&gt; of the freestanding Odin runtime, which copies one byte at a time. A full frame with 15 windows took 26.6 ms; it takes 2.1 ms.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.44.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-44-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-44-0"/>
<published>2026-11-11T00:00:00Z</published>
<updated>2026-11-11T00:00:00Z</updated>
<summary>A call from the host: kerneltool call &quot;monitor.programs()&quot; calls an export of a service of the machine that kerneltool run started, and prints the typed result. The program remote relays the call to the services that its grant names (manual, monitor, storage), and refuses a call for another module hash. The calls go over UDP with no authentication: while remote runs, a program of the host that sends to its port acts for the person.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;A call from the host&lt;/strong&gt;: &lt;code&gt;kerneltool call &amp;quot;monitor.programs()&amp;quot;&lt;/code&gt; calls an export of a service of the machine that &lt;code&gt;kerneltool run&lt;/code&gt; started, and prints the typed result. The program &lt;code&gt;remote&lt;/code&gt; relays the call to the services that its grant names (&lt;code&gt;manual&lt;/code&gt;, &lt;code&gt;monitor&lt;/code&gt;, &lt;code&gt;storage&lt;/code&gt;), and refuses a call for another module hash. The calls go over UDP with no authentication: while &lt;code&gt;remote&lt;/code&gt; runs, a program of the host that sends to its port acts for the person.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;monitor&lt;/code&gt; is a service&lt;/strong&gt;: &lt;code&gt;programs()&lt;/code&gt;, &lt;code&gt;counts()&lt;/code&gt;, &lt;code&gt;count()&lt;/code&gt; and &lt;code&gt;served()&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;The person starts &lt;code&gt;remote&lt;/code&gt; from the menu, and &lt;code&gt;revoke(&amp;quot;remote&amp;quot;, &amp;quot;person&amp;quot;)&lt;/code&gt; cuts its right to act for the person.&lt;/li&gt;&lt;li&gt;The test step &lt;code&gt;Call&lt;/code&gt; checks typed results in place of lines of the log.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.43.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-43-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-43-0"/>
<published>2026-11-11T00:00:00Z</published>
<updated>2026-11-11T00:00:00Z</updated>
<summary>system.nanoseconds() gives a fine time from the cycle counter, with no kernel entry. The time page has the cycle counter at the time 0.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;system.nanoseconds()&lt;/code&gt; gives a fine time from the cycle counter, with no kernel entry. The time page has the cycle counter at the time 0.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;The milliseconds of the time page lost the ticks that came late on a loaded host. They now come from the cycle counter: &lt;code&gt;clock&lt;/code&gt; shows the page 0 to 3 ms behind it.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.42.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-42-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-42-0"/>
<published>2026-11-11T00:00:00Z</published>
<updated>2026-11-11T00:00:00Z</updated>
<summary>Errors that diagnose: a kernel operation that fails gives an error record of 56 bytes in its completion record: the kind, the operation, the number of the argument, its value, the limit, and what the kernel found. An export gives one through its last parameter. There is no global last error, and a call that succeeds runs none of this code.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Errors that diagnose&lt;/strong&gt;: a kernel operation that fails gives an error record of 56 bytes in its completion record: the kind, the operation, the number of the argument, its value, the limit, and what the kernel found. An export gives one through its last parameter. There is no global last error, and a call that succeeds runs none of this code.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A fault gives a stack trace&lt;/strong&gt; from the frame pointers, one line for each frame (&lt;code&gt;module + offset&lt;/code&gt;).&lt;/li&gt;&lt;li&gt;The storage service, the manual and &lt;code&gt;math&lt;/code&gt; give error records, and the console writes each record as a sentence.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The program &lt;code&gt;errors&lt;/code&gt;&lt;/strong&gt;: 19 cases, each one an error made for real, with the sentence of its record.&lt;/li&gt;&lt;li&gt;&lt;code&gt;kerneltool repeat &amp;lt;module&amp;gt; &amp;lt;count&amp;gt;&lt;/code&gt; builds one module again and again and compares each build with the first.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Each module is compiled through LLVM IR and &lt;code&gt;llc&lt;/code&gt;, to keep the frame pointers. A call through a slot takes 4.1 to 4.8 ns, against 3.6 to 3.7 ns before.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.41.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-41-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-41-0"/>
<published>2026-11-10T00:00:00Z</published>
<updated>2026-11-10T00:00:00Z</updated>
<summary>The program locks measures kernel entries, pages on first use and the word wait with 1, 2 and 4 programs that work on their own objects, then stops 120 programs under stress. kerneltool measure runs it with only the desktop. memory() and monitor show the takes and the waits of each kind of lock.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The program &lt;code&gt;locks&lt;/code&gt;&lt;/strong&gt; measures kernel entries, pages on first use and the word wait with 1, 2 and 4 programs that work on their own objects, then stops 120 programs under stress. &lt;code&gt;kerneltool measure&lt;/code&gt; runs it with only the desktop. &lt;code&gt;memory()&lt;/code&gt; and &lt;code&gt;monitor&lt;/code&gt; show the takes and the waits of each kind of lock.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The kernel lock is split by data&lt;/strong&gt;: eight kinds of lock in one order that the kernel checks at each take, a lock for each program, and a run queue for each processor. No kernel entry takes a lock for all the kernel; the control lock serves only the paths that cross programs. With 4 programs at once, kernel entries went from 2.78 to 3.25 million to 6.68 to 7.24 million in one second, and pages on first use from 1.62 to 1.82 million to 3.32 to 3.63 million (three runs, only the desktop).&lt;/li&gt;&lt;li&gt;An idle processor, or one with less load, takes a waiting thread from the queue of another processor.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.40.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-40-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-40-0"/>
<published>2026-11-10T00:00:00Z</published>
<updated>2026-11-10T00:00:00Z</updated>
<summary>The first layer of the network: a frame service drives the virtio network device, and the network service speaks Ethernet, ARP, IPv4, ICMP echo and UDP. A program gets an endpoint whose grant names one remote. The kernel has no network code.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The first layer of the network&lt;/strong&gt;: a frame service drives the virtio network device, and the network service speaks Ethernet, ARP, IPv4, ICMP echo and UDP. A program gets an endpoint whose grant names one remote. The kernel has no network code.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The program &lt;code&gt;net&lt;/code&gt;&lt;/strong&gt; shows ten cases with their answers, and its measures: the round trip of a datagram of 64 bytes in 60 to 88 us at least, and 57 886 to 81 733 datagrams in one second with 64 in flight, 0 lost (ten runs).&lt;/li&gt;&lt;li&gt;A frame from the wire never faults the network service: a malformed frame is a refused row of an endpoint or of the machine, which &lt;code&gt;net&lt;/code&gt; reads with the right Inspect.&lt;/li&gt;&lt;li&gt;&lt;code&gt;revoke(&amp;quot;net&amp;quot;, &amp;quot;network&amp;quot;)&lt;/code&gt; ends the endpoint of a program that runs.&lt;/li&gt;&lt;li&gt;The time page has the frequency of the cycle counter.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.39.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-39-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-39-0"/>
<published>2026-11-10T00:00:00Z</published>
<updated>2026-11-10T00:00:00Z</updated>
<summary>docs/DESIGN.md: the design rules, taken from the boot display. Each thing on the screen is a fact of a record, each form is a rectangle, one color is one concept, one font in three sizes, a grid of 8 pixels.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;docs/DESIGN.md&lt;/code&gt;: the design rules, taken from the boot display. Each thing on the screen is a fact of a record, each form is a rectangle, one color is one concept, one font in three sizes, a grid of 8 pixels.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;A new boot display&lt;/strong&gt;: a path of ten steps of the start, the stages as one tube on a line of time, cards, and a tile for each module of the boot image in the color of its hash. No form has a round corner.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.38.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-38-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-38-0"/>
<published>2026-11-10T00:00:00Z</published>
<updated>2026-11-10T00:00:00Z</updated>
<summary>One build gives one hash: the threads of the compiler changed the order of the functions, and 13 of 48 modules differed between two builds in one folder. The compiler now runs on one thread, and 0 differed in three builds. kerneltool check builds the modules two times and compares them.</summary>
<content type="html">&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;One build gives one hash&lt;/strong&gt;: the threads of the compiler changed the order of the functions, and 13 of 48 modules differed between two builds in one folder. The compiler now runs on one thread, and 0 differed in three builds. &lt;code&gt;kerneltool check&lt;/code&gt; builds the modules two times and compares them.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.37.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-37-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-37-0"/>
<published>2026-11-10T00:00:00Z</published>
<updated>2026-11-10T00:00:00Z</updated>
<summary>The format of the data disk is a contract (contract/store), which the storage service and the kernel tool read.</summary>
<content type="html">&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;The format of the data disk is a contract (&lt;code&gt;contract/store&lt;/code&gt;), which the storage service and the kernel tool read.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;A wrong block under a valid root damages one object, not the storage service.&lt;/strong&gt; Before, it stopped the service for every program. The service takes the root before the newest one when only the newest names a wrong block.&lt;/li&gt;&lt;li&gt;A damaged object is never read as an empty object: &lt;code&gt;size&lt;/code&gt; answers -8, and the client gives the status &lt;code&gt;Damaged&lt;/code&gt;. Before, &lt;code&gt;notes&lt;/code&gt; wrote over its note after a disk error.&lt;/li&gt;&lt;li&gt;A data disk whose first format a stop cut is formatted again. Before, the service refused it for good.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Security&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;A program could change the name of an object in the call region between the check of the storage service and its use. The service now copies the name one time, then checks and uses the copy.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.36.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-36-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-36-0"/>
<published>2026-11-10T00:00:00Z</published>
<updated>2026-11-10T00:00:00Z</updated>
<summary>Functions that give the information of the modules: the manual serves tables of the modules, their exports, their imports, who imports a module, the replacements, and what runs, read from the flat tables and from the module records of the kernel. All 45 modules and their 65 exports take about 150 us. The system has no SQLite.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Functions that give the information of the modules&lt;/strong&gt;: the manual serves tables of the modules, their exports, their imports, who imports a module, the replacements, and what runs, read from the flat tables and from the module records of the kernel. All 45 modules and their 65 exports take about 150 us. The system has no SQLite.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The console combines tables&lt;/strong&gt; with &lt;code&gt;where&lt;/code&gt;, &lt;code&gt;sort&lt;/code&gt;, &lt;code&gt;join&lt;/code&gt; and &lt;code&gt;columns&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;A description can have a Table result, and Text fields of a fixed size in a record.&lt;/li&gt;&lt;li&gt;A malformed module gives a &lt;code&gt;Problem&lt;/code&gt; with its sentence, never a fault.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.35.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-35-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-35-0"/>
<published>2026-11-10T00:00:00Z</published>
<updated>2026-11-10T00:00:00Z</updated>
<summary>The code of an imported module is one copy for all the programs that one starter starts, at any base. The program imports starts two programs that import calendar at two places.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The code of an imported module is one copy&lt;/strong&gt; for all the programs that one starter starts, at any base. The program &lt;code&gt;imports&lt;/code&gt; starts two programs that import &lt;code&gt;calendar&lt;/code&gt; at two places.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.34.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-34-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-34-0"/>
<published>2026-11-10T00:00:00Z</published>
<updated>2026-11-10T00:00:00Z</updated>
<summary>Replacement of an import: after replace(&quot;calendar&quot;, &quot;calendar_fixed&quot;), each next load uses the corrected module in place of the faulty one, and the module that imports it does not change. The loader checks the description of each export that a slot uses, and refuses a module whose description changed.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Replacement of an import&lt;/strong&gt;: after &lt;code&gt;replace(&amp;quot;calendar&amp;quot;, &amp;quot;calendar_fixed&amp;quot;)&lt;/code&gt;, each next load uses the corrected module in place of the faulty one, and the module that imports it does not change. The loader checks the description of each export that a slot uses, and refuses a module whose description changed.&lt;/li&gt;&lt;li&gt;The kernel keeps the module records of each program (&lt;code&gt;Program_Module&lt;/code&gt;, operation 26), and the stop report names the module that ran.&lt;/li&gt;&lt;li&gt;The program &lt;code&gt;imports&lt;/code&gt; shows the loader in its cases: a call through an import slot takes 3.5 ns.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;The kernel has 26 operations.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.33.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-33-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-33-0"/>
<published>2026-11-10T00:00:00Z</published>
<updated>2026-11-10T00:00:00Z</updated>
<summary>A program loads a module with imports: the loader finds each import by its hash in the files that the program was granted, loads each module one time, and binds its slots. The console loads agenda, which imports calendar.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;A program loads a module with imports&lt;/strong&gt;: the loader finds each import by its hash in the files that the program was granted, loads each module one time, and binds its slots. The console loads &lt;code&gt;agenda&lt;/code&gt;, which imports &lt;code&gt;calendar&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;A failed load gives a record with its detail (&lt;code&gt;Load_Error&lt;/code&gt;): the stage, the module, the import, and the hash that the load source does not have.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.32.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-32-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-32-0"/>
<published>2026-11-10T00:00:00Z</published>
<updated>2026-11-10T00:00:00Z</updated>
<summary>A persistent program: notes keeps a note and a count in its private store across a restart of the machine; each key is one commit. The test runs four machines on one data disk: a clean stop, an end of QEMU during 1000 commits, and a cut root block.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;A persistent program&lt;/strong&gt;: &lt;code&gt;notes&lt;/code&gt; keeps a note and a count in its private store across a restart of the machine; each key is one commit. The test runs four machines on one data disk: a clean stop, an end of QEMU during 1000 commits, and a cut root block.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.31.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-31-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-31-0"/>
<published>2026-11-10T00:00:00Z</published>
<updated>2026-11-10T00:00:00Z</updated>
<summary>The storage service: each program has a private store on the data disk, named by the root service, with a limit in blocks. The engine is new: copy on write, two places for the root block, and a check in each pointer.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The storage service&lt;/strong&gt;: each program has a private store on the data disk, named by the root service, with a limit in blocks. The engine is new: copy on write, two places for the root block, and a check in each pointer.&lt;/li&gt;&lt;li&gt;The storage service starts at the first connection. &lt;code&gt;storage.stores()&lt;/code&gt; lists the stores for the person, and &lt;code&gt;revoke(name, &amp;quot;store&amp;quot;)&lt;/code&gt; cuts the grant of a program.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.30.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-30-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-30-0"/>
<published>2026-11-10T00:00:00Z</published>
<updated>2026-11-10T00:00:00Z</updated>
<summary>A block service: a program drives a virtio disk through device memory, a message interrupt, and memory with a physical address. The root service finds the device on the bus and gives it.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;A block service&lt;/strong&gt;: a program drives a virtio disk through device memory, a message interrupt, and memory with a physical address. The root service finds the device on the bus and gives it.&lt;/li&gt;&lt;li&gt;The program &lt;code&gt;disk&lt;/code&gt; measures it: with 32 requests in flight, 165 000 to 300 000 blocks read in one second, with one kernel entry for 10 to 20 requests (two runs).&lt;/li&gt;&lt;li&gt;&lt;code&gt;Memory_Physical&lt;/code&gt; (operation 25) gives the physical address of a memory object to a holder of the right Physical.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;Device_Create&lt;/code&gt; makes device memory and message interrupts. The kernel has 25 operations.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;A Ports handle that a program received while its ports were open on the processor did not open its ports, and the program stopped on a protection fault.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.29.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-29-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-29-0"/>
<published>2026-11-10T00:00:00Z</published>
<updated>2026-11-10T00:00:00Z</updated>
<summary>Shared code: the programs of one module map the same pages of code and constants with no Write, each with its own writable data. Four programs twin use 311 pages in place of 320.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Shared code&lt;/strong&gt;: the programs of one module map the same pages of code and constants with no Write, each with its own writable data. Four programs &lt;code&gt;twin&lt;/code&gt; use 311 pages in place of 320.&lt;/li&gt;&lt;li&gt;The programs &lt;code&gt;frames&lt;/code&gt; and &lt;code&gt;twin&lt;/code&gt; show ten cases of pages on first use and of shared code, each with the answer of the kernel.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.28.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-28-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-28-0"/>
<published>2026-11-10T00:00:00Z</published>
<updated>2026-11-10T00:00:00Z</updated>
<summary>Pages on first use: a memory object reserves its pages in its budget at its creation, and gets each page frame at its first use. There is no overcommit. An object of 8192 pages is ready in 74 us, against 2 560 us with all its frames at once; the first use of a page takes 722 ns.</summary>
<content type="html">&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Pages on first use&lt;/strong&gt;: a memory object reserves its pages in its budget at its creation, and gets each page frame at its first use. There is no overcommit. An object of 8192 pages is ready in 74 us, against 2 560 us with all its frames at once; the first use of a page takes 722 ns.&lt;/li&gt;&lt;li&gt;The frames of a memory object are in a frame list, not contiguous. The reports and &lt;code&gt;memory()&lt;/code&gt; show the reserved pages.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.27.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-27-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-27-0"/>
<published>2026-11-10T00:00:00Z</published>
<updated>2026-11-10T00:00:00Z</updated>
<summary>The menu of the windows in the bar: a press on the title of a window brings it to the front.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The menu of the windows&lt;/strong&gt; in the bar: a press on the title of a window brings it to the front.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;The kernel tool read lines of the log that QEMU had not finished. It was a cause of a machine test that failed sometimes.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.26.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-26-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-26-0"/>
<published>2026-11-10T00:00:00Z</published>
<updated>2026-11-10T00:00:00Z</updated>
<summary>Limits of a budget: a limit of processor time and a limit of log records for each second. The kernel counts processor time with the cycle counter and applies the limit in each period of 100 ms. A limit counts in each budget above.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Limits of a budget&lt;/strong&gt;: a limit of processor time and a limit of log records for each second. The kernel counts processor time with the cycle counter and applies the limit in each period of 100 ms. A limit counts in each budget above.&lt;/li&gt;&lt;li&gt;&lt;code&gt;thread_start&lt;/code&gt; takes a budget. The program &lt;code&gt;limits&lt;/code&gt; runs three threads at 5 %, 20 % and 60 % of one processor.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.25.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-25-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-25-0"/>
<published>2026-11-10T00:00:00Z</published>
<updated>2026-11-10T00:00:00Z</updated>
<summary>Revocation of a grant: the kernel keeps the origin of each handle and each mapping, and Handle_Revoke (operation 24) ends all that came from a handle. A lent handle is revoked after its call.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Revocation of a grant&lt;/strong&gt;: the kernel keeps the origin of each handle and each mapping, and &lt;code&gt;Handle_Revoke&lt;/code&gt; (operation 24) ends all that came from a handle. A lent handle is revoked after its call.&lt;/li&gt;&lt;li&gt;The root service records its grants: &lt;code&gt;grants&lt;/code&gt; and &lt;code&gt;revoke&lt;/code&gt; in the console. The program &lt;code&gt;origin&lt;/code&gt; shows twelve cases.&lt;/li&gt;&lt;li&gt;&lt;code&gt;Handle_Give&lt;/code&gt; with the target 0 copies a handle in the same program.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;The kernel has 24 operations. A lent handle costs its caller 5 kernel entries and 2000 ns (2 entries before).&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;The compositor wrote past its table of windows when it removed a window with 17 programs open, and stopped on a bounds check.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.24.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-24-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-24-0"/>
<published>2026-11-10T00:00:00Z</published>
<updated>2026-11-10T00:00:00Z</updated>
<summary>Records and handles in a description: an export takes a Record (bytes with described fields) and a Handle, which is lent with the rights of the description and ends with its call. The console has Record and Handle values: Rectangle(1, 2, 30, 4), buffer(1), byte(b, 4095).</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Records and handles in a description&lt;/strong&gt;: an export takes a Record (bytes with described fields) and a Handle, which is lent with the rights of the description and ends with its call. The console has Record and Handle values: &lt;code&gt;Rectangle(1, 2, 30, 4)&lt;/code&gt;, &lt;code&gt;buffer(1)&lt;/code&gt;, &lt;code&gt;byte(b, 4095)&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;&lt;code&gt;Handle_State&lt;/code&gt; (operation 23) proves where a handle came from.&lt;/li&gt;&lt;li&gt;The module &lt;code&gt;sample&lt;/code&gt; shows a record and a lent handle in an isolated call.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;The kernel has 23 operations.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.23.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-23-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-23-0"/>
<published>2026-11-10T00:00:00Z</published>
<updated>2026-11-10T00:00:00Z</updated>
<summary>The console runs in a terminal and has no surface. The terminal sends key records to its program, and the program owns its edit line. The root service starts a program and its terminal together.</summary>
<content type="html">&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The console runs in a terminal&lt;/strong&gt; and has no surface. The terminal sends key records to its program, and the program owns its edit line. The root service starts a program and its terminal together.&lt;/li&gt;&lt;li&gt;A terminal draws after a change only.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.22.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-22-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-22-0"/>
<published>2026-11-10T00:00:00Z</published>
<updated>2026-11-10T00:00:00Z</updated>
<summary>The command kerneltool in the development shell.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;The command &lt;code&gt;kerneltool&lt;/code&gt; in the development shell.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Two source libraries&lt;/strong&gt;: &lt;code&gt;contract:&lt;/code&gt; (what two parties agree on; the kernel compiles with it only) and &lt;code&gt;support:&lt;/code&gt; (what a program compiles in). An import names its library; no relative import is left.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.21.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-21-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-21-0"/>
<published>2026-11-10T00:00:00Z</published>
<updated>2026-11-10T00:00:00Z</updated>
<summary>One module in each role: tally runs as a program, as a service, as a library in the console and as a sandboxed program, with the same hash.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;One module in each role&lt;/strong&gt;: &lt;code&gt;tally&lt;/code&gt; runs as a program, as a service, as a library in the console and as a sandboxed program, with the same hash.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A module carries its documentation&lt;/strong&gt;, and the program &lt;code&gt;manual&lt;/code&gt; shows it: the exports, their parameters, and the ways to use the module.&lt;/li&gt;&lt;li&gt;&lt;code&gt;unload&lt;/code&gt; in the console removes a module.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.20.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-20-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-20-0"/>
<published>2026-11-10T00:00:00Z</published>
<updated>2026-11-10T00:00:00Z</updated>
<summary>The time page: the kernel writes the time in one page that each program reads, so system.time() does not enter the kernel. clock reads it 879 to 1 491 million times in one second, against 1.9 to 2.4 million with a kernel entry (four runs).</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The time page&lt;/strong&gt;: the kernel writes the time in one page that each program reads, so &lt;code&gt;system.time()&lt;/code&gt; does not enter the kernel. &lt;code&gt;clock&lt;/code&gt; reads it 879 to 1 491 million times in one second, against 1.9 to 2.4 million with a kernel entry (four runs).&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.19.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-19-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-19-0"/>
<published>2026-11-10T00:00:00Z</published>
<updated>2026-11-10T00:00:00Z</updated>
<summary>A shared queue: several writers and several readers with no lock, and an event that several threads wait on. crowd moves 33.9 million records in one second with 1 writer and 1 reader, with 2 to 6 kernel entries for one million records (alone in the machine).</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;A shared queue&lt;/strong&gt;: several writers and several readers with no lock, and an event that several threads wait on. &lt;code&gt;crowd&lt;/code&gt; moves 33.9 million records in one second with 1 writer and 1 reader, with 2 to 6 kernel entries for one million records (alone in the machine).&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.18.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-18-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-18-0"/>
<published>2026-11-10T00:00:00Z</published>
<updated>2026-11-10T00:00:00Z</updated>
<summary>The terminal: a program sends typed records of text with a style, with no escape sequence. A reader thread and a drawer thread show them, and the display does not slow the program: flood writes 1.7 to 3.0 million lines in one second (five runs).</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The terminal&lt;/strong&gt;: a program sends typed records of text with a style, with no escape sequence. A reader thread and a drawer thread show them, and the display does not slow the program: &lt;code&gt;flood&lt;/code&gt; writes 1.7 to 3.0 million lines in one second (five runs).&lt;/li&gt;&lt;li&gt;A surface can have two pictures.&lt;/li&gt;&lt;li&gt;&lt;code&gt;kerneltool film&lt;/code&gt; films the terminal.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;A ring of 0.17.0 could lose a wake.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.17.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-17-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-17-0"/>
<published>2026-11-10T00:00:00Z</published>
<updated>2026-11-10T00:00:00Z</updated>
<summary>A ring has a capacity, chosen at its creation: one wake serves many records, and wait_spin spins a short time before it waits. flow moves 29.8 million records in one second with a capacity of 1024 and wait_spin, with 56 kernel entries for one million records (one run).</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;A ring has a capacity, chosen at its creation&lt;/strong&gt;: one wake serves many records, and &lt;code&gt;wait_spin&lt;/code&gt; spins a short time before it waits. &lt;code&gt;flow&lt;/code&gt; moves 29.8 million records in one second with a capacity of 1024 and &lt;code&gt;wait_spin&lt;/code&gt;, with 56 kernel entries for one million records (one run).&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;A full ring slows its writer to the speed of its reader: a ring does not grow.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.16.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-16-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-16-0"/>
<published>2026-11-10T00:00:00Z</published>
<updated>2026-11-10T00:00:00Z</updated>
<summary>A program that runs serves its own exports: connect(&quot;paint&quot;) in the console, then paint.line(...). The root service makes each connection, and a call has the same description and the same form as the call of a module. paint and life serve exports.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;A program that runs serves its own exports&lt;/strong&gt;: &lt;code&gt;connect(&amp;quot;paint&amp;quot;)&lt;/code&gt; in the console, then &lt;code&gt;paint.line(...)&lt;/code&gt;. The root service makes each connection, and a call has the same description and the same form as the call of a module. &lt;code&gt;paint&lt;/code&gt; and &lt;code&gt;life&lt;/code&gt; serve exports.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.15.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-15-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-15-0"/>
<published>2026-11-10T00:00:00Z</published>
<updated>2026-11-10T00:00:00Z</updated>
<summary>The log is records in channels: each record has a time, a program, a thread, a level, a channel and a text. The kernel is the one writer; a reader maps the records with the right Read. The program log shows them.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The log is records in channels&lt;/strong&gt;: each record has a time, a program, a thread, a level, a channel and a text. The kernel is the one writer; a reader maps the records with the right Read. The program &lt;code&gt;log&lt;/code&gt; shows them.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.14.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-14-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-14-0"/>
<published>2026-11-10T00:00:00Z</published>
<updated>2026-11-10T00:00:00Z</updated>
<summary>The launcher is a menu: one button in the bar opens one line for each program.</summary>
<content type="html">&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The launcher is a menu&lt;/strong&gt;: one button in the bar opens one line for each program.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.13.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-13-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-13-0"/>
<published>2026-11-10T00:00:00Z</published>
<updated>2026-11-10T00:00:00Z</updated>
<summary>Paging protects the kernel from itself: guard pages around each kernel stack, no page writable and executable, the direct map not executable, SMEP and SMAP, and one place where the kernel uses the memory of a program (user_copy).</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Paging protects the kernel from itself&lt;/strong&gt;: guard pages around each kernel stack, no page writable and executable, the direct map not executable, SMEP and SMAP, and one place where the kernel uses the memory of a program (&lt;code&gt;user_copy&lt;/code&gt;).&lt;/li&gt;&lt;li&gt;Six tests of the kernel on itself: each one does a thing that the page tables refuse, and checks the report of the fault. The program &lt;code&gt;pages&lt;/code&gt; shows what the page tables give.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.12.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-12-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-12-0"/>
<published>2026-11-10T00:00:00Z</published>
<updated>2026-11-10T00:00:00Z</updated>
<summary>The boot display: a boot record with the stages of the start, drawn by the boot program, then by the root service, then by the program boot. A start that fails keeps the display, with its cause.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The boot display&lt;/strong&gt;: a boot record with the stages of the start, drawn by the boot program, then by the root service, then by the program &lt;code&gt;boot&lt;/code&gt;. A start that fails keeps the display, with its cause.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.11.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-11-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-11-0"/>
<published>2026-11-10T00:00:00Z</published>
<updated>2026-11-10T00:00:00Z</updated>
<summary>Several processors: the kernel runs on each processor under one kernel lock, with a processor record and a timer for each. processors shows four processors that run one program: a picture takes 404 ms with 1 thread and 148 ms with 4 (one run).</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Several processors&lt;/strong&gt;: the kernel runs on each processor under one kernel lock, with a processor record and a timer for each. &lt;code&gt;processors&lt;/code&gt; shows four processors that run one program: a picture takes 404 ms with 1 thread and 148 ms with 4 (one run).&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.10.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-10-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-10-0"/>
<published>2026-11-10T00:00:00Z</published>
<updated>2026-11-10T00:00:00Z</updated>
<summary>Budgets: no kernel operation creates an object from nothing. A memory object, a program and a thread take a budget handle with the right Spend. Budget_Create and Budget_Read are operations 21 and 22. The program budget shows each page come back.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Budgets&lt;/strong&gt;: no kernel operation creates an object from nothing. A memory object, a program and a thread take a budget handle with the right Spend. &lt;code&gt;Budget_Create&lt;/code&gt; and &lt;code&gt;Budget_Read&lt;/code&gt; are operations 21 and 22. The program &lt;code&gt;budget&lt;/code&gt; shows each page come back.&lt;/li&gt;&lt;li&gt;The log is an object: &lt;code&gt;Log&lt;/code&gt; takes a Log handle with the right Write.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;The kernel has 22 operations.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.9.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-9-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-9-0"/>
<published>2026-11-10T00:00:00Z</published>
<updated>2026-11-10T00:00:00Z</updated>
<summary>Rights on handles: each handle has a set of rights, Handle_Give copies a handle with fewer rights, and an operation without its right gives No_Right. The machine is one object with the rights Inspect, Devices and Stop. In the program rights the kernel does four operations and refuses five.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Rights on handles&lt;/strong&gt;: each handle has a set of rights, &lt;code&gt;Handle_Give&lt;/code&gt; copies a handle with fewer rights, and an operation without its right gives &lt;code&gt;No_Right&lt;/code&gt;. The machine is one object with the rights Inspect, Devices and Stop. In the program &lt;code&gt;rights&lt;/code&gt; the kernel does four operations and refuses five.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.8.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-8-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-8-0"/>
<published>2026-11-10T00:00:00Z</published>
<updated>2026-11-10T00:00:00Z</updated>
<summary>Descriptions come from the source: the kernel tool reads the name of each parameter and the help from the comment of each export, and the test checks them.</summary>
<content type="html">&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Descriptions come from the source&lt;/strong&gt;: the kernel tool reads the name of each parameter and the help from the comment of each export, and the test checks them.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.7.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-7-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-7-0"/>
<published>2026-11-10T00:00:00Z</published>
<updated>2026-11-10T00:00:00Z</updated>
<summary>The console runs a line in a second thread: it keeps the keys during a call, and Escape stops an isolated call.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The console runs a line in a second thread&lt;/strong&gt;: it keeps the keys during a call, and Escape stops an isolated call.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Removed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;The limit of 2000 ms of an isolated call. The person decides with Escape.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.6.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-6-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-6-0"/>
<published>2026-11-10T00:00:00Z</published>
<updated>2026-11-10T00:00:00Z</updated>
<summary>One wait: rings wait on words, and each thread has an event word.</summary>
<content type="html">&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;One wait&lt;/strong&gt;: rings wait on words, and each thread has an event word.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Removed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;The operation &lt;code&gt;Wake(memory)&lt;/code&gt;. The kernel has 20 operations.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.5.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-5-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-5-0"/>
<published>2026-11-10T00:00:00Z</published>
<updated>2026-11-10T00:00:00Z</updated>
<summary>The word wait and a lock: Word_Wait and Word_Wake (operations 19 and 20) on a word in shared memory, and system.Lock as a library over them. workers shows four threads on one number, and one queue of 140 tiles.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The word wait and a lock&lt;/strong&gt;: &lt;code&gt;Word_Wait&lt;/code&gt; and &lt;code&gt;Word_Wake&lt;/code&gt; (operations 19 and 20) on a word in shared memory, and &lt;code&gt;system.Lock&lt;/code&gt; as a library over them. &lt;code&gt;workers&lt;/code&gt; shows four threads on one number, and one queue of 140 tiles.&lt;/li&gt;&lt;li&gt;The kernel tool writes the boot volume itself.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;The kernel has 21 operations.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.4.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-4-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-4-0"/>
<published>2026-11-10T00:00:00Z</published>
<updated>2026-11-10T00:00:00Z</updated>
<summary>Several threads in a program, each with its own kernel ring: Thread_Create, Thread_Stop and Thread_State. threads draws one square from each of five threads.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Several threads in a program&lt;/strong&gt;, each with its own kernel ring: &lt;code&gt;Thread_Create&lt;/code&gt;, &lt;code&gt;Thread_Stop&lt;/code&gt; and &lt;code&gt;Thread_State&lt;/code&gt;. &lt;code&gt;threads&lt;/code&gt; draws one square from each of five threads.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;The kernel has 19 operations.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.3.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-3-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-3-0"/>
<published>2026-11-10T00:00:00Z</published>
<updated>2026-11-10T00:00:00Z</updated>
<summary>Text results: an export writes text into a buffer of the caller and gives a count of bytes.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Text results&lt;/strong&gt;: an export writes text into a buffer of the caller and gives a count of bytes.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.2.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-2-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-2-0"/>
<published>2026-11-10T00:00:00Z</published>
<updated>2026-11-10T00:00:00Z</updated>
<summary>The program rings: six programs pass records through six rings, drawn live from the shared memory. A stopped program takes no record: the records wait in its ring.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The program &lt;code&gt;rings&lt;/code&gt;&lt;/strong&gt;: six programs pass records through six rings, drawn live from the shared memory. A stopped program takes no record: the records wait in its ring.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.1.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-1-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-1-0"/>
<published>2026-11-10T00:00:00Z</published>
<updated>2026-11-10T00:00:00Z</updated>
<summary>The isolated call: isolate(&quot;probe&quot;) in the console runs a module in a call host, a sandboxed program with no handle, and calls its exports through a ring. A module that faults or loops stops alone.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The isolated call&lt;/strong&gt;: &lt;code&gt;isolate(&amp;quot;probe&amp;quot;)&lt;/code&gt; in the console runs a module in a call host, a sandboxed program with no handle, and calls its exports through a ring. A module that faults or loops stops alone.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
<entry>
<title>modus 0.0.0</title>
<id>https://github.com/sachahjkl/kernel/blob/master/CHANGELOG.md#release-0-0-0</id>
<link rel="alternate" type="text/html" href="https://modus.froment.software/releases.html#release-0-0-0"/>
<published>2026-11-10T00:00:00Z</published>
<updated>2026-11-10T00:00:00Z</updated>
<summary>The system boots under QEMU to a desktop: a UEFI boot program loads the kernel module and the boot image. The kernel has one entry point and runs the operations of the kernel ring of each thread (16 operations). The root service starts the other programs in user space and grants their handles.</summary>
<content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The system boots under QEMU to a desktop&lt;/strong&gt;: a UEFI boot program loads the kernel module and the boot image. The kernel has one entry point and runs the operations of the kernel ring of each thread (16 operations). The root service starts the other programs in user space and grants their handles.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The console&lt;/strong&gt;: integers, texts, variables, arithmetic and typed commands. &lt;code&gt;load(&amp;quot;math&amp;quot;)&lt;/code&gt; makes the exports of a module commands.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The desktop&lt;/strong&gt;: the compositor with a bar, a clock, windows, focus, drag and close; it draws only the damaged rectangles. The programs &lt;code&gt;monitor&lt;/code&gt;, &lt;code&gt;plasma&lt;/code&gt;, &lt;code&gt;life&lt;/code&gt;, &lt;code&gt;paint&lt;/code&gt; and &lt;code&gt;temple&lt;/code&gt;; &lt;code&gt;fault&lt;/code&gt; shows that a fault stops one program only.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The module format&lt;/strong&gt;: a module is named by the BLAKE3 hash of its content. The kernel tool converts a linked ELF image to a module, builds the boot image, and tests the machine under QEMU.&lt;/li&gt;&lt;/ul&gt;</content>
</entry>
</feed>
