<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Rukia Labs — Engineering</title>
    <link>https://rukialabs.com/engineering/</link>
    <description>How the platform is built, and what we got wrong on the way.</description>
    <language>en</language>
    <atom:link href="https://rukialabs.com/engineering/rss.xml" rel="self" type="application/rss+xml"/>
    <lastBuildDate>Sat, 12 Sep 2026 00:00:00 GMT</lastBuildDate>
    <item>
      <title>The chat panel nobody opened was costing us 400MB</title>
      <link>https://rukialabs.com/engineering/the-chat-panel-nobody-opened/</link>
      <guid isPermaLink="true">https://rukialabs.com/engineering/the-chat-panel-nobody-opened/</guid>
      <pubDate>Sat, 12 Sep 2026 00:00:00 GMT</pubDate>
      <description>A lesson editor that got slower the longer you typed, and the two causes I did not expect to find.

The lesson editor is where an instructor writes a lesson: a rich text editor for the body, a place for a video link, file attachments, and a preview showing what a student will see. Instructors spend hours in it. It is, more than anything else we ship, the thing our customers actually work in. And for a few months, it had been getting worse.</description>
      <dc:creator>Manasseh Gitau</dc:creator>
      <category>performance</category>
      <category>frontend</category>
    </item>
    <item>
      <title>The browser is not a witness</title>
      <link>https://rukialabs.com/engineering/the-browser-is-not-a-witness/</link>
      <guid isPermaLink="true">https://rukialabs.com/engineering/the-browser-is-not-a-witness/</guid>
      <pubDate>Thu, 10 Sep 2026 00:00:00 GMT</pubDate>
      <description>Two services, built eighteen months apart, both believed whatever the browser told them about which organisation it was.

We found the same hole twice, in two systems written a year and a half apart by people solving unrelated problems. Neither was a subtle cryptographic mistake. Both were the same sentence, written twice: The browser told us which organisation this request is for, and we believed it.</description>
      <dc:creator>Rukia Labs Engineering</dc:creator>
      <category>security</category>
      <category>multi-tenancy</category>
      <category>architecture</category>
    </item>
    <item>
      <title>One documentation site, two front doors</title>
      <link>https://rukialabs.com/engineering/one-docs-two-front-doors/</link>
      <guid isPermaLink="true">https://rukialabs.com/engineering/one-docs-two-front-doors/</guid>
      <pubDate>Sat, 05 Sep 2026 00:00:00 GMT</pubDate>
      <description>These pages are served from two places in two different sets of colours, from a single source.

This site is served at two addresses: Same words, same pages, same build inputs. Only the branding differs — and, less obviously, the path everything is mounted at.</description>
      <dc:creator>Rukia Labs Engineering</dc:creator>
      <category>documentation</category>
      <category>multi-tenancy</category>
      <category>edge</category>
    </item>
    <item>
      <title>The 404 that moved every deploy</title>
      <link>https://rukialabs.com/engineering/the-404-that-moved-every-deploy/</link>
      <guid isPermaLink="true">https://rukialabs.com/engineering/the-404-that-moved-every-deploy/</guid>
      <pubDate>Sat, 29 Aug 2026 00:00:00 GMT</pubDate>
      <description>One button stopped opening its dialog. The next release fixed it and broke a search bar instead.

A bulk-enrolment dialog stopped opening. No error, no spinner, nothing — the button simply did not respond. Everything around it worked. It worked in development. It worked against a local preview of the production build. It worked on a colleague&apos;s machine. Then we shipped a fix for something unrelated, and the dialog came back on its own. The search and filter bar stopped working instead.</description>
      <dc:creator>Rukia Labs Engineering</dc:creator>
      <category>edge</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Four frontends, one address</title>
      <link>https://rukialabs.com/engineering/four-frontends-one-deployment/</link>
      <guid isPermaLink="true">https://rukialabs.com/engineering/four-frontends-one-deployment/</guid>
      <pubDate>Sat, 22 Aug 2026 00:00:00 GMT</pubDate>
      <description>How the learner, instructor and admin consoles share a domain and a session without being one application.

An organisation&apos;s address serves three separate applications: They are three builds, from three directories, with three bundles. They share a domain, a session and a design system, and a person moving between them does not sign in again.</description>
      <dc:creator>Rukia Labs Engineering</dc:creator>
      <category>architecture</category>
      <category>multi-tenancy</category>
    </item>
    <item>
      <title>A dash is not a zero</title>
      <link>https://rukialabs.com/engineering/a-dash-is-not-a-zero/</link>
      <guid isPermaLink="true">https://rukialabs.com/engineering/a-dash-is-not-a-zero/</guid>
      <pubDate>Sat, 08 Aug 2026 00:00:00 GMT</pubDate>
      <description>The same submission showed as 300%, 0% and 12000% in three consoles, and none of those numbers was flagged as unreliable.

A learner scored 120 out of 300 on a project. The admin console showed 300%. The instructor console showed 0%. The student&apos;s own course card showed 12000%. Nobody had written a bug. Every one of those numbers came out of code that was individually reasonable.</description>
      <dc:creator>Rukia Labs Engineering</dc:creator>
      <category>frontend</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Branding that arrives before the JavaScript does</title>
      <link>https://rukialabs.com/engineering/branding-before-the-bundle/</link>
      <guid isPermaLink="true">https://rukialabs.com/engineering/branding-before-the-bundle/</guid>
      <pubDate>Sat, 18 Jul 2026 00:00:00 GMT</pubDate>
      <description>Why every organisation&apos;s colours are correct in the first painted frame, and what it took to get there.

Every organisation on the platform gets its own address and its own branding. The obvious way to build that is to fetch the branding when the app starts. We did, and it was wrong in a way that took a while to name.</description>
      <dc:creator>Rukia Labs Engineering</dc:creator>
      <category>edge</category>
      <category>multi-tenancy</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
