{system?.name || 'RouteForge'} {system?.version || 'v1.0.1'}
Current user: {currentUser?.username || '-'}
Role: {currentUser?.role || '-'}
Read-only: {readOnlyLabel}
Mode: {system?.demo_mode ? 'DEMO' : 'LIVE'}
Demo mode is active.
}diff --git a/README.md b/README.md index d67bda0..8c99426 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,10 @@ +# BGP, RPKI and ROA Preflight Validation Tool +
-
+
@@ -61,7 +63,7 @@ Using read-only checks before execution helps teams validate assumptions without
## Current Release
-RouteForge is a **stable** self-hosted release for production-grade read-only validation workflows. Current release: **v1.0.1**.
+RouteForge is a **stable** self-hosted release for production-grade read-only validation workflows. Current release: **v1.0.2**.
## Quickstart with Docker Compose
diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md
index 0df4769..5e5afda 100644
--- a/RELEASE_NOTES.md
+++ b/RELEASE_NOTES.md
@@ -1,3 +1,11 @@
+## v1.0.2 (2026-05-22)
+
+- Final text polish and release metadata cleanup for the stable release line.
+- Updated backend/frontend/API-visible versions to v1.0.2 / 1.0.2.
+- Normalized dashboard role label display to Admin/Operator/Viewer while keeping API role values lowercase.
+- Corrected About maintainer line to "Built and maintained by Noisens."
+- README cleanup: SEO H1 added, release badge/status updated, and current release set to v1.0.2.
+
## v1.0.1 (2026-05-22)
- Polished the global layout and removed redundant runtime badges from the live header.
diff --git a/ROADMAP.md b/ROADMAP.md
index e6bf9f3..8425012 100644
--- a/ROADMAP.md
+++ b/ROADMAP.md
@@ -1,7 +1,7 @@
# RouteForge Roadmap
## Current Status
-RouteForge is now **v1.0.1 stable**: a selfhosted, read-only routing preflight release for production-oriented validation workflows.
+RouteForge is now **v1.0.2 stable**: a selfhosted, read-only routing preflight release for production-oriented validation workflows.
## v1.0.0 Completed Scope
The stable release includes:
diff --git a/backend/app/api/routes_system.py b/backend/app/api/routes_system.py
index 6b2928c..e5fc98e 100644
--- a/backend/app/api/routes_system.py
+++ b/backend/app/api/routes_system.py
@@ -12,7 +12,7 @@
def system_info():
return {
'name': 'RouteForge',
- 'version': 'v1.0.1',
+ 'version': 'v1.0.2',
'demo_mode': settings.demo_mode,
'read_only': True,
'data_sources': ['RIPEstat', 'RIPEstat Whois/Registry'],
diff --git a/backend/app/core/system_status.py b/backend/app/core/system_status.py
index cf1f5f8..886fd22 100644
--- a/backend/app/core/system_status.py
+++ b/backend/app/core/system_status.py
@@ -153,7 +153,7 @@ def build_system_status(engine: Engine | None) -> dict:
return {
"status": "ok",
"name": settings.app_name,
- "version": "v1.0.1",
+ "version": "v1.0.2",
"read_only": True,
"mode": "demo" if settings.demo_mode else "live",
"demo_mode": settings.demo_mode,
diff --git a/backend/app/main.py b/backend/app/main.py
index 8cf567a..84f8982 100644
--- a/backend/app/main.py
+++ b/backend/app/main.py
@@ -20,7 +20,7 @@
logging.basicConfig(level=getattr(logging, settings.log_level.upper(), logging.INFO))
logger = logging.getLogger("routeforge")
-app = FastAPI(title="RouteForge", version="1.0.1")
+app = FastAPI(title="RouteForge", version="1.0.2")
app.add_middleware(
CORSMiddleware,
diff --git a/backend/pyproject.toml b/backend/pyproject.toml
index 4a1053b..957212e 100644
--- a/backend/pyproject.toml
+++ b/backend/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "routeforge-backend"
-version = "1.0.1"
+version = "1.0.2"
description = "RouteForge backend"
license = "AGPL-3.0-or-later"
requires-python = ">=3.12"
diff --git a/backend/tests/test_api_smoke.py b/backend/tests/test_api_smoke.py
index ed99135..a57f4af 100644
--- a/backend/tests/test_api_smoke.py
+++ b/backend/tests/test_api_smoke.py
@@ -177,7 +177,7 @@ def test_system_status_endpoint() -> None:
response = client.get('/api/system/status')
assert response.status_code == 200
payload = response.json()
- assert payload.get('version') == 'v1.0.1'
+ assert payload.get('version') == 'v1.0.2'
assert payload.get('read_only') is True
assert payload.get('database', {}).get('status')
assert payload.get('ripestat', {}).get('cache_ttl_seconds') is not None
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index bfa79d2..2115e38 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "routeforge-frontend",
- "version": "0.9.1-rc",
+ "version": "1.0.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "routeforge-frontend",
- "version": "0.9.1-rc",
+ "version": "1.0.2",
"license": "AGPL-3.0-or-later",
"dependencies": {
"react": "^18.3.1",
diff --git a/frontend/package.json b/frontend/package.json
index c142456..e386444 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -1,6 +1,6 @@
{
"name": "routeforge-frontend",
- "version": "1.0.1",
+ "version": "1.0.2",
"private": true,
"license": "AGPL-3.0-or-later",
"type": "module",
diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx
index 9ced8d1..ebfc9c4 100644
--- a/frontend/src/App.tsx
+++ b/frontend/src/App.tsx
@@ -74,7 +74,7 @@ export default function App() {
if (authMode === 'login') return
Current user: {currentUser?.username || '-'}
Role: {currentUser?.role || '-'}
Read-only: {readOnlyLabel}
Mode: {system?.demo_mode ? 'DEMO' : 'LIVE'}
Demo mode is active.
}alembic current, alembic heads, alembic upgrade head.Current user: {currentUser?.username || '-'}
Role: {formatRole(currentUser?.role)}
Read-only: {readOnlyLabel}
Mode: {system?.demo_mode ? 'DEMO' : 'LIVE'}
Demo mode is active.
}alembic current, alembic heads, alembic upgrade head.alembic current, alembic heads, alembic upgrade head.RouteForge is a read-only routing operations console for validation workflows.
Read-only: All checks are non-destructive.
Version: {system?.version || 'v1.0.1'}
Build and maintained by Norman Sens.
RouteForge is a read-only routing operations console for validation workflows.
Read-only: All checks are non-destructive.
Version: {system?.version || 'v1.0.2'}
Built and maintained by Noisens.