42 lines
1.9 KiB
Markdown
42 lines
1.9 KiB
Markdown
# CLAUDE.md
|
||
|
||
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
||
|
||
## Project Overview
|
||
|
||
A minimal, self-contained image upload server written in vanilla Node.js (ES modules). No external dependencies — only Node.js built-ins (`http`, `fs`, `path`, `url`).
|
||
|
||
## Running the Server
|
||
|
||
```bash
|
||
# Direct
|
||
node server.mjs
|
||
|
||
# Via daemon manager
|
||
./server.sh start
|
||
./server.sh stop
|
||
./server.sh restart
|
||
./server.sh status
|
||
```
|
||
|
||
- Listens on `0.0.0.0:8765` (hardcoded in `server.mjs`)
|
||
- Logs to `/tmp/server_mjs.log`; PID tracked at `/tmp/server_mjs.pid`
|
||
|
||
## Architecture
|
||
|
||
The entire application lives in two files:
|
||
|
||
**`server.mjs`** — Three logical sections:
|
||
1. **Embedded HTML UI** (lines 9–85): Full self-contained frontend (HTML/CSS/JS) as a string constant — no separate asset files. Dark theme, drag-and-drop, German labels.
|
||
2. **`parseMultipart()`** (lines 87–110): Custom binary multipart/form-data parser; no external library.
|
||
3. **HTTP server** (lines 112–145): Two routes — `GET /` serves the UI, `POST /upload` saves files to the directory where `server.mjs` lives.
|
||
|
||
**`server.sh`** — Daemon management (start/stop/restart/status). Note: the path inside the script points to `/home/joachim/git/ai-coding-kit/screens/server.mjs`, not the local copy — update if deploying from this directory.
|
||
|
||
## Key Conventions
|
||
|
||
- **Save location**: Files are written to the same directory as `server.mjs` via `fileURLToPath(import.meta.url)`.
|
||
- **Filename sanitization**: `path.basename()` prevents path traversal; regex `/[^a-zA-Z0-9._\- ()äöüÄÖÜß]/g`replaces disallowed characters with underscores. German characters are intentionally allowed.
|
||
- **Synchronous writes**: `fs.writeFileSync()` is used deliberately for simplicity.
|
||
- **UI is embedded**: Keep HTML/CSS/JS inside the string constant in `server.mjs` — there are no separate asset files by design.
|