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/<repo>/
    • Repository overview, file list
  • GET /r/<repo>/tree/<ref>/<path>
    • Directory browsing
  • GET /r/<repo>/blob/<ref>/<path>
    • View text file
  • GET /r/<repo>/raw/<ref>/<path>
    • Download raw file
  • GET /r/<repo>/archive/<ref>.(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/