docs/thinking/2026-03-04-os-access-controls

OS Access Controls — Audit & Forward-Looking Design

2026-03-04


Current State

What exists today

The dashboard lives on Vercel behind Google OAuth, restricted to @daisyai.ai emails. Once you're in, you see everything — fundraising, clients, network, personal logs. Two people, full trust, no roles.

Where credentials live

CredentialLocationCommitted to git?
Neon DB (DATABASE_URL).env.local, Vercel envYes (in history)
Neon MCP token.mcp.jsonYes
Linear API key.mcp.jsonYes
Google Workspace MCP OAuth.mcp.jsonYes
Google OAuth (dashboard).env.local, Vercel envNo
Anthropic API key.envYes (in history)
Apollo API key.env, .env.localYes (in history)
AUTH_SECRET.env.local, Vercel envNo

Risk: .mcp.json and .env are tracked in git. Anyone with repo access can read all keys from commit history. Fine for two founders in a private repo. Not fine with 5+ people.

Services connected

ServiceWhat it doesAccess level
Neon PostgresForum, gallery, graph dataFull DB owner
LinearIssue trackingFull workspace
Google Workspace MCPGmail, Drive, Calendar, Docs, SheetsCore tier (read/write)
ApolloPeople search, contact enrichmentFull API
VercelDashboard hostingTeam admin
GitHub (daisyai-ai/OS)Source of truthPrivate org repo
SlackAgent notifications → #daisy-agentsWebhook (write-only)
Google MeetMeeting polling via service accountDomain-wide delegation

Dashboard data exposure

Once authenticated, a user can:

  • Read any file in the repo (fundraising pipeline, investor notes, client details, personal logs)
  • Use the chat tool (Claude with full OS context)
  • Post to forum/gallery under any name (no server-side identity attribution)
  • Search Apollo contacts (costs credits)
  • Delete CRM accounts

What changes at different scales

5 people (first hires)

Problem: Everyone sees everything. New engineer sees investor term sheets and client pricing. Not great.

Minimum viable changes:

  • Move all secrets out of git. Use Vercel env vars + a .mcp.json.example template. Each person configures their own MCP locally.
  • Rotate every key that's been in git history (Neon, Linear, Anthropic, Apollo, Google OAuth).
  • Forum/gallery: attribute posts to the authenticated session user, not a free-text name field.

Nice to have:

  • Role-based dashboard sections. Simple: admin vs member. Admins see fundraising + client financials. Members see everything else.
  • Per-person Linear API keys instead of a shared org key.

10 people (small team)

Problem: You need actual roles. An engineer shouldn't see investor pipeline details. A BDR shouldn't have access to modify the product roadmap in Linear.

Changes:

  • Google Workspace groups → map to dashboard roles (e.g., eng@daisyai.ai, gtm@daisyai.ai, leadership@daisyai.ai)
  • Dashboard middleware checks group membership, gates sections:
SectionLeadershipEngGTM
DashboardYesYesYes
ClientsYesRead-onlyYes
FundraisingYesNoNo
NetworkYesNoYes
HuddlesYesYesYes
Forum/GalleryYesYesYes
Personal logsOwn onlyOwn onlyOwn only
Chat (Claude)Full contextEng contextGTM context
  • Secrets management: move to something real (Vercel env vars for dashboard, 1Password/Doppler for shared dev secrets).
  • GitHub: branch protection on main, PR reviews required.

50 people (company)

Problem: This markdown-based OS probably doesn't scale to 50 people as-is. But the access model still matters.

Changes:

  • SSO (Google Workspace SAML or OIDC) with SCIM provisioning
  • RBAC with actual permission system (not just "admin vs member")
  • Audit logging (who accessed what, when)
  • The OS becomes more of a leadership tool; most employees use Linear, Slack, Docs directly
  • API routes need per-endpoint authorization, not just "authenticated = full access"
  • Data classification: investor data is confidential, client data is restricted, public content is public

External access (investors, advisors)

Never give them dashboard access. The OS contains competitive intel, client details, and internal strategy they shouldn't see.

Instead:

  • Investors: Share specific materials via Google Drive links with expiry. Use the data room pattern — curated folder with financials, deck, product demo. Read-only.
  • Advisors: Case by case. Some advisors (like a clinical advisor) might get access to specific client context. Create a read-only view or just share specific docs.
  • Board members (eventually): Dedicated board portal or a filtered dashboard view showing only board-relevant metrics and materials.

Immediate action items

These aren't urgent but should happen before the next hire:

  1. Add .mcp.json to .gitignore, create .mcp.json.example with placeholder values
  2. Rotate keys that have been in git history (Neon password, Linear key, Anthropic key, Apollo key)
  3. Attribute forum/gallery posts to authenticated session email instead of free-text name
  4. Remove OAUTHLIB_INSECURE_TRANSPORT=1 from committed config

Design principle

Start open, narrow as you grow. The cost of premature access control is friction and complexity when you're moving fast. The cost of too-late access control is a security incident or an awkward conversation with an employee who saw something they shouldn't have.

Right now: two founders, full trust, everything visible. That's correct. Just be ready to tighten when the first hire happens.

Daisy

v1

What do you need?

I can pull up the fundraise pipeline, CRM accounts, hot board, meeting notes — anything in the OS.

Sonnet · read-only