Personal AI-powered bookmark hive mind. Send any URL (article, YouTube, tweet, Instagram) to a Telegram bot β it gets fetched, summarized by Gemini, classified into a workspace, stored in Supabase + an Obsidian vault, and retrievable by natural-language /ask queries.
- Ingest: forward any URL to the Telegram bot.
- Extract: real content is fetched β YouTube transcripts via
yt-dlp, tweets via the syndication endpoint, articles via Jina Reader, Instagram via Jina fallback. - Process: Gemini 2.5 Flash classifies into one of the predefined workspaces and produces a summary + key points + tags.
- Store twice: Supabase row (with
text-embedding-004embedding for semantic search) and an Obsidian markdown file with[[wikilinks]]so the graph view builds itself. - Retrieve:
/ask what did I save about Xβ embedding search β Gemini answers with cited source URLs.
| Layer | Tool |
|---|---|
| Trigger | Telegram bot |
| Orchestrator | n8n (homelab, behind Cloudflare Tunnel) |
| AI | Gemini 2.5 Flash + text-embedding-004 (free tier) |
| Vector DB | Supabase Cloud (Postgres + pgvector) |
| Browsing / graph view | Obsidian vault (Syncthing-synced) |
.
βββ README.md you are here
βββ .env.example secrets template
βββ docs/ architecture, setup, workspaces, prompt design
βββ supabase/schema.sql database schema + match_bookmarks RPC
βββ prompts/ source of truth for Gemini prompts
βββ n8n/workflows/ exported workflow JSON
βββ scripts/ yt-dlp + URL normalization helpers
βββ obsidian-vault-template/ starter vault structure
- Follow
docs/setup.mdβ provisions Supabase, Telegram bot, Gemini API key, n8n credentials. - Import the three workflows from
n8n/workflows/into your n8n instance. - Send a URL to your bot.
The ingest workflow writes Obsidian markdown files into /files/obsidian-vault/
inside the n8n container (host bind mount). n8n's restrictFileAccessTo defaults
to ~/.n8n-files, which blocks the vault path with a misleading
"is not writable" error.
Add to the n8n service env in docker-compose.yml:
environment:
- N8N_RESTRICT_FILE_ACCESS_TO=/filesThen docker compose up -d to recreate the container. The workspace subdirs
(AI & LLMs, Dev Tools, β¦) must also exist on the host beforehand β n8n's
readWriteFile node does not create parents.
n8n's MCP create_workflow_from_code has reproducible 500 bugs. Deploy via raw
REST API instead:
# Update
curl -X PUT https://<your-n8n>/api/v1/workflows/<id> \
-H "X-N8N-API-KEY: ..." -H "Content-Type: application/json" \
--data @workflow.json
# Activate
curl -X POST https://<your-n8n>/api/v1/workflows/<id>/activate \
-H "X-N8N-API-KEY: ..."Body must include name, nodes, connections, settings only. Readonly
fields (availableInMCP, binaryMode, staticData, versionId, etc.) cause
400 errors if passed back unchanged.
See docs/architecture.md for the full architecture and current build sprint.
See docs/workspaces.md for the taxonomy. Edit prompts/classify.md to change them.