Skip to content

Releases: 2ro/OpenExhibit

v0.1.0 — initial public release

24 May 18:13
@2ro 2ro
v0.1.0
7ee0fad

Choose a tag to compare

A self-hosted portfolio CMS in Rust. Spiritual successor to Indexhibit, rewritten from scratch with no JavaScript anywhere — public site, admin, lightbox, slideshow autoplay, mobile menu, all of it. HTML and CSS primitives only.

Stack

  • Actix-Web 4 · sqlx/PostgreSQL · Askama templates · SCSS via grass at cargo build time
  • Argon2id passwords · CSRF on every mutating endpoint · CSP + frame/referrer policies · per-IP rate limits on auth
  • SMTP password encrypted at rest (ChaCha20-Poly1305) · trusted-proxy XFF allowlist

What ships

  • Eleven exhibit formats — visual index, slideshow, horizontal strip, no-show, no-thumbs, over-and-over, random image, thickbox, documenta, tag display, external link. Add your own as one Rust file + one template.
  • Server-rendered rich text — Markdown + a small BBCode subset + sanitized inline HTML.
  • Theme-able in two clicks — text + background colour pickers drive the public site's :root custom properties; site-wide and per-exhibit custom CSS textareas as escape hatches.
  • Admin dark mode via prefers-color-scheme. No toggle, no flicker.
  • Image uploads with magic-byte MIME validation, EXIF rotation, and lazy on-demand thumbnail/derivative generation in five shapes.
  • Native <audio> / <video> with HTTP range-request seeking.
  • Self-service password reset by email (SMTP via lettre, or stdout fallback).
  • Server-side hit logging into PostgreSQL — no analytics pixel.

Install

curl -fsSL https://raw.githubusercontent.com/2ro/OpenExhibit/main/install.sh \
  | sudo bash -s -- --domain example.com

Installs PostgreSQL, Rust, and Caddy on a fresh Debian/Ubuntu VPS, builds the binary, terminates TLS via Caddy, starts the systemd unit. First-boot admin password is in journalctl -u openexhibit.

For loopback-only / bring-your-own-proxy, drop --domain.

Docs

Architecture, API routes, database schema, exhibit-format guide, and configuration reference all live under docs/.


🤖 Built with AI pair-programming assistance (Claude)