2814 Commits
Author SHA1 Message Date
Juan Denis 76432b1231 Fix gzip database backups and restores
A gzip.open() handle passed as a subprocess stream hands the child the
raw fd, so mysqldump/pg_dump wrote plain SQL inside a gzip header and
restores piped compressed bytes into mysql/psql. Backups, policies and
pre-deploy snapshots all produced files that could not be restored.

run_to_gzip/run_from_gzip pump the bytes through Python instead, with
stderr in a temp file so a noisy child can't deadlock the pipe. The two
hand-rolled db_sync dump pipes move onto them too.
2026-10-10 06:32:13 -04:00
Juan Denis fca18e9055 Gate server terminal, re-pair and move on workspace
Creating a terminal, regenerating the pairing token and moving a server
checked the role but not workspace membership, so a developer outside a
workspace could get a shell on its servers or re-pair them to their own
agent. REST now uses the rule the Socket.IO rooms already applied, in
one helper. The Default workspace counts as shared: servers created
without a context land there and nobody is a member of it.
2026-10-10 06:25:35 -04:00
Juan Denis d60eaf466b Protect the idle update slot in the file manager
PROTECTED_ROOTS covered only the running /opt/serverkit-<x>, so the
previous version's .env (JWT key) in the sibling slot was readable by
any role with files.read, including the default viewer.
2026-10-10 06:15:56 -04:00
Juan Denis d0008909fa Merge pull request #161 from jhd3197/dev
Standardize UI fields, scales, copy and all 16 translations
v1.11.19
2026-10-09 00:54:26 -04:00
Juan Denis a7b33c533d Merge branch 'main' into dev 2026-10-09 00:43:53 -04:00
github-actions[bot] c3fecb0462 chore: bump version to 1.11.19 [skip ci] 2026-10-09 04:42:25 +00:00
Juan Denis a7f2fc8642 Sync the bundled registry index
Mirrors serverkit-extensions after publishing WordPress 1.0.3,
Automations 1.0.4 and the new Vela 0.1.0 entry.
2026-10-09 00:35:16 -04:00
Juan Denis 862b1022c5 Regenerate the migration inventory
The hex colour literal ratchet dropped to 139 when the table work
removed one from the design system.
2026-10-09 00:34:41 -04:00
Juan Denis 882726bd6f Bump Werkzeug to 3.1.9 for CVE-2026-102598 2026-10-09 00:33:56 -04:00
Juan Denis f500564f07 Put the status bar on the shared chrome surface
The sidebar and top bar moved to --surface; the status bar stayed on
--bg-sidebar, breaking the one-background contract the settings UI
browser regression checks.
2026-10-09 00:33:55 -04:00
Juan Denis 289a157199 Give every list one table and every page full width
Each list page restyled DataTable on top of the shared look: fourteen
re-skin classes, filled grey headers, padded cards inside padded pages
and nth-child column widths (which put Docker's Name column 300px in
once the checkbox column existed). The table wrap is now the only
frame, the header is unfilled, column widths come from the column
definition, and raw tables and ui Table uses render through DataTable.
scripts/check-tables.mjs holds it in lint.

Page bodies drop the 1400px reading column (and the per-page caps on
Domains, Deployments, Dashboard, detail pages and Recipes) for one
20px gutter everywhere; Settings caps only its form column. The top
bar gets the sidebar's surface and edge so the chrome reads apart from
the canvas, and the bulk-selection pill clears the status bar.

Also removes decorative chrome: gradient letter avatars and tinted
stat icons become neutral, Domains rows lose the icon tile and the
"Registrar -" sub-line, and destructive row actions are quiet ghost
buttons that turn red on hover (.btn-ghost.is-danger).
2026-10-09 00:21:04 -04:00
Juan Denis 7e0dca491c Translate split sentences as whole sentences
The 404 description and the database tuner confirms were built from
three or four t() fragments glued with +, which dropped spaces
("itbelongs", "CheckExtensions") and left translators guessing
(German rendered a short interruption as a short circuit). Each is
now one key with a proper translation in every locale. Also fixes the
German nav term for Dashboard and drops the retired sidebarView key.
2026-10-09 00:20:46 -04:00
Juan Denis 1677614654 Stop built-in views reading as unsaved
Picking a built-in view on any ResourceListPage list showed Unsaved
at once: the live page bag carries pageSize and an unset search that
built-in views never declare. Compare only the page keys both sides
set, treating an empty search as unset.
2026-10-09 00:20:31 -04:00
Juan Denis 57142268b0 Fill the database studio and show engine names
On PageLayout the studio body sat in a block-level fill region, so its
flex:1 collapsed it to its content height. The tree also repeated
"Not installed" next to the Install button, truncating MySQL to MyS.
2026-10-09 00:20:25 -04:00
Juan Denis 73741eb197 Treat a missing email extension as no relay
The connections hub reads the relay from the Email extension's route.
Without the extension that 404 marked the whole hub as failed.
2026-10-09 00:20:23 -04:00
Juan Denis d8b3e130de Lift the sidebar off the canvas, drop view presets
The light sidebar sat ~2% off the page and its border vanished, so the
nav blended into the content. It now uses the surface tone with a
visible hairline. The account menu loses its sidebar presets; the
Customize sidebar page already owns that.
2026-10-09 00:20:21 -04:00
Juan Denis 5318e44502 Retry extension contributions after a failed fetch
A failed contributions request (the backend restarting under an update)
fell back to the baked plugins manifest and cached that for the whole
session. When the baked manifest is empty, every extension vanished
from the nav until a full reload. Retry with backoff instead.
2026-10-09 00:20:19 -04:00
github-actions[bot] 5b00df06e5 chore: bump version to 1.11.18 [skip ci] 2026-10-05 05:06:47 +00:00
Juan Denis 32cb19804a Match browser tests to the copy rewrite labels 2026-10-05 00:58:54 -04:00
Juan Denis 6986f16b31 Translate the notification preferences saved message
It was a hard-coded English string the literal census missed.
2026-10-05 00:58:52 -04:00
Juan Denis 65fe44414f Drive the shared dropdown in browser tests
The select sweep replaced native selects with Radix, so selectOption()
failed in the settings UI test. SelectItem now exposes its value as
data-value and the test opens the trigger and clicks that option.
2026-10-05 00:58:49 -04:00
Juan Denis 2d03eb6bf6 Correct the changelog's GUI scope claim
The serverkit-gui scope change is in its repo but not released; the
copy bundled here is still JWT-only.
2026-10-05 00:45:16 -04:00
Juan Denis e3cbb39bee Translate the log line-count options
"100 lines" was hard-coded English in every locale. Also carries the
translations for the taken-domain error.
2026-10-05 00:45:12 -04:00
Juan Denis 7e40248bf8 Show workspace member refresh errors over stale rows
DataTable only renders emptyState with no rows, so a failed refresh
after members loaded showed the old table with no error or retry.
2026-10-05 00:45:09 -04:00
Juan Denis 44ff9d419c Stop nesting the CatalogCard action in a button
A clickable card was role=button around its own action button, giving
assistive tech two conflicting controls. The title is now the real
button; the rest of the card stays a mouse-only shortcut.
2026-10-05 00:45:07 -04:00
Juan Denis 0fec9e2216 Refuse existing domains when attaching one
Attach flows create a new domain row, and POST /domains rejects any
name ServerKit already has, so suggesting existing domains there was
guaranteed to fail on submit. rejectExisting drops the suggestions and
reports a taken name as an error. Other DomainField uses (SSL,
tunnels, canonical domain) still suggest existing domains.
2026-10-05 00:45:04 -04:00
Juan Denis 31297577f0 Keep EnvEditor secrets masked when rows shift
Reveal state is keyed by row index. Deleting a revealed row moved the
next row's secret into that index and showed it unmasked. Delete now
shifts the revealed set with the rows and a pasted .env clears it.
2026-10-05 00:45:01 -04:00
Juan Denis 718fc223df Update settings browser test for the 2FA rename
The glossary pass renamed the MFA column and filter to 2FA; the test
still looked for the old labels, which turned CI red.
2026-10-05 00:45:01 -04:00
Juan Denis a60706af3e Restore translated brand names in zh-Hant
Machine translation turned product names into ordinary words
(Compose, Discord, Slack, Telegram, Traefik, Let's Encrypt and
others). They now appear in their original spelling.
2026-10-05 00:04:00 -04:00
Juan Denis 3d1407ec7b Restore translated brand names in zh-Hans
Machine translation turned product names into ordinary words
(Compose, Discord, Slack, Telegram, Traefik, Let's Encrypt and
others). They now appear in their original spelling.
2026-10-05 00:03:59 -04:00
Juan Denis af19a190a6 Restore translated brand names in vi
Machine translation turned product names into ordinary words
(Compose, Discord, Slack, Telegram, Traefik, Let's Encrypt and
others). They now appear in their original spelling.
2026-10-05 00:03:59 -04:00
Juan Denis 415020db42 Restore translated brand names in tr
Machine translation turned product names into ordinary words
(Compose, Discord, Slack, Telegram, Traefik, Let's Encrypt and
others). They now appear in their original spelling.
2026-10-05 00:03:58 -04:00
Juan Denis 98761f11aa Restore translated brand names in th
Machine translation turned product names into ordinary words
(Compose, Discord, Slack, Telegram, Traefik, Let's Encrypt and
others). They now appear in their original spelling.
2026-10-05 00:03:58 -04:00
Juan Denis a8e4dfd3de Restore translated brand names in ru
Machine translation turned product names into ordinary words
(Compose, Discord, Slack, Telegram, Traefik, Let's Encrypt and
others). They now appear in their original spelling.
2026-10-05 00:03:58 -04:00
Juan Denis 48079ed54c Restore translated brand names in pt
Machine translation turned product names into ordinary words
(Compose, Discord, Slack, Telegram, Traefik, Let's Encrypt and
others). They now appear in their original spelling.
2026-10-05 00:03:57 -04:00
Juan Denis e0b3659169 Restore translated brand names in pl
Machine translation turned product names into ordinary words
(Compose, Discord, Slack, Telegram, Traefik, Let's Encrypt and
others). They now appear in their original spelling.
2026-10-05 00:03:56 -04:00
Juan Denis 953b8d3377 Restore translated brand names in ko
Machine translation turned product names into ordinary words
(Compose, Discord, Slack, Telegram, Traefik, Let's Encrypt and
others). They now appear in their original spelling.
2026-10-05 00:03:55 -04:00
Juan Denis 5dccf4226a Restore translated brand names in it
Machine translation turned product names into ordinary words
(Compose, Discord, Slack, Telegram, Traefik, Let's Encrypt and
others). They now appear in their original spelling.
2026-10-05 00:03:54 -04:00
Juan Denis 071a5f52c2 Restore translated brand names in id
Machine translation turned product names into ordinary words
(Compose, Discord, Slack, Telegram, Traefik, Let's Encrypt and
others). They now appear in their original spelling.
2026-10-05 00:03:54 -04:00
Juan Denis d68af1e191 Restore translated brand names in fr
Machine translation turned product names into ordinary words
(Compose, Discord, Slack, Telegram, Traefik, Let's Encrypt and
others). They now appear in their original spelling.
2026-10-05 00:03:53 -04:00
Juan Denis 5a221223ef Restore translated brand names in es
Machine translation turned product names into ordinary words
(Compose, Discord, Slack, Telegram, Traefik, Let's Encrypt and
others). They now appear in their original spelling.
2026-10-05 00:03:53 -04:00
Juan Denis bbfe2bffe0 Restore translated brand names in de
Machine translation turned product names into ordinary words
(Compose, Discord, Slack, Telegram, Traefik, Let's Encrypt and
others). They now appear in their original spelling.
2026-10-05 00:03:52 -04:00
Juan Denis 8ae08f9350 Restore translated brand names in bn
Machine translation turned product names into ordinary words
(Compose, Discord, Slack, Telegram, Traefik, Let's Encrypt and
others). They now appear in their original spelling.
2026-10-05 00:03:52 -04:00
Juan Denis bbcdcb727f Restore translated brand names in ar
Machine translation turned product names into ordinary words
(Compose, Discord, Slack, Telegram, Traefik, Let's Encrypt and
others). They now appear in their original spelling.
2026-10-05 00:03:51 -04:00
Juan Denis 4b7f3ed9c7 Fix th app-map sentence wording 2026-10-05 00:02:32 -04:00
Juan Denis bb3cf55210 Use the service term consistently in zh-Hant
The English UI renamed app/application to service; these strings
still used the old word. Grammar adjusted to the new noun.
2026-10-05 00:02:23 -04:00
Juan Denis 06eb786203 Use the service term consistently in zh-Hans
The English UI renamed app/application to service; these strings
still used the old word. Grammar adjusted to the new noun.
2026-10-05 00:02:22 -04:00
Juan Denis 7f8873ab3f Use the service term consistently in vi
The English UI renamed app/application to service; these strings
still used the old word. Grammar adjusted to the new noun.
2026-10-05 00:02:22 -04:00
Juan Denis bf09af274a Use the service term consistently in tr
The English UI renamed app/application to service; these strings
still used the old word. Grammar adjusted to the new noun.
2026-10-05 00:02:22 -04:00
Juan Denis 308dacb4a3 Use the service term consistently in th
The English UI renamed app/application to service; these strings
still used the old word. Grammar adjusted to the new noun.
2026-10-05 00:02:21 -04:00