# Brand Kit ## Status The current working tree implements Brand Kit as a real workspace-owned domain under `app/brand/` with `/v1/brand` REST routes, frontend brand-kit feature modules, TypeScript/Python SDK resources, MCP brand tools, and an n8n `MediaBrandKit` node. Authoritative PostgreSQL migrations, RLS runtime certification, Docker/Hugging Face runtime verification, and final production certification remain deferred until all planned product phases are complete. ## Domain model `BrandKit` and `BrandKitVersion` are the canonical records. A kit owns versions through `brand_kit_versions`, includes workspace/creator ownership fields, and tracks `status`, timestamps, and an `active_version_id`. Versions store bounded branding fields such as colors, fonts, voice/tone metadata, asset references, watermark settings, and a `metadata` JSON column mapped safely away from the SQLAlchemy reserved `metadata` attribute. ## API | Method | Endpoint | Purpose | |---|---|---| | `GET` | `/v1/brand` | List workspace brand kits with active version metadata. | | `POST` | `/v1/brand` | Create a workspace brand kit. | | `PATCH` | `/v1/brand/{brand_kit_id}` | Update a workspace brand kit. | | `DELETE` | `/v1/brand/{brand_kit_id}` | Delete a workspace brand kit. | `POST /v1/brand` accepts `name`, optional `description`, and `initial_version` payload data. The response surface returns the kit plus its current `active_version_id`; it does not expose invitation tokens or secret fields. Version-specific brand-kit routes are **not exposed** in the current backend contract. Python and TypeScript SDKs therefore fail closed with `NotImplementedError` for `get_version` and `create_version` instead of inventing endpoints. ## Frontend The frontend uses `/v1/brand` through `frontend/features/brand-kits/api/index.ts`. Brand kits appear in workspace settings navigation with `permission: "admin"`, and capability discovery treats the brand area as active when the backend advertises the expected routes. ## SDK Both official SDKs use `/v1/brand` for list/get/create/update/delete operations. The Python client is defined in `sdk/python/media_platform/brand_kits.py`, and the TypeScript client is defined in `sdk/typescript/src/resources/brand-kits.ts`. Static contract tests verify route paths, request bodies, and fail-closed versioned-operation behavior. ## MCP and n8n MCP registers narrow typed brand tools through `app/mcp/tools/brand.py` and `app/mcp/server.py`. The official n8n `MediaBrandKit` node consumes the shared MediaRouter SDK/credential boundary; no provider credentials or raw brand documents are exposed to n8n transports. ## Security and runtime Brand kit routes reuse the existing API-key authentication, scoped workspace context, and structured audit boundary. Sensitive fields remain backend-only. PostgreSQL FORCE RLS, migration ordering, and provider-facing certification are intentionally deferred to the final production certification phase.