Changelog
Newest first.
Inline buttons
Section titled “Inline buttons”Saved-link replies now carry tap buttons (Star / Share / Reading / Read) handled via
Telegram callback_query updates — organize a link without typing its id.
Auto-collections & dedup
Section titled “Auto-collections & dedup”/organizeclusters links by embedding similarity, names each group with the model (e.g.password-vaults,dev-interviews), and assigns the name to uncollected members./dupeslists near-duplicate / overlapping links for review.
Deeper notes
Section titled “Deeper notes”Enrichment now reads the link’s full content — the article body (via HTMLRewriter) and the
GitHub README — not just metadata. The model also produces a multi-sentence details
synopsis, and summaries/tags/key-points are grounded in real content.
/ask — retrieval-augmented answers
Section titled “/ask — retrieval-augmented answers”Ask a question and get a short answer synthesized from your most relevant saved links, with
citations ([#5]).
Semantic search
Section titled “Semantic search”A Workers AI embedding model (@cf/baai/bge-base-en-v1.5) + a Vectorize index make /find
hybrid: semantic matches (by meaning) ranked first, keyword FTS filling in. A query-instruction
prefix and a score threshold keep results precise.
Admin dashboard
Section titled “Admin dashboard”A private web dashboard at links.<domain>/dashboard behind Cloudflare Access — browse and
manage every link by clicking (status, star, share, collection, reminder, and delete), with a
second Worker-side JWT check as defense in depth.
Export & public List
Section titled “Export & public List”/export md|csv|jsonsends your whole library to the chat as a file./share <id>publishes a link to List, a public page at/list.
Link metadata
Section titled “Link metadata”Three tiers of new columns: auto-captured (domain, image, site_name, author,
published_at, GitHub stars/language/license), AI-extracted (category, key_points),
and user-set workflow state (status, favorite, collection, remind_at) with commands to
set them and filter lists.
Cloudflare rewrite
Section titled “Cloudflare rewrite”Replaced the original local Python bot with a single Cloudflare Worker.
- Telegram webhook entry (no more long-polling); a Worker that wakes per request and validates a secret header.
- Cloudflare D1 (SQLite + FTS5) for storage, via checked-in migrations. Existing links seeded across from the old local database.
- Workers AI (
@cf/google/gemma-4-26b-a4b-it, JSON mode) for summaries and tags, replacing local Ollama — with graceful degradation when the model is unavailable. - HTMLRewriter for OpenGraph/HTML scraping, replacing BeautifulSoup.
- Single-user lock via
ALLOWED_CHAT_IDin addition to the webhook secret. - Fixes: multi-word tags normalized to single tokens; reliable insert detection via
INSERT OR IGNORE … RETURNING id; Workers AI output read from the chat-completions shape.