# kkbaidu/my-terminal-portfolio architecture

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

- Interactive diagram: https://gitdiagram.com/kkbaidu/my-terminal-portfolio
- Repository: https://github.com/kkbaidu/my-terminal-portfolio

## Overview

This is a Next.js portfolio presented as an interactive terminal, with visitors issuing commands to explore profile data, projects, skills, work history, and other portfolio content. The main enhanced workflow is an AI question: the terminal sends it to the AI route, which builds a retrieval-grounded prompt and streams a response from a configured model, or falls back to generated text. Contact, GitHub, resume, projects, and blog are distinct capability branches. Some component wiring is inferred from the README and partial excerpts; uncertain links are omitted.

Main entry points: [`src/components/portfolio-terminal.tsx`](https://github.com/kkbaidu/my-terminal-portfolio/blob/main/src/components/portfolio-terminal.tsx) (Terminal UI), [`src/lib/commands.ts`](https://github.com/kkbaidu/my-terminal-portfolio/blob/main/src/lib/commands.ts) (Command Handler), [`src/lib/portfolio.ts`](https://github.com/kkbaidu/my-terminal-portfolio/blob/main/src/lib/portfolio.ts) (Portfolio Access), [`src/app/api/ai/route.ts`](https://github.com/kkbaidu/my-terminal-portfolio/blob/main/src/app/api/ai/route.ts) (AI Endpoint)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_terminal["Terminal Experience"]
  node_home["Terminal Page<br/>[page.tsx]"]
  node_terminal_ui["Terminal UI"]
  node_commands["Command Handler<br/>[commands.ts]"]
  node_boot["Boot Sequence<br/>[boot-sequence.tsx]"]
  node_markdown["Markdown Renderer"]
  node_contact_form["Contact Form<br/>[contact-form.tsx]"]
  node_github_card["GitHub Profile Card<br/>[github-profile.tsx]"]
end

subgraph group_portfolio["Portfolio Content"]
  node_portfolio_data["Portfolio Data<br/>[portfolio.json]"]
  node_portfolio_lib["Portfolio Access<br/>[portfolio.ts]"]
  node_rag["Context Retrieval<br/>[rag.ts]"]
  node_projects_page["Projects Page<br/>[page.tsx]"]
  node_blog_page["Blog Page<br/>[page.tsx]"]
  node_resume_file["Resume PDF"]
end

subgraph group_services["API Services"]
  node_ai_api["AI Endpoint<br/>[route.ts]"]
  node_github_api["GitHub Endpoint<br/>[route.ts]"]
  node_contact_api["Contact Endpoint<br/>[route.ts]"]
  node_resume_api["Resume Endpoint<br/>[route.ts]"]
end

subgraph group_integrations["External Integrations"]
  node_gemini["Google Gemini"]
  node_openai["OpenAI"]
  node_github_service["GitHub API"]
  node_resend["Resend Email"]
end

node_visitor(("Visitor"))

node_visitor -->|"opens"| node_home
node_home -->|"renders"| node_terminal_ui
node_terminal_ui -->|"shows"| node_boot
node_terminal_ui -->|"dispatches commands"| node_commands
node_commands -->|"reads portfolio"| node_portfolio_lib
node_portfolio_lib -->|"reads"| node_portfolio_data
node_commands -->|"retrieves context"| node_rag
node_rag -->|"reads content"| node_portfolio_lib
node_terminal_ui -->|"renders output"| node_markdown
node_terminal_ui -->|"sends questions"| node_ai_api
node_ai_api -->|"builds prompt"| node_commands
node_ai_api -->|"streams response"| node_gemini
node_ai_api -.->|"fallback model"| node_openai
node_terminal_ui -->|"renders card"| node_github_card
node_github_card -->|"requests profile"| node_github_api
node_github_api -->|"fetches user and repos"| node_github_service
node_terminal_ui -->|"renders form"| node_contact_form
node_contact_form -->|"submits message"| node_contact_api
node_contact_api -.->|"sends email"| node_resend
node_commands -->|"offers download"| node_resume_api
node_resume_api -->|"reads PDF"| node_resume_file
node_visitor -->|"opens"| node_projects_page
node_projects_page -->|"reads projects"| node_portfolio_lib
node_visitor -->|"opens"| node_blog_page
node_blog_page -->|"reads articles"| node_portfolio_lib

click node_home "https://github.com/kkbaidu/my-terminal-portfolio/blob/main/src/app/page.tsx"
click node_terminal_ui "https://github.com/kkbaidu/my-terminal-portfolio/blob/main/src/components/portfolio-terminal.tsx"
click node_commands "https://github.com/kkbaidu/my-terminal-portfolio/blob/main/src/lib/commands.ts"
click node_boot "https://github.com/kkbaidu/my-terminal-portfolio/blob/main/src/components/boot-sequence.tsx"
click node_markdown "https://github.com/kkbaidu/my-terminal-portfolio/blob/main/src/components/terminal-markdown.tsx"
click node_contact_form "https://github.com/kkbaidu/my-terminal-portfolio/blob/main/src/components/contact-form.tsx"
click node_github_card "https://github.com/kkbaidu/my-terminal-portfolio/blob/main/src/components/github-profile.tsx"
click node_portfolio_data "https://github.com/kkbaidu/my-terminal-portfolio/blob/main/src/data/portfolio.json"
click node_portfolio_lib "https://github.com/kkbaidu/my-terminal-portfolio/blob/main/src/lib/portfolio.ts"
click node_rag "https://github.com/kkbaidu/my-terminal-portfolio/blob/main/src/lib/rag.ts"
click node_projects_page "https://github.com/kkbaidu/my-terminal-portfolio/blob/main/src/app/projects/page.tsx"
click node_blog_page "https://github.com/kkbaidu/my-terminal-portfolio/blob/main/src/app/blog/page.tsx"
click node_ai_api "https://github.com/kkbaidu/my-terminal-portfolio/blob/main/src/app/api/ai/route.ts"
click node_github_api "https://github.com/kkbaidu/my-terminal-portfolio/blob/main/src/app/api/github/route.ts"
click node_contact_api "https://github.com/kkbaidu/my-terminal-portfolio/blob/main/src/app/api/contact/route.ts"
click node_resume_api "https://github.com/kkbaidu/my-terminal-portfolio/blob/main/src/app/api/resume/route.ts"
click node_resume_file "https://github.com/kkbaidu/my-terminal-portfolio/blob/main/docs/Kingsley-Korankye-Baidu_Resume.pdf"

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_home,node_terminal_ui,node_commands,node_boot,node_markdown,node_contact_form,node_github_card toneBlue
class node_portfolio_data,node_portfolio_lib,node_rag,node_projects_page,node_blog_page,node_resume_file toneAmber
class node_ai_api,node_github_api,node_contact_api,node_resume_api toneMint
class node_gemini,node_openai,node_github_service,node_resend toneRose
class node_visitor toneIndigo
```

## Components

### Terminal Experience

- [Terminal Page](https://github.com/kkbaidu/my-terminal-portfolio/blob/main/src/app/page.tsx): `src/app/page.tsx`
- [Terminal UI](https://github.com/kkbaidu/my-terminal-portfolio/blob/main/src/components/portfolio-terminal.tsx): `src/components/portfolio-terminal.tsx`
- [Command Handler](https://github.com/kkbaidu/my-terminal-portfolio/blob/main/src/lib/commands.ts): `src/lib/commands.ts`
- [Boot Sequence](https://github.com/kkbaidu/my-terminal-portfolio/blob/main/src/components/boot-sequence.tsx): `src/components/boot-sequence.tsx`
- [Markdown Renderer](https://github.com/kkbaidu/my-terminal-portfolio/blob/main/src/components/terminal-markdown.tsx): `src/components/terminal-markdown.tsx`
- [Contact Form](https://github.com/kkbaidu/my-terminal-portfolio/blob/main/src/components/contact-form.tsx): `src/components/contact-form.tsx`
- [GitHub Profile Card](https://github.com/kkbaidu/my-terminal-portfolio/blob/main/src/components/github-profile.tsx): `src/components/github-profile.tsx`

### Portfolio Content

- [Portfolio Data](https://github.com/kkbaidu/my-terminal-portfolio/blob/main/src/data/portfolio.json): `src/data/portfolio.json`
- [Portfolio Access](https://github.com/kkbaidu/my-terminal-portfolio/blob/main/src/lib/portfolio.ts): `src/lib/portfolio.ts`
- [Context Retrieval](https://github.com/kkbaidu/my-terminal-portfolio/blob/main/src/lib/rag.ts): `src/lib/rag.ts`
- [Projects Page](https://github.com/kkbaidu/my-terminal-portfolio/blob/main/src/app/projects/page.tsx): `src/app/projects/page.tsx`
- [Blog Page](https://github.com/kkbaidu/my-terminal-portfolio/blob/main/src/app/blog/page.tsx): `src/app/blog/page.tsx`
- [Resume PDF](https://github.com/kkbaidu/my-terminal-portfolio/blob/main/docs/Kingsley-Korankye-Baidu_Resume.pdf): `docs/Kingsley-Korankye-Baidu_Resume.pdf`

### API Services

- [AI Endpoint](https://github.com/kkbaidu/my-terminal-portfolio/blob/main/src/app/api/ai/route.ts): `src/app/api/ai/route.ts`
- [GitHub Endpoint](https://github.com/kkbaidu/my-terminal-portfolio/blob/main/src/app/api/github/route.ts): `src/app/api/github/route.ts`
- [Contact Endpoint](https://github.com/kkbaidu/my-terminal-portfolio/blob/main/src/app/api/contact/route.ts): `src/app/api/contact/route.ts`
- [Resume Endpoint](https://github.com/kkbaidu/my-terminal-portfolio/blob/main/src/app/api/resume/route.ts): `src/app/api/resume/route.ts`

### External Integrations

- **Google Gemini**
- **OpenAI**
- **GitHub API**
- **Resend Email**

### Other components

- **Visitor**

## Connections

- Visitor → Terminal Page: opens
- Terminal Page → Terminal UI: renders
- Terminal UI → Boot Sequence: shows
- Terminal UI → Command Handler: dispatches commands
- Command Handler → Portfolio Access: reads portfolio
- Portfolio Access → Portfolio Data: reads
- Command Handler → Context Retrieval: retrieves context
- Context Retrieval → Portfolio Access: reads content
- Terminal UI → Markdown Renderer: renders output
- Terminal UI → AI Endpoint: sends questions
- AI Endpoint → Command Handler: builds prompt
- AI Endpoint → Google Gemini: streams response
- AI Endpoint → OpenAI: fallback model
- Terminal UI → GitHub Profile Card: renders card
- GitHub Profile Card → GitHub Endpoint: requests profile
- GitHub Endpoint → GitHub API: fetches user and repos
- Terminal UI → Contact Form: renders form
- Contact Form → Contact Endpoint: submits message
- Contact Endpoint → Resend Email: sends email
- Command Handler → Resume Endpoint: offers download
- Resume Endpoint → Resume PDF: reads PDF
- Visitor → Projects Page: opens
- Projects Page → Portfolio Access: reads projects
- Visitor → Blog Page: opens
- Blog Page → Portfolio Access: reads articles
