563716fa76
- Add $state-based entity cache layer with 30s TTL, request deduplication, and local mutation helpers (entity-cache.svelte.ts + caches.svelte.ts) - Wire all 10 page components to use shared caches for cross-page data - Add slide animation for nav tree expand/collapse with rotating chevron - Remove aggregate count badges from container nav nodes (keep on leaves) - Convert Targets from flat leaf to group with per-type children (Telegram, Webhook, Email, Discord, Slack, ntfy, Matrix) - Add URL-based type filtering on Targets page with per-type descriptions - Add Bots group children for Email and Matrix alongside Telegram - Tab-based routing for bots page (?tab=telegram/email/matrix) - Add per-type target counts and email/matrix bot counts to /status/counts - Split CLAUDE.md into focused context files under .claude/docs/ - Fix .gitignore: scope lib/ to root, allow .claude/docs/ tracking - Clear all caches on logout - Reset form state when switching target type tabs
1.2 KiB
1.2 KiB
Backend Architecture Notes
Stack
- FastAPI REST API + SQLite — async SQLAlchemy via sqlmodel, auto-created on startup with migrations.
packages/core(notify_bridge_core): Shared library — providers, models, notifications, templates. No DB dependency. Includesjinja2dependency.packages/server(notify_bridge_server): FastAPI REST API + SQLite. Depends on core.
Environment Variables
NOTIFY_BRIDGE_DATA_DIR,NOTIFY_BRIDGE_SECRET_KEY,NOTIFY_BRIDGE_DATABASE_URL
Key Constraints
- SQLAlchemy async + aiohttp: Cannot nest
async with aiohttp.ClientSession()inside a route that has an active SQLAlchemy async session — greenlet context breaks. Eagerly load all DB data before entering aiohttp context. - Jinja2 SandboxedEnvironment: All template rendering MUST use
from jinja2.sandbox import SandboxedEnvironment. - System-owned entities:
user_id=0means system-owned (e.g. default templates). - FastAPI route ordering: Static path routes MUST be registered BEFORE parameterized routes.
__pycache__: Add to.gitignore. Never commit.
API
- All CRUD routes under
/api/, auth via JWT Bearer,NOTIFY_BRIDGE_env prefix.