A year ago, I wrote about Long Echo as a philosophy for preserving AI conversations across decades. The key insight was graceful degradation: design archives that work progressively even as technology disappears.
That philosophy has now become a tool.
From Philosophy to Tool
The original Long Echo was intentionally not code. It was a set of principles documented in CTK’s repository. The hard problems of conversation parsing, storage, and search were already solved by toolkits like CTK, BTK, and EBK.
What was missing was the unification layer. Each toolkit exports its own ECHO-compliant archive, but combining them into a single browsable experience required manual work. That’s what longecho now provides.
What longecho Does Now
longecho is a CLI tool with five capabilities:
longecho check ~/my-data/ # Validate ECHO compliance
longecho discover ~/ # Find ECHO sources
longecho search ~/ "query" # Search README descriptions
longecho build ~/my-archive/ # Generate static site
longecho serve ~/my-archive/ # Preview locally via HTTP
The check, discover, and search commands existed in the original specification. What’s new is build and serve—the orchestration layer.
Building a Unified Site
The build command takes a hierarchical archive and generates a static site:
longecho build ~/my-archive/
This produces a site/ directory with:
- An index page linking to all sub-archives
- Navigation between sources
- Automatic linking to existing sub-site builds
If a sub-archive already has its own site/ directory (like CTK’s exports), longecho links to it. Use --bundle to copy everything into a portable, self-contained site.
Live Preview
The serve command provides local HTTP preview:
longecho serve ~/my-archive/ --port 8000
It builds the site if needed, then serves it for browser viewing.
The Manifest
ECHO compliance requires only a README. But for machine-readable metadata, longecho supports an optional manifest:
version: "1.0"
name: "Alex's Data Archive"
description: "Personal data archive"
sources:
- path: "conversations/"
order: 1
- path: "bookmarks/"
order: 2
- path: "ebooks/"
order: 3
The manifest enables:
- Explicit ordering of sources in generated sites
- Selective inclusion via the
browsableflag - Override names for cleaner presentation
- Icon hints for UI presentation
Without a manifest, longecho auto-discovers sub-archives by looking for directories with README files. The manifest provides explicit control when needed.
Hierarchical Archives in Practice
My actual archive structure looks like this:
longecho-archive/
├── README.md
├── manifest.yaml
├── conversations/ # CTK export
│ ├── README.md
│ ├── conversations.db
│ └── site/
├── bookmarks/ # BTK export
│ ├── README.md
│ ├── bookmarks.db
│ └── site/
└── ebooks/ # EBK export
├── README.md
├── ebooks.db
└── site/
Each subdirectory is independently ECHO-compliant:
- conversations/ contains my AI conversation history from ChatGPT, Claude, and others
- bookmarks/ contains years of saved links with hierarchical tags
- ebooks/ contains my ebook library with extracted highlights
Running longecho build creates a unified site/ at the root that links everything together. Each toolkit’s export is preserved exactly—longecho doesn’t modify the underlying data.
ECHO Compliance in Practice
The minimal requirement for ECHO compliance is:
- A
README.mdorREADME.txtat the root - Data in durable formats
That’s it. No manifest, no special structure, no version numbers.
The toolkits naturally satisfy this:
- CTK exports with README explaining the SQLite schema
- BTK exports with README describing bookmark format
- EBK exports with README documenting ebook metadata
longecho doesn’t impose additional requirements. It works with what the toolkits already produce.
Why This Matters
The philosophy hasn’t changed. Archives should work without tools:
| If you have… | You can still… |
|---|---|
| longecho | Browse a beautiful unified site |
| A web browser | Open any toolkit’s site/index.html |
| SQLite | Query the databases directly |
| A text editor | Read the README files |
What’s new is convenience. Instead of manually copying files and editing HTML, longecho build generates the unified view automatically. But the underlying archive remains simple: directories with README files and durable-format data.
Implementation Notes
longecho is written in Python with Typer for the CLI and Jinja2 for HTML templates. The codebase is small (under 1000 lines) and well-tested (78% coverage, 114 tests).
Key design decisions:
Link by default, bundle optionally: Generated sites link to sub-archive sites rather than copying them. This keeps the output small and avoids duplication. The
--bundleflag creates a fully portable copy when needed.Auto-discovery with override: Without a manifest, longecho finds ECHO sources automatically. With a manifest, you get explicit control.
No data transformation: longecho never modifies the underlying data. It generates HTML that links to what already exists.
Status and What’s Next
longecho is alpha quality with core functionality working. The test suite covers the major paths, and I’m using it for my own archives.
What might come next:
- Search integration: Cross-archive search combining all toolkit indexes
- Theme support: Custom templates for generated sites
- Watch mode: Rebuild automatically when sources change
But the core is stable: check, discover, build, serve. The philosophy is now a tool.
The archive is not a monument. It is a conversation that outlasts its participants.
Resources
- longecho: github.com/queelius/longecho
- CTK: github.com/queelius/ctk
- BTK: github.com/queelius/btk
- Original Long Echo post: Long Echo: Designing for Digital Resilience
Discussion