INBUXA Admin built its own source into every deployment: the whole tree
packed as source.tar.gz next to the app, with an identity string shown
beside the link and in the version tooltip. The top bar menu and the
source link offered that download.
It answered the AGPL precisely -- the source of *this* build, uncommitted
work and all -- but it paid for that by carrying the tree into every
deployment, to a repository that is public and already has it. The
version shown beside the link already names the build, so the link and
the version together say what the archive said.
This is the same change already made to ihasmail-inbuxa, for the same
reason, and it leaves the two forks answering the offer the same way.
It is also what lets INBUXA Admin be built in an Alpine image: the
plugin shelled out to `tar --transform`, which BusyBox tar does not
have, so `npm run build` failed there and nowhere else.
Removed with it: source-archive.ts, the Vite plugin call, __SOURCE_ID__
and sourceDownloadUrl(). The build no longer shells out to git or tar,
and nothing is written next to the app.
The two strings that named the archive change with it: the link now
reads "Source code (<version>), AGPL-3.0" rather than naming a tree id,
and the version tooltip drops the id it appended.
Publishing the source is what asks for it: a modified version has to carry
prominent notices saying it was modified, with a date. These files already
added a Coffey Labs copyright line beside upstream's, which implies as much
without saying it; now they say it.
38 files, found by diffing against the merge base with upstream rather than
by guessing. Upstream's own notices are untouched. The build is unchanged.
- Each option's explanation moves from a line of text under its label to
a small tooltip on an ⓘ beside it, so forms read calmer and the help is
still one hover away.
- Help text is ours where written (src/help/texts.ts: domains, people,
DNS providers, blocked addresses, and the main pages), and the schema's
description elsewhere.
- A "?" on every list and form opens a side panel: what the page is for,
what people usually do there, and every option explained.
- Every tooltip and panel carries a stable help id (x:Domain.dnsManagement,
x:Domain), and manual.ts turns an id into a link to the admin manual
once one is configured (VITE_MANUAL_URL, or <meta name="manual-url">).
Until then no link shows.
- The INBUXA palette on warm surfaces, softer cards, buttons and inputs, and
self-hosted Inter and Space Grotesk.
- Each section's icon sits on a colored tile, colored by what the section is
about.
- The sidebar gets a guide line for sub-pages and a labeled Management /
Settings / Account switch, and folds to a rail of tiles (remembered).
- Every page has a header with its section's tile.
- Fields and pages with no label of their own are spelled out in words
(defaultCertificateId becomes Default certificate ID).
- The dashboard greets you, and its stat cards wear colored tiles.
- Unavailable live numbers are a calm note, not an error.
- The cat appears in empty lists and while loading.
- Chart colors work again: they were hex values wrapped in hsl().
Every build writes the exact tree it was built from, uncommitted work
included, as source.tar.gz next to the app, and names that tree. The sidebar,
user menu, sign-in card and version tooltip link to it.
Coffey Labs' copyright line is added below Stalwart Labs' in every inherited
file changed, and the new files carry Coffey Labs' alone.
The upgrade prompt and its links are gone, the edition tooltip is neutral,
storage keys and the package description are INBUXA's own, and the README
states the lineage once, in the fine print.
- One edition: whatever edition the server reports, nothing is hidden or
disabled as Enterprise-only (accountStore.setAccountInfo).
- INBUXA branding: name, logo (mark plus a text-colored wordmark), favicon,
page titles, setup wizard text, and ihasmail's palette in light and dark.
- Two-factor setup names INBUXA as the issuer and drops the image parameter
that made authenticator apps fetch a logo from a third-party site.
- Runs apart from the server: the server address can be set at deploy time
with <meta name="api-base-url">, and OAuth endpoints the server returns as
relative paths are resolved against the server's address, not the page's.
Verified end to end against a separate inbuxa-server.
- Upstream's release workflow moved to .github-upstream so it never runs.
Upstream's history contains no Enterprise-only code, so this is an ordinary
fork. upstream is a fetch-only remote.