Skip to content

feat(vendor): identify the company behind LibreDB, add a mobile footer, fix swallowed spaces - #36

Merged
kaya-abdullah merged 3 commits into
mainfrom
feat/vendor-identity-mobile-footer
Aug 1, 2026
Merged

feat(vendor): identify the company behind LibreDB, add a mobile footer, fix swallowed spaces#36
kaya-abdullah merged 3 commits into
mainfrom
feat/vendor-identity-mobile-footer

Conversation

@kaya-abdullah

Copy link
Copy Markdown
Member

Why

Partner programmes verify a vendor from its product website. Nothing on libredb.org named a legal entity: the Organization JSON-LD carried only LibreDB with no address, the privacy policy named no data controller, and the string Sekoya appeared nowhere in this repository. Our SUSE One partner application was declined for exactly this class of gap on the company site, so the product site is being brought in line.

Two problems surfaced while doing it, and are fixed here too.

1. Vendor identity

One source of truth in src/data/company.ts, surfaced in four places:

  • JSON-LD — an Organization node with legalName, a full PostalAddress, taxID/vatID and the MERSIS and trade registry identifiers. Its @id is https://sekoya.tech/#organization, the same @id the company site publishes, so the two sites describe one entity rather than two. Wired in as parentOrganization of LibreDB and provider of the WebApplication.
  • Privacy policy — a Vendor and Data Controller section with the registered name, full address and registration numbers. The Contact section now points at the data controller instead of only at GitHub issues. The policy previously named no legal entity at all, which is a GDPR gap independent of any partner application.
  • Status bar — vendor attribution in the dead space between the connection signal and the links. The bar is a single 28px line, so it is disclosed progressively: trade name at lg, registered name from xl, locality from 2xl.
  • humans.txt, llms.txt, llms-full.txt — a vendor block.

The address is ASCII with no Turkish diacritics, byte-identical to the address on sekoya.tech: application forms are frequently ASCII-only and reviewers match the two character for character.

2. Mobile had no footer

StatusBar is hidden lg:block, so every viewport under 1024px had no footer at all — no vendor attribution, and no link to the privacy policy anywhere in the DOM.

MobileFooter is its counterpart: the same quick links in a stacked grid, the registered name and full address shown outright since there is vertical room, and the studio version. The link list moved to src/data/quick-links.ts so the two footers cannot drift apart — this also collapsed the status bar's nine hand-written links from 48 lines to 13.

3. Nine swallowed spaces

Astro follows JSX whitespace rules: a newline between prose and an adjacent inline element is dropped, not collapsed to a space. Prettier reflows long sentences and moves inline tags onto their own line, at which point the space silently disappears. Source still reads correctly; typecheck, lint and build all stay green.

Shipped joined:

Rendered Where
See ourPrivacy Policy cookie banner — all 17 pages
visit our website atlibredb.org privacy policy
processed by Meta under theirPrivacy Policy privacy policy
the file you openis the sequence database architecture
log and fsync-dbefore the commit database reliability
without the magic.One core, three lenses database hero
credentials from your.env file ×2 docker compose

Fixed with an explicit {' '} — already the idiom elsewhere in this repo — or   where the line would otherwise exceed the print width and Prettier would wrap the expression across three lines.

src/lib/prose-whitespace.test.ts is added to the gate so this cannot regress. It scans the .astro sources for prose ending a line immediately followed by a content-bearing inline element with no explicit space. <span> is deliberately out of scope: it is used for badges and icon dots inside flex ... gap-* rows, where the missing text-node space is invisible.

Verification

  • bun run gate clean: 0 typecheck errors, Prettier clean, oxlint clean, knip clean, 66 tests pass
  • Status bar measured over CDP at 1024 / 1152 / 1280 / 1440 / 1600 / 1920 / 2560 px: overflow: 0, no truncation, height unchanged at 28px at every width
  • Mobile footer measured at 390px and 820px: overflow: 0
  • Every one of the nine joins re-checked against rendered innerText after the fix
  • The guard test was validated by reverting each of the eight fix sites in turn and confirming it fails on each

Note on merging

The three commits are deliberately separated (fix / feat / chore(release)) and chore(release): 0.7.4 touches only package.json, matching the v0.7.3 convention. Rebase and merge or a merge commit would preserve that; squashing would collapse it. Deploy is gated on release: published, so tagging v0.7.4 and publishing the release is a separate step after this lands.

🤖 Generated with Claude Code

kaya-abdullah and others added 3 commits August 1, 2026 03:00
Astro follows JSX whitespace rules, so a newline between prose text and an
adjacent inline element is dropped rather than collapsed to a space. Prettier
reflows long sentences and moves inline tags onto their own line, at which
point the space silently disappears from the rendered page. The source still
reads correctly and typecheck, lint and the build all stay green, so these
went unnoticed.

Nine occurrences shipped joined text:

- "See ourPrivacy Policy" in the cookie banner — on all 17 pages
- "visit our website atlibredb.org" (privacy policy)
- "processed by Meta under theirPrivacy Policy" (privacy policy)
- "the file you openis the sequence" (database architecture)
- "log and fsync-dbefore the commit" (database reliability)
- "without the magic.One core, three lenses" (database hero)
- "credentials from your.env file" and "read from your.env file"
  (docker compose)

Each is fixed with an explicit {' '} — already the idiom used elsewhere in
this repo — or &#32; where the line would otherwise exceed the print width
and Prettier would wrap the expression onto three lines.

Add src/lib/prose-whitespace.test.ts to the gate so this cannot regress. It
scans the .astro sources for prose ending a line immediately followed by a
content-bearing inline element with no explicit space, and was verified by
reverting each of the eight fix sites in turn and confirming it fails. <span>
is deliberately out of scope: it is used for badges and icon dots inside
`flex ... gap-*` rows, where the missing text-node space is invisible.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…ooter

Partner programmes verify a vendor from its product website. Nothing on
libredb.org named a legal entity: the Organization JSON-LD carried only
"LibreDB" with no address, the privacy policy named no data controller, and
the string "Sekoya" appeared nowhere in the repository. Our SUSE One
application was declined for exactly this class of gap on the company site.

Vendor identity, from one source of truth in src/data/company.ts:

- JSON-LD: an Organization node with legalName, a full PostalAddress, taxID /
  vatID and the MERSIS and trade registry identifiers. It uses
  https://sekoya.tech/#organization as its @id — the same @id the company
  site publishes — so the two sites describe one entity rather than two, and
  it is wired in as parentOrganization of LibreDB and provider of the
  WebApplication.
- Privacy policy: a "Vendor and Data Controller" section carrying the
  registered name, full address and registration numbers, plus a Contact
  section that now points at the data controller instead of only at GitHub
  issues. The policy previously named no legal entity at all, which is a
  GDPR gap independent of any partner application.
- Status bar: vendor attribution in the dead space between the connection
  signal and the links, linking to the company information page. The bar is a
  single 28px line, so it is disclosed progressively — trade name at lg, the
  registered name from xl, the locality from 2xl. Measured over CDP at seven
  widths from 1024px to 2560px: no overflow, no truncation, height unchanged.
- humans.txt, llms.txt and llms-full.txt gain a vendor block.

The address is written in ASCII with no Turkish diacritics, byte-identical to
the address on sekoya.tech. Application forms are frequently ASCII-only and
reviewers match the two character for character.

Mobile footer:

StatusBar is `hidden lg:block`, which left every viewport under 1024px with no
footer at all — no vendor attribution, and no link to the privacy policy
anywhere in the DOM. MobileFooter is its counterpart: the same quick links in
a stacked grid, the registered name and full address shown outright since
there is vertical room, and the studio version. The link list moved to
src/data/quick-links.ts so the two footers cannot drift apart.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@kaya-abdullah
kaya-abdullah merged commit adee086 into main Aug 1, 2026
4 checks passed
@kaya-abdullah
kaya-abdullah deleted the feat/vendor-identity-mobile-footer branch August 1, 2026 00:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant