# Siteforge

This project is a React + TypeScript portfolio app built with Vite.

It is designed to showcase two categories of work:

- Websites
- Apps

The app now supports:

- Dynamic cards generated from a project data source
- Built vs Hosted filters
- A dedicated About page route for each project
- An admin editor route to update cards and About pages
- A per-project README summary block on each project page
- Embedded Spotify podcast player on the home section

## Run locally

```bash
npm install
npm run dev:full
```

`dev:full` starts both:

- Vite frontend (`http://localhost:5173`)
- Admin content API (`http://localhost:4173`)

## Build for production

```bash
npm run build
```

## Run in container

Pull image directly:

```bash
docker pull ghcr.io/nmemmert/siteforge:latest
docker run -d --name siteforge-app -p 4173:4173 -v ./data:/app/data ghcr.io/nmemmert/siteforge:latest
```

Run with Docker Compose:

```bash
docker compose pull
docker compose up -d
```

The app will be available at `http://localhost:4173`.

Persistent admin saves:

- Admin updates are written to `data/admin-content.json`.
- `docker-compose.yml` mounts `./data` into the container at `/app/data`.
- This keeps your edits after container restarts/rebuilds.

## Where to edit content

- Project domain data and ownership: `src/data/projects.ts`
- Portfolio rendering logic: `src/App.tsx`
- Portfolio UI styles: `src/App.css`
- Global theme variables: `src/index.css`

## Routes

- Portfolio home: `/`
- Project details: `/projects/:slug`
- Admin editor: `/admin`

## Admin editing

- Open `/admin` to edit project card and featured-page content.
- Use **Global Settings** to update theme, home headers, and quick tips.
- Use **Project Settings** to update project-specific fields and README URL.
- Use **Create new entry** to add a new project directly from Admin.
- Enter a URL and click **Scan URL metadata** to auto-fill title, summary, domain, category, and icon when available.
- Click **Save project** to apply updates instantly.
- Saved edits are written to `data/admin-content.json` through the API server.
- Use the **Theme** dropdown to switch between Sandstone, Ocean, Midnight, Forest, and Sunset.
- Use **Remove project** to delete the selected project from your local Admin data.
- Use **Reset project** or **Reset all** to restore defaults from `src/data/projects.ts`.

Scan notes:

- URL scanning is best-effort and depends on site accessibility.
- Some sites block direct scanning; Admin falls back to a proxy scan path when possible.
- Always review scanned fields before saving.

Deployment note:

- To keep Admin saves working on the internet, deploy with the Node API (`server.js`) and writable server storage for `data/admin-content.json`.

Useful container commands:

```bash
docker compose logs -f
docker compose down
```

Update to latest image:

```bash
docker compose pull
docker compose up -d
```

## Notes

- The current project cards are sample placeholders.
- Most metadata was scanned from live pages.
- Skywatch currently uses a manual fallback description due to a `401` response during automated scan.
