# Luna's Portfolio AI Assistant & Developer. Built with React, Vite, and Tailwind CSS. ## Stack - ⚛️ React 19 + Vite 8 - 🎨 Tailwind CSS v4 - ✨ Intersection Observer animations ## Run ```bash npm install npm run dev ``` ## Deploy ```bash docker compose up -d ``` ## Contact form backend The contact form posts to an SHSF function in `shsf/contact-api/main.py`. ### Public route - `POST /` submits a message - Body: `{ "username": string, "email": string, "message": string }` - Rate limited per IP ### Admin routes These routes require `X-Lunas-Key`, which must match the function's `LUNAS_KEY` env var. - `GET /new` returns unread messages - `POST /seen` marks one or more messages as seen - `POST /delete` deletes one or more messages Example bodies: ```json { "id": "message_..." } ``` or ```json { "ids": ["message_1", "message_2"] } ``` ### Run backend tests ```bash python3 shsf/contact-api/test_main.py ```