59 lines
942 B
Markdown
59 lines
942 B
Markdown
# 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
|
|
```
|