Black Rainbow Labs

BlackRainbowLabs

Between the two bows a rainbow throws is a band of sky where no light comes back at all. It has a name — Alexander’s band — and it is the part of the picture most software cannot draw: the answer that is not there. We build the two that can.

Primary bow
42.4°
red edge, one internal reflection
Alexander’s band
8.0°
no light returns
Secondary bow
50.4°
red edge, colours reversed
01The band

Two products, one refusal

A rainbow is arithmetic. Light enters a droplet, bends by an amount that depends on its wavelength, reflects off the back and leaves again, and the angle it leaves at has a minimum — which is why the light piles up there and why you see an arc rather than a smear. Do that arithmetic twice and you get the second bow further out, dimmer and inverted. Do it honestly and you also get the gap: a band of sky that both bows step over, where the geometry sends nothing back to you.

The band is not an absence of rainbow. It is a result. Nobody had to decide to leave it dark; it is what the equations return when they are asked a question they have no answer to, and it is visible in every rainbow anyone has ever photographed.

Most software is built the other way round. A search engine returns ten results whether or not ten exist. An editor claims a feature is finished because a menu entry opens a dialog. Both are confident where the honest answer is a dark band, and both failures are invisible, because a wrong answer and a right one arrive in the same shape.

Black Rainbow Labs builds the two exceptions, and neither of them asks to be trusted about it.

Every wavelength is asked where its own two bows land, and contributes here only in proportion to how close one of them is. Nothing special happens between 42.4° and 50.4° — it comes out black because no wavelength puts anything there. The band was named by Alexander of Aphrodisias, c. 200 AD.
  1. The claim is machine-checkable or it is not made

    Unluminous’s contract — that everything a person can reach an agent can reach too — is not a promise in a README. Three tests fail the day it stops being true, one of them for documentation that has drifted.

  2. A verdict is a statistic, not a bigger number

    rust-db is graded on one primary measurement per family, decided by a 95% paired bootstrap interval and a paired randomisation test against a threshold declared before the run. Everything else is printed and never votes.

  3. Nothing is fetched at run time

    Both are Rust, both run in the process that called them, and neither reaches the network to do its job. Unluminous bundles SQLite’s own C, so its board is one file with no server and no port.

A single storm cloud photographed from a great distance at dusk, its interior lit from behind
The droplets that make a bow are the ones in a cloud like this. Rendered on this machine with Krea 2; the prompt is in public/images/cloud-mass.prompt.txt.
02Unluminous

Unluminousv0.37.1

A text editor for macOS and Windows, written in Rust — and an IDE an agent can drive.

Open on GitHub

Unluminous opens any file holding text. It has a file explorer whose folders expand in place, a terminal along the bottom with tabs, line numbers, a tab per open file, git in full, five themes taken from the IntelliJ ones, and a background the desktop shows through while the text stays solid.

What makes it an AI-first IDE is a definition rather than a slogan: everything a person can do in that window, an agent can do too, through the Model Context Protocol, and both are held to the same automated tests. Ctrl/Cmd+Shift+O and unluminous_modal open go-to-file are one feature. A breakpoint set by clicking the gutter and one set by unluminous_debug breakpoint add are the same breakpoint.

Three mechanisms keep that true without anybody having to remember it. The command list is built by walking the real menus, so an entry added today is drivable today. Anything with no menu entry is a row in one catalogue file that the CLI parses against and the window dispatches on. And the MCP tools are generated from that same catalogue, so a command is a tool the day it is added — every_command_is_offered_as_a_tool_in_both_shapes fails if one ever is not.

The documentation is a test too: the build fails while a command has no section, while a usage line is out of date, or while a section describes a command that no longer exists.

20.8ms
a drag-selection frame in a large file, down from 818
1.4ms
recolouring a 170 KB file, down from 561
6languages
CSS, HTML, JavaScript, TypeScript, Rust, Mermaid
0fetches
nothing is downloaded at run time, ever
03rust-db

rust-db

An embedded retrieval engine that returns nothing when there is nothing to return.

In development. The repository is not public yet.

rust-db does the job of PostgreSQL with pgvector plus a llama.cpp embedding server over HTTP, in one library that runs inside the calling process. That combination is also the baseline it is graded against — configured properly, not left on its defaults, because beating an unconfigured extension proves nothing.

Storage with dictionary-encoded filter columns, cosine over normalised vectors, an HNSW graph whose traversal honours a predicate, int8 scalar quantisation, an inverted index with BM25 that weights a hit by how much of the query it holds and how tightly those terms sit together, three fusion methods, and persistence. It links no database client.

On a corpus of 186,827 chunks and 2,613 queries in nine families: 17 primary comparisons — 15 better, 1 equivalent, 1 inconclusive, 0 worse, and every correctness gate passing. The one comparison it declines to call a win is a 0.9960 to 0.9760 lead whose interval touches zero on 25 queries.

Since task-1782 the repository also holds the beginning of a second, separate engine: a first-party SQL database aiming at SQLite file-format and behaviour parity. It shares nothing with the retrieval engine and does not change it.

Measured against a correctly configured pgvector

One primary measurement per family, decided by a 95% paired bootstrap interval and a paired randomisation test against a threshold declared before the run — 0.01 on the ranking measures, five per cent on latency. Every other figure is a diagnostic and does not vote.

FamilyMeasurementrust-dbpgvector
Abstentionconfident answer rate, no-answer questions0.00501.0000
Filteredsource = jira, recall@10 in filter1.0000.3280
Lexicalrare identifiers, MRR0.54420.1357
Multi-sourceevidence in two sources, recall@100.62370.1923
Hybriddocument identity, nDCG@100.97560.8148
Passageone transposed character, graded nDCG@100.67940.3969
Latencyno predicate, p500.704 ms1.519 ms
17comparisons
15 better · 1 equivalent · 1 inconclusive · 0 worse
2,613queries
in nine families, over 186,827 chunks
0.704ms
p50 with no predicate, against 1.519
55settings
swept in 31 s, against 1 m 19 s for one graded run
04Method

How anything here gets called finished

  1. 01

    A number with no line behind it is not a number

    Every figure on this page traces to a file: Unluminous’s to its README and Cargo manifest, rust-db’s to its scorecard. Nothing was recalled, and nothing was rounded to look better.

  2. 02

    The threshold is declared before the run

    With enough queries every difference eventually becomes detectable, including differences far too small to matter. So the practical threshold is fixed first and a lead that does not clear it is reported as inconclusive rather than as a win.

  3. 03

    A diagnostic never votes

    Counting every metric turns one behaviour into four wins, and scoring rows-returned higher-is-better makes fifty irrelevant chunks beat ten useful ones. Both happened. One primary measurement per family replaced them.

  4. 04

    Documentation that has drifted is a failing test

    Unluminous’s build fails while a command has no documentation section, while a usage line is stale, or while a section describes a command that no longer exists. Prose rots faster than code; this is the only way found to notice.

  5. 05

    Rust, and nothing at run time

    Both products run inside the process that called them and neither reaches the network to do its job. No daemon to keep alive, no port to secure, no version skew between a client and a server.

05Contact

Black Rainbow Labs

An independent software lab. Unluminous is open on GitHub and ships an installer for Windows and macOS; rust-db is in development and not public yet. Issues and questions go to the Unluminous repository.

The field behind this page is not a picture of a rainbow. Every point is a droplet carrying one wavelength, and its brightness is computed each frame from the Descartes minimum-deviation angle for water’s refractive index at that wavelength — so the bows land where the arithmetic puts them and the band between them is dark because nothing puts light there. Open it with ?bowDebug=1 to read the angles back. Type is Nippo, General Sans and Azeret Mono, all self-hosted; there are no third-party requests, no analytics and no cookies.