# emanuelrendas/ai-showroom architecture

> Architecture diagram of the GitHub repository emanuelrendas/ai-showroom, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-27). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/emanuelrendas/ai-showroom
- Repository: https://github.com/emanuelrendas/ai-showroom

## Overview

AI Showroom is a Next.js application for authenticated users to navigate a shared Workspace → Project → Mission hierarchy backed by Supabase. Its primary workflow is signing in, opening a workspace, browsing or creating projects, then browsing or creating missions; Supabase Auth and RLS protect persistent shared data. The repository also contains a distinct Obsidian sync toolchain for guarded vault mutations and local pulls. The README documents the app’s security and persistence capabilities; sampled source confirms key sync-runner and mutation-pipeline calls. Unsampled route, query, action, and policy details limit some wiring.

Main entry points: [`lib/supabase/server.ts`](https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/lib/supabase/server.ts) (Server Client), [`tools/obsidian-sync/mutation-pipeline.ts`](https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/tools/obsidian-sync/mutation-pipeline.ts) (Mutation Pipeline), [`lib/supabase/client.ts`](https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/lib/supabase/client.ts) (Browser Client), [`tools/obsidian-sync/local-pull.ts`](https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/tools/obsidian-sync/local-pull.ts) (Local Pull)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_auth["Authentication"]
  node_sign_in_page["Sign-in Page<br/>[page.tsx]"]
  node_auth_form["Sign-in Form<br/>[sign-in-form.tsx]"]
  node_auth_actions["Auth Actions<br/>[actions.ts]"]
  node_auth_state["Auth State<br/>[auth-state.ts]"]
end

subgraph group_workspace["Workspace Workflow"]
  node_app_home["App Home<br/>[page.tsx]"]
  node_workspace_page["Workspace Page<br/>[page.tsx]"]
  node_workspace_shell["Workspace Shell"]
  node_workspace_actions["Workspace Actions<br/>[actions.ts]"]
  node_workspace_queries["Workspace Queries<br/>[queries.ts]"]
  node_workspace_form["Create Workspace"]
  node_project_page["Project Page<br/>[page.tsx]"]
  node_project_actions["Project Actions<br/>[actions.ts]"]
  node_project_queries["Project Queries<br/>[queries.ts]"]
  node_project_form["Create Project"]
  node_mission_page["Mission Page<br/>[page.tsx]"]
  node_mission_actions["Mission Actions<br/>[actions.ts]"]
  node_mission_queries["Mission Queries<br/>[queries.ts]"]
  node_mission_form["Create Mission"]
end

subgraph group_backend["Supabase Backend"]
  node_server_client["Server Client<br/>[server.ts]"]
  node_browser_client["Browser Client<br/>[client.ts]"]
  node_schema_types["Database Types<br/>[database.types.ts]"]
  node_supabase_auth(("Supabase Auth"))
  node_supabase_db[("Supabase Data")]
end

subgraph group_sync["Obsidian Sync"]
  node_vault_runner["Foundation Review"]
  node_closure_runner["Review Closure"]
  node_mutation_pipeline["Mutation Pipeline"]
  node_contract_validator["Contract Validator"]
  node_append_validator["Append Validator"]
  node_isolation_gate["Isolation Gate<br/>[isolation-gate.ts]"]
  node_git_transaction["Git Transaction<br/>[git-transaction.ts]"]
  node_local_pull["Local Pull<br/>[local-pull.ts]"]
end

node_user(("User"))
node_vault[("Obsidian Vault")]
node_git_remote(("Git Remote"))

node_user -->|"opens"| node_sign_in_page
node_sign_in_page -->|"renders"| node_auth_form
node_auth_form -->|"submits"| node_auth_actions
node_auth_actions -->|"uses"| node_server_client
node_server_client -->|"authenticates"| node_supabase_auth
node_auth_state -->|"reads session"| node_browser_client
node_browser_client -->|"authenticates"| node_supabase_auth
node_user -->|"opens"| node_app_home
node_app_home -->|"loads workspaces"| node_workspace_queries
node_workspace_page -->|"renders"| node_workspace_shell
node_workspace_shell -->|"loads workspace"| node_workspace_queries
node_workspace_form -->|"submits"| node_workspace_actions
node_workspace_actions -->|"uses"| node_server_client
node_workspace_queries -->|"uses"| node_server_client
node_workspace_page -->|"loads projects"| node_project_queries
node_project_form -->|"submits"| node_project_actions
node_project_actions -->|"uses"| node_server_client
node_project_page -->|"loads project"| node_project_queries
node_project_queries -->|"uses"| node_server_client
node_mission_form -->|"submits"| node_mission_actions
node_mission_actions -->|"uses"| node_server_client
node_mission_page -->|"loads mission"| node_mission_queries
node_mission_queries -->|"uses"| node_server_client
node_server_client -->|"reads and writes"| node_supabase_db
node_browser_client -->|"accesses"| node_supabase_db
node_schema_types -->|"types"| node_server_client
node_schema_types -->|"types"| node_browser_client
node_user -->|"initiates"| node_vault_runner
node_vault_runner -->|"executes"| node_mutation_pipeline
node_vault_runner -->|"executes"| node_local_pull
node_closure_runner -->|"executes"| node_mutation_pipeline
node_closure_runner -->|"executes"| node_local_pull
node_mutation_pipeline -->|"validates"| node_contract_validator
node_mutation_pipeline -->|"validates"| node_append_validator
node_mutation_pipeline -->|"checks isolation"| node_isolation_gate
node_mutation_pipeline -->|"commits changes"| node_git_transaction
node_git_transaction -->|"mutates"| node_vault
node_local_pull -->|"pulls into"| node_vault
node_local_pull -->|"fetches from"| node_git_remote

click node_sign_in_page "https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/app/(auth)/sign-in/page.tsx"
click node_auth_form "https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/features/auth/sign-in-form.tsx"
click node_auth_actions "https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/features/auth/actions.ts"
click node_auth_state "https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/features/auth/auth-state.ts"
click node_app_home "https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/app/(app)/app/page.tsx"
click node_workspace_page "https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/app/(app)/w/%5BworkspaceSlug%5D/page.tsx"
click node_workspace_shell "https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/features/workspaces/workspace-shell.tsx"
click node_workspace_actions "https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/features/workspaces/actions.ts"
click node_workspace_queries "https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/features/workspaces/queries.ts"
click node_workspace_form "https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/features/workspaces/create-workspace-form.tsx"
click node_project_page "https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/app/(app)/w/%5BworkspaceSlug%5D/projects/%5BprojectId%5D/page.tsx"
click node_project_actions "https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/features/projects/actions.ts"
click node_project_queries "https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/features/projects/queries.ts"
click node_project_form "https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/features/projects/create-project-form.tsx"
click node_mission_page "https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/app/(app)/w/%5BworkspaceSlug%5D/projects/%5BprojectId%5D/missions/%5BmissionId%5D/page.tsx"
click node_mission_actions "https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/features/missions/actions.ts"
click node_mission_queries "https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/features/missions/queries.ts"
click node_mission_form "https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/features/missions/create-mission-form.tsx"
click node_server_client "https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/lib/supabase/server.ts"
click node_browser_client "https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/lib/supabase/client.ts"
click node_schema_types "https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/lib/supabase/database.types.ts"
click node_vault_runner "https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/tools/obsidian-sync/foundation-review-runner.ts"
click node_closure_runner "https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/tools/obsidian-sync/review-closure-runner.ts"
click node_mutation_pipeline "https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/tools/obsidian-sync/mutation-pipeline.ts"
click node_contract_validator "https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/tools/obsidian-sync/contract-validator.ts"
click node_append_validator "https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/tools/obsidian-sync/append-only-validator.ts"
click node_isolation_gate "https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/tools/obsidian-sync/isolation-gate.ts"
click node_git_transaction "https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/tools/obsidian-sync/git-transaction.ts"
click node_local_pull "https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/tools/obsidian-sync/local-pull.ts"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_sign_in_page,node_auth_form,node_auth_actions,node_auth_state,node_user toneBlue
class node_app_home,node_workspace_page,node_workspace_shell,node_workspace_actions,node_workspace_queries,node_workspace_form,node_project_page,node_project_actions,node_project_queries,node_project_form,node_mission_page,node_mission_actions,node_mission_queries,node_mission_form,node_vault toneAmber
class node_server_client,node_browser_client,node_schema_types,node_supabase_auth,node_supabase_db toneMint
class node_vault_runner,node_closure_runner,node_mutation_pipeline,node_contract_validator,node_append_validator,node_isolation_gate,node_git_transaction,node_local_pull toneRose
class node_git_remote toneIndigo
```

## Components

### Authentication

- [Sign-in Page](https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/app/(auth)/sign-in/page.tsx): `app/(auth)/sign-in/page.tsx`
- [Sign-in Form](https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/features/auth/sign-in-form.tsx): `features/auth/sign-in-form.tsx`
- [Auth Actions](https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/features/auth/actions.ts): `features/auth/actions.ts`
- [Auth State](https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/features/auth/auth-state.ts): `features/auth/auth-state.ts`

### Workspace Workflow

- [App Home](https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/app/(app)/app/page.tsx): `app/(app)/app/page.tsx`
- [Workspace Page](https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/app/(app)/w/%5BworkspaceSlug%5D/page.tsx): `app/(app)/w/[workspaceSlug]/page.tsx`
- [Workspace Shell](https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/features/workspaces/workspace-shell.tsx): `features/workspaces/workspace-shell.tsx`
- [Workspace Actions](https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/features/workspaces/actions.ts): `features/workspaces/actions.ts`
- [Workspace Queries](https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/features/workspaces/queries.ts): `features/workspaces/queries.ts`
- [Create Workspace](https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/features/workspaces/create-workspace-form.tsx): `features/workspaces/create-workspace-form.tsx`
- [Project Page](https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/app/(app)/w/%5BworkspaceSlug%5D/projects/%5BprojectId%5D/page.tsx): `app/(app)/w/[workspaceSlug]/projects/[projectId]/page.tsx`
- [Project Actions](https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/features/projects/actions.ts): `features/projects/actions.ts`
- [Project Queries](https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/features/projects/queries.ts): `features/projects/queries.ts`
- [Create Project](https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/features/projects/create-project-form.tsx): `features/projects/create-project-form.tsx`
- [Mission Page](https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/app/(app)/w/%5BworkspaceSlug%5D/projects/%5BprojectId%5D/missions/%5BmissionId%5D/page.tsx): `app/(app)/w/[workspaceSlug]/projects/[projectId]/missions/[missionId]/page.tsx`
- [Mission Actions](https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/features/missions/actions.ts): `features/missions/actions.ts`
- [Mission Queries](https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/features/missions/queries.ts): `features/missions/queries.ts`
- [Create Mission](https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/features/missions/create-mission-form.tsx): `features/missions/create-mission-form.tsx`

### Supabase Backend

- [Server Client](https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/lib/supabase/server.ts): `lib/supabase/server.ts`
- [Browser Client](https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/lib/supabase/client.ts): `lib/supabase/client.ts`
- [Database Types](https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/lib/supabase/database.types.ts): `lib/supabase/database.types.ts`
- **Supabase Auth**
- **Supabase Data**

### Obsidian Sync

- [Foundation Review](https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/tools/obsidian-sync/foundation-review-runner.ts): `tools/obsidian-sync/foundation-review-runner.ts`
- [Review Closure](https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/tools/obsidian-sync/review-closure-runner.ts): `tools/obsidian-sync/review-closure-runner.ts`
- [Mutation Pipeline](https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/tools/obsidian-sync/mutation-pipeline.ts): `tools/obsidian-sync/mutation-pipeline.ts`
- [Contract Validator](https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/tools/obsidian-sync/contract-validator.ts): `tools/obsidian-sync/contract-validator.ts`
- [Append Validator](https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/tools/obsidian-sync/append-only-validator.ts): `tools/obsidian-sync/append-only-validator.ts`
- [Isolation Gate](https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/tools/obsidian-sync/isolation-gate.ts): `tools/obsidian-sync/isolation-gate.ts`
- [Git Transaction](https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/tools/obsidian-sync/git-transaction.ts): `tools/obsidian-sync/git-transaction.ts`
- [Local Pull](https://github.com/emanuelrendas/ai-showroom/blob/feature/milestone-1-foundation/tools/obsidian-sync/local-pull.ts): `tools/obsidian-sync/local-pull.ts`

### Other components

- **User**
- **Obsidian Vault**
- **Git Remote**

## Connections

- User → Sign-in Page: opens
- Sign-in Page → Sign-in Form: renders
- Sign-in Form → Auth Actions: submits
- Auth Actions → Server Client: uses
- Server Client → Supabase Auth: authenticates
- Auth State → Browser Client: reads session
- Browser Client → Supabase Auth: authenticates
- User → App Home: opens
- App Home → Workspace Queries: loads workspaces
- Workspace Page → Workspace Shell: renders
- Workspace Shell → Workspace Queries: loads workspace
- Create Workspace → Workspace Actions: submits
- Workspace Actions → Server Client: uses
- Workspace Queries → Server Client: uses
- Workspace Page → Project Queries: loads projects
- Create Project → Project Actions: submits
- Project Actions → Server Client: uses
- Project Page → Project Queries: loads project
- Project Queries → Server Client: uses
- Create Mission → Mission Actions: submits
- Mission Actions → Server Client: uses
- Mission Page → Mission Queries: loads mission
- Mission Queries → Server Client: uses
- Server Client → Supabase Data: reads and writes
- Browser Client → Supabase Data: accesses
- Database Types → Server Client: types
- Database Types → Browser Client: types
- User → Foundation Review: initiates
- Foundation Review → Mutation Pipeline: executes
- Foundation Review → Local Pull: executes
- Review Closure → Mutation Pipeline: executes
- Review Closure → Local Pull: executes
- Mutation Pipeline → Contract Validator: validates
- Mutation Pipeline → Append Validator: validates
- Mutation Pipeline → Isolation Gate: checks isolation
- Mutation Pipeline → Git Transaction: commits changes
- Git Transaction → Obsidian Vault: mutates
- Local Pull → Obsidian Vault: pulls into
- Local Pull → Git Remote: fetches from
