chore(core/eckhart): align default homescreen and device menu label
What changed, and why it matters
This is a cosmetic UI alignment change for the Trezor hardware wallet. It makes the default device name shown on the homescreen and in the device menu consistent by using the model's full name (e.g., 'Trezor Safe 5') instead of a hardcoded 'Trezor' fallback. It also tweaks text styling and reorders a translation entry. There is no security-relevant change.
No security action required. This is a routine UI consistency and theming change.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The commit removes the optional defaulting of the homescreen label in the Rust UI API (label is now required as str rather than str | None), and updates Python callers to pass label or utils.MODEL_FULL_NAME. The device menu similarly falls back to utils.MODEL_FULL_NAME instead of the literal string ‘Trezor’. A text style constant was updated with different disabled/notice colors and word-breaking behavior. A translation key was reordered alphabetically. No cryptographic, authentication, or trust-boundary logic is modified.
Changed components
core/embed/rust/src/ui/api/firmware_micropython.rscore/embed/rust/src/ui/layout_eckhart/theme/firmware.rscore/mocks/generated/trezorui_api.pyicore/src/apps/homescreen/device_menu.pycore/src/trezor/ui/layouts/homescreen.pycore/translations/en.jsonInspect captured patch +13 / −13
diff --git a/core/embed/rust/src/ui/api/firmware_micropython.rs b/core/embed/rust/src/ui/api/firmware_micropython.rs
index 653ff143..223c2340 100644
--- a/core/embed/rust/src/ui/api/firmware_micropython.rs
+++ b/core/embed/rust/src/ui/api/firmware_micropython.rs
@@ -915,10 +915,7 @@ extern "C" fn new_show_group_share_success(
extern "C" fn new_show_homescreen(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj {
let block = move |_args: &[Obj], kwargs: &Map| {
- let label: TString<'static> = kwargs
- .get(Qstr::MP_QSTR_label)?
- .try_into_option()?
- .unwrap_or_else(|| model::FULL_NAME.into());
+ let label: TString<'static> = kwargs.get(Qstr::MP_QSTR_label)?.try_into()?;
let notification: Option<TString<'static>> =
kwargs.get(Qstr::MP_QSTR_notification)?.try_into_option()?;
let notification_level: u8 = kwargs.get_or(Qstr::MP_QSTR_notification_level, 0)?;
@@ -1890,7 +1887,7 @@ pub static mp_module_trezorui_api: Module = obj_module! {
/// def show_homescreen(
/// *,
- /// label: str | None,
+ /// label: str,
/// notification: str | None,
/// notification_level: int = 0,
/// lockable: bool,
diff --git a/core/embed/rust/src/ui/layout_eckhart/theme/firmware.rs b/core/embed/rust/src/ui/layout_eckhart/theme/firmware.rs
index 3d5c4a95..e4be3e7e 100644
--- a/core/embed/rust/src/ui/layout_eckhart/theme/firmware.rs
+++ b/core/embed/rust/src/ui/layout_eckhart/theme/firmware.rs
@@ -40,9 +40,10 @@ pub const TEXT_BIG: TextStyle = TextStyle::new(
fonts::FONT_SATOSHI_EXTRALIGHT_46,
GREY_EXTRA_LIGHT,
BG,
- GREY_LIGHT,
- GREY_LIGHT,
-);
+ GREY,
+ GREY,
+)
+.with_line_breaking(LineBreaking::BreakWordsNoHyphen);
/// TT Satoshi Regular - 38 (Screen text, Menu item label)
pub const TEXT_REGULAR: TextStyle =
TextStyle::new(fonts::FONT_SATOSHI_REGULAR_38, GREY_LIGHT, BG, GREY, GREY);
diff --git a/core/mocks/generated/trezorui_api.pyi b/core/mocks/generated/trezorui_api.pyi
index 637793f4..ed51c684 100644
--- a/core/mocks/generated/trezorui_api.pyi
+++ b/core/mocks/generated/trezorui_api.pyi
@@ -610,7 +610,7 @@ def show_group_share_success(
# rust/src/ui/api/firmware_micropython.rs
def show_homescreen(
*,
- label: str | None,
+ label: str,
notification: str | None,
notification_level: int = 0,
lockable: bool,
diff --git a/core/src/apps/homescreen/device_menu.py b/core/src/apps/homescreen/device_menu.py
index 3f7d4900..cd732001 100644
--- a/core/src/apps/homescreen/device_menu.py
+++ b/core/src/apps/homescreen/device_menu.py
@@ -43,7 +43,9 @@ async def handle_device_menu() -> None:
wipe_code=config.has_wipe_code() if is_initialized else None,
check_backup=is_initialized,
device_name=(
- (storage_device.get_label() or "Trezor") if is_initialized else None
+ (storage_device.get_label() or utils.MODEL_FULL_NAME)
+ if is_initialized
+ else None
),
screen_brightness=TR.brightness__title if is_initialized else None,
haptic_feedback=(
diff --git a/core/src/trezor/ui/layouts/homescreen.py b/core/src/trezor/ui/layouts/homescreen.py
index a9f16a46..7639dd82 100644
--- a/core/src/trezor/ui/layouts/homescreen.py
+++ b/core/src/trezor/ui/layouts/homescreen.py
@@ -3,7 +3,7 @@ from typing import TYPE_CHECKING
import storage.cache as storage_cache
import trezorui_api
from storage.cache_common import APP_COMMON_BUSY_DEADLINE_MS
-from trezor import TR, ui
+from trezor import TR, ui, utils
if TYPE_CHECKING:
from typing import Any, Callable, Iterator, ParamSpec, TypeVar
@@ -72,7 +72,7 @@ class Homescreen(HomescreenBase):
super().__init__(
layout=_retry_with_gc(
trezorui_api.show_homescreen,
- label=label,
+ label=label or utils.MODEL_FULL_NAME,
notification=notification,
notification_level=notification_level,
lockable=lockable,
diff --git a/core/translations/en.json b/core/translations/en.json
index f6b02da6..f25286f5 100644
--- a/core/translations/en.json
+++ b/core/translations/en.json
@@ -514,9 +514,9 @@
"led__title": "LED",
"lockscreen__tap_to_connect": "Tap to connect",
"lockscreen__tap_to_unlock": "Tap to unlock",
- "lockscreen__unlock": "Unlock",
"lockscreen__title_locked": "Locked",
"lockscreen__title_not_connected": "Not connected",
+ "lockscreen__unlock": "Unlock",
"misc__decrypt_value": "Decrypt value",
"misc__enable_labeling": "Enable labeling?",
"misc__encrypt_value": "Encrypt value",
Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.