diff --git a/backend/services/local_jwt.py b/backend/services/local_jwt.py
index aff8b9b..0f3d759 100644
--- a/backend/services/local_jwt.py
+++ b/backend/services/local_jwt.py
@@ -32,14 +32,17 @@ def decode_token(token: str) -> dict[str, Any] | None:
secret = settings.auth_jwt_secret
if not secret:
return None
- try:
- return jwt.decode(
- token,
- secret,
- algorithms=[ALGORITHM],
- issuer="periscope-local",
- options={"verify_aud": False},
- leeway=10,
- )
- except jwt.PyJWTError:
- return None
+ # Accept pre-rebrand issuer so existing sessions keep working.
+ for issuer in ("periscope-local", "pinscope-local"):
+ try:
+ return jwt.decode(
+ token,
+ secret,
+ algorithms=[ALGORITHM],
+ issuer=issuer,
+ options={"verify_aud": False},
+ leeway=10,
+ )
+ except jwt.PyJWTError:
+ continue
+ return None
diff --git a/frontend/content/changelog.md b/frontend/content/changelog.md
index 1a4b1ca..332ca04 100644
--- a/frontend/content/changelog.md
+++ b/frontend/content/changelog.md
@@ -2,6 +2,14 @@
What's new in Periscope.
+## 2.29.1 — 2026-09-13 — Fix sign-in /login 404 after rebrand
+
+Landing CTAs pointed at `/login`, which did not exist (page is `/sign-in`). Added redirects, accepted legacy JWT issuer `pinscope-local`, and CORS for both Periscope and Pinscope hosts.
+
+- [Fixed] `/login` → `/sign-in`, `/register` → `/sign-up`; marketing links updated.
+- [Fixed] JWT decode accepts `pinscope-local` issuer from pre-rebrand sessions.
+- [Fixed] Deploy script CORS includes both public hostnames.
+
## 2.29.0 — 2026-09-13 — Rebrand to Periscope
Product name, package (`periscopex`), Docker containers, deploy script, and default site URL are now **Periscope** (`https://periscope.michelebigi.it`). Deterministic finding IDs use the `PE-*` prefix. Existing project.json `pinscope_version` and browser storage keys are still read.
diff --git a/frontend/next.config.ts b/frontend/next.config.ts
index 5e872b2..80eaadd 100644
--- a/frontend/next.config.ts
+++ b/frontend/next.config.ts
@@ -27,6 +27,12 @@ const nextConfig: NextConfig = {
canvas: { browser: "" },
},
},
+ async redirects() {
+ return [
+ { source: "/login", destination: "/sign-in", permanent: false },
+ { source: "/register", destination: "/sign-up", permanent: false },
+ ];
+ },
async headers() {
return [
{
diff --git a/frontend/src/app/(marketing)/contact/nav.tsx b/frontend/src/app/(marketing)/contact/nav.tsx
index 3be5a69..a293e85 100644
--- a/frontend/src/app/(marketing)/contact/nav.tsx
+++ b/frontend/src/app/(marketing)/contact/nav.tsx
@@ -44,12 +44,12 @@ export function Nav() {
) : (
<>
-
+
-
+