# zackkuptsow/portfolio architecture

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

- Interactive diagram: https://gitdiagram.com/zackkuptsow/portfolio
- Repository: https://github.com/zackkuptsow/portfolio

## Overview

kups.me is a portfolio site built around a scroll-driven terminal, with a separate AWS hosting project and a resume-request service. The main visitor workflow is to scroll through profile sections, then view or request the resume by email. The email path validates and rate-limits requests before starting asynchronous delivery. The graph also preserves documented site features and hosting; links involving unsampled components rely on README statements or are marked unverified.

Main entry points: [`projects/resume/components/Terminal/engine/TerminalEngine.ts`](https://github.com/zackkuptsow/portfolio/blob/main/projects/resume/components/Terminal/engine/TerminalEngine.ts) (Terminal engine), [`projects/send_resume/functions/intake/handler.ts`](https://github.com/zackkuptsow/portfolio/blob/main/projects/send_resume/functions/intake/handler.ts) (Request intake), [`projects/send_resume/functions/send_email/handler.ts`](https://github.com/zackkuptsow/portfolio/blob/main/projects/send_resume/functions/send_email/handler.ts) (Email sender), [`projects/resume/app/page.tsx`](https://github.com/zackkuptsow/portfolio/blob/main/projects/resume/app/page.tsx) (Portfolio page)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_site["Portfolio site"]
  node_portfolio["Portfolio page<br/>[page.tsx]"]
  node_profile["Profile content<br/>[profile.ts]"]
  node_projects["Project showcase<br/>[page.tsx]"]
  node_sms["SMS program<br/>[SmsProgramPage.tsx]"]
  node_legal["Legal pages<br/>[page.tsx]"]
  node_resume_options["Resume options<br/>[GetResume.tsx]"]
  node_email_option["Email request<br/>[requestResume.ts]"]
end

subgraph group_terminal["Terminal experience"]
  node_terminal_engine["Terminal engine<br/>[TerminalEngine.ts]"]
  node_terminal_layout["Terminal layout<br/>[TerminalLayout.ts]"]
  node_scroll_driver["Scroll driver<br/>[ScrollDriver.ts]"]
  node_scroll_map["Scroll mapping<br/>[scrollMap.ts]"]
  node_commands["Command builder<br/>[buildCommand.ts]"]
  node_shell["Terminal shell<br/>[Shell.ts]"]
  node_session_output["Session output<br/>[SessionOutput.ts]"]
  node_egg_art["Easter egg art"]
end

subgraph group_delivery["Resume delivery"]
  node_intake["Request intake<br/>[handler.ts]"]
  node_validation["Request validation"]
  node_rate_limit["Rate limiter<br/>[rate_limit.ts]"]
  node_workflow["Delivery workflow"]
  node_email_handler["Email sender<br/>[handler.ts]"]
  node_email_content["Email content<br/>[email_content.ts]"]
  node_dynamodb[("DynamoDB")]
  node_step_functions["Step Functions"]
  node_s3_resume[("Resume object")]
  node_ses["Amazon SES"]
end

subgraph group_hosting["Site hosting"]
  node_hosting_stack["Hosting stack"]
  node_aws_hosting["AWS hosting"]
end

node_visitor(("Visitor"))

node_visitor -->|"opens"| node_portfolio
node_portfolio -->|"presents"| node_terminal_engine
node_terminal_engine -->|"builds commands"| node_commands
node_terminal_engine -->|"uses layout"| node_terminal_layout
node_terminal_engine -->|"uses scrolling"| node_scroll_driver
node_scroll_driver -->|"maps scroll"| node_scroll_map
node_terminal_engine -.->|"runs commands"| node_shell
node_terminal_engine -->|"uses output"| node_session_output
node_terminal_engine -->|"loads easter eggs"| node_egg_art
node_portfolio -.->|"presents content"| node_profile
node_visitor -->|"views projects"| node_projects
node_visitor -->|"views program"| node_sms
node_visitor -->|"views policies"| node_legal
node_visitor -->|"requests resume"| node_resume_options
node_resume_options -.->|"offers email"| node_email_option
node_email_option -.->|"posts request"| node_intake
node_intake -->|"validates request"| node_validation
node_intake -->|"claims request slot"| node_rate_limit
node_rate_limit -->|"checks quota"| node_dynamodb
node_intake -->|"starts execution"| node_step_functions
node_workflow -->|"configures workflow"| node_step_functions
node_workflow -->|"integrates API"| node_intake
node_step_functions -->|"invokes task"| node_email_handler
node_email_handler -->|"fetches PDF"| node_s3_resume
node_email_handler -->|"builds message"| node_email_content
node_email_handler -->|"sends email"| node_ses
node_hosting_stack -->|"provisions hosting"| node_aws_hosting

click node_portfolio "https://github.com/zackkuptsow/portfolio/blob/main/projects/resume/app/page.tsx"
click node_profile "https://github.com/zackkuptsow/portfolio/blob/main/projects/resume/data/profile.ts"
click node_projects "https://github.com/zackkuptsow/portfolio/blob/main/projects/resume/app/projects/page.tsx"
click node_sms "https://github.com/zackkuptsow/portfolio/blob/main/projects/resume/components/SmsProgram/SmsProgramPage.tsx"
click node_legal "https://github.com/zackkuptsow/portfolio/blob/main/projects/resume/app/privacy/page.tsx"
click node_resume_options "https://github.com/zackkuptsow/portfolio/blob/main/projects/resume/components/GetResume/GetResume.tsx"
click node_email_option "https://github.com/zackkuptsow/portfolio/blob/main/projects/resume/components/GetResume/components/EmailOption/requestResume.ts"
click node_terminal_engine "https://github.com/zackkuptsow/portfolio/blob/main/projects/resume/components/Terminal/engine/TerminalEngine.ts"
click node_terminal_layout "https://github.com/zackkuptsow/portfolio/blob/main/projects/resume/components/Terminal/engine/TerminalLayout.ts"
click node_scroll_driver "https://github.com/zackkuptsow/portfolio/blob/main/projects/resume/components/Terminal/engine/ScrollDriver.ts"
click node_scroll_map "https://github.com/zackkuptsow/portfolio/blob/main/projects/resume/components/Terminal/engine/scrollMap.ts"
click node_commands "https://github.com/zackkuptsow/portfolio/blob/main/projects/resume/components/Terminal/buildCommand.ts"
click node_shell "https://github.com/zackkuptsow/portfolio/blob/main/projects/resume/components/Terminal/shell/Shell.ts"
click node_session_output "https://github.com/zackkuptsow/portfolio/blob/main/projects/resume/components/Terminal/shell/SessionOutput.ts"
click node_egg_art "https://github.com/zackkuptsow/portfolio/blob/main/projects/resume/data/terminalEggDrawings.ts"
click node_intake "https://github.com/zackkuptsow/portfolio/blob/main/projects/send_resume/functions/intake/handler.ts"
click node_validation "https://github.com/zackkuptsow/portfolio/blob/main/projects/send_resume/functions/intake/validate_request.ts"
click node_rate_limit "https://github.com/zackkuptsow/portfolio/blob/main/projects/send_resume/functions/intake/rate_limit.ts"
click node_workflow "https://github.com/zackkuptsow/portfolio/blob/main/projects/send_resume/lib/send_resume-stack.ts"
click node_email_handler "https://github.com/zackkuptsow/portfolio/blob/main/projects/send_resume/functions/send_email/handler.ts"
click node_email_content "https://github.com/zackkuptsow/portfolio/blob/main/projects/send_resume/functions/send_email/email_content.ts"
click node_hosting_stack "https://github.com/zackkuptsow/portfolio/blob/main/projects/infrastructure/lib/infrastructure-stack.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_portfolio,node_profile,node_projects,node_sms,node_legal,node_resume_options,node_email_option toneBlue
class node_terminal_engine,node_terminal_layout,node_scroll_driver,node_scroll_map,node_commands,node_shell,node_session_output,node_egg_art toneAmber
class node_intake,node_validation,node_rate_limit,node_workflow,node_email_handler,node_email_content,node_dynamodb,node_step_functions,node_s3_resume,node_ses toneMint
class node_hosting_stack,node_aws_hosting toneRose
class node_visitor toneIndigo
```

## Components

### Portfolio site

- [Portfolio page](https://github.com/zackkuptsow/portfolio/blob/main/projects/resume/app/page.tsx): `projects/resume/app/page.tsx`
- [Profile content](https://github.com/zackkuptsow/portfolio/blob/main/projects/resume/data/profile.ts): `projects/resume/data/profile.ts`
- [Project showcase](https://github.com/zackkuptsow/portfolio/blob/main/projects/resume/app/projects/page.tsx): `projects/resume/app/projects/page.tsx`
- [SMS program](https://github.com/zackkuptsow/portfolio/blob/main/projects/resume/components/SmsProgram/SmsProgramPage.tsx): `projects/resume/components/SmsProgram/SmsProgramPage.tsx`
- [Legal pages](https://github.com/zackkuptsow/portfolio/blob/main/projects/resume/app/privacy/page.tsx): `projects/resume/app/privacy/page.tsx`
- [Resume options](https://github.com/zackkuptsow/portfolio/blob/main/projects/resume/components/GetResume/GetResume.tsx): `projects/resume/components/GetResume/GetResume.tsx`
- [Email request](https://github.com/zackkuptsow/portfolio/blob/main/projects/resume/components/GetResume/components/EmailOption/requestResume.ts): `projects/resume/components/GetResume/components/EmailOption/requestResume.ts`

### Terminal experience

- [Terminal engine](https://github.com/zackkuptsow/portfolio/blob/main/projects/resume/components/Terminal/engine/TerminalEngine.ts): `projects/resume/components/Terminal/engine/TerminalEngine.ts`
- [Terminal layout](https://github.com/zackkuptsow/portfolio/blob/main/projects/resume/components/Terminal/engine/TerminalLayout.ts): `projects/resume/components/Terminal/engine/TerminalLayout.ts`
- [Scroll driver](https://github.com/zackkuptsow/portfolio/blob/main/projects/resume/components/Terminal/engine/ScrollDriver.ts): `projects/resume/components/Terminal/engine/ScrollDriver.ts`
- [Scroll mapping](https://github.com/zackkuptsow/portfolio/blob/main/projects/resume/components/Terminal/engine/scrollMap.ts): `projects/resume/components/Terminal/engine/scrollMap.ts`
- [Command builder](https://github.com/zackkuptsow/portfolio/blob/main/projects/resume/components/Terminal/buildCommand.ts): `projects/resume/components/Terminal/buildCommand.ts`
- [Terminal shell](https://github.com/zackkuptsow/portfolio/blob/main/projects/resume/components/Terminal/shell/Shell.ts): `projects/resume/components/Terminal/shell/Shell.ts`
- [Session output](https://github.com/zackkuptsow/portfolio/blob/main/projects/resume/components/Terminal/shell/SessionOutput.ts): `projects/resume/components/Terminal/shell/SessionOutput.ts`
- [Easter egg art](https://github.com/zackkuptsow/portfolio/blob/main/projects/resume/data/terminalEggDrawings.ts): `projects/resume/data/terminalEggDrawings.ts`

### Resume delivery

- [Request intake](https://github.com/zackkuptsow/portfolio/blob/main/projects/send_resume/functions/intake/handler.ts): `projects/send_resume/functions/intake/handler.ts`
- [Request validation](https://github.com/zackkuptsow/portfolio/blob/main/projects/send_resume/functions/intake/validate_request.ts): `projects/send_resume/functions/intake/validate_request.ts`
- [Rate limiter](https://github.com/zackkuptsow/portfolio/blob/main/projects/send_resume/functions/intake/rate_limit.ts): `projects/send_resume/functions/intake/rate_limit.ts`
- [Delivery workflow](https://github.com/zackkuptsow/portfolio/blob/main/projects/send_resume/lib/send_resume-stack.ts): `projects/send_resume/lib/send_resume-stack.ts`
- [Email sender](https://github.com/zackkuptsow/portfolio/blob/main/projects/send_resume/functions/send_email/handler.ts): `projects/send_resume/functions/send_email/handler.ts`
- [Email content](https://github.com/zackkuptsow/portfolio/blob/main/projects/send_resume/functions/send_email/email_content.ts): `projects/send_resume/functions/send_email/email_content.ts`
- **DynamoDB**
- **Step Functions**
- **Resume object**
- **Amazon SES**

### Site hosting

- [Hosting stack](https://github.com/zackkuptsow/portfolio/blob/main/projects/infrastructure/lib/infrastructure-stack.ts): `projects/infrastructure/lib/infrastructure-stack.ts`
- **AWS hosting**

### Other components

- **Visitor**

## Connections

- Visitor → Portfolio page: opens (evidence: `README.md`)
- Portfolio page → Terminal engine: presents (evidence: `README.md`)
- Terminal engine → Command builder: builds commands (evidence: `projects/resume/components/Terminal/engine/TerminalEngine.ts`)
- Terminal engine → Terminal layout: uses layout (evidence: `projects/resume/components/Terminal/engine/TerminalEngine.ts`)
- Terminal engine → Scroll driver: uses scrolling (evidence: `projects/resume/components/Terminal/engine/TerminalEngine.ts`)
- Scroll driver → Scroll mapping: maps scroll (evidence: `projects/resume/components/Terminal/engine/ScrollDriver.ts`)
- Terminal engine → Terminal shell: runs commands (evidence: `projects/resume/components/Terminal/engine/TerminalEngine.ts`)
- Terminal engine → Session output: uses output (evidence: `projects/resume/components/Terminal/engine/TerminalEngine.ts`)
- Terminal engine → Easter egg art: loads easter eggs (evidence: `projects/resume/components/Terminal/engine/TerminalEngine.ts`)
- Portfolio page → Profile content: presents content
- Visitor → Project showcase: views projects (evidence: `README.md`)
- Visitor → SMS program: views program (evidence: `README.md`)
- Visitor → Legal pages: views policies (evidence: `README.md`)
- Visitor → Resume options: requests resume (evidence: `README.md`)
- Resume options → Email request: offers email
- Email request → Request intake: posts request
- Request intake → Request validation: validates request (evidence: `projects/send_resume/functions/intake/handler.ts`)
- Request intake → Rate limiter: claims request slot (evidence: `projects/send_resume/functions/intake/handler.ts`)
- Rate limiter → DynamoDB: checks quota (evidence: `projects/send_resume/functions/intake/rate_limit.ts`)
- Request intake → Step Functions: starts execution (evidence: `projects/send_resume/functions/intake/handler.ts`)
- Delivery workflow → Step Functions: configures workflow (evidence: `projects/send_resume/lib/send_resume-stack.ts`)
- Delivery workflow → Request intake: integrates API (evidence: `projects/send_resume/lib/send_resume-stack.ts`)
- Step Functions → Email sender: invokes task
- Email sender → Resume object: fetches PDF (evidence: `projects/send_resume/functions/send_email/handler.ts`)
- Email sender → Email content: builds message (evidence: `projects/send_resume/functions/send_email/handler.ts`)
- Email sender → Amazon SES: sends email (evidence: `projects/send_resume/functions/send_email/handler.ts`)
- Hosting stack → AWS hosting: provisions hosting (evidence: `README.md`)
