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
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.
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.
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.
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.

public/images/cloud-mass.prompt.txt.Unluminousv0.37.1
A text editor for macOS and Windows, written in Rust — and an IDE an agent can drive.
Open on GitHubUnluminous 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
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.
| Family | Measurement | rust-db | pgvector |
|---|---|---|---|
| Abstention | confident answer rate, no-answer questions | 0.0050 | 1.0000 |
| Filtered | source = jira, recall@10 in filter | 1.000 | 0.3280 |
| Lexical | rare identifiers, MRR | 0.5442 | 0.1357 |
| Multi-source | evidence in two sources, recall@10 | 0.6237 | 0.1923 |
| Hybrid | document identity, nDCG@10 | 0.9756 | 0.8148 |
| Passage | one transposed character, graded nDCG@10 | 0.6794 | 0.3969 |
| Latency | no predicate, p50 | 0.704 ms | 1.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
How anything here gets called finished
- 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.
- 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.
- 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.
- 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.
- 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.
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.

