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 +

RouteForge Logo

- Version + Version License Status Selfhosted @@ -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 if (authMode === 'error') return

{authError}
- const systemLine = system ? `${system.name} · ${system.version}` : 'RouteForge · v1.0.1' + const systemLine = system ? `${system.name} · ${system.version}` : 'RouteForge · v1.0.2' const title = { dashboard: 'Dashboard', asn: 'ASN Check', prefix: 'Prefix Check', preflight: 'Preflight', 'roa-planner': 'ROA Planner', 'bgp-visibility': 'BGP Visibility', reports: 'Reports', 'watch-mode': 'Watch Mode', 'change-cases': 'Change Cases', system: 'System', users: 'Users', audit: 'Audit Log', about: 'About' }[active] const proxyStatus = systemStatusError ? 'ERROR' : 'OK' const migrationStatus = systemStatus?.database?.migration_status || 'unknown' @@ -87,9 +87,10 @@ export default function App() { return ['dashboard', 'reports', 'watch-mode', 'change-cases', 'bgp-visibility', 'roa-planner', 'about'].includes(view) } const readOnlyLabel = system?.read_only ? 'Enabled' : 'Disabled' + const formatRole = (role?: string) => role ? role.charAt(0).toUpperCase() + role.slice(1) : '-' return - {active === 'dashboard' &&

{system?.name || 'RouteForge'} {system?.version || 'v1.0.1'}

Current user: {currentUser?.username || '-'}

Role: {currentUser?.role || '-'}

Read-only: {readOnlyLabel}

Mode: {system?.demo_mode ? 'DEMO' : 'LIVE'}

{system?.demo_mode &&

Demo mode is active.

}

Quick Actions

{role === 'admin' && }
{migrationsBlocked &&
Database migrations are required before using RouteForge. Run: alembic current, alembic heads, alembic upgrade head.
}
} + {active === 'dashboard' &&

{system?.name || 'RouteForge'} {system?.version || 'v1.0.2'}

Current user: {currentUser?.username || '-'}

Role: {formatRole(currentUser?.role)}

Read-only: {readOnlyLabel}

Mode: {system?.demo_mode ? 'DEMO' : 'LIVE'}

{system?.demo_mode &&

Demo mode is active.

}

Quick Actions

{role === 'admin' && }
{migrationsBlocked &&
Database migrations are required before using RouteForge. Run: alembic current, alembic heads, alembic upgrade head.
}
} {!canAccess(active) &&
You do not have permission to access this section.
} {active === 'asn' && canAccess('asn') && } {active === 'prefix' && canAccess('prefix') && } @@ -102,6 +103,6 @@ export default function App() { {active === 'system' && canAccess('system') &&
{systemStatusError &&
{systemStatusError}
}{migrationsBlocked &&
Database migrations are required before using RouteForge. Run: alembic current, alembic heads, alembic upgrade head.
}{systemStatus &&
Version: {systemStatus.version}
Mode: {systemStatus.mode}
API Proxy: {proxyStatus}
Migration Status: {migrationStatus}
DB Current Revision: {systemStatus.database?.schema_version || 'unknown'}
DB Head Revision: {systemStatus.database?.migration_head || 'unknown'}
}
} {active === 'users' && canAccess('users') && } {active === 'audit' && canAccess('audit') && } - {active === 'about' &&

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.

} + {active === 'about' &&

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.

}
}