Version 2.0.0
The entire archiver was rewritten from Node.js to Rust. Same features, same file structure on disk, but now it’s a single static binary with no runtime dependencies.
Changed
- Rust rewrite — the entire scraper, builder, and server are now Rust. No Node.js, no npm, no runtime. One binary.
- Sitemap-first scraping — webChronicle now auto-discovers sitemaps (
/sitemap.xml,/sitemap_index.xml,/wp-sitemap.xml, etc.) before falling back to recursive crawling. You can also pass a sitemap URL directly. - 10-thread concurrent scraping — pages are fetched in parallel for faster runs.
- Local-first link rewriting — all links in snapshots are rewritten to point to local copies. No broken links when browsing offline.
- CDN image handling — images from CDN URLs are downloaded and stored locally.
data-src/data-srcsetsupport — lazy-loaded images are captured correctly.- Overlay injection moved to serve-time — snapshots on disk are clean HTML. The overlay (archive date, back link) is injected by the server on-the-fly via Shadow DOM. Copy a snapshot folder, get the original page.
ledger.tomlindex — replaces the old JSON index. Human-readable, hand-editable.- Tera templates — the index page uses Tera instead of Eleventy’s Liquid.
- System fonts — no web font requests. The UI uses
system-uiand friends.
Removed
- Node.js runtime, npm dependencies, Eleventy,
.nvmrc,package.jsonbuild scripts — all gone.package.jsonis metadata only. - Filmstrip UI — replaced with a blog-style feed (domain h2, snapshots ul/li,
max-width: 640px).
Install
git clone https://github.com/freshjuice-dev/webchronicle.git
cd webchronicle
cargo build --release
./target/release/webchronicle init
./target/release/webchronicle scrape
./target/release/webchronicle build
./target/release/webchronicle serve --port 3000
Known gaps
@font-facedeclarations in CSS files are not yet parsed for local font downloading. Fonts referenced viaurl()in CSS are downloaded, but@font-facesrc URLs are not.