Releases: 2ro/OpenExhibit
Releases · 2ro/OpenExhibit
v0.1.0 — initial public release
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 buildtime - 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
:rootcustom 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.comInstalls 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)