+
| Element | What it shows |
@@ -22,7 +22,6 @@ The top card on the left holds the stack's identity and primary controls.
| **Breadcrumb** | `
+
-The header answers three questions at a glance:
+The header answers two questions at a glance:
- **What is this?** A breadcrumb (`LOCAL · STACKS · NAME`) and the stack name as the title.
- **Is it healthy?** A state pill to the right of the title reports the live state:
@@ -187,21 +187,20 @@ The header answers three questions at a glance:
- `running · starting` (amber) during the Docker healthcheck start period.
- `running` (green) when no healthcheck is defined.
- `exited` (red) when no containers are up.
-- **What does it ship?** A mono line under the title shows the primary image tag and the short image digest, with a copy button to grab the full digest.
-The action row to the right of the header keeps everyday lifecycle controls visible. The **More actions** overflow holds Rollback, Scan config, and Delete; the next sections cover both surfaces.
+The action row below the title keeps everyday lifecycle controls visible. The **More actions** overflow holds Rollback, Scan config, and Delete; the next sections cover both surfaces.
If Sencho discovers its own compose project as a stack (because the deployment directory lives inside `COMPOSE_DIR`), that stack is treated as the running Sencho instance: deploy, update, stop, down, and delete are disabled in the UI and refused by the API. Use **Fleet → Node Update** to upgrade Sencho. Compose Doctor flags the condition during preflight.
### Image source links
-Next to the image line is a links button that turns the image reference into somewhere useful to go. It opens a small menu with:
+Each container row includes a links button that turns the image reference into somewhere useful to go. It opens a small menu with:
- **Open on the registry.** Docker Hub images link to their Docker Hub page; GitHub Container Registry (`ghcr.io`) images link to the owner on GitHub. Images from a private or unrecognized registry show the registry host instead of a link, so you never land on a broken guessed URL.
- **Copy image reference.** Grabs the full reference for use elsewhere.
- **Source, homepage, documentation, and revision links** when the image declares them. These come from the image's own [OCI labels](https://github.com/opencontainers/image-spec/blob/main/annotations.md) (`org.opencontainers.image.source`, `.url`, `.documentation`, `.revision`, `.version`) and are read locally from the image, so they need no internet access and appear only when the image ships them. A revision links to its commit when the source is a GitHub repository; the version is shown as plain text.
-The same links button appears on each container row and on the update cards in [Auto-Update Policies](/features/auto-update-policies), so you can review what an image ships and where it comes from before approving an update.
+The same links button appears on update cards in [Auto-Update Policies](/features/auto-update-policies), so you can review what an image ships and where it comes from before approving an update.
## Container health strip
diff --git a/docs/getting-started/introduction.mdx b/docs/getting-started/introduction.mdx
index 4c01e813..c6ac6442 100644
--- a/docs/getting-started/introduction.mdx
+++ b/docs/getting-started/introduction.mdx
@@ -48,7 +48,7 @@ Stacks can be pinned and grouped by label. Each row carries a compact status mar
Opening a stack gives you the day-to-day workspace:
-- The identity header shows the node, stack name, runtime state, primary image, digest, and main action buttons.
+- The identity header shows the node, stack name, runtime state, and main action buttons.
- Running stacks expose **Restart**, **Stop**, and **Update**; stopped stacks expose **Start** and **Update**. The overflow menu holds less frequent actions such as rollback, config scan, and delete.
- Container rows show health, uptime, published ports, live CPU and memory, network activity, logs, and service actions.
- The logs panel can run in **Structured** mode or **Raw terminal** mode.
diff --git a/frontend/src/components/EditorLayout.tsx b/frontend/src/components/EditorLayout.tsx
index f2b74cdd..1455121f 100644
--- a/frontend/src/components/EditorLayout.tsx
+++ b/frontend/src/components/EditorLayout.tsx
@@ -87,8 +87,6 @@ export default function EditorLayout() {
const editorState = useEditorViewState();
const {
stackMisconfigScanning,
- copiedDigest, setCopiedDigest,
- copiedDigestTimerRef,
content, setContent,
envContent, setEnvContent,
envExists,
@@ -465,14 +463,12 @@ export default function EditorLayout() {
isEditing={isEditing}
editingCompose={editingCompose}
logsMode={logsMode}
- copiedDigest={copiedDigest}
loadingAction={loadingAction}
stackMisconfigScanning={stackMisconfigScanning}
can={can}
isAdmin={isAdmin}
trivy={trivy}
activeNode={activeNode}
- copiedDigestTimerRef={copiedDigestTimerRef}
deployStack={stackActions.deployStack}
restartStack={stackActions.restartStack}
stopStack={stackActions.stopStack}
@@ -493,7 +489,6 @@ export default function EditorLayout() {
setLogsMode={setLogsMode}
setEditingCompose={setEditingCompose}
setGitSourceOpen={setGitSourceOpen}
- setCopiedDigest={setCopiedDigest}
requestDeleteStack={stackActions.requestDeleteStack}
isSelfStack={selectedFile ? stackSelfFlags[selectedFile] === true : false}
recoveryResult={selectedFile ? lastActionResult[selectedFile] : undefined}
diff --git a/frontend/src/components/EditorLayout/EditorView.tsx b/frontend/src/components/EditorLayout/EditorView.tsx
index 831bc2ad..51643b3e 100644
--- a/frontend/src/components/EditorLayout/EditorView.tsx
+++ b/frontend/src/components/EditorLayout/EditorView.tsx
@@ -142,7 +142,6 @@ export interface EditorViewProps {
isEditing: boolean;
editingCompose: boolean;
logsMode: 'structured' | 'raw';
- copiedDigest: string | null;
loadingAction: StackAction | null;
stackMisconfigScanning: boolean;
@@ -152,9 +151,6 @@ export interface EditorViewProps {
trivy: { available: boolean };
activeNode: Node | null;
- // Refs
- copiedDigestTimerRef: React.MutableRefObject