Cannula Robotics
← Platform
Platform

Tech stack

The pieces and why we chose them.

LayerChoiceWhy
Static siteAstro 5Pre-rendered HTML, MDX-driven content, zero runtime cost.
StylingTailwind v4CSS-first tokens; brand changes are a global swap.
HostingCloudflare Pages (cr-ai-intranet)Edge-deployed, integrated with the rest of CF.
AuthCloudflare AccessGoogle Workspace SSO at the edge, no in-app code.
Chat APIcr-ai-proxy Worker on cr-proxy.cannularobotics.comBearer-auth proxy that talks to Anthropic via AI Gateway.
AI GatewayCloudflare AI Gateway (cr-ai-gateway)Rate limits, cost caps, request inspection. Auto-fallback to direct on 401.
ModelClaude Opus 4.7 with ZDRDefault. Sonnet/Haiku selectable per request.
Retrievalcr-retrieval Worker on cr-retrieval.cannularobotics.comRAG over Notion + Granola + Drive.
EmbeddingsWorkers AI @cf/baai/bge-large-en-v1.5 (1024-dim)In-CF; cheap; swappable.
Vector storeCloudflare VectorizeOne index per source: cr-notion, cr-granola, cr-drive.
Sync stateCloudflare KV (cr-retrieval-sync-state)Per-source cursors and high watermarks.
Notion accessInternal integration token + REST API directlyWorkers-native fetch; no Node-shim libraries.
Drive accessGoogle OAuth refresh tokenUser-scoped, no service account, no domain-wide delegation.
Granola accessDrive-folder fallbackGranola exports notes into a Drive folder; we index from there.
IngestOn-demand via POST /api/admin/ingestCron paused until workers.dev subdomain is registered.
Repogithub.com/sjolundjohn/cannula-ai-intranetMonorepo (Astro site + two Workers).

Everything lives in a single CR Cloudflare account, separate from any other tenant.