Files
notify-bridge/.claude/docs/backend-architecture.md
alexei.dolgolyov 563716fa76 feat: entity cache system, nav UX improvements, split CLAUDE.md
- 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
2026-03-21 23:35:50 +03:00

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. Includes jinja2 dependency.
  • 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=0 means 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.