Skip to content

Saving links

To save a link, just send a URL to the bot — from the Telegram share sheet on your phone, or by pasting into the chat on desktop. You get a reply with the title, an AI-written summary, and tags — plus tap buttons (☆ Star · 🌐 Share · 📖 Reading · ✅ Read) so you can organize it on the spot without typing its id.

Type anything before or after the URL and it’s stored as your personal note, separate from the auto-generated summary:

https://github.com/tokio-rs/tokio want to try for the async runtime

The URL is extracted (trailing punctuation trimmed), and the rest becomes the note, shown under 📝 in the reply.

The bot detects the link type and enriches accordingly:

| Link type | Source | What it pulls | |-----------|--------|---------------| | GitHub repo | GitHub API | Full name, description, language, topics, stars, license, README | | YouTube | oEmbed API | Video title + channel (YouTube blocks page scraping from the server) | | Anything else | OpenGraph / HTML scrape | og:title / <title>, og:description, and the article body |

The bot reads the link’s actual content — the article body (for web pages) and the README (for GitHub repos) — not just the page’s metadata. That content is handed to a Cloudflare-hosted Gemma model, which writes a 1–2 sentence summary, a few lowercase tags, a category (article/video/repo/tool/…), a few key points, and a longer details synopsis (what it contains and what you’d take away). If the model is unavailable, the bot falls back to the scraped description and (for GitHub) the repo topics — the link still saves.

The details synopsis shows in the dashboard and gives /ask and semantic search richer material to work with.

If a link’s enrichment ever comes out poor — or you’ve improved the enrichment since — /refresh <id> re-fetches the content, re-summarizes, re-indexes, and re-embeds that link.

Some metadata is also captured automatically without the model: the domain, OpenGraph image / site name / author / published date for web pages, and stars / language / license for GitHub repos. Stars and language show on the result card; the rest is stored for filtering and a future web view.

Tags are stored space-delimited, and each tag is normalized to a single token — internal spaces become hyphens (so api gateway is saved as #api-gateway, not split into two broken chips). Tags feed search.

URLs are unique. If you send a link you’ve already saved, the bot replies ⚠️ Already in your library and nothing is added — your original note and tags are kept untouched.

Each saved link is one row: the URL, title, summary, tags, your note, the kind (github or web), a timestamp, the captured metadata above, and workflow fields you set later (see Organizing). See Where your data lives for the full schema.