# facundodlf/agentic-marketing-team architecture

> Architecture diagram of the GitHub repository facundodlf/agentic-marketing-team, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-12). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/facundodlf/agentic-marketing-team
- Repository: https://github.com/facundodlf/agentic-marketing-team

## Overview

This is a Nuxt marketing-team dashboard, with a concrete news workflow: a user scans news or submits a URL, the scraper API extracts and ideates news, and the review UI displays ideas that can be approved or discarded. The composable synchronizes ideas and status changes through API routes; the server uses Firebase/Firestore and Gemini. The tree also shows copywriting, newsroom editing, leads, inbox, and orchestration areas, but their runtime wiring is mostly unsampled. Those branches are represented without inferred call chains.

Main entry points: [`server/api/agents/scraper.post.ts`](https://github.com/facundodlf/agentic-marketing-team/blob/main/server/api/agents/scraper.post.ts) (News scraper API), [`features/ScraperNews/composables/useScraper.ts`](https://github.com/facundodlf/agentic-marketing-team/blob/main/features/ScraperNews/composables/useScraper.ts) (Scraper and ideas state), [`server/api/ideas`](https://github.com/facundodlf/agentic-marketing-team/tree/main/server/api/ideas) (Idea read and update API), [`server/utils/firebase.ts`](https://github.com/facundodlf/agentic-marketing-team/blob/main/server/utils/firebase.ts) (Firestore access)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["Dashboard and navigation"]
  node_layout["App shell<br/>[default.vue]"]
  node_navigation["Sidebar navigation<br/>[AppSidebar.vue]"]
  node_pages["Dashboard pages"]
end

subgraph group_news["News discovery and review"]
  node_scraper_ui["News review"]
  node_scraper_state["Scraper and ideas state<br/>[useScraper.ts]"]
  node_scraper_api["News scraper API<br/>[scraper.post.ts]"]
  node_ideas_api["Idea read and update API"]
  node_news_types["News idea schema<br/>[types.ts]"]
  node_firestore[("Firestore access<br/>[firebase.ts]")]
end

subgraph group_content["Content and copy"]
  node_copy_api["Copywriter API<br/>[copyhook.post.ts]"]
  node_newsroom["Newsroom editor"]
  node_copy_editor["Copy editor<br/>[CopyEditor.vue]"]
  node_social_preview["Social preview<br/>[SocialPreview.vue]"]
  node_latest_copy["Latest copy preview"]
end

subgraph group_agents["Agents and leads"]
  node_orchestrator_chat["Orchestrator chat"]
  node_lead_widget["Qualified leads"]
  node_lead_data["Lead data<br/>[mock-data.ts]"]
  node_agent_registry["Agent definitions<br/>[agents.ts]"]
end

node_user(("Marketing user"))
node_firestore_service[("Firebase Firestore")]
node_gemini["Gemini AI"]
node_news_sources["News and URL sources"]

node_user -->|"opens app"| node_layout
node_layout -->|"renders"| node_navigation
node_user -.->|"visits"| node_pages
node_pages -.->|"shows"| node_scraper_ui
node_scraper_ui -->|"uses"| node_scraper_state
node_scraper_state -->|"posts scans"| node_scraper_api
node_scraper_state -->|"fetches and patches"| node_ideas_api
node_scraper_api -->|"reads and writes"| node_firestore
node_ideas_api -->|"accesses"| node_firestore
node_firestore -->|"initializes"| node_firestore_service
node_scraper_api -->|"generates ideas"| node_gemini
node_scraper_api -.->|"extracts news"| node_news_sources
node_scraper_api -->|"validates ideas"| node_news_types
node_ideas_api -->|"uses schema"| node_news_types
node_newsroom -->|"renders"| node_copy_editor
node_newsroom -.->|"previews copy"| node_social_preview
node_lead_widget -->|"displays"| node_lead_data
node_scraper_api -->|"uses agent config"| node_agent_registry
node_copy_api -.->|"uses agent config"| node_agent_registry

click node_layout "https://github.com/facundodlf/agentic-marketing-team/blob/main/app/layouts/default.vue"
click node_navigation "https://github.com/facundodlf/agentic-marketing-team/blob/main/shared/ui/AppSidebar.vue"
click node_pages "https://github.com/facundodlf/agentic-marketing-team/tree/main/app/pages"
click node_scraper_ui "https://github.com/facundodlf/agentic-marketing-team/blob/main/widgets/pending-news/ui/PendingNewsWidget.vue"
click node_scraper_state "https://github.com/facundodlf/agentic-marketing-team/blob/main/features/ScraperNews/composables/useScraper.ts"
click node_scraper_api "https://github.com/facundodlf/agentic-marketing-team/blob/main/server/api/agents/scraper.post.ts"
click node_ideas_api "https://github.com/facundodlf/agentic-marketing-team/tree/main/server/api/ideas"
click node_news_types "https://github.com/facundodlf/agentic-marketing-team/blob/main/entities/news/types.ts"
click node_firestore "https://github.com/facundodlf/agentic-marketing-team/blob/main/server/utils/firebase.ts"
click node_copy_api "https://github.com/facundodlf/agentic-marketing-team/blob/main/server/api/agents/copyhook.post.ts"
click node_newsroom "https://github.com/facundodlf/agentic-marketing-team/blob/main/widgets/newsroom/ui/NewsroomWorkspace.vue"
click node_copy_editor "https://github.com/facundodlf/agentic-marketing-team/blob/main/widgets/newsroom/ui/CopyEditor.vue"
click node_social_preview "https://github.com/facundodlf/agentic-marketing-team/blob/main/widgets/newsroom/ui/SocialPreview.vue"
click node_latest_copy "https://github.com/facundodlf/agentic-marketing-team/blob/main/widgets/latest-copy/ui/LatestCopyWidget.vue"
click node_orchestrator_chat "https://github.com/facundodlf/agentic-marketing-team/blob/main/widgets/orchestrator-chat/ui/OrchestratorChatWidget.vue"
click node_lead_widget "https://github.com/facundodlf/agentic-marketing-team/blob/main/widgets/qualified-leads/ui/QualifiedLeadsWidget.vue"
click node_lead_data "https://github.com/facundodlf/agentic-marketing-team/blob/main/entities/lead/model/mock-data.ts"
click node_agent_registry "https://github.com/facundodlf/agentic-marketing-team/blob/main/shared/constants/agents.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_layout,node_navigation,node_pages,node_user toneBlue
class node_scraper_ui,node_scraper_state,node_scraper_api,node_ideas_api,node_news_types,node_firestore,node_firestore_service toneAmber
class node_copy_api,node_newsroom,node_copy_editor,node_social_preview,node_latest_copy toneMint
class node_orchestrator_chat,node_lead_widget,node_lead_data,node_agent_registry toneRose
class node_gemini,node_news_sources toneIndigo
```

## Components

### Dashboard and navigation

- [App shell](https://github.com/facundodlf/agentic-marketing-team/blob/main/app/layouts/default.vue): `app/layouts/default.vue`
- [Sidebar navigation](https://github.com/facundodlf/agentic-marketing-team/blob/main/shared/ui/AppSidebar.vue): `shared/ui/AppSidebar.vue`
- [Dashboard pages](https://github.com/facundodlf/agentic-marketing-team/tree/main/app/pages): `app/pages`

### News discovery and review

- [News review](https://github.com/facundodlf/agentic-marketing-team/blob/main/widgets/pending-news/ui/PendingNewsWidget.vue): `widgets/pending-news/ui/PendingNewsWidget.vue`
- [Scraper and ideas state](https://github.com/facundodlf/agentic-marketing-team/blob/main/features/ScraperNews/composables/useScraper.ts): `features/ScraperNews/composables/useScraper.ts`
- [News scraper API](https://github.com/facundodlf/agentic-marketing-team/blob/main/server/api/agents/scraper.post.ts): `server/api/agents/scraper.post.ts`
- [Idea read and update API](https://github.com/facundodlf/agentic-marketing-team/tree/main/server/api/ideas): `server/api/ideas`
- [News idea schema](https://github.com/facundodlf/agentic-marketing-team/blob/main/entities/news/types.ts): `entities/news/types.ts`
- [Firestore access](https://github.com/facundodlf/agentic-marketing-team/blob/main/server/utils/firebase.ts): `server/utils/firebase.ts`

### Content and copy

- [Copywriter API](https://github.com/facundodlf/agentic-marketing-team/blob/main/server/api/agents/copyhook.post.ts): `server/api/agents/copyhook.post.ts`
- [Newsroom editor](https://github.com/facundodlf/agentic-marketing-team/blob/main/widgets/newsroom/ui/NewsroomWorkspace.vue): `widgets/newsroom/ui/NewsroomWorkspace.vue`
- [Copy editor](https://github.com/facundodlf/agentic-marketing-team/blob/main/widgets/newsroom/ui/CopyEditor.vue): `widgets/newsroom/ui/CopyEditor.vue`
- [Social preview](https://github.com/facundodlf/agentic-marketing-team/blob/main/widgets/newsroom/ui/SocialPreview.vue): `widgets/newsroom/ui/SocialPreview.vue`
- [Latest copy preview](https://github.com/facundodlf/agentic-marketing-team/blob/main/widgets/latest-copy/ui/LatestCopyWidget.vue): `widgets/latest-copy/ui/LatestCopyWidget.vue`

### Agents and leads

- [Orchestrator chat](https://github.com/facundodlf/agentic-marketing-team/blob/main/widgets/orchestrator-chat/ui/OrchestratorChatWidget.vue): `widgets/orchestrator-chat/ui/OrchestratorChatWidget.vue`
- [Qualified leads](https://github.com/facundodlf/agentic-marketing-team/blob/main/widgets/qualified-leads/ui/QualifiedLeadsWidget.vue): `widgets/qualified-leads/ui/QualifiedLeadsWidget.vue`
- [Lead data](https://github.com/facundodlf/agentic-marketing-team/blob/main/entities/lead/model/mock-data.ts): `entities/lead/model/mock-data.ts`
- [Agent definitions](https://github.com/facundodlf/agentic-marketing-team/blob/main/shared/constants/agents.ts): `shared/constants/agents.ts`

### Other components

- **Marketing user**
- **Firebase Firestore**
- **Gemini AI**
- **News and URL sources**

## Connections

- Marketing user → App shell: opens app (evidence: `app/layouts/default.vue`)
- App shell → Sidebar navigation: renders (evidence: `app/layouts/default.vue`)
- Marketing user → Dashboard pages: visits
- Dashboard pages → News review: shows
- News review → Scraper and ideas state: uses (evidence: `widgets/pending-news/ui/PendingNewsWidget.vue`)
- Scraper and ideas state → News scraper API: posts scans (evidence: `features/ScraperNews/composables/useScraper.ts`)
- Scraper and ideas state → Idea read and update API: fetches and patches (evidence: `features/ScraperNews/composables/useScraper.ts`)
- News scraper API → Firestore access: reads and writes (evidence: `server/api/agents/scraper.post.ts`)
- Idea read and update API → Firestore access: accesses (evidence: `server/api/ideas/index.get.ts`)
- Firestore access → Firebase Firestore: initializes (evidence: `server/utils/firebase.ts`)
- News scraper API → Gemini AI: generates ideas (evidence: `server/api/agents/scraper.post.ts`)
- News scraper API → News and URL sources: extracts news
- News scraper API → News idea schema: validates ideas (evidence: `server/api/agents/scraper.post.ts`)
- Idea read and update API → News idea schema: uses schema (evidence: `server/api/ideas/index.get.ts`)
- Newsroom editor → Copy editor: renders (evidence: `widgets/newsroom/ui/NewsroomWorkspace.vue`)
- Newsroom editor → Social preview: previews copy
- Qualified leads → Lead data: displays (evidence: `widgets/qualified-leads/ui/QualifiedLeadsWidget.vue`)
- News scraper API → Agent definitions: uses agent config (evidence: `server/api/agents/scraper.post.ts`)
- Copywriter API → Agent definitions: uses agent config (evidence: `server/api/agents/copyhook.post.ts`)
