Feather DB Cloud Edition.
v0.10 replaces the legacy Gradio dashboard with a brand-aligned admin SPA and adds the connective tissue needed to run Feather as a managed context engine — pluggable embeddings, in-memory observability, and 20+ new REST endpoints.
At a glance
Added — Atlas-style admin SPA
feather-api/static/admin/
New single-page admin UI mounted at /admin/ (HTML + Tailwind via CDN + Alpine.js + D3, ~2k LOC, zero build step). Served by FastAPI with Cache-Control: no-cache so each deploy is picked up without manual refresh.
- ·Overview screen — 4 record-count tiles + 4 ops/latency tiles + ops-per-minute sparkline + recent-activity feed.
- ·Namespaces list with create-namespace modal.
- ·Namespace detail with 7 tabs: Records · Search · Schema · Hierarchy · Graph · Context · Console.
- ·Record drawer with Metadata + Edges tabs, add-edge form, edit-record form.
- ·Marketing profile card — when a record has
brand,channel,campaign,ctr,roasattributes, render as a KPI card. - ·Cmd-K command palette — fuzzy search namespaces, jump to record by id, trigger actions.
- ·Settings — connection info (cURL / Python / JS snippets), embedding service config, API key management.
Brand-aligned per the Feather DB brand book: paper #fcfaf7 surfaces, Geist + Geist Mono + Playfair Display italic type, lime as gesture only, ink-black primary CTAs. Removed the Gradio dashboard (~1300 LOC).
Added — pluggable embedding service
feather-api/app/embedding.py
Six providers ship out of the box with curated model dropdowns. Stored in-memory; API key never echoed back. Pad/truncate to namespace dim is automatic if a different-dim model is configured.
# configure via REST
PUT /v1/admin/embedding_config
{
"provider": "openai",
"model": "text-embedding-3-small",
"api_key": "sk-..."
}
# then one-call embed + store
POST /v1/{ns}/ingest_text
{ "text": "...", "metadata": { "namespace_id": "acme" } }Added — in-memory observability
feather-api/app/metrics.py
Ring-buffer for HTTP ops (default 2000 events). Snapshot endpoint exposes p50 / p95 / p99 latency and bucketed time-series for sparkline rendering. HTTP middleware records every /v1/* request — no external dependency.
GET /v1/admin/overview # cluster stats
GET /v1/admin/metrics # p50 / p95 / p99 + ops counts
GET /v1/admin/activity # recent ops feed
GET /v1/admin/ops_timeseries # buckets for sparkline
GET /v1/admin/connection_info # copy-paste cURL / Python / JSAdded — REST endpoints
20+ new REST endpoints
Full surface for the managed context engine — namespaces CRUD, server-side embed, bulk import, discovery, maintenance.
POST /v1/namespaces create
DELETE /v1/namespaces/{ns} hard-delete
GET /v1/{ns}/schema distinct attribute keys + samples
GET /v1/{ns}/hierarchy Brand → Channel → Campaign tree
GET /v1/{ns}/top_recalled recall_count desc
GET /v1/{ns}/graph D3-shaped nodes + links
POST /v1/{ns}/context_chain vector search + BFS expansion
POST /v1/{ns}/purge bulk hard-delete by namespace_id
POST /v1/{ns}/compact rebuild HNSW (drops soft-deleted)
POST /v1/{ns}/seed bulk-insert N random records
POST /v1/{ns}/import bulk import inline records
POST /v1/{ns}/ingest_text embed + store via provider
GET /v1/{ns}/records/{id}/edges outgoing + incoming edgesBug fixes
Delete persistence (C++ save_vectors)
forget() and purge() now properly skip records in the persisted file. Previously, forgotten vectors resurrected on save+reload as orphans. Fixes a 6-month-old data-correctness bug.
Big-int id precision
Dashboard preserves >2^53 record ids as strings through JSON parse so view / delete works on huge ids. Seeded ids capped at 2^53 - 1 going forward.
Gemini default model
Switched to gemini-embedding-001 — Google deprecated text-embedding-004.
Removed
Legacy Gradio dashboard
- ·
feather-api/dashboard.py - ·
feather-api/Dockerfile.dashboard - ·
feather-dashboardservice fromdocker-compose.yml
Where to go next
Try the Cloud Edition in 5 minutes
Spin up the Docker image and open http://localhost:8000/admin/.
git clone https://github.com/feather-store/feather.git
cd feather
docker compose -f feather-api/docker-compose.yml build
FEATHER_API_KEY="feather-$(openssl rand -hex 16)" \
docker compose -f feather-api/docker-compose.yml up -d