-
-
π§
-
Memory Usage
-
- - Small footprint: ~10-20 MB RAM
- - Efficient caching of recently visited pages
- - Minimal state: Only necessary data stored
-
-
-
-
-
β‘
-
Load Time
-
- - Instant startup: <1 second
- - Fast page switching: Markdown loads immediately
- - Async loading: No blocking operations
-
-
-
-
-
π
-
Network
-
- - HTTP/2 support: Multiplexed requests
- - Keep-alive: Reuses connections
- - Compression: Supports gzip, deflate, brotli
-
-
+
+ Bare is fast because it does less, not because it works harder. An
+ LRU render cache in the Rust core makes returning to a recently
+ visited page instant; typical pages stripped to their content are
+ 5–50 KB rather than multi-megabyte payloads; and async I/O
+ (tokio) means fetching never blocks the interface.
+
+
+
Design targets the project measures itself against:
+
+
+
+
+
+ | Metric |
+ Target |
+
+
+
+
+ | Cached re-render |
+ ≈ one frame (~16 ms) |
+
+
+ | Typical page, fetch → readable |
+ well under half a second |
+
+
+ | External network calls beyond the document |
+ zero |
+
+
+ | Application binary |
+ single-digit megabytes |
+
+
+ | Resident memory |
+ ~10–20 MB |
+
+
+
- π Security
+ π Privacy the code actually enforces
+
+
+ Privacy in Bare is not a preference panel; it is a property of the architecture.
+ Three mechanisms make it real rather than aspirational:
+
-
π‘οΈ
-
Architectural Security
-
- - No JavaScript: No way to run malicious code
- - No plugins: No extension API that can be abused
- - Sandboxed WebView: WebView runs in a restricted context
- - Rust Backend: Memory safety prevents many vulnerabilities
-
+
πΌοΈ
+
Structural image blocking
+
+ The WebView ships with a strict Content-Security-Policy of
+ img-src 'self' data:. The page is forbidden at the engine
+ level from loading a remote image, so a tracking pixel cannot fire even
+ if one survives extraction. The ImageMode setting
+ (Block · Placeholder · Show) puts that choice
+ in your hands.
+
-
π
-
Network Security
-
- - TLS verification: All HTTPS and Gemini connections verified
- - TOFU for Gemini: Trust On First Use for Gemini certificates
- - No mixed content: Blocks insecure resources on secure pages
- - CSP: Content Security Policy protection against XSS
-
+
1οΈβ£
+
One click, one request
+
+ The WebView never originates network traffic. Only the Rust core fetches, and
+ it fetches exactly the document you asked for — no fonts, analytics
+ beacons, or third-party assets load in the background to leak your visit.
+
-
π
-
Data Protection
-
- - No telemetry: No data sent to developers
- - Local storage: All data stored locally
- - No cloud sync: No external storage
- - Encrypted storage: Sensitive data can be encrypted
-
+
π
+
TOFU for Gemini
+
+ Gemini connections are verified Trust-On-First-Use: a SHA-256 fingerprint of
+ each server's certificate is stored in known_hosts.json, and a
+ later mismatch is flagged as a possible machine-in-the-middle attack —
+ the same model SSH uses.
+
+
+
+ No JavaScript, no cookies, no telemetry. The most private data is the data that is
+ never collected.
+
@@ -472,41 +504,39 @@
Production Build
+
+ β
Quality and trust
+ Bare is small, but it is not casual about correctness:
+
+ - 117+ unit tests across the core logic — extraction, protocol clients, converters, settings.
+ - Idiomatic Rust:
Result + thiserror everywhere, ? propagation, almost no unwrap() outside tests, per-module error types.
+ - A safe stack:
rustls with ring (no OpenSSL), clamped numeric settings, allowlist sanitization.
+ - 13 interface languages, in place unusually early for a project this size.
+
+
+
+
+
- π Technology Roadmap
+ π« What Bare will deliberately never build
-
-
-
Short-term (0-6 months)
-
- - β
Basic Markdown rendering
- - β
HTTP/HTTPS support
- - β
Gemini protocol support
- - β
Gopher protocol support
- - β¬ PDF export
- - β¬ Tabs support
-
-
-
-
-
Medium-term (6-18 months)
-
- - β¬ Plugin system
- - β¬ Custom CSS themes
- - β¬ Cross-device synchronization
- - β¬ Mobile platforms (Android, iOS)
-
-
-
-
-
Experimental (18+ months)
-
- - β¬ P2P protocol support (IPFS, DAT)
- - β¬ AI-based content filtering
- - β¬ Voice control
-
-
-
+
+ A roadmap is also a list of refusals. These are not missing features —
+ they are guarantees:
+
+
+
+ - No plugin or extension system. Non-extensibility is the central promise; a tool that cannot be extended cannot be quietly corrupted.
+ - No JavaScript engine. Ever. It is the largest source of tracking and attack surface on the web.
+ - No telemetry, no cloud sync, no accounts. Your reading is yours.
+ - No author-controlled styling. Presentation belongs to the reader.
+
+
+
+ What is genuinely on the table stays in character — improvements to
+ reading, never to running code: PDF export, heading anchors and a
+ table of contents, and richer reading-typography controls.
+
diff --git a/website/sider/technology.md b/website/sider/technology.md
index c308b7e..b4638f2 100644
--- a/website/sider/technology.md
+++ b/website/sider/technology.md
@@ -1,124 +1,103 @@
# Technology
-> "Technology is best when it disappears." β Adapted from Alan Kay
+> *"Technology is best when it disappears."* β adapted from Mark Weiser
-Bare is built with modern, lightweight technology to deliver a fast, secure, and efficient browsing experience. Unlike heavy, resource-intensive browsers like Chrome or Electron-based applications, Bare is designed to be **minimal, secure, and performance-optimized**.
+Bare is not a small web browser. It is a **reading instrument** that happens to speak HTTP, Gemini and Gopher. Every engineering decision serves a single goal: turn whatever a server sends into clean, consistent, private text β and then get out of your way.
----
+This page explains how that is built, honestly, including the things Bare deliberately does *not* do.
-## ποΈ Architecture
+---
-Bare uses a **client-server architecture** where:
-- **Frontend** (User Interface): Vanilla HTML/CSS/JavaScript
-- **Backend** (Logic and fetching): Rust
-- **Bridge**: Tauri for communication between frontend and backend
+## ποΈ The shape of the program
-This separation provides:
-- **Security**: Rust backend handles all external communication
-- **Performance**: Native Rust code for network operations
-- **Flexibility**: Web technologies for user interface
+Bare is a [Tauri 2](https://tauri.app/) application: a Rust core wrapped in the operating system's own WebView, with **no bundled browser engine**.
----
-
-## π οΈ Main Components
+```
+Frontend (vanilla JS) β Tauri IPC bridge β Rust core
+ renders finished HTML message passing fetch Β· extract Β· sanitize Β· render
+```
-### Tauri 2.0
+Why this split matters:
-**[Tauri](https://tauri.app/)** is the foundational framework that makes Bare possible.
+- All networking, parsing and sanitization happen in **Rust** β never inside the page.
+- The WebView only ever receives finished, already-sanitized HTML. **It never talks to the network itself.**
+- There is no Chromium to ship, so the entire application is a few megabytes instead of a few hundred.
-**Why Tauri?**
+**Why not Electron:**
-| Aspect | Tauri | Electron | Tauri Advantage |
-|--------|-------|----------|------------------|
-| App size | ~2-5 MB | ~100-200 MB | 20-100x smaller |
-| Memory usage | Low | High | 5x less RAM |
-| Security | High (Rust) | Medium (JS) | Memory safety |
-| Performance | High | Medium | Native speed |
-| Platform support | Windows, macOS, Linux | Windows, macOS, Linux | Same, but lighter |
+| | Bare (Tauri) | Electron |
+|---|---|---|
+| App size | single-digit MB | ~100β200 MB |
+| Memory | ~10β20 MB | hundreds of MB |
+| Engine | OS-native WebView | bundled Chromium |
+| Core language | Rust (memory-safe) | Node.js |
-**Key features of Tauri used by Bare:**
+---
-- **System WebView**: Uses the OS's native WebView (WebKit on macOS/Linux, WebView2 on Windows)
-- **Rust Backend**: Secure, fast system access
-- **Minimal bundling**: No Chromium content
-- **Platform-specific builds**: Optimal performance on each platform
+## π¬ The reading pipeline
-### Rust
+The heart of Bare is what happens between *"you click a link"* and *"you see text."* For an ordinary HTML page it is four stages, all in Rust:
-**[Rust](https://www.rust-lang.org/)** is the programming language powering Bare's backend.
+1. **Fetch** β [reqwest](https://crates.io/crates/reqwest) over `rustls` + `ring` (no OpenSSL, no native-tls), capped at 5 MB, sending an `Accept` header that politely asks the server for Markdown first:
+ ```
+ Accept: text/markdown, text/plain;q=0.9, text/html;q=0.5
+ ```
-**Why Rust?**
+2. **Extract** β a real **DOM-based readability** pass scores the document tree, lifts out the article, and discards navigation, sidebars, ad slots and comment threads. This replaced an earlier naive string-search method in v0.1.6, because content extraction *is* the core promise β it had to be done properly, not approximated.
-1. **Memory safety**: Rust's ownership rules prevent memory errors like buffer overflows
-2. **Performance**: Compiled to native code, as fast as C/C++
-3. **Security**: No garbage collection, no runtime overhead
-4. **Concurrency**: Excellent support for asynchronous programming
-5. **Ecosystem**: Rich package ecosystem (crates.io)
+3. **Sanitize** β the result is run through [ammonia](https://crates.io/crates/ammonia), an allowlist-based Rust HTML sanitizer, stripping scripts, event handlers and anything that could carry a payload. This runs on the Markdown path too, so untrusted content is cleaned in depth, not only fenced off by policy.
-**Rust libraries used in Bare:**
+4. **Render** β [pulldown-cmark](https://crates.io/crates/pulldown-cmark) turns the cleaned Markdown into HTML with CommonMark + GitHub extensions (tables, task lists, strikethrough), and `syntect` adds syntax highlighting to code blocks.
-- **[pulldown-cmark](https://crates.io/crates/pulldown-cmark)**: Fast CommonMark + GFM Markdown parser
- - Fast: Written in Rust, optimized for performance
- - Accurate: Full support for CommonMark specification
- - Flexible: Supports extensions like tables, footnotes, etc.
+Gemtext and gophermaps skip the extraction stage entirely β they are already clean by design and go straight to dedicated converters.
-- **[reqwest](https://crates.io/crates/reqwest)**: Async HTTP client
- - Supports HTTP/1.1 and HTTP/2
- - Integrated TLS support
- - Async/await-based API
+---
-- **[tauri](https://crates.io/crates/tauri)**: Tauri Rust library
- - Communication with frontend
- - System API access
- - Window handling
+## π Privacy the code actually enforces
-### Vanilla Web Technologies
+Privacy in Bare is not a preference panel; it is a property of the architecture (see [Philosophy](./philosophy.md)). Three mechanisms make it real rather than aspirational:
-Bare's frontend is built with **pure web technologies**:
+- **Structural image blocking.** The WebView ships with a strict Content-Security-Policy of `img-src 'self' data:`. The page is *forbidden at the engine level* from loading a remote image, so a tracking pixel cannot fire even if one survives extraction. The `ImageMode` setting (**Block Β· Placeholder Β· Show**) puts that choice entirely in your hands.
-- **HTML5**: Semantic markup for structure
-- **CSS3**: Minimal styling, focused on readability
-- **JavaScript (ES6+)**: Clean, efficient code without frameworks
+- **One click, one request.** The WebView never originates network traffic. Only the Rust core fetches, and it fetches exactly the document you asked for β nothing else loads in the background. There are no fonts, analytics beacons, or third-party assets to leak your visit.
-**Advantages of this approach:**
+- **TOFU for Gemini.** Gemini connections are verified Trust-On-First-Use: a SHA-256 fingerprint of each server's certificate is stored in `known_hosts.json`, and a later mismatch is flagged as a possible machine-in-the-middle attack β the same model SSH uses.
-1. **No dependencies**: No npm packages, no build steps
-2. **Fast loading**: No frameworks to load
-3. **Easy maintenance**: No version conflicts
-4. **Long lifespan**: Standards that don't change radically
+No JavaScript, no cookies, no telemetry. The most private data is the data that is never collected.
---
-## π Protocol Support
+## β‘ Speed by subtraction
-### HTTP/HTTPS
+Bare is fast because it does less, not because it works harder.
-Standard web protocols with full support for:
-- GET and HEAD requests
-- Redirect handling
-- SSL/TLS encryption
-- Content-Type negotiation
+- An **LRU render cache** in the Rust core means returning to a recently visited page is instant β the readable HTML is already built.
+- Typical pages, stripped to their content, are **5β50 KB** instead of the multi-megabyte payloads of the modern web.
+- Async I/O throughout (`tokio`) means fetching never blocks the interface.
-**Special for Markdown:**
-Bare sends an `Accept` header that signals preference for Markdown:
-```
-Accept: text/markdown, text/plain;q=0.9, text/html;q=0.5
-```
+**Design targets the project measures itself against:**
-This allows servers that support content negotiation to deliver cleaner content directly.
+| Metric | Target |
+|--------|--------|
+| Cached re-render | β one frame (~16 ms) |
+| Typical page, fetch β readable | well under half a second |
+| External network calls beyond the document | zero |
+| Application binary | single-digit megabytes |
+| Resident memory | ~10β20 MB |
-### Gemini Protocol
+---
-**[Gemini](https://geminiprotocol.net/)** is a modern, text-based protocol with mandatory TLS encryption.
+## π Protocol support
-**Bare's Gemini support includes:**
+| Protocol | What Bare does |
+|----------|----------------|
+| **HTTP/HTTPS** | GET/HEAD, redirects, TLS via rustls, content negotiation, readability extraction |
+| **Gemini** | Full client with TOFU certificates, gemtext β Markdown, interactive input pages |
+| **Gopher** | RFC 1436 client, gophermap β Markdown, type-aware icons, search (item type 7) |
+| **file://** | Open local Markdown files directly from disk |
-- Full protocol implementation (RFC)
-- TOFU (Trust On First Use) certificate handling
-- Gemtext to Markdown conversion
-- Interactive pages (input dialog)
+Gemtext, for example, converts cleanly because it is already a line-oriented text format:
-**Gemtext format:**
```gemini
# Heading 1
## Heading 2
@@ -128,257 +107,71 @@ This is a paragraph.
=> https://example.com Link description
```
-### Gopher Protocol
-
-**[Gopher](https://en.wikipedia.org/wiki/Gopher_(protocol))** is the classic protocol from 1991.
-
-**Bare's Gopher support includes:**
-
-- Full RFC 1436 implementation
-- Gophermap to Markdown conversion
-- Support for text files, menus, and search
-- Emoji icons for different content types
-- Search dialog for interactive Gopher queries
-
----
-
-## π§ Features
-
-### Markdown Rendering
-
-Bare's Markdown rendering engine handles:
-
-- **Basic formatting**: Bold, italic, headings, lists
-- **Links**: Inline and reference-style links
-- **Images**: Optional display (can be disabled for privacy)
-- **Code blocks**: Syntax highlighting (optional)
-- **Tables**: Full support
-- **Footnotes**: Supported
-- **HTML**: HTML in Markdown is escaped (security)
-
-### HTML to Markdown Conversion
-
-For HTML pages, Bare offers **Readability mode**:
-
-- Extracts main content from article pages
-- Removes ads, navigation, sidebars
-- Converts to clean Markdown
-- Preserves structure and formatting
-
-**Example:**
-A busy news site with ads and complex layout is converted to:
-```markdown
-# Article Title
-
-This is the main content of the article...
-```
-
-### Navigation
-
-- **History**: Full back/forward navigation
-- **Bookmarks**: Save and organize favorite pages
-- **URL autocomplete**: Smart address bar with suggestions
-- **Protocol detection**: Automatic recognition of gemini://, gopher://, etc.
-
-### User Experience
-
-- **Theme**: Light, dark, sepia, high-contrast
-- **Font family**: System, serif, sans-serif, monospace
-- **Font size**: Adjustable (70%-150%)
-- **Content width**: Adjustable (400-1200px)
-- **Zoom**: Ctrl+/Ctrl- for zoom in/out
-
-### Search
-
-- **In-page search**: Ctrl+F to search current page
-- **Regular expressions**: Advanced search with regex
-- **Match highlighting**: Visual highlighting of matches
-
-### Keyboard Shortcuts
-
-Bare has comprehensive keyboard support:
-
-| Shortcut | Action |
-|----------|--------|
-| Ctrl+K | Open command palette |
-| Ctrl+F | Search in page |
-| Ctrl+D | Bookmark page |
-| Ctrl+B | Show bookmarks |
-| Ctrl+O | Open local file |
-| Ctrl+Plus | Zoom in |
-| Ctrl+Minus | Zoom out |
-| Alt+β | Back |
-| Alt+β | Forward |
-| Alt+Home | Home |
-| F5 | Reload |
-
----
-
-## π Performance Optimizations
-
-### Memory Usage
-
-- **Small footprint**: ~10-20 MB RAM for entire application
-- **Efficient caching**: Cache of recently visited pages
-- **Minimal state**: Only necessary data stored
-
-### Load Time
-
-- **Instant startup**: <1 second
-- **Fast page switching**: Markdown loads immediately
-- **Async loading**: No blocking operations
-
-### Network
-
-- **HTTP/2 support**: Multiplexed requests
-- **Keep-alive**: Reuses connections
-- **Compression**: Supports gzip, deflate, brotli
-
---
-## π Security
-
-### Architectural Security
-
-1. **No JavaScript**: No way to run malicious code
-2. **No plugins**: No extension API that can be abused
-3. **Sandboxed WebView**: WebView runs in a restricted context
-4. **Rust Backend**: Memory safety prevents many vulnerabilities
-
-### Network Security
+## β
Quality and trust
-1. **TLS verification**: All HTTPS and Gemini connections verified
-2. **TOFU for Gemini**: Trust On First Use for Gemini certificates
-3. **No mixed content**: Blocks insecure resources on secure pages
-4. **CSP**: Content Security Policy protection against XSS
+Bare is small, but it is not casual about correctness:
-### Data Protection
-
-1. **No telemetry**: No data sent to developers
-2. **Local storage**: All data stored locally
-3. **No cloud sync**: No external storage
-4. **Encrypted storage**: Sensitive data can be encrypted
+- **117+ unit tests** across the core logic β extraction, protocol clients, converters, settings.
+- **Idiomatic Rust:** `Result` + `thiserror` everywhere, `?` propagation, almost no `unwrap()` outside tests, per-module error types.
+- **A safe stack:** `rustls` with `ring` (no OpenSSL), clamped numeric settings, allowlist sanitization.
+- **13 interface languages**, in place unusually early for a project this size.
---
-## π οΈ Build Process
+## π οΈ Build it yourself
-### Development Environment
+Bare is GPL-3.0 and builds from source on Windows, macOS and Linux.
```bash
-# Clone repository
+# Clone the repository
git clone https://github.com/FrankBurmo/bare.git
cd bare
-# Install Rust (if not already installed)
+# Install Rust if you don't have it
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
-# Install Tauri CLI
+# Install the Tauri CLI
cargo install tauri-cli
-# Start development server
+# Run in development with hot reload
cargo tauri dev
-```
-
-### Production Build
-```bash
-# Build for current platform
+# Produce an optimized release build
cargo tauri build
-
-# Build for specific platform
-cargo tauri build --target x86_64-pc-windows-msvc
-cargo tauri build --target x86_64-unknown-linux-gnu
-cargo tauri build --target universal2-apple-darwin
-```
-
-### Build for Distribution
-
-```bash
-# Build all platforms (requires cross-compilation setup)
-cargo tauri build --all-targets
-
-# Build with update check
-cargo tauri build --features updater
```
----
-
-## π¦ Dependencies
-
-### Rust Crates (backend)
-
-```toml
-[dependencies]
-# Tauri
-tauri = "2.0"
-tauri-utils = "2.0"
-
-# HTTP
-reqwest = { version = "0.12", features = ["json", "rustls-tls"] }
-
-# Markdown parsing
-pulldown-cmark = { version = "0.10", features = ["html", "tick_token"] }
-
-# URL handling
-url = "2.5"
-percent-encoding = "2.3"
-
-# Async
-tokio = { version = "1.0", features = ["full"] }
-
-# Error handling
-anyhow = "1.0"
-thiserror = "1.0"
-
-# Serialization
-serde = { version = "1.0", features = ["derive"] }
-serde_json = "1.0"
-
-# File system
-walkdir = "2.4"
-```
+Before sending a change, the project expects a clean `cargo fmt`, no `cargo clippy` warnings, and a green `cargo test`.
---
-## π Technology Roadmap
+## π« What Bare will deliberately never build
-### Short-term (0-6 months)
-- β
Basic Markdown rendering
-- β
HTTP/HTTPS support
-- β
Gemini protocol support
-- β
Gopher protocol support
-- β¬ PDF export
-- β¬ Tabs support
+A roadmap is also a list of refusals. These are not missing features β they are guarantees:
-### Medium-term (6-18 months)
-- β¬ Plugin system
-- β¬ Custom CSS themes
-- β¬ Cross-device synchronization
-- β¬ Mobile platforms (Android, iOS)
+- **No plugin or extension system.** Non-extensibility is the central promise; a tool that cannot be extended cannot be quietly corrupted.
+- **No JavaScript engine.** Ever. It is the largest source of tracking and attack surface on the web.
+- **No telemetry, no cloud sync, no accounts.** Your reading is yours.
+- **No author-controlled styling.** Presentation belongs to the reader.
-### Experimental (18+ months)
-- β¬ P2P protocol support (IPFS, DAT)
-- β¬ AI-based content filtering
-- β¬ Voice control
+What *is* genuinely on the table stays in character β improvements to *reading*, never to *running code*: PDF export, heading anchors and a table of contents, and richer reading-typography controls.
---
-## π Related Reading
+## π Useful links
-- [About Bare](./about.md) β What the browser is
-- [Philosophy](./philosophy.md) β Why Bare was created
-- [History](./history.md) β The background of text-based protocols
-
----
-
-## π Useful Links
-
-- [Tauri Documentation](https://tauri.app/v2/guides/)
-- [Rust Documentation](https://doc.rust-lang.org/)
+- [Tauri documentation](https://tauri.app/v2/guides/)
+- [Rust documentation](https://doc.rust-lang.org/)
- [pulldown-cmark](https://docs.rs/pulldown-cmark/latest/pulldown_cmark/)
- [reqwest](https://docs.rs/reqwest/latest/reqwest/)
+## π Related reading
+
+- [About Bare](./about.md) β what the browser is and who it's for
+- [Philosophy](./philosophy.md) β why these constraints exist
+- [History](./history.md) β the lineage Bare belongs to
+
---
[Back to Home](../index.md)
diff --git a/website/sitemap.xml b/website/sitemap.xml
index 12787cc..b40f30e 100644
--- a/website/sitemap.xml
+++ b/website/sitemap.xml
@@ -16,28 +16,28 @@
https://frankburmo.github.io/bare/sider/about.html
- 2026-06-18
+ 2026-06-22
monthly
0.8
https://frankburmo.github.io/bare/sider/philosophy.html
- 2026-06-18
+ 2026-06-22
monthly
0.8
https://frankburmo.github.io/bare/sider/technology.html
- 2026-06-18
+ 2026-06-22
monthly
0.8
https://frankburmo.github.io/bare/sider/history.html
- 2026-06-18
+ 2026-06-22
monthly
0.8