@loop/database
Supabase client and repositories for the Loop Health health.* schema. Not used by Payload CMS (which has its own ORM) or Patient Graph (which uses Drizzle directly).
Installation
pnpm add @loop/databaseClient
import { createClient, createAdminClient, getClient, getAdminClient } from '@loop/database';
// Public client (respects RLS)
const client = createClient(supabaseUrl, anonKey);
// Admin client (bypasses RLS)
const adminClient = createAdminClient(supabaseUrl, serviceKey);
// Singleton getters
const client = getClient();
const admin = getAdminClient();Repositories
import { createRepositories } from '@loop/database';
const repos = createRepositories(supabaseClient);
// Available repositories
repos.users // UserRepository
repos.stacks // StackRepository
repos.labs // LabRepository
repos.biomarkers // BiomarkerRepository
repos.orders // OrderRepository
repos.cart // CartRepository
repos.products // ProductRepository
repos.notifications // NotificationRepository
repos.coas // COARepository
repos.embeddings // EmbeddingRepository
repos.faqs // FAQRepository
repos.researchPapers // ResearchPaperRepositoryKnowledge Base
Embedding-based search for the help center and Luna AI:
import {
generateEmbedding,
searchKnowledgeBase,
upsertArticleChunks,
} from '@loop/database';
// Generate embedding
const embedding = await generateEmbedding('How does BPC-157 work?');
// Search knowledge base
const results = await searchKnowledgeBase('peptide benefits', { limit: 5 });
// Index content
await upsertArticleChunks(articleId, chunks);Used By
@loop/database is used by backend applications that need direct database access:
- @loop/admin — Supabase client for CMS data
- @loop/my-loop-health — Health data repositories and queries
- @loop/call-booking — Call records and scheduling data
- @loop/embeddings-api — Indexing status tracking