Saga – LinkedIn content copilot
Open full-size image ↗
Category: Client SaaS (Stratas product, Stripe-billed)
Status: Live, active development
Time window: May 2026 → ongoing (380 commits since split from monorepo)
Live URL: https://saga.stratas.no (legacy alias saga.stratas.no)
Purpose
A LinkedIn content copilot that drafts weekly posts from a user's own work, schedules them, and posts to personal profiles or company Pages – with a two-sided confidentiality gate that stops client pipeline data from ever entering the prompt.
Who it is for
Operators, founders, and consultants who want to publish on LinkedIn from real work but do not have hours per week to draft and schedule.
Stack
- Frontend: Next.js 15 (App Router) + React 19
- Auth: NextAuth (LinkedIn OAuth, dual-app flow for personal login + org posting)
- Backend: Trigger.dev v4 (per-user weekly
schedules.task, 3-retry budget) - Data: Supabase (dedicated
linkedinschema) - LLM / AI: Anthropic Claude – Opus 4.6 (chat), Sonnet 4.6 (batch drafts), Haiku 4.5 (verification only)
- Payments: Stripe
- Observability: Langfuse (every Claude call traced with resolved user ID)
My contribution
Shaped the copilot through direct product use, investigated the confidentiality incident and translated it into product and engineering requirements. Designed and implemented input and output checks, added regression tests, and carried the changes into production and ongoing use.
Notable capabilities
- Two-sided confidentiality gate:
detectConfidentialLeakon the way out +isConfidentialMetric+protectedClientNames()on the way in - Model stratification with cost tags per call; per-route/context spend totals in Langfuse
- LinkedIn scope parsing tolerant of both comma and space delimiters (LinkedIn returns granted scopes both ways)
- Per-user weekly draft scheduling migrated from Vercel cron (global) to Trigger.dev v4 (per-user, retryable)
- Vision-pass reads of user dashboards without leaking dashboard UI vocabulary as proper nouns
Outcome
208 test files with 3,485+ assertions. Three eval suites (brand adherence, draft quality, framing A/B, avatar likeness). Confidentiality regression that triggered PR #345 has not recurred. 80%+ coverage house rule enforced.
Evidence
- Case study: Related case study
- Live: saga.stratas.no
- Key files:
shared/publish-gate.ts,shared/work-prompt.ts,src/lib/linkedin-org-oauth.ts,src/lib/claude.ts,evals/*.eval.test.ts
Skills demonstrated
nextjs-15, react-19, nextauth-linkedin-oauth, trigger-dev-v4, supabase-schema-isolation, claude-opus, claude-sonnet, claude-haiku, langfuse-per-call-tagging, stripe, ai-safety-gates, evaluation-suites, oauth-scope-parsing, vitest
Want to discuss the decisions behind it?
Over fifteen years of consulting and growth, and hands-on AI delivery from discovery to daily operations. I can share my CV and talk through how I connect business outcomes with systems that run.
Available for a chat. In person in Stavanger, or remotely worldwide.