# Changelog All notable changes to Chat Switchboard. ## [0.12.0] β€” 2026-02-25 ### Added - **File handling and vision support.** Upload images, PDFs, and documents into chat via πŸ“Ž button, drag-and-drop, or paste. Multimodal message assembly injects base64 images for vision-capable models and extracted text for documents. Staged attachment strip shows upload progress and extraction status. Auth-aware blob rendering with Bearer tokens. Image lightbox viewer. Vision capability hints on image attachments. - **Storage backend abstraction.** `ObjectStore` interface with two implementations: PVC (local filesystem) for single-node/dev and S3 (minio-go) for multi-node production. S3 backend works with any S3-compatible API: MinIO, Ceph RGW, AWS S3. Auto-detection when `STORAGE_BACKEND` is not set (tries PVC, disables if not writable). Both backends share identical semantics β€” all handlers, attachment CRUD, multimodal assembly, and orphan cleanup work regardless of backend. - **S3 configuration.** `S3_ENDPOINT`, `S3_BUCKET`, `S3_ACCESS_KEY`, `S3_SECRET_KEY`, `S3_REGION`, `S3_PREFIX`, `S3_FORCE_PATH_STYLE` env vars. Endpoint auto-detects SSL from scheme. Path-style URLs default on (required for MinIO/Ceph). Optional key prefix for shared buckets. CI pipeline syncs S3 secrets to K8s when `STORAGE_BACKEND=s3`. - **Text extraction pipeline.** PDF, DOCX, XLSX, PPTX, ODT, RTF text extraction via filesystem-based queue. Inline and sidecar modes. Crash recovery for items stuck in processing state. - **Admin storage panel.** Backend health, file count, total size, orphan detection and cleanup. Shows PVC path or S3 endpoint/bucket depending on active backend. Extraction queue status. - **Vault CLI commands.** `switchboard vault rekey` re-encrypts all provider API keys when rotating the encryption key. `switchboard vault status` shows encryption health. Admin UI encryption status indicator in Settings tab. - **Per-chat model persistence.** Server-side `channels.settings` JSONB field stores `last_selector_id`. Roams across devices with localStorage write-through cache as fallback. ## [0.11.0] β€” 2026-02-25 ### Added - **Browser extension system.** Full lifecycle: manifest registration, script injection, scoped context (`ctx.renderers`, `ctx.tools`, `ctx.events`, `ctx.storage`, `ctx.ui`), permission-aware API proxying. Extensions self- register via `Extensions.register()` and receive isolated contexts during `initAll()`. Admin CRUD endpoints, asset serving (public, no auth needed for `