Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@ Thumbs.db
.terraform/
.terraform.lock.hcl

# Personal notes
SITE_NOTES.md

# Logs
*.log
api-logs.txt
Expand Down
9 changes: 3 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ A serverless resume website that runs the **same FastAPI code** locally (Docker)

Let's get the boring config stuff out of the way first. You'll need to set up a few things before running the site.

I have a folder called `_scratch` I use this folder for storing my information, files, AI embeddings so they aren't loaded to github. Create your own `_scratch` as some scripts may export to `_scratch`
I have a folder called `_scratch` I use this folder for storing my information and files so they aren't loaded to github. Create your own `_scratch` as some scripts may export to `_scratch`

From the root, `mkdir -p _scratch`

Expand Down Expand Up @@ -275,7 +275,6 @@ aws-serverless-resume/
│ ├── s3.tf # Static file bucket
│ ├── cloudfront.tf # CDN distribution
│ └── ... # Other AWS resources
├── tests/ # pytest test suite
├── docker-compose.yml # Local development setup
├── Makefile # Convenience commands
├── README.md # This file
Expand Down Expand Up @@ -366,13 +365,13 @@ make up
**For data changes:**

```bash
make reload # Reload Excel template
docker compose exec api python /app/scripts/load_resume.py /app/scripts/resume-data-template.xlsx
```

**For code changes:**

```bash
make restart # Restart containers
make down && make up # Restart containers
```

**For HTML/CSS changes:**
Expand Down Expand Up @@ -575,8 +574,6 @@ Some ideas for extending this project:
- [ ] Add multi-language support
- [ ] Integrate with LinkedIn API for auto-sync
- [ ] Add dark mode toggle
- [ ] Create a chatbot that answers questions about your resume (using Claude API)

Fork it and make it your own!

---
Expand Down
10 changes: 0 additions & 10 deletions api/chat.py

This file was deleted.

5 changes: 2 additions & 3 deletions api/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,7 @@ async def lifespan(app):
# CORS configuration
app.add_middleware(
CORSMiddleware,
allow_origins=["https://robrose.info", "https://www.robrose.info", "http://localhost:8080",
"https://thefretdetective.com", "https://www.thefretdetective.com"],
allow_origins=["https://robrose.info", "https://www.robrose.info", "http://localhost:8080"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
Expand All @@ -56,7 +55,7 @@ async def lifespan(app):
is_lambda = os.getenv('AWS_LAMBDA_FUNCTION_NAME') is not None
prefix = "/api" if is_lambda else ""

# Include routers for different API sections, chatbots, etc
# Include routers
app.include_router(health_router, prefix=prefix)
app.include_router(resume_router, prefix=prefix)
app.include_router(contact_router, prefix=prefix)
7 changes: 0 additions & 7 deletions api/models.py

This file was deleted.

2 changes: 1 addition & 1 deletion app/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@ <h2>Contact</h2>
Deployed via Terraform
</p>
<p>
Frontend design assisted by AI
Built with Claude as a development partner
<a
href="https://github.com/mr-flowjangles/aws-serverless-resume"
target="_blank"
Expand Down
91 changes: 84 additions & 7 deletions app/scripts/architecture.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/**
* RobbAI Architecture Display
* Architecture Display
* Loads and displays the interactive architecture visualization
*/

Expand All @@ -12,16 +12,16 @@ async function loadArchitecture() {
}

container.innerHTML = `
<!-- SECTION 1: WEBSITE INFRASTRUCTURE -->
<!-- SECTION 1: RESUME SITE -->
<div style="background: linear-gradient(135deg, #f8fafc 0%, #e0f2fe 100%); padding: 2rem; border-radius: 12px; margin-bottom: 3rem; border-left: 6px solid #0284c7;">
<h3 style="color: #0f172a; font-size: 1.75rem; margin-bottom: 1rem; display: flex; align-items: center; gap: 0.75rem;">
<span style="font-size: 2rem;">🌐</span> Website Infrastructure
<span style="font-size: 2rem;">🌐</span> Resume Site
</h3>
<p style="color: #475569; margin-bottom: 2rem; line-height: 1.6;">
Serverless AWS architecture powering the resume website with unified FastAPI codebase for local and production.
This site doesn't need this much infrastructure — but it's a useful sandbox for learning serverless AWS patterns end to end. One FastAPI codebase runs locally via Docker and in production via Lambda, fully deployed with Terraform.
</p>

<!-- Site Components -->
<!-- Core Components -->
<h4 class="arch-section-title" style="font-size: 1.25rem;">Core Components</h4>
<div class="arch-components">
<div class="arch-column">
Expand Down Expand Up @@ -49,11 +49,15 @@ async function loadArchitecture() {
</div>

<div class="arch-column">
<h4>Data Storage</h4>
<h4>Data &amp; Email</h4>
<div class="arch-component arch-aws">
<div class="arch-component-name">DynamoDB</div>
<div class="arch-component-desc">Resume content</div>
</div>
<div class="arch-component arch-aws">
<div class="arch-component-name">SES</div>
<div class="arch-component-desc">Contact form delivery</div>
</div>
</div>
</div>

Expand All @@ -78,7 +82,80 @@ async function loadArchitecture() {
</div>
</div>

<!-- Legend -->
<!-- SECTION 2: BOT FACTORY -->
<div style="background: linear-gradient(135deg, #f8fafc 0%, #fce7f3 100%); padding: 2rem; border-radius: 12px; margin-bottom: 3rem; border-left: 6px solid #9333ea;">
<h3 style="color: #0f172a; font-size: 1.75rem; margin-bottom: 1rem; display: flex; align-items: center; gap: 0.75rem;">
<span style="font-size: 2rem;">🤖</span> Bot Factory
</h3>
<p style="color: #475569; margin-bottom: 2rem; line-height: 1.6;">
A reusable RAG chatbot platform extracted from this project into its own repo. Define a bot with YAML config, a system prompt, and knowledge base files — Bot Factory handles embeddings, retrieval, and response generation.
</p>

<!-- Bot Factory Components -->
<h4 class="arch-section-title" style="font-size: 1.25rem;">Core Components</h4>
<div class="arch-components">
<div class="arch-column">
<h4>AI Services</h4>
<div class="arch-component arch-external">
<div class="arch-component-name">Claude</div>
<div class="arch-component-desc">Response generation via Bedrock</div>
</div>
<div class="arch-component arch-external">
<div class="arch-component-name">Embeddings</div>
<div class="arch-component-desc">Semantic search vectors</div>
</div>
</div>

<div class="arch-column">
<h4>Infrastructure</h4>
<div class="arch-component arch-aws">
<div class="arch-component-name">Lambda</div>
<div class="arch-component-desc">Buffered + SSE streaming handlers</div>
</div>
<div class="arch-component arch-aws">
<div class="arch-component-name">S3</div>
<div class="arch-component-desc">Bot configs &amp; knowledge data</div>
</div>
</div>

<div class="arch-column">
<h4>Data Layer</h4>
<div class="arch-component arch-aws">
<div class="arch-component-name">DynamoDB</div>
<div class="arch-component-desc">Embeddings, logs, chat history, API keys</div>
</div>
</div>
</div>

<!-- Bot Definition -->
<h4 class="arch-section-title" style="font-size: 1.25rem;">Bot Definition</h4>
<div class="arch-flow-steps">
<div class="arch-step">
<div class="arch-step-number">📋</div>
<h4>config.yml</h4>
<p>Bot identity, model settings, RAG tuning, frontend config</p>
</div>
<div class="arch-step">
<div class="arch-step-number">💬</div>
<h4>prompt.yml</h4>
<p>System prompt defining personality, tone, and response rules</p>
</div>
<div class="arch-step">
<div class="arch-step-number">📚</div>
<h4>data/*.yml</h4>
<p>Knowledge base files — text or structured entries with search terms</p>
</div>
</div>
</div>

<!-- Development Process -->
<div style="background: #f8fafc; padding: 1.5rem; border-radius: 8px; margin-bottom: 2rem; border-left: 4px solid #64748b;">
<p style="color: #475569; margin: 0; line-height: 1.6;">
Both projects are built with <strong style="color: #0f172a;">Claude</strong> as a development partner — architecture decisions, code reviews, debugging, and refactoring. Less "AI wrote my code" and more "I have a really good sounding board."
</p>
</div>

<!-- Legend -->
<div class="arch-legend">
<div class="arch-legend-item">
<div class="arch-legend-color arch-aws"></div>
Expand Down
26 changes: 20 additions & 6 deletions app/scripts/projects.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,19 +14,33 @@ export const PROJECTS_CONFIG = {

repos: [
{
name: "the-fret-detective",
label: "The Fret Detective",
description: "AI Guitar Teacher, forked from bot-factory-ui.",
// color: "#0284c7",
name: "aws-serverless-resume",
label: "Serverless Resume",
description:
"This site. Serverless resume running FastAPI on Lambda, deployed with Terraform.",
color: "#0f172a",
},
{
name: "bot-factory",
label: "Bot Factory",
description:
"Reusable RAG chatbot platform. Define bots with YAML, deploy to serverless AWS.",
color: "#0f172a",
url: "https://thefretdetective.com",
},
{
name: "bot-factory-ui",
label: "Bot Factory UI",
description:
"Forkable web package to integrate with a RAG chatbot. bot-factory coming soon.",
"Forkable frontend package for integrating with a Bot Factory RAG chatbot.",
color: "#0f172a",
},
{
name: "the-fret-detective",
label: "The Fret Detective",
description:
"AI guitar teacher built on Bot Factory. Learn chords, scales, and theory through conversation.",
color: "#0f172a",
url: "https://thefretdetective.com",
},
],
};
Loading