# Glaze 🍯

Glaze is a small web frontend for **soft-serve**, built in **Odin**.

It serves **server-rendered HTML pages** that let you browse git repositories, inspect files, and download content. Everything is backend-driven and intentionally simple, primarily serving server side rendered pages.

## Goals

### Product goals

- Provide a clean, fast web UI for:
  - listing repositories
  - browsing directories and files
  - viewing text files in-browser
  - downloading raw files and archives
- Integrate cleanly with existing soft-serve setups.
- Be pleasant to self-host.

### Engineering goals

- Implement a **resilient HTTP/1.x server** in Odin using raw sockets:
  - incremental request parsing
  - keep-alive support with limits and timeouts
  - bounded memory usage per connection
  - clear connection state machine
- Keep the HTTP server reusable for future projects.

## Non-goals (initially)

- Public JSON API
- HTTP/2 or TLS (use a reverse proxy if needed)
- Chunked request bodies
- Full GitHub-like features (PRs, issues, etc.)

## High-level architecture

Glaze consists of two main layers:

1. **HTTP server**
   - TCP listener, raw sockets
   - HTTP/1.x parsing and response writing
   - routing and static file serving

2. **Application layer**
   - HTML page handlers
   - git / soft-serve integration
   - simple templating helpers

## Suggested layout

```
src/
| http/ # sockets, parsing, routing
| app/ # page handlers
| views/ # HTML helpers / templates
| integrations/
| softserve/ # repo + file access
| static/ # CSS, icons, etc.
| main.odin
```

## Pages & routes (initial scope)

- `GET /`
  - List repositories
- `GET /r//`
  - Repository overview, file list
- `GET /r//tree//`
  - Directory browsing
- `GET /r//blob//`
  - View text file
- `GET /r//raw//`
  - Download raw file
- `GET /r//archive/.(zip|tar.gz)`
  - Download repository archive (later)

## Git / soft-serve integration

Early versions will likely:
- run on the same host as soft-serve
- access repositories directly via `git` commands or filesystem access

Integration details are intentionally abstracted so the backend can later switch
to:
- soft-serve CLI
- SSH access
- or an internal soft-serve API

## HTTP server design notes

- Nonblocking sockets with an event loop (poll/epoll)
- One connection can serve multiple requests (keep-alive)
- Strict limits to avoid resource abuse:
  - max header size
  - max request line length
  - max body size
  - idle timeouts

## Milestones

### M1: Hello Glaze

- TCP listener + HTTP parsing
- `GET /` returns simple HTML
- keep-alive working

### M2: Layout + static assets

- Basic page layout
- CSS served from `/static/`

### M3: Repository list

- Real repo data
- Clickable repo links

### M4: Repository browsing

- Directory listing
- File view
- Raw downloads

### M5: Nice touches

- README rendering
- Archive downloads
- Better caching headers

## Development

- Local run:
  `glaze -listen 127.0.0.1:8080`
- Test with:
  `curl -v http://127.0.0.1:8080/`