No description
Find a file
lichenblankie c045c8709c
Some checks are pending
/ build (push) Waiting to run
/ release (push) Blocked by required conditions
Fixed workflow build
2026-04-11 03:40:09 +00:00
.forgejo/workflows Fixed workflow build 2026-04-11 03:40:09 +00:00
themes Privacy hardening: degoogle, security headers, referrer protection 2026-04-08 10:11:57 -07:00
.dockerignore Add Dockerfile and Docker Compose for one-command setup 2026-03-26 17:59:08 -07:00
.gitignore Add hybrid semantic search with optional cross-encoder reranking 2026-03-27 03:24:41 -07:00
app.py Disabled semantic search and reranker by default 2026-04-08 05:21:08 +00:00
CLAUDE.md Add CLAUDE.md with project architecture and conventions 2026-03-26 08:17:38 -07:00
db.py Add PyInstaller builds, AGPLv3 license, transport node selection, and rmap.world link 2026-04-08 04:36:28 +00:00
docker-compose.yml Add entrypoint script for configurable Reticulum networking in Docker 2026-03-26 18:44:26 -07:00
Dockerfile Set PYTHONUNBUFFERED=1 in Dockerfile for real-time log output 2026-03-26 19:23:03 -07:00
embeddings.py Add PyInstaller builds, AGPLv3 license, transport node selection, and rmap.world link 2026-04-08 04:36:28 +00:00
entrypoint.sh Set share_instance = No for reliable mesh announces 2026-03-26 21:39:37 -07:00
gateway.py Privacy hardening: degoogle, security headers, referrer protection 2026-04-08 10:11:57 -07:00
handlers.py Add bulk operations, select all, and orphaned tag cleanup 2026-04-08 10:33:57 -07:00
LICENSE Add PyInstaller builds, AGPLv3 license, transport node selection, and rmap.world link 2026-04-08 04:36:28 +00:00
pyinstaller.spec Add PyInstaller builds, AGPLv3 license, transport node selection, and rmap.world link 2026-04-08 04:36:28 +00:00
README.md Disabled semantic search and reranker by default 2026-04-08 05:21:08 +00:00
requirements.txt Add hybrid semantic search with optional cross-encoder reranking 2026-03-27 03:24:41 -07:00
rns_client.py Add WAL mode, connection pooling, pagination, and delta sync 2026-03-26 12:00:43 -07:00
templates.py Privacy hardening: degoogle, security headers, referrer protection 2026-04-08 10:11:57 -07:00

TinyWeb

A personal, decentralized search engine built on the Reticulum mesh network. Curate your own index of web pages, search it locally, and share collections with friends over an encrypted mesh. No algorithms, no ads, no tracking.

Features

  • Personal search index — Save pages you find valuable, search them with full-text search (SQLite FTS5)
  • Tagging — Organize saved pages with comma-separated tags
  • Bookmarklet — One-click indexing from any browser tab
  • Subscriptions — Subscribe to friends' TinyWeb instances over Reticulum and search their indexes alongside yours
  • Custom templates — Full HTML/CSS/JS template editor to personalize your instance
  • Import/export — JSON-based backup and restore
  • Mesh-native — Works over Reticulum without the internet; encrypted and decentralized by default

Download (pre-built binaries)

Download the latest release for your platform from the GitHub Releases page:

Platform File
Windows TinyWeb-windows-x64.exe
macOS TinyWeb-macos-arm64
Linux TinyWeb-linux-x64

Run the downloaded file — no installation required.

Data storage

Your data is stored in ~/.tinyweb/:

File Description
index.db SQLite database with your indexed pages
tinyweb_identity Your Reticulum identity (keep safe!)
models/ Downloaded AI models for semantic search
index.hnsw Semantic search index

This allows your data to persist between upgrades and stay separate from the application.

Command line options

./TinyWeb --version    # Show version
./TinyWeb -p 9000      # Use port 9000 instead of default 8080

Getting started

pip install -r requirements.txt
python app.py

This starts the Reticulum server and an HTTP gateway on http://localhost:8080. Open it in your browser.

Your destination hash is printed on startup — share it with friends so they can subscribe to your index.

Remote gateway

To browse a remote TinyWeb instance without running your own index:

python gateway.py <destination_hash>

This connects over Reticulum and serves the remote instance at http://localhost:8080.

How it works

  1. Save pages — Use the /add form or the bookmarklet (found on /style) to index any URL
  2. Search — Full-text search across your saved pages, linked pages from trusted sites, and synced subscriptions
  3. Subscribe — Add a friend's destination hash on /subscriptions to sync their shared index
  4. Customize — Edit your site name, HTML template, and sharing settings on /style

Project structure

app.py          — Entry point: boots Reticulum, starts HTTP gateway
gateway.py      — HTTP-to-RNS bridge (local or remote dispatch)
handlers.py     — Route dispatcher and all request handlers
db.py           — SQLite database, FTS5, URL fetching, SSRF protection
templates.py    — HTML template rendering and escaping
rns_client.py   — Reticulum client for fetching remote site lists
themes/         — Saved HTML templates (e.g. kodama.html)

Security

TinyWeb includes several hardening measures:

  • CSRF protection — All POST forms use per-session tokens via double-submit cookies
  • SSRF prevention — URL fetching validates hostnames against private IP ranges, with redirect re-validation
  • FTS5 injection prevention — Search queries are sanitized before passing to SQLite MATCH
  • Content Security Policy — CSP headers on all HTML responses restrict script/style/frame sources
  • XSS escaping — All user-supplied content is HTML-escaped before rendering
  • Bookmark authentication — The bookmarklet endpoint requires a secret token
  • Identity file protection — The Reticulum identity key is restricted to owner-only permissions (0600)

Dependencies

Philosophy

TinyWeb is built for the slow web — intentionality over speed, human curation over algorithmic feeds, privacy over surveillance, and community over corporations. Every page in your index was saved because you found it valuable, not because an algorithm told you to click.