Avocet is a TUI for browsing your Raindrop.io bookmarks. It is written in Python with the Textual framework. It syncs your collections and bookmarks into a local SQLite cache, generates a concise summary of a bookmark — using either Anthropic Claude or OpenAI — the first time you open it (cached thereafter), and opens links in your default browser.
- Python 3.12+
- uv
- Clone the repo.
uv sync(orjust install) to install dependencies.- Provide the required credentials, either as environment variables or in a
.envfile (copy.env.exampleto.envand fill it in — exported variables take precedence over.env):RAINDROP— your Raindrop.io API token (from app.raindrop.io/settings/integrations).- A summary provider key — set one of
ANTHROPIC_API_KEYorOPENAI_API_KEY. Avocet auto-detects which to use from the key you provide (Anthropic wins if both are set). Override withAVOCET_SUMMARY_PROVIDER=anthropic|openai, and the model withAVOCET_SUMMARY_MODEL(defaults:claude-haiku-4-5/gpt-5-mini).
just run(oruv run textual run --dev avocet/app.py).- Navigate with the arrow keys. Move focus between the collections sidebar and the
bookmarks table; press Enter on a bookmark to view its details — a Claude summary is
generated on first view and cached. Useful keys:
oopen in browser,/search,a/e/dadd/edit/delete,ffilter by tag,rrefresh from Raindrop, andctrl+pfor the command palette (including runtime theme switching).ctrl+cquits.
Summaries are generated lazily the first time you open each bookmark, so startup is instant.
Common tasks (see the justfile for all of them):
just test # uv run pytest
just lint # uv run ruff check .
just typecheck # uv run ty check
just snapshot-update # regenerate visual snapshot baselines after a UI changeThe test suite has three layers: unit tests (Raindrop API client and database manager),
interaction tests driven through Textual's run_test/Pilot, and visual-regression
snapshot tests via pytest-textual-snapshot.