Conversation
Expose disk_reclaim_service behind /api/v1/system/disk/reclaim: a read-only report and a confirm-gated POST whose keys are re-validated against a fresh scan server-side (safe candidates only — telemetry stays CLI-only). ?wait=false runs it as a background job; both paths are audit-logged. The curated fix shows up where the problem is reported: a failing disk.headroom doctor check and an alerting disk tile each offer 'Reclaim space', which previews measured candidates before handing the run to Operations.
RecipeExecutionService encrypted handoff inputs with a direct app.utils.crypto import, tripping the service-level crypto ratchet. SecretService gains upsert_internal_secret — create-or-update without the human display-name grammar, for machine-named secrets in a dedicated vault slug — and the recipe service routes through it.
…migration inventory The recipes Phase 0 commit moved all three measured counts without regenerating their baselines. The new api/recipes.py persistence crossings are owned and documented in the baseline; the hand-shaped error census is unchanged by this branch.
…mespace en.json drops from 8107 to 6624 keys: repeated UI copy (Cancel x95, Status x67, Refresh x54, ...) now lives under common.actions / common.labels / common.loading, and extractor-era suffix duplicates (refresh2, status3) within a component collapse onto one key. Trailing ... defaults are normalized to the ellipsis character. Translations are preserved: all 16 locales were re-keyed, carrying existing per-component translations onto their new common.* keys (majority vote where sources disagreed), and stale keys were pruned. Verified: npm run lint (0 errors), node --test (140 pass), vite build. edit
There was a problem hiding this comment.
🟡 Changes recommended
There is a confirmed frontend bug in normalizeDeploymentOperation where handoff can become a boolean instead of an object, plus a confirmed duplicate disk-reclaim stylesheet definition that makes styling order-dependent.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Pull request overview
This PR delivers a large UX + operations-focused upgrade to ServerKit: it adds operator-driven “outcome” flows (Recipes + Walkthroughs) and introduces a safe, server-validated disk reclaim workflow, alongside a redesigned app shell/status bar and a broad i18n key consolidation / copy normalization across the frontend.
Changes:
- Add disk reclaim report + confirm-gated reclaim execution (API + job handler + UI entry points).
- Add guided walkthrough state storage + API and wire walkthrough signals into the new-service flow and shell.
- Normalize UI shell + accessibility behavior (reduced-motion-aware scrolling) and consolidate many translation keys to
common.*.
File summaries
| File | Description |
|---|---|
| VERSION | Bump panel version to 1.9.1 |
| frontend/src/utils/serviceTypes.js | Move labels to consolidated common.* i18n keys |
| frontend/src/utils/reducedMotion.js | Add reduced-motion helper for imperative scrolling |
| frontend/src/styles/pages/_setup-wizard.scss | New utility classes to replace inline wizard styles |
| frontend/src/styles/pages/_settings.scss | New settings-page helper classes replacing inline styles |
| frontend/src/styles/pages/_servers.scss | Add pairing-related form styling classes |
| frontend/src/styles/pages/_git.scss | Add Git page atom/layout styles |
| frontend/src/styles/pages/_app-map.scss | Replace inline node styles; add ReactFlow minimap/node styling |
| frontend/src/styles/main.scss | Import walkthrough/statusbar/disk-reclaim component styles |
| frontend/src/styles/layout/_main-content.scss | Add statusbar height CSS var on layout root |
| frontend/src/styles/components/disk-reclaim.scss | Standalone disk reclaim modal styles (CSS variables) |
| frontend/src/styles/components/_skeleton.scss | Move tree skeleton padding logic into CSS selectors |
| frontend/src/styles/components/_disk-reclaim.scss | Disk reclaim modal list styles (SCSS tokens) |
| frontend/src/styles/components/_design-system.scss | Support hidden overflow tabs; fix header flex overflow |
| frontend/src/styles/components/_dashboard-widgets.scss | Add reusable svg styling for widget charts/gauges |
| frontend/src/styles/_variables.scss | Add shell z-index tokens |
| frontend/src/services/operations.js | Treat waiting as active; surface recipe handoff details |
| frontend/src/services/api/walkthroughs.js | Add API methods for walkthrough state GET/PUT |
| frontend/src/services/api/index.js | Register walkthrough + disk API modules |
| frontend/src/services/api/disk.js | Add disk reclaim report + run endpoints |
| frontend/src/services/api/deploymentJobs.js | Add recipe handoff submission API method |
| frontend/src/services/tests/operations.test.mjs | Add test coverage for handoff-waiting recipe handling |
| frontend/src/pages/WorkspaceDetail.jsx | Consolidate workspace tab labels to common.* |
| frontend/src/pages/TestSandbox.jsx | Normalize ellipsis, reuse stable i18n keys, move actions to common.* |
| frontend/src/pages/SSOCallback.jsx | Normalize ellipsis copy |
| frontend/src/pages/SourceConnectionCallback.jsx | Normalize ellipsis copy |
| frontend/src/pages/Settings.jsx | Use consolidated common.* labels/keys |
| frontend/src/pages/Security.jsx | Normalize ellipsis copy |
| frontend/src/pages/PublicStatusPage.jsx | Deduplicate i18n keys |
| frontend/src/pages/Projects.jsx | Consolidate table headers + modal actions to common.* |
| frontend/src/pages/Notifications.jsx | Consolidate labels/loading to common.* |
| frontend/src/pages/NotFound.jsx | Deduplicate i18n keys |
| frontend/src/pages/new-service/useNewServiceForm.js | Emit walkthrough signals on source select + service creation |
| frontend/src/pages/new-service/SourceStep.jsx | Add walkthrough target marker attribute |
| frontend/src/pages/new-service/ConnectStep.jsx | Consolidate refresh/settings/branch labels to common.* |
| frontend/src/pages/Monitoring.jsx | Consolidate refresh label to common.* |
| frontend/src/pages/FleetProxy.jsx | Consolidate column headers + refresh/retry to common.* |
| frontend/src/pages/Downloads.jsx | Reduced-motion-aware scrolling + i18n consolidation |
| frontend/src/pages/Deployments.jsx | Consolidate table header labels to common.* |
| frontend/src/pages/DeployConsole.jsx | Use common.state.failed; deduplicate tooltip key |
| frontend/src/pages/Coexistence.jsx | Consolidate refresh to common.* |
| frontend/src/pages/CloudflareZoneSettings.jsx | Consolidate retry/storage/actions labels to common.* |
| frontend/src/pages/AppMap.jsx | Replace inline styles; remove inline minimap background |
| frontend/src/layouts/DashboardLayout.jsx | Mount walkthrough + status bar; move launchers into status bar |
| frontend/src/hooks/useSettingFocus.js | Reduced-motion-aware scrollIntoView |
| frontend/src/hooks/useConfirm.js | Use consolidated cancel action key |
| frontend/src/contexts/walkthroughContextValue.js | Add WalkthroughContext + hook guard |
| frontend/src/components/WorkspaceSwitcher.jsx | Deduplicate i18n keys |
| frontend/src/components/workspaces/WorkspaceSitesTab.jsx | Consolidate status/remove labels to common.* |
| frontend/src/components/workspaces/WorkspaceServicesTab.jsx | Consolidate status/remove labels to common.* |
| frontend/src/components/workspaces/WorkspaceServersTab.jsx | Consolidate status/remove labels to common.* |
| frontend/src/components/workspaces/WorkspaceOverviewTab.jsx | Consolidate labels to common.* |
| frontend/src/components/workspaces/WorkspaceMembersTab.jsx | Consolidate remove action to common.* |
| frontend/src/components/ui/sheet.jsx | Consolidate sr-only close label to common.* |
| frontend/src/components/ui/dialog.jsx | Consolidate sr-only close label to common.* |
| frontend/src/components/shared/TagsPanel.jsx | Consolidate loading/add actions to common.* |
| frontend/src/components/shared/EnvironmentVariablesPanel.jsx | Consolidate key/value/source headers to common.* |
| frontend/src/components/setup/SetupStepIntent.jsx | Replace inline wizard styles; consolidate continue action |
| frontend/src/components/setup/SetupStepCapacity.jsx | Replace inline wizard styles |
| frontend/src/components/setup/SetupStepAccount.jsx | Replace inline styles; consolidate username/password labels |
| frontend/src/components/settings/WhiteLabelTab.jsx | Consolidate remove/preview key; hide file input via class |
| frontend/src/components/settings/WebhookSubscriptionModal.jsx | Consolidate name/cancel labels to common.* |
| frontend/src/components/settings/UsersTab.jsx | Consolidate headers/cancel to common.*; normalize ellipsis |
| frontend/src/components/settings/UserModal.jsx | Consolidate username/password/permissions/cancel to common.* |
| frontend/src/components/settings/TwoFactorPolicyCard.jsx | Replace inline styles with classes; add grace input class |
| frontend/src/components/settings/ThemeStudioModal.jsx | Consolidate name label |
| frontend/src/components/settings/ThemeGallery.jsx | Consolidate remove action |
| frontend/src/components/settings/SSOConfigTab.jsx | Normalize ellipsis; consolidate enable label |
| frontend/src/components/settings/RecycleBinTab.jsx | Consolidate type/restore/refresh; deduplicate confirm key |
| frontend/src/components/settings/ProfileTab.jsx | Consolidate username label |
| frontend/src/components/settings/PermissionEditor.jsx | Consolidate “System” label |
| frontend/src/components/settings/ModulesTab.jsx | Normalize ellipsis |
| frontend/src/components/settings/MemberActionsCard.jsx | Replace inline styles with classes |
| frontend/src/components/settings/LoginLinksSection.jsx | Consolidate user label |
| frontend/src/components/settings/InviteModal.jsx | Replace inline styles; consolidate actions/permissions label |
| frontend/src/components/settings/InvitationsTab.jsx | Consolidate status/created/actions headers; normalize ellipsis |
| frontend/src/components/settings/IconReferenceTab.jsx | Replace inline styles; normalize ellipsis |
| frontend/src/components/settings/connections/DnsActivity.jsx | Consolidate time/action headers |
| frontend/src/components/settings/AppearanceTab.jsx | Consolidate system label; hide file input via class |
| frontend/src/components/settings/ApiKeyModal.jsx | Consolidate done/name/cancel to common.* |
| frontend/src/components/settings/AISettingsTab.jsx | Consolidate loading; replace inline layout styles |
| frontend/src/components/settings/AboutTab.jsx | Consolidate product/version/checking/retry/dismiss labels |
| frontend/src/components/services/serviceTabs.jsx | Consolidate services tab label |
| frontend/src/components/service-detail/ShellTab.jsx | Normalize ellipsis copy |
| frontend/src/components/service-detail/PackagesTab.jsx | Consolidate version header; normalize ellipsis copy |
| frontend/src/components/service-detail/MetricsTab.jsx | Normalize ellipsis; consolidate memory/uptime labels |
| frontend/src/components/service-detail/LogsTab.jsx | Normalize ellipsis; consolidate refresh label |
| frontend/src/components/service-detail/GunicornTab.jsx | Normalize ellipsis copy |
| frontend/src/components/service-detail/CommandsTab.jsx | Normalize ellipsis copy |
| frontend/src/components/servers/serverTabs.jsx | Consolidate servers tab label |
| frontend/src/components/servers/LinkPanelForm.jsx | Consolidate close/cancel labels; deduplicate confirm key |
| frontend/src/components/serverdetail/SurveyTab.jsx | Consolidate services/databases/domain labels |
| frontend/src/components/serverdetail/ServerMetricsTab.jsx | Consolidate memory/disk labels |
| frontend/src/components/serverdetail/PackagesTab.jsx | Consolidate loading/remove labels; deduplicate install key |
| frontend/src/components/serverdetail/AlertsTab.jsx | Consolidate system/security section titles |
| frontend/src/components/server/OnboardingWizard.jsx | Consolidate Docker step label |
| frontend/src/components/security/VulnerabilityTab.jsx | Normalize ellipsis; consolidate version label |
| frontend/src/components/security/securityTabs.jsx | Consolidate overview/settings labels |
| frontend/src/components/security/SecurityConfigTab.jsx | Normalize ellipsis copy |
| frontend/src/components/security/QuarantineTab.jsx | Consolidate size/actions/restore/delete labels |
| frontend/src/components/security/IPListsTab.jsx | Consolidate remove/cancel; normalize ellipsis |
| frontend/src/components/security/EventsTab.jsx | Consolidate refresh/loading labels |
| frontend/src/components/security/AutoUpdatesTab.jsx | Normalize ellipsis; consolidate refresh/status labels |
| frontend/src/components/security/AuditTab.jsx | Normalize ellipsis copy |
| frontend/src/components/SchedulePicker.jsx | Deduplicate i18n keys for frequency options |
| frontend/src/components/ScheduledTasksCard.jsx | Consolidate loading labels |
| frontend/src/components/proxy/ProxyStackPanel.jsx | Consolidate retry/status/all labels |
| frontend/src/components/PrivateURLSection.jsx | Consolidate copy/save/cancel actions |
| frontend/src/components/previews/PreviewList.jsx | Normalize ellipsis; consolidate save/open |
| frontend/src/components/PageSkeleton.jsx | Remove inline padding; rely on skeleton SCSS |
| frontend/src/components/monitoring/monitorTabs.jsx | Consolidate overview tab label |
| frontend/src/components/monitoring/MonitorsSummary.jsx | Deduplicate monitors title key |
| frontend/src/components/monitoring/MonitoringOverview.jsx | Add disk reclaim modal entry point; consolidate memory/disk labels |
| frontend/src/components/monitoring/FleetThresholdsPanel.jsx | Consolidate warning/memory/disk labels; deduplicate keys |
| frontend/src/components/MetricsGraph.jsx | Consolidate disk label |
| frontend/src/components/marketplace/marketTabs.jsx | Consolidate extensions tab label |
| frontend/src/components/marketplace/ManualInstallModal.jsx | Consolidate back/toast keys |
| frontend/src/components/marketplace/ExtensionPermissionsDialog.jsx | Deduplicate keys; consolidate close/loading |
| frontend/src/components/LogViewer.jsx | Normalize ellipsis; consolidate refresh/download/clear/loading |
| frontend/src/components/log-viewer/LogToolbar.jsx | Consolidate clear/refresh/download labels |
| frontend/src/components/log-viewer/logHelpers.js | Consolidate databases/system/security labels |
| frontend/src/components/LinkedAppsSection.jsx | Deduplicate link label key |
| frontend/src/components/LinkAppModal.jsx | Normalize ellipsis; consolidate close/cancel |
| frontend/src/components/JournalControls.jsx | Consolidate all/warning/info chips |
| frontend/src/components/JobProgressModal.jsx | Reduced-motion-aware autoscroll; consolidate failed label |
| frontend/src/components/git/RepoConnectForm.jsx | Consolidate branch label; deduplicate “or paste a URL” |
| frontend/src/components/git/PathSelector.jsx | Consolidate add action |
| frontend/src/components/git/GitProviders.jsx | Deduplicate hint key |
| frontend/src/components/file-manager/FileRow.jsx | Consolidate download/permissions/delete labels |
| frontend/src/components/file-manager/ContextMenu.jsx | Consolidate download/permissions/delete labels |
| frontend/src/components/FavoriteStar.jsx | Deduplicate aria-label i18n keys |
| frontend/src/components/ds/ViewMenu.jsx | Deduplicate aria-label keys; consolidate save action |
| frontend/src/components/ds/status.js | Treat waiting as amber status kind |
| frontend/src/components/ds/SortMenu.jsx | Consolidate clear action |
| frontend/src/components/ds/PageTopbar.jsx | Use is-hidden class instead of inline display:none |
| frontend/src/components/ds/grid/GridViewPicker.jsx | Consolidate cancel/create actions |
| frontend/src/components/ds/grid/GridFooter.jsx | Consolidate “All” option label |
| frontend/src/components/ds/grid/GridFilterDrawer.jsx | Consolidate value aria-label and done action |
| frontend/src/components/ds/grid/ColumnMenu.jsx | Deduplicate operator label key; consolidate done action |
| frontend/src/components/ds/Drawer.jsx | Remove inline flex/minWidth styling (handled in SCSS) |
| frontend/src/components/ds/DataTableFooter.jsx | Consolidate “All” option label |
| frontend/src/components/ds/DataTable.jsx | Consolidate “Clear filters” action |
| frontend/src/components/domains/domainTabs.jsx | Consolidate domains tab label |
| frontend/src/components/domains/DdnsTokenCallout.jsx | Consolidate dismiss action |
| frontend/src/components/docker/VolumesTab.jsx | Consolidate name/kind/cancel; normalize ellipsis; deduplicate keys |
| frontend/src/components/docker/PruneButton.jsx | Deduplicate tooltip key |
| frontend/src/components/docker/ImagesTab.jsx | Consolidate size/created/cancel; normalize ellipsis; deduplicate keys |
| frontend/src/components/deployments/DeploymentTimeline.jsx | Consolidate “Current” label |
| frontend/src/components/deployments/ConfigDiffModal.jsx | Consolidate domains/cancel/close labels |
| frontend/src/components/deploy-console/SuccessBanner.jsx | Consolidate open action |
| frontend/src/components/deploy-console/LogPane.jsx | Reduced-motion-aware scroll jumps |
| frontend/src/components/deploy-console/ConsoleToolbar.jsx | Consolidate copy/download labels |
| frontend/src/components/databases/TableDataTab.jsx | Consolidate type/key/default/refresh labels |
| frontend/src/components/databases/SourceTree.jsx | Consolidate actions/loading labels |
| frontend/src/components/databases/ProcessListPanel.jsx | Consolidate user/time headers |
| frontend/src/components/databases/ManagedDatabasesPanel.jsx | Consolidate refresh; deduplicate untrack key |
| frontend/src/components/databases/ImportDumpModal.jsx | Consolidate “Type” confirm label |
| frontend/src/components/databases/EngineCatalogDrawer.jsx | Consolidate “All” label |
| frontend/src/components/databases/DbUsersPanel.jsx | Consolidate copy/dismiss actions |
| frontend/src/components/databases/DbBlankStates.jsx | Deduplicate open-sql-console key |
| frontend/src/components/databases/CreateTableModal.jsx | Consolidate name/type/default/add labels |
| frontend/src/components/databases/ConsoleTab.jsx | Consolidate clear action |
| frontend/src/components/databases/ConfigTunerPanel.jsx | Consolidate refresh/current/all labels |
| frontend/src/components/databases/BackupsTab.jsx | Fix confirm text key; consolidate size/created headers |
| frontend/src/components/dashboard/widgets/renderers.jsx | Replace inline svg styles with SCSS classes; deduplicate empty key |
| frontend/src/components/dashboard/grid/WidgetLibrary.jsx | Consolidate all/add labels |
| frontend/src/components/dashboard/grid/WidgetFullscreen.jsx | Consolidate close title |
| frontend/src/components/dashboard/grid/WidgetFrame.jsx | Deduplicate aria-label keys; consolidate remove action |
| frontend/src/components/dashboard/AccountSecurityNudge.jsx | Consolidate dismiss action |
| frontend/src/components/cloudflare/WorkersPanel.jsx | Consolidate name/serverKit/delete/remove labels |
| frontend/src/components/cloudflare/StoragePanel.jsx | Consolidate add/delete; deduplicate deleted toast key |
| frontend/src/components/cloudflare/CloudflareWafPanel.jsx | Consolidate description/action/delete/add/severity/time labels |
| frontend/src/components/buildpack/BuildpackPreview.jsx | Consolidate port label |
| frontend/src/components/backups/ScheduleCard.jsx | Consolidate schedule label; normalize ellipsis |
| frontend/src/components/backups/RestoreDrawer.jsx | Consolidate restore action/confirm text |
| frontend/src/components/backups/ProtectionStatusCard.jsx | Deduplicate protection key |
| frontend/src/components/backups/ProtectionPanel.jsx | Consolidate delete/refresh labels |
| frontend/src/components/backups/backupTabs.jsx | Consolidate overview/storage/settings labels |
| frontend/src/components/backups/BackupsOverview.jsx | Consolidate size/status headers |
| frontend/src/components/backups/BackupHistoryList.jsx | Consolidate size/status/storage/restore/delete labels |
| frontend/src/components/apps/VolumesPanel.jsx | Consolidate cancel/size/status/name labels |
| frontend/src/components/apps/ResourceLimitsPanel.jsx | Consolidate memory label |
| frontend/src/components/apps/MicroCachePanel.jsx | Deduplicate aria-label key; consolidate saving label |
| frontend/src/components/apps/HtaccessConverter.jsx | Consolidate close action |
| frontend/src/components/apps/ContainerOpsPanel.jsx | Deduplicate error toast key |
| frontend/src/components/apps/AppWafPanel.jsx | Deduplicate error toast keys; consolidate add/severity/time labels |
| frontend/src/components/appdetail/SettingsTab.jsx | Consolidate saving label |
| frontend/src/components/appdetail/PackagesTab.jsx | Normalize ellipsis copy |
| frontend/src/components/appdetail/OverviewTab.jsx | Consolidate type/port/service/state/memory/domains labels |
| frontend/src/components/appdetail/LogsTab.jsx | Consolidate refresh action |
| frontend/src/components/appdetail/GunicornTab.jsx | Normalize ellipsis copy |
| frontend/src/components/appdetail/CommandsTab.jsx | Normalize ellipsis copy |
| frontend/src/components/appdetail/BuildTab.jsx | Normalize ellipsis; deduplicate found/rollback/build-config/cancel keys |
| frontend/src/components/ai/ConfirmActionCard.jsx | Deduplicate confirm-action key |
| frontend/src/components/ai/Composer.jsx | Consolidate stop action |
| frontend/src/components/ai/ChatBubble.jsx | Deduplicate title key |
| frontend/src/components/ai/AIAssistant.jsx | Support hideLauncher for statusbar-driven shell |
| docs/MIGRATION_INVENTORY.md | Update ratchet/baseline counts |
| backend/tests/test_walkthroughs.py | Add walkthrough self-scoping + validation tests |
| backend/tests/test_route_authz_sweep.py | Allowlist walkthrough state PUT as viewer-writable self-scoped |
| backend/tests/test_manifest_spec.py | Add recipe schema normalization/validation tests |
| backend/tests/test_core_blueprint_registry.py | Update expected blueprint count + manifest hash |
| backend/tests/ERROR_SHAPE_CEILING | Raise error-shape ceiling baseline |
| backend/tests/api_controller_boundary_baseline.json | Add recipes controller baseline + updated persistence count |
| backend/app/services/secret_vault_service.py | Add internal upsert method for service-owned secrets |
| backend/app/services/disk_reclaim_service.py | Add safe-key validation + job handler registration for reclaim |
| backend/app/models/deployment_job.py | Expose recipe title/fields + waiting attention flags in serialization |
| backend/app/core_blueprints.py | Register recipes + walkthroughs blueprints |
| backend/app/api/walkthroughs.py | Add walkthrough state API (self-scoped, viewer-writable) |
| backend/app/init.py | Register recipe execution + disk reclaim jobs at startup |
Review details
- Files reviewed: 283/341 changed files
- Comments generated: 3
- Review effort level: Lite
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
…chrome) The bottom-edge surfaces (Operations, Alerts, Recipes, Assistant) now share one console: every panel carries the same four-tab strip (ShellDockTabs) and a ShellDockContext keeps exactly one open, so switching surfaces is a tab click instead of hunting separate popovers. Recipes is rebuilt into the prototype's split layout — step rail left, one step's story right, with a deep-link action button, 'Done - next step', and Back. The workspace/server switchers get real themed menus (dot - name - meta - check) replacing the native <select> popup that ignored the theme, and the sidebar keeps its full height again: it was shortened by the statusbar height even though the bar only spans the content column, leaving a dead 30px hole under the user card. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…randing The right-side chat drawer now carries the shared console tab strip, so the assistant reads as the right-docked tab of the same console the bottom panels belong to (its close moved into the strip). The 'powered by Prompture' lines are gone from the header and empty state — the empty state now tells the user what to ask instead. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…lette The palette's empty state now leads with a Create tile grid (shared list in data/createItems.js) plus a '+ n more' shelf that folds in the less-common targets and any extension-contributed 'New ...' commands, then a Recipes group (picking one starts it and opens the recipes console). Create and recipe entries also score into regular search results. The sidebar '+' stops carrying its own little dropdown and opens this palette instead — one door for every new-thing flow, like the prototype. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Gradient fill (accent-bright to accent), accent glow, inner top highlight, and a hover that lifts the gradient toward white — all from theme tokens so runtime skins keep recoloring it. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
en.json regenerated from inline defaults (new statusbar/console/palette/ recipes strings; Prompture and old walkthrough-hub strings gone). es picks up translations for all 26 new keys; every locale drops the now-orphaned keys so the parity gate stays green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The curated serverkit-recipes index is consumed like the themes registry (cached remote index, bundled fallback, SERVERKIT_RECIPES_REGISTRY_URL override). GET /recipes/registry[/<slug>] browses it; POST /recipes/runs now accepts a registry_slug plus server_id — targeting a server finds or creates the per-workspace Recipes project — and validated non-secret params that pre-supply handoff inputs so only true secrets pause the run. Frontend: Recipes catalog page (cards, category chips, install drawer with running-server picker, preflight table, up-front inputs and an asked-during-the-run secrets preview) under new Services and Marketplace tabs; runs land in the deployment console. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Reserve the word Recipes for installers. The status-bar segment, dock tab, hub aria-label and command-palette category now read Walkthroughs (new app.walkthroughs.title/all keys; stale es allRecipes dropped). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This PR is now the complete 1.9.5 operator-workflow release. What began as Recipes, walkthroughs, and safe disk reclaim grew into a broader pass over how an operator moves through ServerKit: discover a Recipe, install it, watch it run, provide a human-held secret when required, recover disk headroom, and reach the assistant, alerts, operations, walkthroughs, and server scope from one consistent shell.
The branch also includes the redesigned file manager, command palette, docked shell console, accessibility and SCSS cleanup, the locale-key consolidation across all 16 languages, and a CI promotion fix that prevents generated version commits from replacing a fully tested PR head with an unchecked one.
Highlights
serverkit-recipesregistry, install a Recipe into a workspace, and reuse the workspace's Recipe project instead of creating duplicates.serverkit.yamlconfigureandverifysteps run on the existing deployment-job envelope, pause inwaitingfor a human handoff, and resume the same run without losing completed-step state.prefers-reduced-motion; touched UI uses the established SCSS system; disk reclaim now has one authoritative stylesheet owner.common.*keys across all 16 locales while preserving existing translations.dev, then publish the required promotion status on the generated commit.Technical changes
Recipes and execution
RecipeRegistryServiceand a bundled registry index for catalog listing, lookup, compatibility validation, and workspace installation.RecipeExecutionServicefor server resolution, idempotent Recipe-project creation, plan construction, execution, handoff submission, retry/resume behavior, audit logging, and cleanup.RecipeStepRegistrykeyed bytype:kind; unsupported capabilities are rejected before a run is created or mutated.capabilities,requires,configure, andverify, including dependency ordering, unique step ids, declared-capability checks, handoff input requirements, and TTL validation.waiting,requires_action,needs_attention, Recipe metadata, and handoff descriptors.RecipeHandoffCardto Operations and API methods for submitting handoff values.docs/serverkit-yaml.schema.jsonfor the expanded v1 manifest format.Secret handling
recipe-runsvault namespace keyed by run and step.Disk reclaim
Walkthroughs
App shell, assistant, and palette
GlobalStatusBarandShellDockTabsas the shared launcher and panel host.File manager and UI cleanup
main.scsspartial is now the single owner.CI and release process
dev→mainPR, pushes the generated version commit, and publishesRequire dev sourcesuccess on that exact head.Security and boundary guarantees
Final review follow-ups
handoff: trueflag cannot leak into UI code expecting an object.Verification
pushandpull_request: all 8 pytest shard jobs passed.No database migration is required for this PR.