<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>ukue.com</title>
    <link>https://ukue.com/</link>
    <description>Recent content on ukue.com</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Tue, 06 Oct 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://ukue.com/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>A Job Queue in One SQLite File: ukue 0.1 Lets Small Teams Skip Redis</title>
      <link>https://ukue.com/a-job-queue-in-one-sqlite-file-ukue-0.1-lets-small-teams-skip-redis/</link>
      <pubDate>Tue, 06 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://ukue.com/a-job-queue-in-one-sqlite-file-ukue-0.1-lets-small-teams-skip-redis/</guid>
      <description>&lt;p&gt;Sooner or later every web app needs to do something outside the request. Send the welcome email after the user has seen the page. Resize the photo while they carry on. Retry the webhook when the other side is down. The standard way to do that is a job queue, and the standard way to get a job queue is to run Redis or RabbitMQ next to your app.&lt;/p&gt;&#xA;&lt;p&gt;ukue 0.1 puts the whole queue in one file instead. It&amp;rsquo;s a SQLite database with a documented layout, and it holds every queue, every waiting job, every retry and every job that failed for good. A Go program imports ukue as a library. Everything else uses the one small &lt;code&gt;ukue&lt;/code&gt; binary, which runs a script for each job or serves a small HTTP API.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How the ukue Job Queue Was Tested: 250 Killed Workers, 0 Lost Jobs</title>
      <link>https://ukue.com/how-the-ukue-job-queue-was-tested-250-killed-workers-0-lost-jobs/</link>
      <pubDate>Tue, 06 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://ukue.com/how-the-ukue-job-queue-was-tested-250-killed-workers-0-lost-jobs/</guid>
      <description>&lt;p&gt;A job queue makes one promise above all others: a job that was added runs, even if the machine has a bad day. So the most important tests for ukue don&amp;rsquo;t check the happy path. They kill workers in the middle of their work and look at what&amp;rsquo;s left.&lt;/p&gt;&#xA;&lt;p&gt;The tests run on every change to the code, on Linux and macOS, and the recorded output is published with the code in &lt;a href=&#34;https://github.com/ukue-queue/ukue/tree/main/test/results&#34;&gt;test/results&lt;/a&gt;. The numbers below come from the recorded run, on a two-core cloud machine.&lt;/p&gt;</description>
    </item>
    <item>
      <title>What Is a Job Queue? Background Jobs, Retries and Dead Letters Explained</title>
      <link>https://ukue.com/what-is-a-job-queue-background-jobs-retries-and-dead-letters-explained/</link>
      <pubDate>Tue, 06 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://ukue.com/what-is-a-job-queue-background-jobs-retries-and-dead-letters-explained/</guid>
      <description>&lt;p&gt;A job queue is a to-do list for software. When something has to happen but doesn&amp;rsquo;t have to happen right now, a program writes it on the list and moves on. A separate worker takes items off the list and does them. That&amp;rsquo;s the whole idea, and almost every web app ends up needing it.&lt;/p&gt;&#xA;&lt;p&gt;Take a sign-up form. When a user signs up, the app has to save the account, send a welcome email, and maybe tell the sales team&amp;rsquo;s CRM. Saving the account is quick. Talking to a mail server can take seconds, and it might be down. Making the user stare at a spinner while that happens is a poor trade, so the app saves the account, adds &amp;ldquo;send a welcome email to Dana&amp;rdquo; to a job queue, and shows the next page at once. A worker sends the email a moment later.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why u Stands for Micro: How the ukue Job Queue Got Its Name</title>
      <link>https://ukue.com/why-u-stands-for-micro-how-the-ukue-job-queue-got-its-name/</link>
      <pubDate>Tue, 06 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://ukue.com/why-u-stands-for-micro-how-the-ukue-job-queue-got-its-name/</guid>
      <description>&lt;p&gt;ukue is meant to be read as µkue, a micro queue. Plenty of people will say &amp;ldquo;you-queue&amp;rdquo; instead, and that&amp;rsquo;s fine. But the u isn&amp;rsquo;t an abbreviation of micro. It&amp;rsquo;s a stand-in for the real sign, the Greek letter μ, and the story of how one turned into the other is older than computers.&lt;/p&gt;&#xA;&lt;p&gt;Micro comes from the Greek &lt;em&gt;mikrós&lt;/em&gt;, &amp;ldquo;small&amp;rdquo;, and in Greek that word starts with μ, their letter m. When the metric system gave its prefixes one-letter symbols, the Latin m was already taken by milli, a thousandth. So micro, a millionth, got the Greek m. That&amp;rsquo;s why a microsecond is written µs and a microfarad µF.&lt;/p&gt;</description>
    </item>
    <item>
      <title>About</title>
      <link>https://ukue.com/about/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://ukue.com/about/</guid>
      <description>&lt;p&gt;ukue.com is the home of ukue, read µkue, a micro queue: a job queue that lives in one file. It keeps background jobs, their retries, their start times and the jobs that failed for good in a single SQLite file. A program can embed it as a library, or run the one small &lt;code&gt;ukue&lt;/code&gt; binary when other programs, in any language, need the same queue.&lt;/p&gt;&#xA;&lt;h2 id=&#34;why-it-exists&#34;&gt;Why It Exists&lt;/h2&gt;&#xA;&lt;p&gt;Most apps reach the point where some work has to happen later, or somewhere other than the web request: a welcome email, a resized photo, a webhook that must get through even if the other side is down for an hour. The usual answer is a queue server such as Redis or RabbitMQ. For a small team that&amp;rsquo;s one more service to install, secure, watch, back up and pay for, sometimes only to send a few emails. ukue does the same job with nothing running beside the app.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Contact</title>
      <link>https://ukue.com/contact/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://ukue.com/contact/</guid>
      <description>&lt;p&gt;ukue.com would like to hear from:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Anyone trying ukue 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; A job that ran when it shouldn&amp;rsquo;t have, one that didn&amp;rsquo;t run, an error you didn&amp;rsquo;t expect.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Anyone with an idea&lt;/strong&gt; for something ukue should do, or a language it should have an example for.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Write to &lt;strong&gt;&lt;a href=&#34;mailto:info@ukue.com&#34;&gt;info@ukue.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/ukue-queue/ukue/issues&#34;&gt;GitHub&lt;/a&gt;. It helps to include what &lt;code&gt;ukue version&lt;/code&gt; prints, your operating system, and the steps that show the problem. Please don&amp;rsquo;t send real customer data: a few made-up jobs that show the same thing are enough.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Download ukue</title>
      <link>https://ukue.com/download/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://ukue.com/download/</guid>
      <description>&lt;p&gt;The &lt;code&gt;ukue&lt;/code&gt; command is one file with nothing else to install. Each archive below holds it with its license files. 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/ukue-queue/ukue/releases/latest/download/ukue_linux_amd64.tar.gz&#34;&gt;ukue_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/ukue-queue/ukue/releases/latest/download/ukue_linux_arm64.tar.gz&#34;&gt;ukue_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/ukue-queue/ukue/releases/latest/download/ukue_darwin_arm64.tar.gz&#34;&gt;ukue_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/ukue-queue/ukue/releases/latest/download/ukue_darwin_amd64.tar.gz&#34;&gt;ukue_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/ukue-queue/ukue/releases/latest/download/ukue_windows_amd64.zip&#34;&gt;ukue_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/ukue-queue/ukue/releases/latest/download/SHA256SUMS&#34;&gt;SHA256SUMS&lt;/a&gt;. Every release is listed on &lt;a href=&#34;https://github.com/ukue-queue/ukue/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 ukue_linux_amd64.tar.gz&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo mv ukue /usr/local/bin/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ukue version&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The Linux binaries are static, so they run on any distribution. The macOS binaries aren&amp;rsquo;t signed by Apple, so macOS may block the first run; allow it in System Settings under Privacy &amp;amp; Security, or run &lt;code&gt;xattr -d com.apple.quarantine ukue&lt;/code&gt;. On Windows, unzip the archive and put &lt;code&gt;ukue.exe&lt;/code&gt; in a folder on your PATH.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Quick Start</title>
      <link>https://ukue.com/quick-start/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://ukue.com/quick-start/</guid>
      <description>&lt;p&gt;ukue is a job queue that lives in one file. This page takes you from nothing to jobs running in a few minutes, from the command line, from Go, and from any other language.&lt;/p&gt;&#xA;&lt;h2 id=&#34;1-get-the-ukue-command&#34;&gt;1. Get the ukue Command&lt;/h2&gt;&#xA;&lt;p&gt;Download the archive for your system from &lt;a href=&#34;https://ukue.com/download/&#34;&gt;the download page&lt;/a&gt;, unpack it and put &lt;code&gt;ukue&lt;/code&gt; somewhere on your PATH. Check it works:&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;ukue version&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Go programmers who only want the library can skip this and go to step 4.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The ukue File Format</title>
      <link>https://ukue.com/file-format/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://ukue.com/file-format/</guid>
      <description>&lt;p&gt;A ukue file is an SQLite database with two tables in it. Any program that can write SQLite can add jobs to it, and a program that follows the steps on this page can claim and finish them too, alongside the &lt;code&gt;ukue&lt;/code&gt; command and the Go package. This is version 1 of the format. The complete description, with every SQL statement, is &lt;a href=&#34;https://github.com/ukue-queue/ukue/blob/main/FORMAT.md&#34;&gt;FORMAT.md on GitHub&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;What stays the same.&lt;/strong&gt; The version is stored in the file. Within version 1, later releases may add indexes, settings and columns with default values, but nothing is removed or renamed, and no column changes meaning. A change that older programs couldn&amp;rsquo;t handle safely gets a new version number, and ukue refuses to open a file whose version it doesn&amp;rsquo;t know.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The ukue HTTP API</title>
      <link>https://ukue.com/http-api/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://ukue.com/http-api/</guid>
      <description>&lt;p&gt;&lt;code&gt;ukue serve&lt;/code&gt; puts a ukue file behind a small JSON API, so programs in any language, and on other machines, can add and run jobs. Go programs can mount the same API in their own HTTP server with the &lt;code&gt;server&lt;/code&gt; package.&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;ukue serve jobs.ukue                              &lt;span style=&#34;color:#75715e&#34;&gt;# listens on 127.0.0.1:7660&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;UKUE_TOKEN&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;s3cret ukue serve --addr :7660 jobs.ukue&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;the-basics&#34;&gt;The Basics&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;JSON in and out.&lt;/strong&gt; Errors come back as &lt;code&gt;{&amp;quot;error&amp;quot;: &amp;quot;...&amp;quot;}&lt;/code&gt; with a 4xx or 5xx status.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Token.&lt;/strong&gt; When the server has a token, from &lt;code&gt;UKUE_TOKEN&lt;/code&gt; or &lt;code&gt;--token-file&lt;/code&gt;, every request except &lt;code&gt;/v1/health&lt;/code&gt; must send &lt;code&gt;Authorization: Bearer &amp;lt;token&amp;gt;&lt;/code&gt;. The server won&amp;rsquo;t listen beyond your own machine without a token, unless you start it with &lt;code&gt;--allow-no-token&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Durations&lt;/strong&gt; can be a number of seconds, such as &lt;code&gt;30&lt;/code&gt; or &lt;code&gt;0.5&lt;/code&gt;, or a string such as &lt;code&gt;&amp;quot;90s&amp;quot;&lt;/code&gt; or &lt;code&gt;&amp;quot;1h30m&amp;quot;&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Times&lt;/strong&gt; in answers are in UTC, such as &lt;code&gt;&amp;quot;2026-10-06T09:00:00.000Z&amp;quot;&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Payloads.&lt;/strong&gt; A &lt;code&gt;payload&lt;/code&gt; that is a JSON string is stored as its text, and any other JSON value is stored as compact JSON. Send binary data as &lt;code&gt;payload_base64&lt;/code&gt;. Answers give the payload back as text when it is valid UTF-8, and as &lt;code&gt;payload_base64&lt;/code&gt; otherwise.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Size.&lt;/strong&gt; A request may be up to 1 MiB, unless the server was started with a different &lt;code&gt;--max-body&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;add-a-job&#34;&gt;Add a Job&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;POST /v1/jobs&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
