# Project export: ECO-MATCH

This document was generated by HackStack to give an AI agent context about a hackathon project. Sections are labeled with their provenance; content marked as truncated was cut to keep this document small.

## Project metadata

- Hackathon: TreeHacks 2026
- Tagline: We launch your journey into the world of sustainability, Eco-Matching your talent and interest to high-impact climate-tech jobs with our state of the art Climate-Tech Career Counsellor.
- Devpost: https://devpost.com/software/eco-match-u9zrbe
- GitHub: https://github.com/Aarush-Garg/Eco-Match-TreeHacks-2026
- Demo: https://eco-match-treehacks-2026.vercel.app/
- Video: https://player.vimeo.com/video/1165161474?byline=0&portrait=0&title=0#t=
- Team: 3 GitHub contributor(s) — Aarush-Garg (3 commits), Claude Opus 4.6 (1 commits), Aarush (1 commits)

## Devpost submission (written by the team)

### Inspiration

This TreeHacks team first began to take shape at one of the earliest meetings of Stanford Climate Week, where Martin and Aarush, ironically enough, bonded over a shared frustration: they were deeply motivated to fight climate change, yet unsure how their respective interests in mechanical engineering and data science fit into the vast, overwhelming landscape of climate tech. From that simple conversation, they decided to form a TreeHacks team with Grant Conroy later joining their team. Motivation At their first official brainstorming session, they stumbled upon the seventh challenge of the TreeHacks Sustainability Track: building a tool to help aspiring climate professionals navigate the climate tech job market, a solution to the shared standpoint that brought the group together in the first place. As a team of motivated entrepreneurs who had personally struggled to explore climate-tech careers in a clear and structured way, we transformed that frustration into inspiration. We decided to build Eco-Match, a platform designed to give students searching for internships, professionals looking to pivot into sustainability, and anyone passionate about climate action the clarity, direction, and tools we once wished we had.

### What it does

We offer a resume parser, an interactive chatbot, and a curated set of resources to help users explore the climate-tech landscape. Users can upload a PDF of their resume, which we analyze to identify their skills and recommend relevant sectors and roles that align with their background. From here, the user can input any additional preferences they have about the user’s areas of interest, risk appetite, and years of experience. Our chatbot enhances this experience by enabling users to explore real job opportunities and gain insight into different areas of climate tech. It can provide clear overviews of the various areas of climate tech, generate personalized job recommendations based on a user’s interests and skills, and suggest actionable steps to build the qualifications needed for targeted roles. In addition, users can navigate the broader climate-tech landscape through structured sector overviews, helping them understand how different parts of the industry connect. The platform also highlights which roles align with specific academic backgrounds and how those roles map across sectors, making it easier for users to identify relevant and realistic career pathways.

### How we built it

We built this platform through a combination of deep curiosity, sustained effort, and a shared commitment to making climate-tech careers more accessible. What began as whiteboard sketches and long conversations about possible features evolved into a fully integrated system. We developed the core components from the ground up, including a job scraper, a resume parser, and an intelligent chatbot. Then we carefully brought them together into a cohesive experience. Throughout the process, we wanted to focus not just on functionality but on usability, so we refined every element of the interface to ensure the platform is intuitive, responsive, and genuinely helpful to users navigating a complex and unfamiliar space.

### Challenges we ran into

The development process was far from straightforward. We encountered a range of unforeseen challenges that required both technical problem-solving and careful decision-making. For example, limitations imposed by the company's Terms of Service constrained our ability to scrape job data, forcing us to rethink how we sourced and structured information. On the modeling side, early versions of our filtering and recommendation systems proved ineffective, requiring extensive iteration and tuning to produce meaningful, relevant results. We also faced the nontrivial task of integrating and navigating the taxonomy from climatetechmap.com, which involved distinguishing between closely related categories and ensuring that our system could interpret and present them without confusion. However, these difficulties actually became the perfect opportunities for us. They encouraged us to persevere through the adversity, to think inventively and collaboratively to fix the issues. Ultimately, they lead to a more robust, thoughtful, and reliable platform.

### Accomplishments we're proud of

Despite the challenges along the way, we accomplished a functional AI-backed UI and career coach that helps users find their place in the climate-tech sector. Not only was it exciting to provide a solution to such a commonly faced problem (even putting in our own resumes and finding job postings for ourselves!), but most importantly, it was inspiring to see how much we could learn about UI development, backend programming, teamwork, and nimble problem-solving in 36 hours.

### What we learned

As this was our first hackathon, the experience also reshaped our understanding of what it means to be a software engineer. We came to see that it extends far beyond writing code or using tools, actually requiring careful planning, constant communication, and the ability to adapt quickly when things don’t go as expected.

### What's next

for Eco-Match What’s next for Eco-Match? More jobs. Improved Retrieval Augmented Generation. Grow our software. Become a job board. Expanding across geographies. Motivating people across all sectors to join the climate tech space.

## README (from the GitHub repository)

# Eco-Match (Climate-Tech Career Counsellor Platform)

## Features

- ** AI-Powered**: Uses Google Gemini Pro for intelligent responses
- ** Climate-Tech Expertise**: Specialized knowledge across 6 key sectors:
  - Buildings (heat pumps, smart buildings, sustainable materials)
  - Manufacturing (green hydrogen, industrial electrification)
  - Transportation (EVs, hydrogen fuel cells, sustainable aviation)
  - Food, Agriculture & Nature (methane reduction, regenerative farming)
  - Electricity (renewables, energy storage, grid modernization)
  - GHG Removal (direct air capture, carbon sequestration)
- ** Smart Context Retrieval (RAG)**: Automatically injects relevant climate-tech context based on your queries
- ** Keyword Filtering**: Detects and emphasizes climate-tech topics in conversations
- ** Interactive UI**: Clean, responsive chat interface with typing indicators and suggestions

## Tech Stack

- **Frontend**: HTML, CSS, JavaScript (Vanilla)
- **Backend**: Node.js + Express
- **AI**: Google Gemini API
- **Data**: JSON-based knowledge base with comprehensive climate-tech taxonomy

## Prerequisites
- Node.js 18.x or higher
- A free Google Gemini API key ([Get one here](https://aistudio.google.com/app/apikey))

## Installation

1. **Clone or download this repository**

2. **Install dependencies**
   ```bash
   npm install
   ```

3. **Get your free Gemini API key**
   - Visit [Google AI Studio](https://aistudio.google.com/app/apikey)
   - Sign in with your Google account
   - Click "Create API Key"
   - Copy your API key

4. **Configure environment variables**
   - Open the `.env` file
   - Replace `your_api_key_here` with your actual Gemini API key:
   ```
   GEMINI_API_KEY=your_actual_api_key_here
   PORT=3000
   ```

## Usage

1. **Open your browser**
   - Navigate to https://eco-match-treehacks-2026.vercel.app/

2. **Start chatting!**
   - Try asking about:
     - "What are heat pumps and how do they work?"
     - "How can we decarbonize transportation?"
     - "Tell me about direct air capture"
     - "What are climate-tech moonshots?"

## Project Structure

```
.
├── index.html              # Main chat interface
├── styles.css              # UI styling (climate-themed)
├── app.js                  # Frontend JavaScript
├── server.js               # Express backend + Gemini integration
├── climate-knowledge.json  # Climate-tech taxonomy database
├── package.json            # Node dependencies
├── .env                    # Environment variables (API key)
├── .gitignore              # Git ignore rules
└── README.md               # This file
```

## How It Works

### 1. System Prompt Configuration
The chatbot is configured with a specialized system prompt that establishes it as a climate-tech expert with knowledge across all 6 sectors.

### 2. Keyword Extraction
When you send a message, the backend analyzes your query to extract climate-tech keywords (e.g., "heat pumps", "carbon capture", "solar", etc.).

### 3. Context Retrieval (RAG)
Based on extracted keywords, the system retrieves relevant information from the climate knowledge base:
- Sector descriptions
- Key technologies
- Innovation imperatives
- Moonshot projects

### 4. Enhanced Prompt
The retrieved context is injected into the prompt sent to Gemini, ensuring responses are grounded in climate-tech knowledge.

### 5. Intelligent Response
Gemini generates a comprehensive response using both its base knowledge and the injected climate-tech context.

## Example Queries

- "What are the main technologies for decarbonizing buildings?"
- "How does green hydrogen work and where can it be used?"
- "What's the difference between DAC and BECCS?"
- "Tell me about regenerative agriculture"
- "What are the challenges with electric vehicles?"
- "How can we reduce methane emissions from livestock?"
- "What innovations are needed for sustainable aviation?"
- "Explain grid-scale battery storage"

## API Endpoints

### `POST /api/chat`
Send a message to the chatbot.

**Request:**
```json
{
  "message": "What are heat pumps?"
}
```

**Response:**
```json
{
  "response": "Heat pumps are...",
  "metadata": {
    "keywords": ["heat_pumps", "buildings"],
    "sectorsReferenced": ["Buildings"]
  }
}
```

### `GET /api/health`
Check server health status.

**Response:**
```json
{
  "status": "ok",
  "message": "Climate-Tech Chatbot API is running",
  "sectorsLoaded": 6
}
```

## Troubleshooting

### "Invalid API key" error
- Make sure you've added your Gemini API key to the `.env` file
- Verify the key is correct (no extra spaces or quotes)
- Ensure you've created the API key at [Google AI Studio](https://aistudio.google.com/app/apikey)

### "API quota exceeded" error
- The free Gemini API has rate limits
- Wait a few minutes and try again
- Consider upgrading to a paid plan if needed

### Server won't start
- Make sure Node.js 18+ is installed: `node --version`
- Delete `node_modules` and run `npm install` again
- Check if port 3000 is available (or change PORT in `.env`)

## Customization

### Adding More Climate Data
Edit `climate-knowledge.json` to add:
- New sectors
- Additional technologies
- More keywords for better matching
- Custom imperatives or moonshots

### Changing the AI Model
In `server.js`, line 17:
```javascript
const model = genAI.getGenerativeModel({ model: 'gemini-pro' });
```
You can change to other Gemini models if needed.

### Styling
Edit `styles.css` to customize:
- Colors and theme
- Layout and spacing
- Responsive breakpoints

## Credits

- **Climate Data**: [Climate Tech Map](https://climatetechmap.com) by Breakthrough Energy, Stanford, and McKinsey
- **AI**: Google Gemini API
- **Built for**: TreeHacks 2026

## License

ISC

## Support

For issues or questions, please check:
1. This README
2. Server console logs
3. Browser console (F12)

---


## Detected evidence (automated analysis)

Indexed codebase: 84 recognized source files, 603 KB.
- CSS (language) — detected in the code
- Express (technology) — detected in the code
- Google Gemini (technology) — detected in the code
- HTML (language) — detected in the code
- JavaScript (language) — detected in the code
- Python (language) — detected in the code
- Vercel (technology) — claimed on Devpost, not found in the code
- AI coding agent: Claude Code — evidence: config files committed to the repository; commit authorship or trailers

## Codebase structure (from repository index)

### Files (99 of 99)

```
.gitignore
.vercelignore
analyze-categories.js
app.js
CLAUDE.md
clean-urls.js
climate_categories_only.csv
climate_categories_only.json
climate_jobs_gold_set_v4.csv
climate_jobs_v6.csv
climate_jobs_v6.json
climate-category-taxonomy.json
climate-jobs-knowledge.json
climate-knowledge.json
climate-taxonomy-enhanced.json
climatetech_majors_v3 (1).json
convert_csv_to_json.js
deploy.sh
DEPLOYMENT.md
FULL_TAXONOMY.py
index copy.html
index.html
integrate-taxonomy.js
list-models.js
major-aerospace-engineering.html
major-agricultural-science-engineering.html
major-architecture.html
major-atmospheric-science-meteorology.html
major-bioengineering-biomedical-engineering.html
major-biology-biochemistry.html
major-building-science-energy-performance.html
major-business-administration-management.html
major-chemical-engineering.html
major-chemistry.html
major-civil-engineering.html
major-climate-system-science-engineering.html
major-communications-journalism.html
major-computational-science-engineering.html
major-computer-science.html
major-construction-management-trades.html
major-data-science-machine-learning.html
major-design-graphic-ux-ui-product.html
major-earth-planetary-sciences.html
major-earth-system-science.html
major-ecology-conservation-biology.html
major-economics.html
major-education-teaching.html
major-electrical-engineering.html
major-electrical-trades-technology.html
major-energy-science-engineering.html
major-engineering-physics.html
major-environmental-engineering.html
major-environmental-science.html
major-environmental-studies-policy.html
major-finance-accounting.html
major-food-science-technology.html
major-forestry-natural-resources.html
major-gis-geospatial-science.html
major-hvac-building-trades.html
major-industrial-systems-engineering.html
major-information-systems-it.html
major-law.html
major-management-science-engineering.html
major-materials-science-engineering.html
major-mathematics-applied-math.html
major-mechanical-engineering.html
major-mechanical-industrial-trades.html
major-mining-geological-engineering.html
major-nuclear-engineering.html
major-occupational-health-safety.html
major-oceanography-marine-science.html
major-physics.html
major-political-science-international-relations.html
major-public-health-epidemiology.html
major-public-policy-administration.html
major-renewable-energy-engineering.html
major-sociology-anthropology-social-science.html
major-statistics-biostatistics.html
major-supply-chain-logistics.html
major-sustainability-sustainable-development.html
major-urban-regional-planning.html
package.json
parse-jobs.js
README.md
resume_parser.js
sector-buildings.html
sector-electricity.html
sector-food-agriculture.html
sector-ghg-removal.html
sector-manufacturing.html
sector-transportation.html
server-climate-only.js.backup
server.js
styles copy.css
styles.css
TAXONOMY-INTEGRATION-SUMMARY.md
test-api-key.js
test-models.js
vercel.json
```

### Dependencies

- package.json: @google/generative-ai@^0.24.1, cors@^2.8.6, dotenv@^17.3.1, express@^5.2.1, multer@^1.4.5-lts.1, pdf-parse@^1.1.1

### Recent commits (newest first)

- Update README.md
- Update README.md
- Update README.md
- Initial commit: Eco-Match TreeHacks 2026

## Key source files (fetched from GitHub, selected and truncated for size)

### CLAUDE.md

```markdown
## Development Environment
- OS: macOS 25.2.0
- Shell: /bin/zsh
- Path format: Unix
- File system: Case-sensitive (default)
- Line endings: LF

## Playwright MCP Guide

File paths:
- Screenshots: `./CCimages/screenshots/`
- PDFs: `./CCimages/pdfs/`

Browser version fix:
- Error: "Executable doesn't exist at chromium-XXXX" → Version mismatch
- v1.0.12+ uses Playwright 1.57.0, requires chromium-1200 with `chrome-win64/` structure
- Quick fix: `npx playwright@latest install chromium`
- Manual symlink (if needed): `cd ~/AppData/Local/ms-playwright && cmd //c "mklink /J chromium-1200 chromium-1181"`

```

### DEPLOYMENT.md

```markdown
# Deployment Guide - Climate-Tech Career Hub

## 🚀 Quick Deployment Options

### Option 1: Vercel (Recommended - Easiest)

1. **Install Vercel CLI**
   ```bash
   npm install -g vercel
   ```

2. **Deploy**
   ```bash
   vercel
   ```
   - Follow the prompts
   - Set environment variable: `GEMINI_API_KEY=your_key`
   - Your site will be live at `https://your-project.vercel.app`

### Option 2: Netlify

1. **Install Netlify CLI**
   ```bash
   npm install -g netlify-cli
   ```

2. **Deploy**
   ```bash
   netlify deploy --prod
   ```
   - Set environment variable in Netlify dashboard: `GEMINI_API_KEY`

### Option 3: Railway

1. **Create account** at [railway.app](https://railway.app)
2. **Connect GitHub repo** or upload files
3. **Add environment variable**: `GEMINI_API_KEY`
4. **Deploy** - automatic deployment on push

### Option 4: Render

1. **Create account** at [render.com](https://render.com)
2. **New Web Service** → Connect repository
3. **Build Command**: `npm install`
4. **Start Command**: `npm start`
5. **Add environment variable**: `GEMINI_API_KEY`

### Option 5: Heroku

1. **Install Heroku CLI**
   ```bash
   npm install -g heroku
   ```

2. **Login and deploy**
   ```bash
   heroku login
   heroku create climate-tech-career-hub
   git init
   git add .
   git commit -m "Initial deployment"
   heroku config:set GEMINI_API_KEY=your_key
   git push heroku main
   ```

## 📋 Pre-Deployment Checklist

- [ ] Replace `GEMINI_API_KEY` with your actual API key
- [ ] Test locally: `npm start` → http://localhost:3000
- [ ] Verify all features work (chatbot, navigation, sections)
- [ ] Test on mobile browsers
- [ ] Check API key has proper permissions at [Google AI Studio](https://aistudio.google.com/)
- [ ] Review job data is up-to-date in `climate-jobs-knowledge.json`

## 🔧 Environment Variables Required

```
GEMINI_API_KEY=your_gemini_api_key_here
PORT=3000  # Optional, defaults to 3000
```

## 📁 Files to Deploy

**Required:**
- `index.html` - Landing page
- `styles.css` - Styling
- `app.js` - Frontend JavaScript
- `server.js` - Backend API
- `package.json` - Dependencies
- `climate-knowledge.json` - Climate tech data
- `climate-jobs-knowledge.json` - Job listings
- `.env` - Environment variables (create on deployment platform)

**Not needed:**
- `node_modules/` (auto-installed)
- `.env.local` (local testing only)
- `*.backup` files
- `test-*.js` files

## 🌐 Custom Domain Setup

### Vercel
1. Go to Project Settings → Domains
2. Add your custom domain
3. Update DNS records as instructed

### Netlify
1. Site Settings → Domain Management
2. Add custom domain
3. Configure DNS

## 🔐 Security Best Practices

1. **Never commit `.env` to Git**
   ```bash
   echo ".env" >> .gitignore
   ```

2. **Use environment variables** on deployment platform

3. **Restrict API key** in Google Cloud Console:
   - Set HTTP referrers for web
   - Limit to your domain only

4. **Enable HTTPS** (automatic on most platforms)

## 📊 Monitoring & Updates

**Update Job
[truncated — 1462 more characters]
```

### package.json

```
{
  "name": "treehacks-v2",
  "version": "1.0.0",
  "description": "Climate-Tech Chatbot powered by Google Gemini API",
  "main": "server.js",
  "scripts": {
    "start": "node server.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "type": "commonjs",
  "dependencies": {
    "@google/generative-ai": "^0.24.1",
    "cors": "^2.8.6",
    "dotenv": "^17.3.1",
    "express": "^5.2.1",
    "multer": "^1.4.5-lts.1",
    "pdf-parse": "^1.1.1"
  }
}

```

### test-models.js

```javascript
require('dotenv').config();
const { GoogleGenerativeAI } = require('@google/generative-ai');

const genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY);

async function listModels() {
  try {
    const models = await genAI.listModels();
    console.log('Available models:');
    for await (const model of models) {
      console.log(`- ${model.name}`);
      console.log(`  Supported methods: ${model.supportedGenerationMethods.join(', ')}`);
    }
  } catch (error) {
    console.error('Error listing models:', error.message);
  }
}

listModels();

```

### analyze-categories.js

```javascript
const data = require('./climate_categories_only.json');

// Extract all categories and organize by sector
const categoriesBySector = {};

data.jobs.forEach(job => {
  if (job.climate_categories) {
    job.climate_categories.forEach(cat => {
      const parts = cat.split(' > ');
      const sector = parts[0];

      if (!categoriesBySector[sector]) {
        categoriesBySector[sector] = new Set();
      }
      categoriesBySector[sector].add(cat);
    });
  }
});

// Convert sets to sorted arrays and count jobs per category
const result = {};
Object.keys(categoriesBySector).sort().forEach(sector => {
  result[sector] = Array.from(categoriesBySector[sector]).sort();
});

console.log(JSON.stringify(result, null, 2));

```

### clean-urls.js

```javascript
const fs = require('fs');

// Load the data
const data = JSON.parse(fs.readFileSync('./climate-taxonomy-enhanced.json', 'utf8'));

let fixedCount = 0;

// Clean URLs in all jobs
data.jobs.forEach(job => {
  if (job.url) {
    const original = job.url;
    // Remove trailing punctuation, quotes, commas, whitespace
    const cleaned = job.url.trim().replace(/[,;'")\]}\s]+$/, '');
    if (original !== cleaned) {
      job.url = cleaned;
      fixedCount++;
      console.log('Fixed:', original, '->', cleaned);
    }
  }
});

// Save back to file
fs.writeFileSync('./climate-taxonomy-enhanced.json', JSON.stringify(data, null, 2));

console.log(`\nTotal URLs fixed: ${fixedCount}`);
console.log('File saved: climate-taxonomy-enhanced.json');

```

### deploy.sh

```shell
#!/bin/bash

# Climate-Tech Career Hub - Deployment Script
echo "🌍 Climate-Tech Career Hub - Vercel Deployment"
echo "================================================"
echo ""

# Change to project directory
cd "/Users/ags/Library/CloudStorage/OneDrive-Personal/Aarush-Personal folder/Aarush's Shared with Big Mac/Stanford - Folder/TreeHacks V2"

# Step 1: Login to Vercel
echo "Step 1: Logging into Vercel..."
echo "A browser window will open. Please authenticate."
echo ""
vercel login

# Check if login was successful
if [ $? -ne 0 ]; then
    echo "❌ Login failed. Please try again."
    exit 1
fi

echo ""
echo "✅ Login successful!"
echo ""

# Step 2: Deploy
echo "Step 2: Deploying to Vercel..."
echo ""
vercel

# Step 3: Instructions for API key
echo ""
echo "================================================"
echo "📝 Next Steps:"
echo "================================================"
echo ""
echo "1. Add your Gemini API key:"
echo "   vercel env add GEMINI_API_KEY production"
echo ""
echo "2. Redeploy with environment variables:"
echo "   vercel --prod"
echo ""
echo "Your site will be live! 🚀"

```

### list-models.js

```javascript
require('dotenv').config();

const API_KEY = process.env.GEMINI_API_KEY;

async function listModels() {
  console.log('Fetching available models...\n');

  const endpoints = ['v1', 'v1beta'];

  for (const endpoint of endpoints) {
    try {
      const url = `https://generativelanguage.googleapis.com/${endpoint}/models?key=${API_KEY}`;
      console.log(`Checking ${endpoint} endpoint...`);

      const response = await fetch(url);
      const data = await response.json();

      if (response.ok && data.models) {
        console.log(`✅ Found ${data.models.length} models on ${endpoint}:\n`);
        data.models.forEach(model => {
          const methods = model.supportedGenerationMethods || [];
          if (methods.includes('generateContent')) {
            console.log(`  ✅ ${model.name} - SUPPORTS generateContent`);
          } else {
            console.log(`  ⚠️  ${model.name} - methods: ${methods.join(', ')}`);
          }
        });
        console.log('');
      } else {
        console.log(`❌ Error: ${data.error?.message || 'Unknown error'}\n`);
      }
    } catch (error) {
      console.log(`❌ Error: ${error.message}\n`);
    }
  }
}

listModels();

```

### test-api-key.js

```javascript
require('dotenv').config();

const API_KEY = process.env.GEMINI_API_KEY;

async function testAPIKey() {
  console.log('API Key (first 20 chars):', API_KEY?.substring(0, 20) + '...');
  console.log('API Key length:', API_KEY?.length);

  // Test different endpoints and models
  const tests = [
    { endpoint: 'v1beta', model: 'gemini-pro' },
    { endpoint: 'v1beta', model: 'gemini-1.5-pro' },
    { endpoint: 'v1beta', model: 'gemini-1.5-flash' },
    { endpoint: 'v1beta', model: 'gemini-1.5-flash-latest' },
    { endpoint: 'v1beta', model: 'gemini-1.5-pro-latest' },
    { endpoint: 'v1', model: 'gemini-pro' },
    { endpoint: 'v1', model: 'gemini-1.5-flash' },
    { endpoint: 'v1', model: 'gemini-1.5-pro' },
    { endpoint: 'v1', model: 'gemini-1.5-flash-latest' },
    { endpoint: 'v1', model: 'gemini-1.5-pro-latest' },
  ];

  for (const test of tests) {
    try {
      const url = `https://generativelanguage.googleapis.com/${test.endpoint}/models/${test.model}:generateContent?key=${API_KEY}`;
      console.log(`\nTesting ${test.endpoint}/${test.model}...`);

      const response = await fetch(url, {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({
          contents: [{ parts: [{ text: 'Hello' }] }]
        })
      });

      const data = await response.json();

      if (response.ok) {
        console.log('✅ SUCCESS!');
        console.log('Response:', data.candidates[0].content.parts[0].text.substring(0, 50));
      } else {
        console.log('❌ FAILED:', data.error?.message || 'Unknown error');
      }
    } catch (error) {
      console.log('❌ ERROR:', error.message);
    }
  }
}

testAPIKey();

```

### major-law.html

```html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Law Jobs | Climate-Tech Career Hub</title>
    <link rel="stylesheet" href="styles.css">
</head>
<body>
    <nav class="navbar">
        <div class="nav-container">
            <div class="nav-logo">🌍 Climate-Tech Career Hub</div>
            <div class="nav-links">
                <a href="index.html" class="nav-link">← Back to Home</a>
                <a href="index.html#sectors" class="nav-link">Sectors</a>
                <a href="index.html#chatbot" class="nav-link">Find Jobs</a>
            </div>
        </div>
    </nav>
    <section class="sector-page-header">
        <div class="section-container">
            <div class="sector-header-content">
                <div class="sector-icon-hero">⚖️</div>
                <h1 class="sector-page-title">Law</h1>
                <p class="sector-page-description">Legal analysis, regulation, contracts, and compliance</p>
            </div>
        </div>
    </section>
    <section class="jobs-section">
        <div class="section-container">
            <h2 class="section-title">Available Positions</h2>
            <div class="jobs-placeholder">
                <div class="placeholder-icon">🔍</div>
                <h3>Job listings for this major coming soon</h3>
                <p>We're currently compiling the latest Law opportunities in climate tech. Check back soon or try our Climate Career Counselor for personalized recommendations.</p>
                <a href="index.html#chatbot" class="cta-button">Try Climate Career Counselor</a>
            </div>
        </div>
    </section>
    <footer class="footer-main">
        <div class="footer-content">
            <div class="footer-section">
                <h4>🌍 Climate-Tech Career Hub</h4>
                <p>Connecting talent with climate impact opportunities worldwide.</p>
            </div>
            <div class="footer-section">
                <h4>Quick Links</h4>
                <a href="index.html">Home</a>
                <a href="index.html#sectors">Explore Sectors</a>
                <a href="index.html#chatbot">Find Jobs</a>
                <a href="index.html#about">About Us</a>
            </div>
        </div>
        <div class="footer-bottom">
            <p>&copy; 2026 Climate-Tech Career Hub. Built with 🌱 for a sustainable future.</p>
        </div>
    </footer>
</body>
</html>
```

[71 more indexed source files omitted to keep this export small. The full file list is in the Codebase structure section above.]