Document not found (404)
+This URL is invalid, sorry. Please use the navigation bar or search to continue.
+ +From f186b71ca51e83837db60de13322394bb5e6d348 Mon Sep 17 00:00:00 2001 From: murilo ijanc Date: Tue, 24 Mar 2026 21:41:06 -0300 Subject: Initial commit Import existing tesseras.net website content. --- book/en/.nojekyll | 1 + book/en/404.html | 228 +++ book/en/404.html.gz | Bin 0 -> 5584 bytes book/en/ayu-highlight-3fdfc3ac.css | 77 + book/en/ayu-highlight-3fdfc3ac.css.gz | Bin 0 -> 450 bytes book/en/book-a0b12cfe.js | 843 +++++++++++ book/en/book-a0b12cfe.js.gz | Bin 0 -> 6624 bytes book/en/clipboard-1626706a.min.js | 7 + book/en/clipboard-1626706a.min.js.gz | Bin 0 -> 3378 bytes book/en/commands/create.html | 329 +++++ book/en/commands/create.html.gz | Bin 0 -> 7137 bytes book/en/commands/export.html | 307 ++++ book/en/commands/export.html.gz | Bin 0 -> 7007 bytes book/en/commands/init.html | 288 ++++ book/en/commands/init.html.gz | Bin 0 -> 6556 bytes book/en/commands/list.html | 283 ++++ book/en/commands/list.html.gz | Bin 0 -> 6400 bytes book/en/commands/verify.html | 307 ++++ book/en/commands/verify.html.gz | Bin 0 -> 6697 bytes book/en/configuration.html | 390 +++++ book/en/configuration.html.gz | Bin 0 -> 7861 bytes book/en/css/chrome-ae938929.css | 756 ++++++++++ book/en/css/chrome-ae938929.css.gz | Bin 0 -> 4616 bytes book/en/css/general-2459343d.css | 408 ++++++ book/en/css/general-2459343d.css.gz | Bin 0 -> 3178 bytes book/en/css/print-9e4910d8.css | 50 + book/en/css/print-9e4910d8.css.gz | Bin 0 -> 364 bytes book/en/css/variables-8adf115d.css | 383 +++++ book/en/css/variables-8adf115d.css.gz | Bin 0 -> 1951 bytes book/en/docker.html | 303 ++++ book/en/docker.html.gz | Bin 0 -> 6681 bytes book/en/elasticlunr-ef4e11c1.min.js | 10 + book/en/elasticlunr-ef4e11c1.min.js.gz | Bin 0 -> 5522 bytes book/en/encryption.html | 294 ++++ book/en/encryption.html.gz | Bin 0 -> 7705 bytes book/en/favicon-bfbdfe47.png | Bin 0 -> 6580 bytes book/en/fonts/OPEN-SANS-LICENSE.txt | 202 +++ book/en/fonts/OPEN-SANS-LICENSE.txt.gz | Bin 0 -> 3990 bytes book/en/fonts/SOURCE-CODE-PRO-LICENSE.txt | 93 ++ book/en/fonts/SOURCE-CODE-PRO-LICENSE.txt.gz | Bin 0 -> 2037 bytes book/en/fonts/fonts-9644e21d.css | 100 ++ book/en/fonts/fonts-9644e21d.css.gz | Bin 0 -> 671 bytes .../open-sans-v17-all-charsets-300-7736aa35.woff2 | Bin 0 -> 44352 bytes ...-sans-v17-all-charsets-300italic-2c7b95c0.woff2 | Bin 0 -> 40656 bytes .../open-sans-v17-all-charsets-600-486c6759.woff2 | Bin 0 -> 44936 bytes ...-sans-v17-all-charsets-600italic-1a3e8659.woff2 | Bin 0 -> 42120 bytes .../open-sans-v17-all-charsets-700-c22fe8c7.woff2 | Bin 0 -> 44988 bytes ...-sans-v17-all-charsets-700italic-238ae959.woff2 | Bin 0 -> 40800 bytes .../open-sans-v17-all-charsets-800-3d2c812a.woff2 | Bin 0 -> 44536 bytes ...-sans-v17-all-charsets-800italic-ba1521ec.woff2 | Bin 0 -> 40812 bytes ...pen-sans-v17-all-charsets-italic-6c9463f7.woff2 | Bin 0 -> 41076 bytes ...en-sans-v17-all-charsets-regular-2e3b1d34.woff2 | Bin 0 -> 43236 bytes ...ce-code-pro-v11-all-charsets-500-2bdd9410.woff2 | Bin 0 -> 59140 bytes book/en/heir-recovery.html | 314 ++++ book/en/heir-recovery.html.gz | Bin 0 -> 7852 bytes book/en/highlight-493f70e1.css | 83 ++ book/en/highlight-493f70e1.css.gz | Bin 0 -> 589 bytes book/en/highlight-abc7f01d.js | 54 + book/en/highlight-abc7f01d.js.gz | Bin 0 -> 46266 bytes book/en/images/logo.png | Bin 0 -> 493569 bytes book/en/index.html | 288 ++++ book/en/index.html.gz | Bin 0 -> 7433 bytes book/en/installation.html | 397 +++++ book/en/installation.html.gz | Bin 0 -> 8165 bytes book/en/introduction.html | 288 ++++ book/en/introduction.html.gz | Bin 0 -> 7440 bytes book/en/mark-09e88c2c.min.js | 7 + book/en/mark-09e88c2c.min.js.gz | Bin 0 -> 5978 bytes book/en/nat-traversal.html | 334 +++++ book/en/nat-traversal.html.gz | Bin 0 -> 8428 bytes book/en/network-concepts.html | 285 ++++ book/en/network-concepts.html.gz | Bin 0 -> 8046 bytes book/en/print.html | 1532 ++++++++++++++++++++ book/en/print.html.gz | Bin 0 -> 27509 bytes book/en/quick-start.html | 314 ++++ book/en/quick-start.html.gz | Bin 0 -> 7259 bytes book/en/replication.html | 319 ++++ book/en/replication.html.gz | Bin 0 -> 8620 bytes book/en/running-a-node.html | 314 ++++ book/en/running-a-node.html.gz | Bin 0 -> 7476 bytes book/en/searcher-c2a407aa.js | 555 +++++++ book/en/searcher-c2a407aa.js.gz | Bin 0 -> 5292 bytes book/en/searchindex-ee09cfdc.js | 1 + book/en/searchindex-ee09cfdc.js.gz | Bin 0 -> 57626 bytes book/en/theme/custom-eff59930.css | 44 + book/en/theme/custom-eff59930.css.gz | Bin 0 -> 501 bytes book/en/toc-9150d087.js | 454 ++++++ book/en/toc-9150d087.js.gz | Bin 0 -> 5453 bytes book/en/toc.html | 32 + book/en/toc.html.gz | Bin 0 -> 1136 bytes book/en/tomorrow-night-4c0ae647.css | 104 ++ book/en/tomorrow-night-4c0ae647.css.gz | Bin 0 -> 668 bytes 92 files changed, 11378 insertions(+) create mode 100644 book/en/.nojekyll create mode 100644 book/en/404.html create mode 100644 book/en/404.html.gz create mode 100644 book/en/ayu-highlight-3fdfc3ac.css create mode 100644 book/en/ayu-highlight-3fdfc3ac.css.gz create mode 100644 book/en/book-a0b12cfe.js create mode 100644 book/en/book-a0b12cfe.js.gz create mode 100644 book/en/clipboard-1626706a.min.js create mode 100644 book/en/clipboard-1626706a.min.js.gz create mode 100644 book/en/commands/create.html create mode 100644 book/en/commands/create.html.gz create mode 100644 book/en/commands/export.html create mode 100644 book/en/commands/export.html.gz create mode 100644 book/en/commands/init.html create mode 100644 book/en/commands/init.html.gz create mode 100644 book/en/commands/list.html create mode 100644 book/en/commands/list.html.gz create mode 100644 book/en/commands/verify.html create mode 100644 book/en/commands/verify.html.gz create mode 100644 book/en/configuration.html create mode 100644 book/en/configuration.html.gz create mode 100644 book/en/css/chrome-ae938929.css create mode 100644 book/en/css/chrome-ae938929.css.gz create mode 100644 book/en/css/general-2459343d.css create mode 100644 book/en/css/general-2459343d.css.gz create mode 100644 book/en/css/print-9e4910d8.css create mode 100644 book/en/css/print-9e4910d8.css.gz create mode 100644 book/en/css/variables-8adf115d.css create mode 100644 book/en/css/variables-8adf115d.css.gz create mode 100644 book/en/docker.html create mode 100644 book/en/docker.html.gz create mode 100644 book/en/elasticlunr-ef4e11c1.min.js create mode 100644 book/en/elasticlunr-ef4e11c1.min.js.gz create mode 100644 book/en/encryption.html create mode 100644 book/en/encryption.html.gz create mode 100644 book/en/favicon-bfbdfe47.png create mode 100644 book/en/fonts/OPEN-SANS-LICENSE.txt create mode 100644 book/en/fonts/OPEN-SANS-LICENSE.txt.gz create mode 100644 book/en/fonts/SOURCE-CODE-PRO-LICENSE.txt create mode 100644 book/en/fonts/SOURCE-CODE-PRO-LICENSE.txt.gz create mode 100644 book/en/fonts/fonts-9644e21d.css create mode 100644 book/en/fonts/fonts-9644e21d.css.gz create mode 100644 book/en/fonts/open-sans-v17-all-charsets-300-7736aa35.woff2 create mode 100644 book/en/fonts/open-sans-v17-all-charsets-300italic-2c7b95c0.woff2 create mode 100644 book/en/fonts/open-sans-v17-all-charsets-600-486c6759.woff2 create mode 100644 book/en/fonts/open-sans-v17-all-charsets-600italic-1a3e8659.woff2 create mode 100644 book/en/fonts/open-sans-v17-all-charsets-700-c22fe8c7.woff2 create mode 100644 book/en/fonts/open-sans-v17-all-charsets-700italic-238ae959.woff2 create mode 100644 book/en/fonts/open-sans-v17-all-charsets-800-3d2c812a.woff2 create mode 100644 book/en/fonts/open-sans-v17-all-charsets-800italic-ba1521ec.woff2 create mode 100644 book/en/fonts/open-sans-v17-all-charsets-italic-6c9463f7.woff2 create mode 100644 book/en/fonts/open-sans-v17-all-charsets-regular-2e3b1d34.woff2 create mode 100644 book/en/fonts/source-code-pro-v11-all-charsets-500-2bdd9410.woff2 create mode 100644 book/en/heir-recovery.html create mode 100644 book/en/heir-recovery.html.gz create mode 100644 book/en/highlight-493f70e1.css create mode 100644 book/en/highlight-493f70e1.css.gz create mode 100644 book/en/highlight-abc7f01d.js create mode 100644 book/en/highlight-abc7f01d.js.gz create mode 100644 book/en/images/logo.png create mode 100644 book/en/index.html create mode 100644 book/en/index.html.gz create mode 100644 book/en/installation.html create mode 100644 book/en/installation.html.gz create mode 100644 book/en/introduction.html create mode 100644 book/en/introduction.html.gz create mode 100644 book/en/mark-09e88c2c.min.js create mode 100644 book/en/mark-09e88c2c.min.js.gz create mode 100644 book/en/nat-traversal.html create mode 100644 book/en/nat-traversal.html.gz create mode 100644 book/en/network-concepts.html create mode 100644 book/en/network-concepts.html.gz create mode 100644 book/en/print.html create mode 100644 book/en/print.html.gz create mode 100644 book/en/quick-start.html create mode 100644 book/en/quick-start.html.gz create mode 100644 book/en/replication.html create mode 100644 book/en/replication.html.gz create mode 100644 book/en/running-a-node.html create mode 100644 book/en/running-a-node.html.gz create mode 100644 book/en/searcher-c2a407aa.js create mode 100644 book/en/searcher-c2a407aa.js.gz create mode 100644 book/en/searchindex-ee09cfdc.js create mode 100644 book/en/searchindex-ee09cfdc.js.gz create mode 100644 book/en/theme/custom-eff59930.css create mode 100644 book/en/theme/custom-eff59930.css.gz create mode 100644 book/en/toc-9150d087.js create mode 100644 book/en/toc-9150d087.js.gz create mode 100644 book/en/toc.html create mode 100644 book/en/toc.html.gz create mode 100644 book/en/tomorrow-night-4c0ae647.css create mode 100644 book/en/tomorrow-night-4c0ae647.css.gz (limited to 'book/en') diff --git a/book/en/.nojekyll b/book/en/.nojekyll new file mode 100644 index 0000000..f173110 --- /dev/null +++ b/book/en/.nojekyll @@ -0,0 +1 @@ +This file makes sure that Github Pages doesn't process mdBook's output. diff --git a/book/en/404.html b/book/en/404.html new file mode 100644 index 0000000..357f11b --- /dev/null +++ b/book/en/404.html @@ -0,0 +1,228 @@ + + +
+ + +Press ← or → to navigate between chapters
+Press S or / to search in the book
+Press ? to show this help
+Press Esc to hide this help
+This URL is invalid, sorry. Please use the navigation bar or search to continue.
+ +Press ← or → to navigate between chapters
+Press S or / to search in the book
+Press ? to show this help
+Press Esc to hide this help
+Create a tessera from a directory of files.
+tes create <PATH> [OPTIONS]
+
+| Argument | Description |
|---|---|
<PATH> | Directory containing files to include |
| Option | Description | Default |
|---|---|---|
-n, --non-interactive | Skip prompts | off |
--dry-run | Preview what would be included | off |
--visibility <VALUE> | Visibility level: public, private, circle | public |
--language <CODE> | Language code (e.g., en, pt-BR) | en |
--tags <LIST> | Comma-separated tags | none |
--location <DESC> | Location description | none |
--data-dir <PATH> | Base directory for data storage | ~/.tesseras |
| Extension | Type | Memory type |
|---|---|---|
.jpg, .jpeg | Image (JPEG) | Moment |
.png | Image (PNG) | Moment |
.wav | Audio (WAV PCM) | Moment |
.webm | Video (WebM) | Moment |
.txt | Plain text (UTF-8) | Reflection |
Files with other extensions are ignored.
+The command automatically assigns a memory type based on the file format:
+.txt) are classified as Reflection — thoughts, beliefs, or opinionstes create ./my-photos --dry-run
+
+tes create ./vacation-2026 \
+ --tags "vacation,summer,beach" \
+ --location "Florianópolis, Brazil" \
+ --language pt-BR \
+ --visibility public
+
+tes create ./daily-log --non-interactive --tags "daily"
+
+| Level | Who can access |
|---|---|
public | Anyone (default) |
private | Only you (and designated heirs) |
circle | Explicitly chosen people |
Press ← or → to navigate between chapters
+Press S or / to search in the book
+Press ? to show this help
+Press Esc to hide this help
+Export a tessera as a self-contained directory.
+tes export <HASH> <DEST>
+
+| Argument | Description |
|---|---|
<HASH> | Tessera content hash (64 hex characters) |
<DEST> | Destination directory |
| Option | Description |
|---|---|
--data-dir <PATH> | Base directory for data storage (default: ~/.tesseras) |
The export creates a directory named tessera-<hash> inside the destination:
tessera-9f2c4a1b.../
+├── MANIFEST # Plain text index with checksums
+├── README.decode # Human-readable decoding instructions
+├── identity/
+│ ├── creator.pub.ed25519 # Creator's public key
+│ └── signature.ed25519.sig # Signature of the MANIFEST
+├── memories/
+│ ├── <content-hash>/
+│ │ ├── media.jpg # Primary media file
+│ │ ├── context.txt # Human context in plain UTF-8
+│ │ └── meta.json # Structured metadata
+│ └── .../
+├── schema/
+│ └── v1.json # JSON schema for metadata validation
+└── decode/
+ ├── formats.txt # Explanation of all formats used
+ ├── jpeg.txt # How to decode JPEG
+ ├── wav.txt # How to decode WAV
+ └── json.txt # How to decode JSON
+
+tes export 9f2c4a1b3e7d8f0cabc123def4567890... ./backup
+
+Exported to ./backup/tessera-9f2c4a1b3e7d8f0cabc123def4567890...
+
+The exported directory is designed to be readable without Tesseras software. It includes:
+This means someone thousands of years from now, with no knowledge of Tesseras, can still understand and access the memories.
+Press ← or → to navigate between chapters
+Press S or / to search in the book
+Press ? to show this help
+Press Esc to hide this help
+Initialize identity and local database.
+tes init
+
+Sets up your local Tesseras environment. This is the first command you should run after installing Tesseras.
+The command creates:
+| Path | Contents |
|---|---|
~/.tesseras/identity/ | Ed25519 keypair for signing tesseras |
~/.tesseras/db/ | SQLite database for indexing |
~/.tesseras/blobs/ | Blob storage for memory files |
~/.tesseras/config.toml | Configuration file |
| Option | Description |
|---|---|
--data-dir <PATH> | Base directory for data storage (default: ~/.tesseras) |
Running init again is safe. If an identity already exists, it is preserved:
tes init
+
+Ed25519 identity already exists
+Database initialized
+Tesseras initialized at /home/user/.tesseras
+
+tes --data-dir /mnt/usb/tesseras init
+
+This creates the full directory structure under /mnt/usb/tesseras/ instead of the default location.
identity/, db/, blobs/)config.tomlPress ← or → to navigate between chapters
+Press S or / to search in the book
+Press ? to show this help
+Press Esc to hide this help
+List all local tesseras.
+tes list
+
+| Option | Description |
|---|---|
--data-dir <PATH> | Base directory for data storage (default: ~/.tesseras) |
Displays a table with the following columns:
+| Column | Description |
|---|---|
| Hash | First 16 characters of the content hash |
| Created | Creation date (YYYY-MM-DD) |
| Memories | Number of memories in the tessera |
| Size | Total size (B, KB, MB, or GB) |
| Visibility | Visibility level (public, private, or circle) |
tes list
+
+Hash Created Memories Size Visibility
+9f2c4a1b3e7d8f0c 2026-02-14 3 284 KB public
+a3b7c2d9e4f01823 2026-02-10 1 12 KB private
+f8e7d6c5b4a39201 2026-01-28 12 4 MB public
+
+If no tesseras have been created yet:
+tes list
+
+No tesseras found.
+
+
+ Press ← or → to navigate between chapters
+Press S or / to search in the book
+Press ? to show this help
+Press Esc to hide this help
+Verify integrity of a stored tessera.
+tes verify <HASH>
+
+| Argument | Description |
|---|---|
<HASH> | Tessera content hash (64 hex characters) |
| Option | Description |
|---|---|
--data-dir <PATH> | Base directory for data storage (default: ~/.tesseras) |
| Code | Meaning |
|---|---|
0 | Verification passed — all files intact, signature valid |
1 | Verification failed — corrupted files or invalid signature |
tes verify 9f2c4a1b3e7d8f0cabc123def456789012345678abcdef0123456789abcdef01
+
+Tessera: 9f2c4a1b3e7d8f0cabc123def456789012345678abcdef0123456789abcdef01
+Signature: VALID
+ [OK] memories/a1b2c3d4/media.jpg
+ [OK] memories/e5f6a7b8/media.txt
+ [OK] memories/c9d0e1f2/media.wav
+Verification: PASSED
+
+If a file has been modified or corrupted:
+Tessera: 9f2c4a1b3e7d8f0cabc123def456789012345678abcdef0123456789abcdef01
+Signature: VALID
+ [OK] memories/a1b2c3d4/media.jpg
+ [FAILED] memories/e5f6a7b8/media.txt
+ [OK] memories/c9d0e1f2/media.wav
+Verification: FAILED
+
+Press ← or → to navigate between chapters
+Press S or / to search in the book
+Press ? to show this help
+Press Esc to hide this help
+The daemon can be configured via a TOML file. Pass the path with --config:
tesseras-daemon --config /etc/tesseras/config.toml
+
+If no config file is given, the daemon uses sensible defaults. CLI options (--listen, --bootstrap, --data-dir) override the corresponding config values.
[node]
+data_dir = "~/.local/share/tesseras"
+listen_addr = "0.0.0.0:4433"
+
+[dht]
+k = 20
+alpha = 3
+bucket_refresh_interval_secs = 3600
+republish_interval_secs = 3600
+pointer_ttl_secs = 86400
+max_stored_pointers = 100000
+ping_failure_threshold = 3
+
+[bootstrap]
+dns_domain = "_tesseras._udp.tesseras.net"
+hardcoded = [
+ "boot1.tesseras.net:4433",
+ "boot2.tesseras.net:4433",
+]
+
+[network]
+enable_mdns = true
+
+[observability]
+metrics_addr = "127.0.0.1:9190"
+log_format = "json"
+
+[node]Basic node settings.
+| Key | Type | Default | Description |
|---|---|---|---|
data_dir | path | Platform-specific | Where to store identity, database, and blobs |
listen_addr | address | 0.0.0.0:4433 | QUIC listener address |
The default data_dir is ~/.local/share/tesseras on Linux and ~/Library/Application Support/tesseras on macOS.
[dht]Kademlia DHT tuning parameters. The defaults work well for most deployments.
+| Key | Type | Default | Description |
|---|---|---|---|
k | integer | 20 | Maximum entries per routing table bucket |
alpha | integer | 3 | Parallelism for iterative lookups |
bucket_refresh_interval_secs | integer | 3600 | How often to refresh routing table buckets (seconds) |
republish_interval_secs | integer | 3600 | How often to republish stored pointers (seconds) |
pointer_ttl_secs | integer | 86400 | How long to keep a pointer before it expires (seconds) |
max_stored_pointers | integer | 100000 | Maximum number of pointers to store locally |
ping_failure_threshold | integer | 3 | How many consecutive ping failures before removing a peer |
[bootstrap]How the node discovers its first peers when joining the network.
+| Key | Type | Default | Description |
|---|---|---|---|
dns_domain | string | _tesseras._udp.tesseras.net | DNS domain for TXT-record-based peer discovery |
hardcoded | list of strings | ["boot1.tesseras.net:4433", "boot2.tesseras.net:4433"] | Fallback bootstrap addresses |
[network]Network-level features.
+| Key | Type | Default | Description |
|---|---|---|---|
enable_mdns | boolean | true | Enable local network discovery via mDNS |
[observability]Monitoring and logging.
+| Key | Type | Default | Description |
|---|---|---|---|
metrics_addr | address | 127.0.0.1:9190 | Address for the Prometheus metrics endpoint |
log_format | string | json | Log output format (json or text) |
Tesseras supports IPv6 natively. The listen_addr and listen_addrs fields accept both IPv4 and IPv6 addresses.
To listen on all IPv6 interfaces:
+[node]
+listen_addr = "[::]:4433"
+
+On Linux and most BSDs, binding to [::] also accepts IPv4 connections (dual-stack) by default. On some systems (notably OpenBSD), [::] is IPv6-only due to IPV6_V6ONLY being enabled by default. To guarantee both IPv4 and IPv6 on all platforms, use listen_addrs with explicit addresses:
[node]
+listen_addrs = ["0.0.0.0:4433", "[::]:4433"]
+
+For IPv6 loopback only (testing):
+[node]
+listen_addr = "[::1]:4433"
+
+Bootstrap addresses can be IPv6:
+[bootstrap]
+hardcoded = [
+ "boot1.tesseras.net:4433",
+ "[2001:db8::1]:4433",
+]
+
+DNS hostnames with both A and AAAA records are resolved to all addresses, so the daemon will connect over whichever protocol is reachable.
+IPV6_V6ONLY behavior by OS| OS | [::] accepts IPv4? | Notes |
|---|---|---|
| Linux | Yes (dual-stack) | IPV6_V6ONLY defaults to 0 |
| macOS | Yes (dual-stack) | IPV6_V6ONLY defaults to 0 |
| FreeBSD | Yes (dual-stack) | IPV6_V6ONLY defaults to 0 |
| OpenBSD | No (IPv6-only) | IPV6_V6ONLY always 1 |
| Windows | Yes (dual-stack) | IPV6_V6ONLY defaults to 0 |
If you need explicit control, use listen_addrs with both an IPv4 and IPv6 address.
Most users don’t need a config file at all. If you do, a minimal config overriding only what you need is enough:
+[node]
+listen_addr = "0.0.0.0:5000"
+
+[bootstrap]
+hardcoded = ["192.168.1.10:4433"]
+
+All other values use their defaults.
+ +Press ← or → to navigate between chapters
+Press S or / to search in the book
+Press ? to show this help
+Press Esc to hide this help
+Tesseras provides a Docker image for running the daemon in containers. This is useful for servers, testing multi-node networks, and CI environments.
+From the repository root:
+docker build -t tesseras-daemon .
+
+The multi-stage Dockerfile uses rust:1.85 to compile and debian:bookworm-slim as the runtime base. The resulting image is small and contains only the daemon binary and CA certificates.
docker run -d \
+ --name tesseras \
+ -p 4433:4433/udp \
+ tesseras-daemon
+
+This starts a node that:
+To persist data across container restarts, mount a volume:
+docker run -d \
+ --name tesseras \
+ -p 4433:4433/udp \
+ -v tesseras-data:/root/.local/share/tesseras \
+ tesseras-daemon
+
+To run a seed node that doesn’t bootstrap from anyone else:
+docker run -d \
+ --name tesseras-seed \
+ -p 4433:4433/udp \
+ tesseras-daemon --listen 0.0.0.0:4433 --bootstrap ""
+
+The repository includes a Docker Compose file for testing a 3-node network:
+services:
+ boot1:
+ build: ../..
+ command: ["--listen", "0.0.0.0:4433", "--bootstrap", ""]
+ ports: ["4433:4433/udp"]
+
+ boot2:
+ build: ../..
+ command: ["--listen", "0.0.0.0:4433", "--bootstrap", "boot1:4433"]
+ depends_on: [boot1]
+
+ client:
+ build: ../..
+ command: ["--listen", "0.0.0.0:4433", "--bootstrap", "boot2:4433"]
+ depends_on: [boot2]
+
+Start the network:
+cd tests/smoke
+docker compose up --build -d
+
+Check that all nodes are running:
+docker compose logs --tail=5
+
+You should see daemon ready in the logs for each node, and bootstrap successful for boot2 and client.
Stop the network:
+docker compose down
+
+To use a config file with Docker, mount it into the container:
+docker run -d \
+ --name tesseras \
+ -p 4433:4433/udp \
+ -v ./config.toml:/etc/tesseras/config.toml:ro \
+ -v tesseras-data:/root/.local/share/tesseras \
+ tesseras-daemon --config /etc/tesseras/config.toml
+
+See the Configuration chapter for all available options.
+ +Press ← or → to navigate between chapters
+Press S or / to search in the book
+Press ? to show this help
+Press Esc to hide this help
+Most tesseras are public — designed to be accessible to anyone, forever. But some memories need privacy. Tesseras supports two encrypted visibility modes:
+Public tesseras are never encrypted. Availability is more important than secrecy for preservation.
+When you create a private or sealed tessera, the following happens:
+Only the holder of the corresponding private key can unwrap the content key and decrypt the content.
+The sealed key envelope uses a hybrid Key Encapsulation Mechanism (KEM) combining two algorithms:
+Both algorithms produce shared secrets that are combined using BLAKE3 key derivation. An attacker must break both algorithms to recover the content key. This follows the same principle as Tesseras’ dual signatures (Ed25519 + ML-DSA): we don’t know which cryptographic assumptions will hold over centuries, so we hedge our bets.
+AES-256-GCM supports authenticated associated data — extra information that is verified during decryption but not encrypted. Tesseras binds the following into the AAD:
+This prevents ciphertext swapping attacks: an attacker cannot copy encrypted content from one tessera to another, because the AAD will not match and decryption will fail. For sealed tesseras, this also means you cannot change the seal date — the timestamp is cryptographically bound to the ciphertext.
+A sealed tessera is a true time capsule. When you create one, you specify an open_after date. The content is encrypted and the key is sealed in an envelope that only you can open.
When the open_after date passes, the owner publishes the content key as a signed Key Publication — a standalone artifact containing the key, the tessera hash, and the owner’s signature. Other nodes can verify the signature and use the published key to decrypt the content.
The tessera’s manifest is never modified. The Key Publication is a separate document, preserving the immutable, content-addressed nature of tesseras.
+Each identity now includes an encryption keypair alongside the signing keypair:
+| Key type | Algorithm | Purpose |
|---|---|---|
| Ed25519 | Classical | Signing manifests and key publications |
| ML-DSA | Post-quantum | Signing (when enabled) |
| X25519 | Classical | Key encapsulation (encryption) |
| ML-KEM-768 | Post-quantum | Key encapsulation (encryption) |
The encryption keypair is generated when the identity is created. The public half is stored in the tessera’s identity directory; the private half stays on the owner’s device.
+Press ← or → to navigate between chapters
+Press S or / to search in the book
+Press ? to show this help
+Press Esc to hide this help
+Your tesseras can survive infrastructure failures, quantum computers, and centuries of time. But what happens when you can no longer access your own keys? Tesseras uses Shamir’s Secret Sharing to let you distribute your cryptographic identity to trusted heirs.
+Shamir’s Secret Sharing splits a secret into N shares with a threshold T. Any T shares can reconstruct the original secret. Fewer than T shares reveal nothing — this is information-theoretically secure, not just computationally hard to break.
+For example, with threshold 2 and 3 total shares:
+Any two of them can recover your identity. A single share alone is useless.
+tes heir create --threshold 2 --shares 3
+
+This splits your Ed25519 identity key into 3 shares (requiring 2 to reconstruct) and saves them to ./heir-shares/:
heir-shares/
+├── heir_share_1.bin # MessagePack binary
+├── heir_share_1.txt # Human-readable base64 text
+├── heir_share_2.bin
+├── heir_share_2.txt
+├── heir_share_3.bin
+└── heir_share_3.txt
+
+Each share is generated in two formats:
+.bin) — compact MessagePack, suitable for USB drives or digital storage.txt) — base64 with human-readable header, suitable for printing on paperThe text format looks like this:
+--- TESSERAS HEIR SHARE ---
+Format: v1
+Owner: a1b2c3d4e5f6a7b8 (fingerprint)
+Share: 1 of 3 (threshold: 2)
+Session: 9f8e7d6c5b4a3210
+Created: 2026-02-15
+
+<base64-encoded data>
+--- END HEIR SHARE ---
+
+When heirs need to recover the identity:
+tes heir reconstruct heir_share_1.txt heir_share_2.bin --output-dir ./recovered-keys
+
+The command auto-detects whether each file is binary or text format. It validates that all shares belong to the same session and owner, verifies checksums, and reconstructs the Ed25519 keypair.
+To install the recovered keys as the active identity:
+tes heir reconstruct share1.txt share2.txt --output-dir ./recovered --install
+
+This backs up the current identity before replacing it.
+To view metadata about a share without exposing secret data:
+tes heir info heir_share_1.txt
+
+Output:
+Heir Share Information:
+ Format version: 1
+ Share: 1 of 3 (threshold: 2)
+ Session: 9f8e7d6c5b4a3210
+ Owner fingerprint: a1b2c3d4e5f6a7b8
+ Share data size: 34 bytes
+ Checksum: valid
+
+.txt files on acid-free paper and store in separate physical locations (safe deposit boxes, different homes). Paper survives decades without degradation.heir create call generates a fresh session ID. Shares from different sessions cannot be mixed — this prevents confusion after key rotations.Press ← or → to navigate between chapters
+Press S or / to search in the book
+Press ? to show this help
+Press Esc to hide this help
+Tesseras is a peer-to-peer network for preserving human memories across millennia. Each person creates a tessera — a self-contained time capsule of memories (photos, audio, video, text) that survives independently of any software, company, or infrastructure.
+The word tessera comes from the small tiles used to make mosaics in the ancient world. In Tesseras, each tessera is a collection of memories packaged into a format designed to be understood even thousands of years from now, without any special software.
+A tessera contains:
+Tesseras has completed through Phase 4 — encryption and sealed tesseras. The project now covers local tessera management, networking, replication, a mobile app, and cryptographic privacy.
+What’s available today:
+| Concept | Description |
|---|---|
| Tessera | A self-contained time capsule of memories |
| Memory | A single item (photo, recording, video, or text) within a tessera |
| Content hash | A BLAKE3 hash that uniquely identifies a tessera by its contents |
| Visibility | Controls who can access a tessera: public, private, sealed, or circle |
| Sealed tessera | A time capsule that can only be opened after a specific date |
| MANIFEST | A plain-text index listing every file in the tessera with its checksum |
| Memory type | Categorizes a memory: moment, reflection, daily, relation, or object |
| Node | A device running the Tesseras daemon, participating in the P2P network |
| DHT | Distributed hash table — how nodes find tessera pointers without a central server |
| Bootstrap | The process of joining the network by contacting known seed nodes |