<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Inorderly.com</title>
    <link>https://inorderly.com/</link>
    <description>Recent content on Inorderly.com</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Sun, 18 Oct 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://inorderly.com/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>How Inorderly Was Tested With Shuffled Arrivals and Killed Runs</title>
      <link>https://inorderly.com/how-inorderly-was-tested-with-shuffled-arrivals-and-killed-runs/</link>
      <pubDate>Sun, 18 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://inorderly.com/how-inorderly-was-tested-with-shuffled-arrivals-and-killed-runs/</guid>
      <description>&lt;p&gt;Inorderly makes one promise above the rest: the same events give the same output, byte for byte, however they arrived. That&amp;rsquo;s an easy thing to say and an easy thing to get slightly wrong, so most of the tests do nothing but try to break it. They shuffle events, repeat them, cut the stream with snapshots, and kill the process in the middle of a run.&lt;/p&gt;&#xA;&lt;p&gt;Every result below comes from the files in &lt;a href=&#34;https://github.com/inorderly/inorderly/tree/main/test/results&#34;&gt;test/results&lt;/a&gt;, recorded from version 0.1.1 on a two-core 2.1 GHz Xeon cloud machine running Linux, with Go 1.24. The same tests run on every push, on Linux, macOS and Windows.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Inorderly 0.1 Turns Late, Duplicate and Out of Order Events Into One Repeatable Sequence</title>
      <link>https://inorderly.com/inorderly-0.1-turns-late-duplicate-and-out-of-order-events-into-one-repeatable-sequence/</link>
      <pubDate>Sun, 18 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://inorderly.com/inorderly-0.1-turns-late-duplicate-and-out-of-order-events-into-one-repeatable-sequence/</guid>
      <description>&lt;p&gt;Events don&amp;rsquo;t arrive the way they happened. A webhook gets retried and the same order turns up twice. A payment service&amp;rsquo;s clock runs behind the checkout&amp;rsquo;s, so the payment looks older than the order it pays for. A price feed delivers tick 88 before tick 87. Every pipeline that takes events from more than one place has some code to deal with this, and that code usually gives a slightly different answer each time it runs.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Making a Ledger, a Billing System and an Audit Agree on Every Balance</title>
      <link>https://inorderly.com/making-a-ledger-a-billing-system-and-an-audit-agree-on-every-balance/</link>
      <pubDate>Sun, 18 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://inorderly.com/making-a-ledger-a-billing-system-and-an-audit-agree-on-every-balance/</guid>
      <description>&lt;p&gt;Two systems that read the same events should end up in the same state. They often don&amp;rsquo;t, and the reason is rarely the code. It&amp;rsquo;s the order. A withdrawal that comes before a deposit gets declined; the same withdrawal after it goes through. If the ledger and billing see those two in a different order, they disagree on the balance, and both are right about what they saw.&lt;/p&gt;&#xA;&lt;p&gt;This worked example has four branches and 300 accounts. Over four hours they produce 100,929 transactions: deposits, withdrawals that are declined when the balance is short, and 929 reversals that undo an earlier transaction and name it as their parent. The branches&amp;rsquo; clocks are up to 0.8 seconds apart, so 77 reversals are stamped before the transaction they undo. The ledger and billing each get the transactions through their own queue, with their own delays. Later an auditor replays the four branch logs. Those were exported at least once, so 2,510 of their lines are there twice.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Merging Two Lossy Market Data Feeds Into One Tick Stream With Exact Gaps</title>
      <link>https://inorderly.com/merging-two-lossy-market-data-feeds-into-one-tick-stream-with-exact-gaps/</link>
      <pubDate>Sun, 18 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://inorderly.com/merging-two-lossy-market-data-feeds-into-one-tick-stream-with-exact-gaps/</guid>
      <description>&lt;p&gt;Exchanges send market data twice, over two lines usually called A and B. Each line drops a packet now and then, and rarely the same one. Take both, keep the first copy of each tick, and you get a fuller feed than either line alone. That&amp;rsquo;s the theory. The merge code is where it gets awkward.&lt;/p&gt;&#xA;&lt;p&gt;This worked example sends 150,000 ticks for three symbols over two lines. Each line loses about 2% of its ticks at random. Line A also goes quiet for four seconds and line B for three, at different times. Line B runs a few milliseconds behind A. In the end 143,458 ticks came on both lines, and 84 came on neither.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Ordering Retried Webhooks So Payments Never Come Before Their Orders</title>
      <link>https://inorderly.com/ordering-retried-webhooks-so-payments-never-come-before-their-orders/</link>
      <pubDate>Sun, 18 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://inorderly.com/ordering-retried-webhooks-so-payments-never-come-before-their-orders/</guid>
      <description>&lt;p&gt;A shop takes its events as webhooks. Checkout sends the order. Payments sends the payment, and later a refund if there is one. The warehouse sends the shipment. Three services, three clocks, one provider in the middle that retries any delivery it isn&amp;rsquo;t sure about.&lt;/p&gt;&#xA;&lt;p&gt;This worked example runs 20,000 orders through that setup. Every order gets a payment that names the order as its parent, and then either a shipment or, for about one order in twelve, a refund. The payments service&amp;rsquo;s clock runs up to a second and a half behind checkout&amp;rsquo;s, which is plenty: 3,487 payments are stamped before the order they pay for. The provider retries about 15% of deliveries, some of them twice, up to a minute and a half later. The same 60,000 events are then delivered three times, each time with different network delays and different retries.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Ordering Sensor Telemetry From Devices With Bad Clocks and Late Uploads</title>
      <link>https://inorderly.com/ordering-sensor-telemetry-from-devices-with-bad-clocks-and-late-uploads/</link>
      <pubDate>Sun, 18 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://inorderly.com/ordering-sensor-telemetry-from-devices-with-bad-clocks-and-late-uploads/</guid>
      <description>&lt;p&gt;Sensors are the worst-behaved producers there are. Their clocks drift. Some sit behind a gateway that forwards readings in batches. Some lose their connection for a while, keep what they measured, and send it all at once when they&amp;rsquo;re back. A few readings just never arrive.&lt;/p&gt;&#xA;&lt;p&gt;This worked example has 200 devices sending a temperature reading every 10 seconds for three hours, 216,000 readings in all. Their clocks are up to 3 seconds out. Fifty of them sit behind five gateways that forward every 45 to 90 seconds. Twenty go offline for 2 to 12 minutes and ten for 25 to 40 minutes. 634 readings are lost on the way. Each reading carries its device&amp;rsquo;s sequence number. The readings are uploaded three times, with different network delays and gateway timing each time.&lt;/p&gt;</description>
    </item>
    <item>
      <title>What Is Deterministic Event Ordering and Why a Replay Should Give the Same Answer</title>
      <link>https://inorderly.com/what-is-deterministic-event-ordering-and-why-a-replay-should-give-the-same-answer/</link>
      <pubDate>Sun, 18 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://inorderly.com/what-is-deterministic-event-ordering-and-why-a-replay-should-give-the-same-answer/</guid>
      <description>&lt;p&gt;Deterministic event ordering means that the same set of events always comes out in the same sequence, no matter the order they arrived in or how many times each one arrived. Feed the events in once and you get a sequence. Feed them in again next week, shuffled, with half of them sent twice, and you get the same sequence, byte for byte.&lt;/p&gt;&#xA;&lt;p&gt;That sounds like it should be the default. It almost never is. Most systems process events in arrival order, and arrival order is an accident of networks, retries and clocks.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Where the Name Inorderly Comes From</title>
      <link>https://inorderly.com/where-the-name-inorderly-comes-from/</link>
      <pubDate>Sun, 18 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://inorderly.com/where-the-name-inorderly-comes-from/</guid>
      <description>&lt;p&gt;Inorderly is two phrases run together. &amp;ldquo;In order&amp;rdquo; is the job: events lined up one after another, the way they should be. &amp;ldquo;Orderly&amp;rdquo; is the manner: calm, tidy, no surprises. Put them side by side and you get a word that describes what the engine does and how it behaves while doing it.&lt;/p&gt;&#xA;&lt;p&gt;It also reads as a small joke. Events show up out of order, and they leave in order. The name sits right in the middle of that.&lt;/p&gt;</description>
    </item>
    <item>
      <title>About</title>
      <link>https://inorderly.com/about/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://inorderly.com/about/</guid>
      <description>&lt;p&gt;inorderly.com is the home of Inorderly, a small Go engine for deterministic event ordering. It takes events that arrive late, twice or out of order and releases them as one sequence. Give it the same events again, in any order and with any repeats, and it writes the same sequence, byte for byte.&lt;/p&gt;&#xA;&lt;h2 id=&#34;why-it-exists&#34;&gt;Why It Exists&lt;/h2&gt;&#xA;&lt;p&gt;Events rarely arrive the way they happened. A webhook provider retries, so an order shows up twice. Two services stamp events with clocks that disagree, so a payment looks older than the order it pays for. A feed handler sees tick 88 before tick 87. Most teams patch this with a dedupe table, a sort buffer and a timeout, and the patch mostly works.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Contact</title>
      <link>https://inorderly.com/contact/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://inorderly.com/contact/</guid>
      <description>&lt;p&gt;inorderly.com would like to hear from:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Anyone trying Inorderly out.&lt;/strong&gt; What worked, what got in the way, and what you used before.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Anyone who found a bug.&lt;/strong&gt; Above all, two runs over the same events that gave different output.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Anyone with an idea&lt;/strong&gt; for something Inorderly should do next.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Write to &lt;strong&gt;&lt;a href=&#34;mailto:info@inorderly.com&#34;&gt;info@inorderly.com&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Bug reports are also welcome on &lt;a href=&#34;https://github.com/inorderly/inorderly/issues&#34;&gt;GitHub&lt;/a&gt;. It helps to include what &lt;code&gt;inorderly version&lt;/code&gt; prints, your operating system, the flags you used, and a few made-up events that show the problem. Please don&amp;rsquo;t send real customer data.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Download Inorderly</title>
      <link>https://inorderly.com/download/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://inorderly.com/download/</guid>
      <description>&lt;p&gt;Each archive below holds the &lt;code&gt;inorderly&lt;/code&gt; command with the license files and README. There&amp;rsquo;s nothing else to install. The links always point to the latest release.&lt;/p&gt;&#xA;&lt;div style=&#34;overflow-x:auto&#34;&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;System&lt;/th&gt;&#xA;          &lt;th&gt;Download&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Linux, x86-64&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://github.com/inorderly/inorderly/releases/latest/download/inorderly_linux_amd64.tar.gz&#34;&gt;inorderly_linux_amd64.tar.gz&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Linux, ARM64&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://github.com/inorderly/inorderly/releases/latest/download/inorderly_linux_arm64.tar.gz&#34;&gt;inorderly_linux_arm64.tar.gz&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;macOS, Apple silicon&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://github.com/inorderly/inorderly/releases/latest/download/inorderly_darwin_arm64.tar.gz&#34;&gt;inorderly_darwin_arm64.tar.gz&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;macOS, Intel&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://github.com/inorderly/inorderly/releases/latest/download/inorderly_darwin_amd64.tar.gz&#34;&gt;inorderly_darwin_amd64.tar.gz&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Windows, x86-64&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://github.com/inorderly/inorderly/releases/latest/download/inorderly_windows_amd64.zip&#34;&gt;inorderly_windows_amd64.zip&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;&lt;em&gt;Checksums are in &lt;a href=&#34;https://github.com/inorderly/inorderly/releases/latest/download/SHA256SUMS&#34;&gt;SHA256SUMS&lt;/a&gt;. Every release is listed on &lt;a href=&#34;https://github.com/inorderly/inorderly/releases&#34;&gt;GitHub&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;install&#34;&gt;Install&lt;/h2&gt;&#xA;&lt;p&gt;On Linux or macOS:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tar -xzf inorderly_linux_amd64.tar.gz&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo mv inorderly /usr/local/bin/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;inorderly version&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The binaries are pure Go and need no system libraries. The macOS ones aren&amp;rsquo;t signed by Apple, and macOS may ask you to allow them the first time. You can also clear the flag yourself:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Quick Start</title>
      <link>https://inorderly.com/quick-start/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://inorderly.com/quick-start/</guid>
      <description>&lt;p&gt;This takes about five minutes. You&amp;rsquo;ll feed the same events to Inorderly in different orders, with repeats, and see the same output and the same hash come back every time. You need the &lt;code&gt;inorderly&lt;/code&gt; command from the &lt;a href=&#34;https://inorderly.com/download/&#34;&gt;download page&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;1-write-some-events&#34;&gt;1. Write Some Events&lt;/h2&gt;&#xA;&lt;p&gt;Inorderly reads one JSON event per line. Save these five lines as &lt;code&gt;events.ndjson&lt;/code&gt;. They&amp;rsquo;re an order, its payment and its shipment from three services, a second order, and the first order again, the way a retried webhook would send it:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Reference</title>
      <link>https://inorderly.com/reference/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://inorderly.com/reference/</guid>
      <description>&lt;p&gt;The command, its files and the Go packages, for Inorderly 0.1. &lt;a href=&#34;https://github.com/inorderly/inorderly/blob/main/docs/CONTRACT.md&#34;&gt;The contract&lt;/a&gt; on GitHub has the exact ordering rules.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-command&#34;&gt;The Command&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;inorderly [flags]           read NDJSON events, write them in order&#xA;inorderly version           print the version as JSON&#xA;inorderly demo [flags]      run the self-checking demo and print its report&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;flags&#34;&gt;Flags&lt;/h3&gt;&#xA;&lt;div style=&#34;overflow-x:auto&#34;&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Flag&lt;/th&gt;&#xA;          &lt;th&gt;Default&lt;/th&gt;&#xA;          &lt;th&gt;Meaning&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;-in FILE&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;standard input&lt;/td&gt;&#xA;          &lt;td&gt;An input file. Repeat it to read several files a line at a time in turn: one line from the first, one from the second, and so on. &lt;code&gt;-&lt;/code&gt; is standard input.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;-out FILE&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;standard output&lt;/td&gt;&#xA;          &lt;td&gt;The ordered output.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;-window N&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;0&lt;/td&gt;&#xA;          &lt;td&gt;How far, in event-time units, an event may arrive behind the newest time seen.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;-hold N&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;the window&lt;/td&gt;&#xA;          &lt;td&gt;How long past its own time an event waits for a parent.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;-remember N&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;0 (always)&lt;/td&gt;&#xA;          &lt;td&gt;How long behind the watermark released events are remembered, for duplicates and parents.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;-rejects FILE&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;none&lt;/td&gt;&#xA;          &lt;td&gt;Late, conflicting and invalid lines, one JSON object each.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;-state DIR&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;none&lt;/td&gt;&#xA;          &lt;td&gt;Checkpoints. A run killed part way carries on from the last checkpoint when started again with the same flags. Needs &lt;code&gt;-in&lt;/code&gt; files and an &lt;code&gt;-out&lt;/code&gt; file.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;-checkpoint-every N&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;10000&lt;/td&gt;&#xA;          &lt;td&gt;Input lines between checkpoints.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;-stats FILE&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;standard error&lt;/td&gt;&#xA;          &lt;td&gt;Where the summary goes.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;-strict&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;off&lt;/td&gt;&#xA;          &lt;td&gt;Exit with status 3 if any line was late, conflicting or invalid.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;h3 id=&#34;input&#34;&gt;Input&lt;/h3&gt;&#xA;&lt;p&gt;One event per line, as JSON. Blank lines are skipped. Lines may end in &lt;code&gt;\n&lt;/code&gt;&#xA;or &lt;code&gt;\r\n&lt;/code&gt;, and the last line needs no line ending. A line longer than 16 MiB&#xA;is invalid. Unknown fields, a missing &lt;code&gt;producer&lt;/code&gt; or &lt;code&gt;time&lt;/code&gt;, a fraction where&#xA;an integer belongs, a key repeated in one &lt;code&gt;data&lt;/code&gt; object, or anything after the&#xA;event on the same line make the line invalid.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
