diff --git a/CHANGELOG.md b/CHANGELOG.md index c4c19d4..184f4a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog — 13ft (OTM fork) +## 0.4.1 — 2026-10-18 + +- Sign-in page restyled onto the platform's shared OTM sign-in standard: brand (name + tagline) above one centered card, the "Sign in with OTM" button full-width and primary, a muted Face ID/Touch ID/passkey line underneath. 13ft has no local accounts, so there's no "Other ways to sign in" step — the fail-closed "isn't wired to OTM yet" copy still shows when unconfigured. + ## 0.4.0 — 2026-10-18 First OTM release of the fork (upstream wasi-master/13ft 0.3.4 underneath). diff --git a/app/otm.py b/app/otm.py index 7ee1fbe..8f02d85 100644 --- a/app/otm.py +++ b/app/otm.py @@ -32,7 +32,7 @@ from typing import Any, Optional import requests -APP_VERSION = "0.4.0" +APP_VERSION = "0.4.1" OTM_AUDIENCE = "app:13ft" OTM_BASE = os.environ.get("OTM_SSO_AUTHORIZE_BASE", "https://admin.poweredbyotm.com") SESSION_COOKIE = "thirteen_session" @@ -246,18 +246,32 @@ SSO_REASONS = { def login_page(next_path: str, reason: Optional[str], configured: bool) -> str: msg = "" if reason: - msg = f'
{html_mod.escape(SSO_REASONS.get(reason, "Sign-in failed."))}
' + msg = f'{html_mod.escape(SSO_REASONS.get(reason, "Sign-in failed."))}
' if not configured: - msg = 'This 13ft isn\'t wired to OTM yet, so nobody can sign in. (Fails closed on purpose — it\'s a fetch proxy.)
' - button = ( - f'' + msg = 'This 13ft isn\'t wired to OTM yet, so nobody can sign in. (Fails closed on purpose — it\'s a fetch proxy.)
' + # OTM-only app (no local accounts) — step 2's primary button is the whole + # card, with the passkey helper line under it. There is no step 3 ("Other + # ways to sign in"): there is no other way. + card = msg + ( + f'Sign in with OTM' + '' + 'Your OTM account — Face ID, Touch ID or a passkey works there.
' if configured else "" ) return ( '' - 'Read the article without the cruft. Sign-in is by OTM account — one login for every OTM tool.
' - f'{msg}{button}{tides_beacon()}' + 'Read the article without the cruft.