- Sovereign AI Agent System
- Your agents.
Your hardware.
Your sats.
-
- A local-first AI command center. Talk to Timmy, coordinate your swarm,
- gate API access with Bitcoin Lightning — no cloud AI, no telemetry, no compromise.
-
-
- Full Test Suite Passing
- FastAPI + HTMX
- Lightning L402
- No Cloud AI
- Multi-Agent Swarm
- MIT License
-
-
-
-
-
-
-
-
+
diff --git a/src/config.py b/src/config.py
index d145b0a..231fb87 100644
--- a/src/config.py
+++ b/src/config.py
@@ -72,6 +72,10 @@ class Settings(BaseSettings):
# Default is False (telemetry disabled) to align with sovereign AI vision.
telemetry_enabled: bool = False
+ # CORS allowed origins for the web chat interface (GitHub Pages, etc.)
+ # Set CORS_ORIGINS as a comma-separated list, e.g. "http://localhost:3000,https://example.com"
+ cors_origins: list[str] = ["*"]
+
# Environment mode: development | production
# In production, security settings are strictly enforced.
timmy_env: Literal["development", "production"] = "development"
diff --git a/src/dashboard/app.py b/src/dashboard/app.py
index 17058f9..0447f72 100644
--- a/src/dashboard/app.py
+++ b/src/dashboard/app.py
@@ -5,6 +5,7 @@ from contextlib import asynccontextmanager
from pathlib import Path
from fastapi import FastAPI, Request
+from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import HTMLResponse
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates
@@ -170,6 +171,14 @@ app = FastAPI(
redoc_url="/redoc" if settings.debug else None,
)
+app.add_middleware(
+ CORSMiddleware,
+ allow_origins=settings.cors_origins,
+ allow_credentials=True,
+ allow_methods=["*"],
+ allow_headers=["*"],
+)
+
templates = Jinja2Templates(directory=str(BASE_DIR / "templates"))
app.mount("/static", StaticFiles(directory=str(PROJECT_ROOT / "static")), name="static")