diff --git a/CHANGELOG.md b/CHANGELOG.md index eecb75d..7569e87 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,22 @@ All notable changes to RustChan will be documented in this file. --- +## [1.0.13] — 2026-03-08 + +### ✨ Added +- **Backup system rewritten to stream instead of buffering in RAM** — all backup operations previously loaded entire zip files into memory, risking OOM on large instances. Downloads now stream from disk in 64 KiB chunks (browsers also get a proper progress bar). Backup creation now writes directly to disk via temp files with atomic rename on success, so partial backups never appear in the saved list. Individual file archiving now streams through an 8 KiB buffer instead of reading each file fully into memory. Peak RAM usage dropped from "entire backup size" to roughly 64 KiB regardless of instance size. +- **ChanClassic theme** — a new theme that mimics the classic 4chan aesthetic: light tan/beige background, maroon/red accents, blue post-number links, and the iconic post block styling. Available in the theme picker alongside existing themes. +- **Default theme in settings.toml** — the generated `settings.toml` now includes a `default_theme` field so the server-side default theme can be set before first startup, without requiring admin panel access. +- **Home page subtitle in settings.toml** — `site_subtitle` is now present in the generated `settings.toml` directly below `forum_name`, allowing the home page subtitle to be configured at install time. +- **Default theme selector in admin panel** — the Site Settings section now includes a dropdown to set the site-wide default theme served to new visitors. + +### 🔄 Changed +- **Admin panel reorganized** — sections are now ordered: Site Settings → Boards → Moderation Log → Report Inbox → Moderation (ban appeals, active bans, word filters consolidated) → Full Site Backup & Restore → Board Backup & Restore → Database Maintenance → Active Onion Address. Code order matches page order for easier future editing. +- **"Backup & Restore" renamed** to **"Full Site Backup & Restore"** to clearly distinguish it from the board-level backup section. +- **Ban appeals, active bans, and word filters** condensed into a single **Moderation** panel with clearly labelled subsections. + +--- + ## [1.0.12] — 2026-03-07 ### 🔄 Changed diff --git a/Cargo.lock b/Cargo.lock index 34bf957..a0171e0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1256,7 +1256,7 @@ dependencies = [ [[package]] name = "rustchan" -version = "1.0.12" +version = "1.0.13" dependencies = [ "anyhow", "argon2", diff --git a/Cargo.toml b/Cargo.toml index 98a6b4c..dd2908d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rustchan" -version = "1.0.12" +version = "1.0.13" edition = "2021" license = "MIT" # FIX[LOW-1]: Removed hardware-specific description. This binary is portable diff --git a/docs/rustchan-showcase.html b/docs/rustchan-showcase.html deleted file mode 100644 index 7fdfbd7..0000000 --- a/docs/rustchan-showcase.html +++ /dev/null @@ -1,2644 +0,0 @@ - - -
- - --██████╗ ██╗ ██╗███████╗████████╗ ██████╗██╗ ██╗ █████╗ ███╗ ██╗ -██╔══██╗██║ ██║██╔════╝╚══██╔══╝██╔════╝██║ ██║██╔══██╗████╗ ██║ -██████╔╝██║ ██║███████╗ ██║ ██║ ███████║███████║██╔██╗ ██║ -██╔══██╗██║ ██║╚════██║ ██║ ██║ ██╔══██║██╔══██║██║╚██╗██║ -██║ ██║╚██████╔╝███████║ ██║ ╚██████╗██║ ██║██║ ██║██║ ╚████║ -╚═╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝ ╚═════╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═══╝- -
A self-hosted imageboard. One binary. Zero runtime dependencies.
- -RustChan ships with a complete imageboard stack. Drop it on a VPS, a Raspberry Pi, or your laptop — it runs immediately. All data lives in one directory next to the binary.
-image crate — GPS, device ID & all EXIF/XMP/IPTC metadata discardedCHAN_THUMB_SIZEshowwavespic filter ffmpegdb.rs for full control| Web framework | Axum 0.8 |
| Async runtime | Tokio 1.x |
| Database | SQLite / rusqlite (bundled) |
| Image processing | image crate |
| Password hashing | argon2 — Argon2id |
| HTML rendering | Plain Rust format! macros |
full-backups/ without stopping the serverVACUUM INTO — safe under live writesboard.json manifest (all posts, threads, polls, votes, file hash records)sqlite3_backup_init() API — no file swapping, no WAL corruption[a-zA-Z0-9._-] only — no path traversalsqlite3_backup_init() rather than file swapping[dice NdM] rolled at post time, embedded immutably in rendered HTMLshowwavespic filter — colour-matched to themerequire_ffmpeg = true to make absence a hard startup errorenable_tor_support = true in settings.tomlhostname filecross for ARM targetsX-Forwarded-For headerUser-selectable from a floating picker on every page. Persisted in localStorage with zero load flash. Click any theme below to preview it — this entire page will transform.
-RustChan handles images, video, and audio natively. When ffmpeg is present on PATH, it upgrades automatically — more formats, waveform thumbnails, and broad-compatibility transcoding. Without it, everything still works.
-image crate — all EXIF, GPS, XMP, IPTC discarded before savingCHAN_THUMB_SIZE, default 250px)require_ffmpeg = true to make absence a hard startup errorCHAN_MAX_AUDIO_MBshowwavespicYouTube, Invidious, and Streamable URLs pasted in post bodies are automatically detected and replaced with a click-to-play widget — identical in layout to a native WebM attachment.
-Every upload passes two independent security checks before being accepted. File extensions are never trusted — the actual binary content is inspected.
- -Every moderation action — bans, appeals, board config, content removal, backups, word filters, database maintenance — is available directly from the web admin panel. The CLI is there if you need it for scripting.
-New thread creation can be gated behind a SHA-256 hashcash PoW challenge solved silently in the browser. No images to click, no third-party tracking, no accessibility barriers.
-All admin operations are also available from the command line — ideal for provisioning scripts, automated backups, and CI pipelines.
- -No Postgres to configure, no Redis to run, no migrations to manage manually. SQLite is bundled at compile time — no system library required. WAL mode gives you concurrent reads without connection queuing.
-Everything lives in one directory next to the binary. Migrating to a new server is literally cp -r rustchan-data/ newserver:
Write-Ahead Logging lets multiple readers proceed simultaneously while a single writer commits — no read-blocking, no connection queuing under normal load. The WAL file is checkpointed by a configurable background task (default: every 3600s) to prevent it from growing unbounded.
-r2d2 + r2d2_sqlite manages a pool of open SQLite connections. Async Axum handlers check out a connection, execute SQL, return it immediately — no blocking the async executor.
-All queries are handwritten SQL in src/db.rs. No query builder, no migrations framework, no N+1 surprises. You can read every query the app will ever run in one file.
RustChan's backup system is entirely web-based — every action happens from the admin panel, no SSH required. Full site or per-board, save to server or download to your laptop, restore without restarting.
-A full backup is a single .zip containing a consistent SQLite snapshot (via VACUUM INTO, safe under live writes) plus every board's uploaded files and thumbnails.
rustchan-data/full-backups/ — listed in the panel for later download or restore..zip directly to your browser — no wget, no scp..zip from your computer directly to restore. Useful when moving instances or recovering from a cloud backup..zip from the server filesystem. Filename validated to [a-zA-Z0-9._-] before any filesystem operation.Board backups are fully self-contained. A board.json manifest carries every post, thread, poll, vote, and file hash record for that board — plus the entire upload directory. Other boards are never touched.
Security is built in, not bolted on. Every layer of the stack has been thought through — from passwords to file uploads to IP privacy.
-No containers. No npm install. No runtime to maintain. Build, create an admin account, create some boards, run.
-rustchan-data/settings.toml is generated automatically
- with a freshly-generated cookie_secret and every setting documented inline.
- Edit it and restart to apply changes. Everything lives in rustchan-data/ — migrations are a cp -r.
-