diff --git a/CHANGELOG.md b/CHANGELOG.md
index a0c48e896..933dbd670 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -56,6 +56,16 @@
### Changed
+- **Local wears the host OS's mark.** The container sees only Linux, so
+ `make serve` names the machine's OS (macOS, Windows, a Linux distro by
+ its os-release, Omarchy by its own directory) as `HOST_OS`/`HOST_OS_URL`;
+ the Overseer's Local card wears that page's favicon and says which OS.
+
+- **Deployments' actions fold into a Deploy menu and More.** Both deploys
+ sit behind one Deploy menu, each with a line on what it costs
+ (`menu_item`'s new `hint`); Back up now stays a button; Rehearse a
+ restore joins rolling back and destroying in More.
+
- **What a stack is made of, said once and read everywhere.** Services group
by their `category` (App, AI, Data) in `aegis services` and the setup
wizard, `ServiceType` gone; the wizard asks "Add Payment? Stripe checkout,
diff --git a/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/web_frontend/templates/components/macros/layout.html b/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/web_frontend/templates/components/macros/layout.html
index baf0fe530..86fa5d4a7 100644
--- a/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/web_frontend/templates/components/macros/layout.html
+++ b/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/web_frontend/templates/components/macros/layout.html
@@ -396,10 +396,11 @@
{{ ti
{# One entry in a dropdown() menu. ``attrs`` carries the htmx verb
(``hx-get``/``hx-post``/``hx-delete`` plus target and swap); the menu
- closes itself on the click, so a dialog never opens over it. #}
-{% macro menu_item(label, attrs, danger=False) %}
+ closes itself on the click, so a dialog never opens over it.
+ ``hint``: a muted line under the label, what choosing it costs. #}
+{% macro menu_item(label, attrs, danger=False, hint=None) %}
+ class="w-full text-left px-3 py-1.5 text-sm {{ 'text-error' if danger else 'text-aegis-text' }} hover:bg-aegis-border/30 rounded transition-colors">{{ label }}{% if hint %}{{ hint }}{% endif %}
{% endmacro %}
{# A menu behind a button. It opens below on the ``align`` side; app.js
diff --git a/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/web_frontend/templates/pages/overseer/deployments/_actions.html b/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/web_frontend/templates/pages/overseer/deployments/_actions.html
index def51747c..d90286e66 100644
--- a/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/web_frontend/templates/pages/overseer/deployments/_actions.html
+++ b/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/web_frontend/templates/pages/overseer/deployments/_actions.html
@@ -2,11 +2,11 @@
one of four views. A deployed server says where redeploys come from.
Without a server yet, the way to one (New server); one being made,
the way to it there. With a server, the
- server, what can be asked of ``aegis deploy-agent`` for it (rolling
- back and destroying folded into More), and, while one runs, its newest
+ server, what can be asked of ``aegis deploy-agent`` for it (deploys
+ in one menu; rehearsing, rolling back and destroying folded into More), and, while one runs, its newest
job (whole under Jobs). #}
{% from "components/macros/layout.html" import card, dropdown, facts %}
-{% from "pages/overseer/deployments/_macros.html" import agent_note, ask, deployed_card, destroy_form, goto, job_panel, note, place %}
+{% from "pages/overseer/deployments/_macros.html" import agent_note, ask, ask_item, deployed_card, destroy_form, goto, job_panel, note, place %}
{% if actions.view == "deployed" %}
{{ deployed_card(actions) }}
{% elif actions.view == "no-server" %}
@@ -27,13 +27,17 @@
{% with live = actions.live %}{% include "pages/overseer/deployments/_live.html" %}{% endwith %}
{% with storage = actions.storage %}{% include "pages/overseer/deployments/_storage.html" %}{% endwith %}
- {{ ask("Deploy", actions.partials, "deploy", "primary") }}
- {# Keeps the site up and nobody signed out; additive migrations only. #}
- {{ ask("Deploy without downtime", actions.partials, "deploy-rolling") }}
+ {# Both deploys behind one menu, each saying what it costs. #}
+ {% call dropdown("Deploy", align="left") %}
+ {{ ask_item("Deploy", actions.partials, "deploy", hint="Restarts everything; a moment offline") }}
+ {# Additive migrations only. #}
+ {{ ask_item("Deploy without downtime", actions.partials, "deploy-rolling", hint="Site stays up, nobody signed out") }}
+ {% endcall %}
{{ ask("Back up now", actions.partials, "backup") }}
- {% if actions.drill %}{{ ask(actions.drill.label, actions.partials, actions.drill.verb) }}{% endif %}
- {# Rolling back and destroying are rare: folded into a menu, asked there. #}
+ {# Rehearsing a restore, rolling back and destroying are rare: folded
+ into a menu, asked there. #}
{% call dropdown("More", align="left") %}
+ {% if actions.drill %}{{ ask_item(actions.drill.label, actions.partials, actions.drill.verb) }}{% endif %}
{% with r = actions.rollback %}{% include "pages/overseer/deployments/_rollback.html" %}{% endwith %}