diff --git a/tests/test_app.py b/tests/test_app.py
index ca301e3..b44c173 100644
--- a/tests/test_app.py
+++ b/tests/test_app.py
@@ -195,3 +195,34 @@ def test_build_archinstall_creds_uses_archinstall_sentinel_keys():
"groups": [],
}
]
+
+
+def test_log_page_done_state_shows_usb_step_before_restart(monkeypatch, tmp_path):
+ """The 'pull the USB stick' step must be visible *before* the restart
+ button — after the click the box reboots within seconds (first hardware
+ bench booted the stick again)."""
+ import app as app_module
+
+ log_path = tmp_path / "install.log"
+ log_path.write_text("Installation completed without any errors.\n")
+ monkeypatch.setattr(app_module, "INSTALL_LOG", log_path)
+ app_module.settings["hostname"] = "bench"
+
+ html = app_module.app.test_client().get("/install/log").get_data(as_text=True)
+
+ assert '
' in html
+ assert "http://bench.local" in html
+ assert "USB stick is out" in html
+ assert html.index("next-steps") < html.index("USB stick is out")
+
+
+def test_log_page_running_state_has_no_restart_button(monkeypatch, tmp_path):
+ import app as app_module
+
+ log_path = tmp_path / "install.log"
+ log_path.write_text("Creating partitions: /dev/sda\n")
+ monkeypatch.setattr(app_module, "INSTALL_LOG", log_path)
+
+ html = app_module.app.test_client().get("/install/log").get_data(as_text=True)
+ assert "next-steps" not in html
+ assert "install_reboot" not in html and "restart now" not in html
diff --git a/webinstaller/app.py b/webinstaller/app.py
index 7210ab2..c0db38f 100644
--- a/webinstaller/app.py
+++ b/webinstaller/app.py
@@ -642,6 +642,7 @@ def install_log_view():
"install/log.html",
log=log,
progress=parse_install_progress(log),
+ hostname=settings["hostname"],
)
diff --git a/webinstaller/static/style.css b/webinstaller/static/style.css
index 094af5c..b667596 100644
--- a/webinstaller/static/style.css
+++ b/webinstaller/static/style.css
@@ -421,3 +421,11 @@ select:focus {
outline-offset: 3px;
border-radius: 2px;
}
+
+/* "Furtka is ready" — the two steps before the restart button (log.html). */
+.next-steps {
+ margin: 1.5rem 0 1rem;
+ padding-left: 1.4rem;
+ line-height: 1.5;
+}
+.next-steps li { margin-bottom: 0.6rem; }
diff --git a/webinstaller/templates/install/log.html b/webinstaller/templates/install/log.html
index 00e530d..2d1953b 100644
--- a/webinstaller/templates/install/log.html
+++ b/webinstaller/templates/install/log.html
@@ -17,16 +17,25 @@
{% else %}Installing Furtka{% endif %}
-{% if progress.status == "done" %}Installation finished. Remove the installer USB / eject the ISO, then click Reboot.
+{% if progress.status == "done" %}Installation finished. Two more steps and Furtka is running from its own disk.
{% elif progress.status == "error" %}Something went wrong. Open the details below and share them so we can help.
{% else %}This takes a few minutes. Don't close this page or power off the machine.{% endif %}
{% if progress.status == "done" %}
+{# The USB-stick step has to be read *before* the click: the machine reboots
+ 3 s after it, and most BIOSes boot the stick before the disk — so the
+ installer would just come back. Seen on the first hardware bench. #}
+
+ - Pull out the USB stick (or eject the installer ISO in your VM).
+ If it stays in, the computer will start this installer again instead of Furtka.
+ - Click the button below. The computer restarts and comes back as
+ http://{{ hostname }}.local in about a minute.
+
{% endif %}