diff --git a/.gitignore b/.gitignore
index 478a663..9c3bd3c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,6 +7,8 @@
!docs/
!docs/LICENSE
!docs/README*
+!docs/branding/
+!docs/branding/**
!crates
!crates/**
diff --git a/AGENTS.md b/AGENTS.md
index 420772c..10b5963 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -2,7 +2,7 @@
## Project Overview
-Archivr is a self-hosted archival tool that captures and preserves digital content — YouTube/Twitter/Instagram/TikTok/Reddit posts, arbitrary URLs, full web pages (via SingleFile + Chromium, optionally through a Freedium mirror for paywalled articles), and local files — into self-contained, SQLite-backed archive directories with blob deduplication, hierarchical tags, collections, and role-based auth. Rust workspace + React frontend.
+archivr is a self-hosted archival tool that captures and preserves digital content — YouTube/Twitter/Instagram/TikTok/Reddit posts, arbitrary URLs, full web pages (via SingleFile + Chromium, optionally through a Freedium mirror for paywalled articles), and local files — into self-contained, SQLite-backed archive directories with blob deduplication, hierarchical tags, collections, and role-based auth. Rust workspace + React frontend.
Read `ARCHIVR-MENTAL-MODEL.md` before making structural changes.
diff --git a/ARCHIVR-MENTAL-MODEL.md b/ARCHIVR-MENTAL-MODEL.md
index eae3d4c..7f8c3ec 100644
--- a/ARCHIVR-MENTAL-MODEL.md
+++ b/ARCHIVR-MENTAL-MODEL.md
@@ -11,7 +11,7 @@ This document explains the current project shape after the workspace refactor.
## The Big Model
-Archivr is now a Rust workspace with three crates:
+archivr is now a Rust workspace with three crates:
```mermaid
flowchart LR
diff --git a/crates/archivr-server/src/routes.rs b/crates/archivr-server/src/routes.rs
index c886874..ec8b474 100644
--- a/crates/archivr-server/src/routes.rs
+++ b/crates/archivr-server/src/routes.rs
@@ -387,8 +387,7 @@ pub fn app_with_state(state: AppState) -> Router {
get(blob_cleanup_scan_handler).delete(blob_cleanup_delete_handler),
)
.route("/api/util/resolve-tco", post(resolve_tco_handler))
- .nest_service("/assets", ServeDir::new(static_dir.join("assets")))
- .fallback_service(ServeFile::new(static_dir.join("index.html")))
+ .fallback_service(ServeDir::new(&static_dir).not_found_service(ServeFile::new(static_dir.join("index.html"))))
.layer(axum::middleware::from_fn_with_state(
state.clone(),
setup_guard,
diff --git a/crates/archivr-server/static/favicon.ico b/crates/archivr-server/static/favicon.ico
new file mode 100644
index 0000000..5575fa6
Binary files /dev/null and b/crates/archivr-server/static/favicon.ico differ
diff --git a/crates/archivr-server/static/favicon.svg b/crates/archivr-server/static/favicon.svg
new file mode 100644
index 0000000..ce6071e
--- /dev/null
+++ b/crates/archivr-server/static/favicon.svg
@@ -0,0 +1,10 @@
+
diff --git a/crates/archivr-server/static/index.html b/crates/archivr-server/static/index.html
index c662850..210c92a 100644
--- a/crates/archivr-server/static/index.html
+++ b/crates/archivr-server/static/index.html
@@ -4,6 +4,8 @@
Archivr
+
+
diff --git a/docs/README.md b/docs/README.md
index add643c..577acc2 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -1,4 +1,4 @@
-# archivr
+# Archivr
An open-source self-hosted archiving tool. Work in progress.
@@ -65,9 +65,9 @@ This project aims to provide a reliable solution for archiving important data fr
- Direct platform URLs
- Platform shorthand inputs such as `tweet:...`, `yt:...`, or `instagram:...`
-## Running Archivr
+## Running archivr
-Archivr currently ships as two binaries:
+archivr currently ships as two binaries:
- `archivr`
- The CLI for creating and writing to one archive.
diff --git a/docs/branding/assets/favicon.ico b/docs/branding/assets/favicon.ico
new file mode 100644
index 0000000..5575fa6
Binary files /dev/null and b/docs/branding/assets/favicon.ico differ
diff --git a/docs/branding/assets/favicon.svg b/docs/branding/assets/favicon.svg
new file mode 100644
index 0000000..ce6071e
--- /dev/null
+++ b/docs/branding/assets/favicon.svg
@@ -0,0 +1,10 @@
+
diff --git a/docs/branding/assets/logo-mark.svg b/docs/branding/assets/logo-mark.svg
new file mode 100644
index 0000000..6dc0bfb
--- /dev/null
+++ b/docs/branding/assets/logo-mark.svg
@@ -0,0 +1,10 @@
+
diff --git a/docs/branding/assets/logo-on-dark.svg b/docs/branding/assets/logo-on-dark.svg
new file mode 100644
index 0000000..9e1714e
--- /dev/null
+++ b/docs/branding/assets/logo-on-dark.svg
@@ -0,0 +1,15 @@
+
diff --git a/docs/branding/assets/logo-on-light.svg b/docs/branding/assets/logo-on-light.svg
new file mode 100644
index 0000000..c5cd6ba
--- /dev/null
+++ b/docs/branding/assets/logo-on-light.svg
@@ -0,0 +1,15 @@
+
diff --git a/docs/branding/logo-capital-A.svg b/docs/branding/logo-capital-A.svg
new file mode 100644
index 0000000..ba092f6
--- /dev/null
+++ b/docs/branding/logo-capital-A.svg
@@ -0,0 +1,20 @@
+
diff --git a/docs/branding/logo-lower-a.svg b/docs/branding/logo-lower-a.svg
new file mode 100644
index 0000000..0e3fd92
--- /dev/null
+++ b/docs/branding/logo-lower-a.svg
@@ -0,0 +1,20 @@
+
diff --git a/docs/branding/logo-mark-v0.svg b/docs/branding/logo-mark-v0.svg
new file mode 100644
index 0000000..cabc508
--- /dev/null
+++ b/docs/branding/logo-mark-v0.svg
@@ -0,0 +1,20 @@
+
diff --git a/docs/branding/logo-v0.svg b/docs/branding/logo-v0.svg
new file mode 100644
index 0000000..034cd03
--- /dev/null
+++ b/docs/branding/logo-v0.svg
@@ -0,0 +1,31 @@
+
diff --git a/docs/branding/style-guide.html b/docs/branding/style-guide.html
new file mode 100644
index 0000000..20ad9ae
--- /dev/null
+++ b/docs/branding/style-guide.html
@@ -0,0 +1,954 @@
+
+
+
+
+
+Archivr — Brand Guidelines
+
+
+
+
+
+
+
+
+
+
Archivr · Brand Guidelines · v1.0 · 2025
+
+
A
+
Archivr
+
+
Preserve what matters. Forever.
+
+
+
+
+
+
01
+
The Logo
+
The Archivr logo consists of two elements: the mark — a capital A in Cormorant Garamond set inside a rounded square in Terracotta — and the wordmark. Use both together as the primary logo. Never separate them in contexts where the brand is being introduced for the first time.
+
+
+
+
+
+
A
+
Archivr
+
+
+
Primary — on dark
+
+
+
+
+
+
+
A
+
Archivr
+
+
+
Secondary — on light
+
+
+
+
+
+
+
+
02
+
The Mark
+
Use the standalone mark when the wordmark would be redundant (favicon, app icon, avatar) or when the space is too small for the full lockup. The mark is recognizable on its own once the brand is established.
+
+
+
+
A
+
128 px
+
+
+
A
+
64 px
+
+
+
A
+
32 px
+
+
+
A
+
16 px
+
+
+
+
+
+
+
+
+
03
+
Clear Space
+
Always maintain a minimum clear space equal to half the mark's height (½H) on all sides of the lockup. Never crowd the logo with other elements.
+
+
+
+
+
½H
+
½H
+
½H
+
½H
+
+
A
+
Archivr
+
+
+
+
+
+
+
Full lockup
+
Minimum width: 120 px
+
+
+
Mark alone
+
Minimum size: 16 × 16 px
+
+
+
+
+
+
+
+
+
+
04
+
Don'ts
+
These are the most common mistakes. All of them dilute or distort the brand.
+
+
+
+
+
+
+ Archivr
+
✕
+
+
+
Don't stretch or distort the proportions
+
+
+
+
+
+
+
A
+
Archivr
+
+
✕
+
+
+
Don't change or recolor the logo
+
+
+
+
+
+
+
A
+
Archivr
+
+
✕
+
+
+
Don't add shadows, glows, or effects
+
+
+
+
+
+
+
A
+
Archivr
+
+
✕
+
+
+
Don't rotate or tilt the logo
+
+
+
+
+
+
+
A
+ Archivr
+
+
✕
+
+
+
Don't substitute a different typeface for the wordmark
+
+
+
+
+
+
+
+
A
+
Archivr
+
+
+
✕
+
+
+
Don't place on busy or patterned backgrounds
+
+
+
+
+
+
+
+
+
+
05
+
Color
+
The palette is organized by role. Shell and Paper form the light/dark surface pair. Terracotta is the single brand accent — use it with restraint. Amber is a secondary accent for highlights and metadata. Never introduce colors outside this palette in brand contexts.
+
+
+
Shell & Dark Surfaces
+
+
+
+
Shell
+
#141d18
+
App topbar, dark surfaces
+
+
+
+
Shell 2
+
#1c271f
+
Elevated dark panels
+
+
+
+
Ink
+
#20251f
+
Primary text on light
+
+
+
+
+
+
Paper & Light Surfaces
+
+
+
+
Paper
+
#f5f0e7
+
Primary content bg
+
+
+
+
Paper 2
+
#e9e1d2
+
Rows, alternating bg
+
+
+
+
Paper 3
+
#fffaf0
+
Elevated panels on light
+
+
+
+
Brand Text
+
#f4ead8
+
Text on dark & accent
+
+
+
+
+
+
Accents
+
+
+
+
Terracotta
+
#8d3f30
+
Primary brand accent, logo mark, CTAs, focus rings
+
+
+
+
Amber
+
#b78342
+
Secondary accent, metadata highlights
+
+
+
+
Ocean
+
#245f72
+
Links, informational states
+
+
+
+
+
+
Neutrals & Borders
+
+
+
+
Muted
+
#6b6f66
+
Secondary text, captions
+
+
+
+
Muted 2
+
#8a8d83
+
Tertiary text, placeholders
+
+
+
+
Line
+
#d2c6b5
+
Borders, dividers on light
+
+
+
+
Line Soft
+
#e5dccd
+
Subtle dividers, rules
+
+
+
+
+
+
+
+
+
+
06
+
Typography
+
Three typefaces cover every context. Cormorant Garamond is the brand voice — it appears in the logo, headings, and display text. Helvetica Neue handles all interface chrome. Spectral carries long-form reading content.
+
+
+
+
Display
+
Cormorant Garamond
+
Logo wordmark · Headings · Display text · Taglines
Weights: 500, 600 Google Fonts: free
+
+
+
Aa Bb Cc Preserve what matters.
+
The archive of a lifetime, held with care.
+
+
+
+
+
+
Interface
+
Helvetica Neue
+
UI labels · Buttons · Nav · Captions · Body copy
Weights: 400, 550, 700 System font (macOS/iOS)
+
+
+
+ The quick brown fox jumps over the lazy dog.
+ Capture · Archive · Preserve · Retrieve
+ 0123456789 & #%@!
+
+
+ Small caps label
+ Button Text
+ mono/url/code
+
+
+
+
+
+
+
Reading
+
Spectral
+
Article body · Long-form content · Reading mode
Weights: 400, 500 Google Fonts: free
+
+
+
An archive is not a graveyard. It is the opposite — a place where things are kept because they still matter, because the person who saved them believed they would matter again.
+
+
+
+
+
+
Display scale (Cormorant Garamond 600)
+
+
72 px
+
Archivr
+
+
+
48 px
+
Archivr
+
+
+
36 px
+
Preserve what matters.
+
+
+
24 px
+
Capture, archive, retrieve. Forever.
+
+
+
+
+
+
+
+
+
07
+
In Context
+
The logo as it appears in the application shell. The mark sits at 28 × 28 px in the topbar, framed by a 2 px Terracotta rule at the bottom of the navigation bar.
+
+
+
+
A
+ Archivr
+
+
+
Capture
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
08
+
Asset Files
+
All files live in branding/assets/. SVG files embed Cormorant Garamond via Google Fonts — they require a network connection to render the typeface correctly, or the font installed locally.
+
+
+
+
+
+
+
logo-on-dark.svg
+
Full lockup · cream wordmark · use on dark backgrounds
+
+
+
+
+
+
logo-on-light.svg
+
Full lockup · dark wordmark · use on light / paper backgrounds
+
+
+
+
+
+
logo-mark.svg
+
Standalone mark · 48 × 48 · for established contexts, avatars
+
+
+
+
+
+
favicon.svg
+
Favicon · reference from <link rel="icon"> or convert to .ico
+
+
+
+
+
+
+
+
diff --git a/frontend/index.html b/frontend/index.html
index 454194d..093b9c6 100644
--- a/frontend/index.html
+++ b/frontend/index.html
@@ -4,6 +4,8 @@
Archivr
+
+
diff --git a/frontend/public/favicon.ico b/frontend/public/favicon.ico
new file mode 100644
index 0000000..5575fa6
Binary files /dev/null and b/frontend/public/favicon.ico differ
diff --git a/frontend/public/favicon.svg b/frontend/public/favicon.svg
new file mode 100644
index 0000000..ce6071e
--- /dev/null
+++ b/frontend/public/favicon.svg
@@ -0,0 +1,10 @@
+