Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "libredb-studio-website",
"type": "module",
"version": "0.7.3",
"version": "0.7.4",
"scripts": {
"dev": "astro dev",
"build": "node scripts/sync-docker-compose.mjs && astro build",
Expand Down
14 changes: 12 additions & 2 deletions public/humans.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,19 @@ Role: Founder & Developer
Site: https://libredb.org
GitHub: https://github.com/cevheri

/* VENDOR */
Company: Sekoya Grup Bilisim ve Teknoloji Ltd. Sti.
Trade name: Sekoya Tech
Address: Inkilap Mah. Hasim Iscan Sok. Kent Sitesi F Blok No: 4/33, 34768 Umraniye / Istanbul, Turkiye
Tax ID (VKN): 7591146987
MERSIS No: 0759114698700001
Trade Registry No: 1015843
Site: https://sekoya.tech
Contact: info@sekoya.tech

/* SITE */
Last update: 2026/03/11
Last update: 2026/08/01
Language: English
Standards: HTML5, CSS3, ES2024
Framework: Astro 5
Framework: Astro 7
Hosting: GitHub Pages
15 changes: 15 additions & 0 deletions public/llms-full.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,21 @@
- **GitHub:** https://github.com/libredb/libredb-studio
- **Privacy Policy:** https://libredb.org/privacy-policy

## Vendor

LibreDB is a product brand. The company that develops, publishes and commercially supports it is a limited liability company registered in Turkiye. These details are matters of public record and can be verified independently.

- **Registered company name:** Sekoya Grup Bilisim ve Teknoloji Ltd. Sti.
- **Trade name:** Sekoya Tech
- **Registered office:** Inkilap Mah. Hasim Iscan Sok. Kent Sitesi F Blok No: 4/33, 34768 Umraniye / Istanbul, Turkiye
- **Tax office:** Umraniye
- **Tax ID (VKN):** 7591146987
- **MERSIS No:** 0759114698700001
- **Trade Registry No:** 1015843
- **Company website:** https://sekoya.tech
- **Company information:** https://sekoya.tech/contact/#company-information
- **Contact:** info@sekoya.tech

---

## Supported Databases
Expand Down
15 changes: 15 additions & 0 deletions public/llms.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,21 @@

> LibreDB Studio is a modern, AI-powered, open-source web-based SQL IDE for cloud-native teams. It supports PostgreSQL, MySQL, Oracle, SQL Server, SQLite, MongoDB, and Redis with features like NL2SQL, visual EXPLAIN plans, ER diagrams, data masking, and OIDC SSO.

## Vendor

LibreDB is a product brand. The company that develops, publishes and commercially supports it is a limited liability company registered in Turkiye. These details are matters of public record and can be verified independently.

- Registered company name: Sekoya Grup Bilisim ve Teknoloji Ltd. Sti.
- Trade name: Sekoya Tech
- Registered office: Inkilap Mah. Hasim Iscan Sok. Kent Sitesi F Blok No: 4/33, 34768 Umraniye / Istanbul, Turkiye
- Tax office: Umraniye
- Tax ID (VKN): 7591146987
- MERSIS No: 0759114698700001
- Trade Registry No: 1015843
- Company website: https://sekoya.tech
- Company information: https://sekoya.tech/contact/#company-information
- Contact: info@sekoya.tech

## Product Overview
- [Homepage](https://libredb.org)
- [Live Demo JWT](https://app.libredb.org)
Expand Down
4 changes: 3 additions & 1 deletion src/components/CookieConsent.astro
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@
<div class="mx-auto max-w-7xl px-4 py-4 sm:px-6 lg:px-8">
<div class="flex flex-col items-start justify-between gap-4 sm:flex-row sm:items-center">
<p class="text-[13.5px] text-dim">
<span class="sql-com">--</span> We use cookies to analyze site traffic and improve your experience. See our
<!-- &#32; keeps the space before the link: Astro follows JSX whitespace rules and drops a
newline between text and an inline element, which silently joined "our" to "Privacy". -->
<span class="sql-com">--</span> We use cookies to analyze site traffic and improve your experience. See our&#32;
<a href="/privacy-policy" class="text-primary underline underline-offset-2 hover:text-primary-bright">
Privacy Policy
</a> for details.
Expand Down
2 changes: 1 addition & 1 deletion src/components/sections/DatabaseArchitectureSection.astro
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ const lenses = [
<div class="mt-10 border-l-2 border-primary bg-panel p-5">
<h3 class="text-[15px] font-bold text-bright">The WAL <em>is</em> the database</h3>
<p class="mt-2 max-w-2xl text-[13.5px] leading-relaxed text-dim">
Most databases keep a write-ahead log separate from data files. LibreDB does not: the file you open
Most databases keep a write-ahead log separate from data files. LibreDB does not: the file you open{' '}
<em>is</em> the sequence of every committed transaction, replayed into an in-memory sorted array on open. No separate
data file, no buffer pool — the same lineage as Redis AOF mode. Two boxes instead of three, which is how the kernel
stays small enough to understand.
Expand Down
2 changes: 1 addition & 1 deletion src/components/sections/DatabaseReliabilitySection.astro
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ const notForYet = [
<article class="flex flex-col bg-panel p-5">
<h3 class="text-[15px] font-bold text-bright">A write-ahead log, fsync-d before commit</h3>
<p class="mt-2 text-[13px] leading-relaxed text-dim">
A transaction that returns has been written to a length-framed, CRC-32 checksummed log and fsync-d
A transaction that returns has been written to a length-framed, CRC-32 checksummed log and fsync-d{' '}
<em>before</em> the commit becomes visible. A crash can only ever damage the last, un-fsync-d record — which recovery
detects and truncates, leaving a valid committed prefix.
</p>
Expand Down
2 changes: 1 addition & 1 deletion src/components/sections/DatabaseSection.astro
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ const principles = [
you can <span class="text-primary">read in one sitting.</span>
</h1>
<p class="mt-5 max-w-2xl text-[15px] leading-relaxed text-muted">
<strong class="font-semibold text-fg">Multi-model without the magic.</strong>
<strong class="font-semibold text-fg">Multi-model without the magic.</strong>{' '}
One core, three lenses, every line tested. A small, readable, embeddable database in TypeScript — built on one idea: a
database can be powerful and still be understood by opening its source.
</p>
Expand Down
6 changes: 3 additions & 3 deletions src/components/sections/DockerComposeSection.astro
Original file line number Diff line number Diff line change
Expand Up @@ -157,8 +157,8 @@ const envGroups = [
</button>
</div>
<p class="mt-3 text-sm text-muted">
That's it — LibreDB Studio is now running at
<code class="text-primary">http://localhost:3000</code>. Log in with the admin credentials from your
That's it — LibreDB Studio is now running at{' '}
<code class="text-primary">http://localhost:3000</code>. Log in with the admin credentials from your{' '}
<code class="text-primary">.env</code> file.
</p>
</section>
Expand Down Expand Up @@ -213,7 +213,7 @@ const envGroups = [
<section class="mb-10">
<h2 class="mb-2 text-xl font-semibold text-bright">Environment variable reference</h2>
<p class="mb-6 text-sm text-muted">
Every supported variable, grouped as in the file. Secrets are read from your
Every supported variable, grouped as in the file. Secrets are read from your{' '}
<code class="text-primary">.env</code> file via <code class="text-primary">${'{VAR}'}</code> interpolation — never hardcoded
in the compose file.
</p>
Expand Down
50 changes: 50 additions & 0 deletions src/components/studio/MobileFooter.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
---
// src/components/studio/MobileFooter.astro
// The mobile counterpart of StatusBar. The status bar is a single 28px line and
// is hidden below lg, which previously left small screens with no footer at all
// — no Privacy link anywhere in the DOM, and no sign of who publishes the
// product. Mobile has vertical room, so here the same quick links stack and the
// vendor's registered name and full address are shown outright rather than
// progressively disclosed.
import { getStudioVersion } from '../../lib/studio-version';
import { VENDOR, VENDOR_ADDRESS_STREET, VENDOR_LOCALITY } from '../../data/company';
import { QUICK_LINKS } from '../../data/quick-links';

const studioVersion = await getStudioVersion();
---

<footer class="border-t border-edge bg-panel px-4 py-6 text-[13px] lg:hidden">
<nav class="grid grid-cols-3 gap-x-4 gap-y-3" aria-label="Quick links">
{
QUICK_LINKS.map((link) => (
<a
href={link.href}
target={link.external ? '_blank' : undefined}
rel={link.external ? 'noopener noreferrer' : undefined}
class="text-muted hover:text-fg"
>
{link.label}
{link.accent && <span class="text-ok"> {link.accent}</span>}
</a>
))
}
</nav>

<div class="mt-6 border-t border-edge pt-4 text-[11px] leading-relaxed text-faint">
<p class="text-muted">LibreDB Studio is developed and commercially supported by</p>
<a
href={VENDOR.companyInfoUrl}
target="_blank"
rel="noopener noreferrer"
class="mt-1 block text-fg hover:text-bright">{VENDOR.legalName}</a
>
<address class="mt-1 text-pretty not-italic">
{VENDOR_ADDRESS_STREET}<br />
{VENDOR_LOCALITY}
</address>
</div>

<p class="mt-4 text-[11px] text-faint">
<span aria-hidden="true">◆</span> studio:{studioVersion}
</p>
</footer>
88 changes: 38 additions & 50 deletions src/components/studio/StatusBar.astro
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
// The studio version is fetched from GitHub releases at build time so the
// site never advertises a stale number.
import { getStudioVersion } from '../../lib/studio-version';
import { VENDOR, VENDOR_LOCALITY, VENDOR_ADDRESS_FULL } from '../../data/company';
import { QUICK_LINKS } from '../../data/quick-links';

const studioVersion = await getStudioVersion();
---
Expand All @@ -14,57 +16,43 @@ const studioVersion = await getStudioVersion();
<span class="flex items-center gap-1.5 text-ok">
<span class="h-1.5 w-1.5 animate-pulse-dot rounded-full bg-ok" aria-hidden="true"></span> Connected
</span>
<div class="flex items-center gap-4">

{
/*
Vendor attribution. Fills the dead space between the connection signal and
the links, and gives the legal entity behind LibreDB a visible home on the
product site — certification reviews look for it here. Disclosed
progressively because the bar is one 28px line: the full name only fits from
xl up, the address from 2xl. `truncate` is the backstop.
*/
}
<a
href={VENDOR.companyInfoUrl}
target="_blank"
rel="noopener noreferrer"
title={`${VENDOR.legalName} - ${VENDOR_ADDRESS_FULL}`}
class="mx-4 min-w-0 cursor-pointer truncate text-faint hover:text-fg"
>
<span class="xl:hidden">{VENDOR.tradeName}</span>
<span class="hidden xl:inline 2xl:hidden">{VENDOR.legalName}</span>
<span class="hidden 2xl:inline">{VENDOR.legalName} &middot; {VENDOR_LOCALITY}</span>
</a>

<div class="flex shrink-0 items-center gap-4">
<nav class="flex items-center gap-3" aria-label="Quick links">
<a
href="https://github.com/libredb/libredb-studio"
target="_blank"
rel="noopener noreferrer"
class="cursor-pointer text-muted hover:text-fg">GitHub</a
>
<a
href="https://www.linkedin.com/company/libredb"
target="_blank"
rel="noopener noreferrer"
class="cursor-pointer text-muted hover:text-fg">LinkedIn</a
>
<a
href="https://x.com/libredb"
target="_blank"
rel="noopener noreferrer"
class="cursor-pointer text-muted hover:text-fg">X</a
>
<a
href="https://www.youtube.com/@libredb"
target="_blank"
rel="noopener noreferrer"
class="cursor-pointer text-muted hover:text-fg">YouTube</a
>
<a
href="https://www.instagram.com/libredb/"
target="_blank"
rel="noopener noreferrer"
class="cursor-pointer text-muted hover:text-fg">Instagram</a
>
<a
href="https://www.reddit.com/r/libredb/"
target="_blank"
rel="noopener noreferrer"
class="cursor-pointer text-muted hover:text-fg">Reddit</a
>
<a
href="https://hub.docker.com/r/libredb/libredb-studio"
target="_blank"
rel="noopener noreferrer"
class="cursor-pointer text-muted hover:text-fg">Docker</a
>
<a
href="https://github.com/sponsors/libredb"
target="_blank"
rel="noopener noreferrer"
class="cursor-pointer text-muted hover:text-fg">Sponsor <span class="text-ok">♥</span></a
>
<a href="/privacy-policy" class="cursor-pointer text-muted hover:text-fg">Privacy</a>
{
QUICK_LINKS.map((link) => (
<a
href={link.href}
target={link.external ? '_blank' : undefined}
rel={link.external ? 'noopener noreferrer' : undefined}
class="cursor-pointer text-muted hover:text-fg"
>
{link.label}
{link.accent && <span class="text-ok"> {link.accent}</span>}
</a>
))
}
</nav>
<span class="text-faint" aria-hidden="true">·</span>
<span class="flex items-center gap-3 text-faint">
Expand Down
2 changes: 2 additions & 0 deletions src/components/studio/StudioShell.astro
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import TopBar from './TopBar.astro';
import MobileTopBar from './MobileTopBar.astro';
import Explorer from './Explorer.astro';
import StatusBar from './StatusBar.astro';
import MobileFooter from './MobileFooter.astro';
import Console from './Console.astro';
import CommandPalette from './CommandPalette.astro';

Expand Down Expand Up @@ -44,6 +45,7 @@ const { active = 'home', standalone = false } = Astro.props;
</div>

<div class="hidden lg:block" transition:persist="statusbar"><StatusBar /></div>
<MobileFooter transition:persist="mobilefooter" />
<Console transition:persist="console" />
</div>

Expand Down
75 changes: 75 additions & 0 deletions src/data/company.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
// Single source of truth for the vendor behind LibreDB. "LibreDB" is a product
// brand, not a legal entity: the company that develops, publishes and
// commercially supports it is Sekoya. Partner programmes and certification
// reviews verify the vendor from the product website, so every surface that
// names the vendor (status bar, JSON-LD, privacy policy, humans.txt) derives
// from this file rather than restating it.
//
// The values are ASCII on purpose — no Turkish diacritics. Application forms
// are frequently ASCII-only and reviewers match the address on the form against
// the website character for character, so this must stay byte-identical to the
// address published on sekoya.tech. Do not "correct" the spelling to Turkish.

export const VENDOR = {
legalName: 'Sekoya Grup Bilisim ve Teknoloji Ltd. Sti.',
tradeName: 'Sekoya Tech',
url: 'https://sekoya.tech',
/** Same @id as the organization node on sekoya.tech, so the two sites describe one entity. */
schemaId: 'https://sekoya.tech/#organization',
companyInfoUrl: 'https://sekoya.tech/contact/#company-information',
email: 'info@sekoya.tech',
taxOffice: 'Umraniye',
taxId: '7591146987',
mersisNo: '0759114698700001',
tradeRegistryNo: '1015843',
} as const;

const VENDOR_ADDRESS = {
street: 'Inkilap Mah. Hasim Iscan Sok. Kent Sitesi F Blok No: 4/33',
postalCode: '34768',
district: 'Umraniye',
city: 'Istanbul',
country: 'Turkiye',
countryCode: 'TR',
} as const;

/** Street line, for footers that break the address over two lines. */
export const VENDOR_ADDRESS_STREET = VENDOR_ADDRESS.street;

/** "34768 Umraniye / Istanbul, Turkiye" — the locality half of the address. */
export const VENDOR_LOCALITY = `${VENDOR_ADDRESS.postalCode} ${VENDOR_ADDRESS.district} / ${VENDOR_ADDRESS.city}, ${VENDOR_ADDRESS.country}`;

/** Full single-line address, for JSON-LD and the plain-text files. */
export const VENDOR_ADDRESS_FULL = `${VENDOR_ADDRESS.street}, ${VENDOR_LOCALITY}`;

/** schema.org PostalAddress for the vendor's registered office. */
const vendorPostalAddress = {
'@type': 'PostalAddress',
streetAddress: VENDOR_ADDRESS.street,
addressLocality: `${VENDOR_ADDRESS.postalCode} ${VENDOR_ADDRESS.district}`,
addressRegion: VENDOR_ADDRESS.city,
postalCode: VENDOR_ADDRESS.postalCode,
addressCountry: VENDOR_ADDRESS.countryCode,
} as const;

/**
* schema.org Organization node for the vendor. Referenced by @id from the
* WebApplication and LibreDB Organization nodes so a crawler resolves the
* publisher to a legally identified company with a verifiable address.
*/
export const vendorOrganizationSchema = {
'@context': 'https://schema.org',
'@type': 'Organization',
'@id': VENDOR.schemaId,
name: VENDOR.tradeName,
legalName: VENDOR.legalName,
url: VENDOR.url,
email: VENDOR.email,
address: vendorPostalAddress,
taxID: VENDOR.taxId,
vatID: VENDOR.taxId,
identifier: [
{ '@type': 'PropertyValue', name: 'MERSIS No', value: VENDOR.mersisNo },
{ '@type': 'PropertyValue', name: 'Trade Registry No', value: VENDOR.tradeRegistryNo },
],
} as const;
Loading
Loading