[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-81721":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":16,"stars7d":17,"stars30d":18,"stars90d":15,"forks30d":15,"starsTrendScore":18,"compositeScore":19,"rankGlobal":9,"rankLanguage":9,"license":20,"archived":21,"fork":21,"defaultBranch":22,"hasWiki":21,"hasPages":21,"topics":23,"createdAt":9,"pushedAt":9,"updatedAt":24,"readmeContent":25,"aiSummary":26,"trendingCount":15,"starSnapshotCount":15,"syncStatus":27,"lastSyncTime":28,"discoverSource":29},81721,"telecrawl","openclaw\u002Ftelecrawl","openclaw","Telegram for Claws",null,"Go",46,7,37,1,0,3,5,9,2.71,"MIT License",false,"main",[],"2026-06-12 02:04:18","# ✈️ telecrawl\n\n![telecrawl banner](docs\u002Fassets\u002Freadme-banner.jpg)\n\nTelegram archive CLI.\n\n`telecrawl` reads local Telegram Desktop `tdata` archives and native Telegram\nfor macOS Postbox databases, stores a searchable SQLite archive in\n`~\u002F.telecrawl\u002Ftelecrawl.db`, and can back it up to GitHub as encrypted age\nshards.\n\nIt is local-first:\n\n- Normal archive\u002Fsearch commands do not upload data.\n- `backup push` uploads only age-encrypted shards when you run it explicitly.\n- Telegram message text, chat names, sender names, and media metadata stay inside\n  encrypted backup payloads.\n\n## Install\n\n```bash\nbrew tap steipete\u002Ftap\nbrew install telecrawl\n```\n\nOr install with Go:\n\n```bash\ngo install github.com\u002Fopenclaw\u002Ftelecrawl\u002Fcmd\u002Ftelecrawl@latest\n```\n\n### Docker\n\n```bash\ndocker build -t telecrawl .\ndocker run --rm -v \"$HOME\u002F.telecrawl:\u002Fdata\" -v \"$HOME\u002FLibrary\u002FApplication Support\u002FTelegram Desktop\u002Ftdata:\u002Ftdata:ro\" telecrawl --source \u002Ftdata doctor\ndocker run --rm -v \"$HOME\u002F.telecrawl:\u002Fdata\" -v \"$HOME\u002FLibrary\u002FApplication Support\u002FTelegram Desktop\u002Ftdata:\u002Ftdata:ro\" telecrawl --source \u002Ftdata import\n```\n\nThe image packages the Python bridge dependencies. Mount Telegram Desktop `tdata` read-only and keep the archive\u002Fconfig under `\u002Fdata`.\n\n## Setup\n\nInstall the Python bridge dependencies used for local Telegram imports:\n\n```bash\ntelecrawl deps install\n```\n\nThis creates `~\u002F.telecrawl\u002Fvenv` and installs the bridge packages for Telegram\nDesktop `tdata`. It also attempts the optional native macOS Postbox SQLCipher\nbinding when the host has the required native SQLCipher support. The Docker image\npackages both the Python bridge and native SQLCipher dependencies.\n\n## Import\n\n```bash\ntelecrawl doctor\ntelecrawl import\ntelecrawl status\n```\n\nImport defaults to:\n\n- latest `200` dialogs\n- latest `500` messages per dialog\n\nUse `0` for no limit:\n\n```bash\ntelecrawl import --dialogs-limit 0 --messages-limit 0\n```\n\nAdd `--fetch-media` when you also want Telegram cloud media that is not cached\nlocally:\n\n```bash\ntelecrawl import --dialogs-limit 0 --messages-limit 0 --fetch-media\n```\n\nWhen no `--source` is provided on macOS, `telecrawl` checks Telegram Desktop\n`tdata` first, then the native Telegram for macOS group container. No backend\nflag is needed. To import a copied archive directly:\n\n```bash\ntelecrawl import --path \"$HOME\u002FLibrary\u002FGroup Containers\u002F6N38VWS5BX.ru.keepcoder.Telegram\"\n```\n\nNative macOS imports include every local `account-*` database they find; if more\nthan one account is present, stored chat and sender IDs are account-scoped to\navoid collisions. They archive cached media by default. `--fetch-media` also uses\nthe existing native Telegram session to fetch missing cloud media when account\nauth data is present; this does not launch Telegram or start a login\u002F2FA flow.\n\nUseful reads:\n\n```bash\ntelecrawl folders\ntelecrawl chats --limit 20\ntelecrawl chats --folder FOLDER_ID\ntelecrawl chats --unread\ntelecrawl topics --chat CHAT_ID\ntelecrawl messages --limit 20\ntelecrawl messages --chat CHAT_ID --after 2026-01-01\ntelecrawl messages --chat CHAT_ID --topic TOPIC_ID\ntelecrawl messages --chat CHAT_ID --pinned\ntelecrawl search \"query\"\ntelecrawl search \"query\" --chat CHAT_ID --topic TOPIC_ID\n```\n\nTelegram folders, forum topics, reply\u002Fthread IDs, pinned messages, edits,\nforwards, reactions, view\u002Freply counts, and richer media titles are archived\nwhen Telethon exposes them for the active account. Folder rows include explicit\nmembership from Telegram dialog filters; dynamic folder rules are recorded as\nmetadata and may not expand to every matching chat.\n\nAdd `--json` before the command for machine-readable output:\n\n```bash\ntelecrawl --json status\ntelecrawl --json search \"invoice\"\n```\n\n## Data Paths\n\nDefaults:\n\n- Telegram Desktop source: `~\u002FLibrary\u002FApplication Support\u002FTelegram Desktop\u002Ftdata`\n- native macOS Postbox source:\n  `~\u002FLibrary\u002FGroup Containers\u002F6N38VWS5BX.ru.keepcoder.Telegram`\n- archive DB: `~\u002F.telecrawl\u002Ftelecrawl.db`\n- archived media copied from local Telegram caches, plus Telegram cloud media\n  when `--fetch-media` is used: `~\u002F.telecrawl\u002Fmedia\u002F`\n- Python bridge venv: `~\u002F.telecrawl\u002Fvenv`\n- Telethon sessions: `~\u002F.telecrawl\u002Fsessions\u002F`\n- backup config: `~\u002F.telecrawl\u002Fbackup.json`\n- age identity: `~\u002F.telecrawl\u002Fage.key`\n- backup checkout: `~\u002FProjects\u002Fbackup-telecrawl`\n\nOverride the archive DB:\n\n```bash\ntelecrawl --db \u002Ftmp\u002Ftelecrawl.db status\n```\n\nOverride the Telegram source:\n\n```bash\ntelecrawl --source \"\u002Fpath\u002Fto\u002Ftdata\" doctor\ntelecrawl --source \"\u002Fpath\u002Fto\u002Ftdata\" import\ntelecrawl --source \"\u002Fpath\u002Fto\u002F6N38VWS5BX.ru.keepcoder.Telegram\" import\n```\n\n## Backup\n\nCreate `https:\u002F\u002Fgithub.com\u002Fsteipete\u002Fbackup-telecrawl` first, then initialize:\n\n```bash\ntelecrawl backup init\ntelecrawl backup push\n```\n\nThe default backup config points at:\n\n```json\n{\n  \"repo\": \"~\u002FProjects\u002Fbackup-telecrawl\",\n  \"remote\": \"https:\u002F\u002Fgithub.com\u002Fsteipete\u002Fbackup-telecrawl.git\",\n  \"identity\": \"~\u002F.telecrawl\u002Fage.key\"\n}\n```\n\nUse a different repository or config path:\n\n```bash\ntelecrawl backup init \\\n  --config ~\u002F.telecrawl\u002Fbackup.json \\\n  --repo ~\u002FProjects\u002Fbackup-telecrawl \\\n  --remote https:\u002F\u002Fgithub.com\u002Fsteipete\u002Fbackup-telecrawl.git\n```\n\nInspect backup metadata:\n\n```bash\ntelecrawl backup status\n```\n\nRestore into the current archive DB:\n\n```bash\ntelecrawl backup pull\ntelecrawl status\n```\n\nRestore into a throwaway DB for validation:\n\n```bash\ntelecrawl --db \u002Ftmp\u002Ftelecrawl-restore-test.db backup pull\ntelecrawl --db \u002Ftmp\u002Ftelecrawl-restore-test.db status\n```\n\n## Backup Security Model\n\nBackup shards are JSONL, gzip-compressed with deterministic gzip metadata, and\nencrypted with age before Git sees them.\n\nGit can still see cleartext metadata:\n\n- export time\n- public age recipients\n- table names\n- row counts\n- shard paths\n- encrypted byte sizes\n- plaintext shard hashes\n- backup cadence and which encrypted shards changed\n\nGit cannot read message text, chat names, sender names, or media metadata without\nan age identity. Binary media files archived in `~\u002F.telecrawl\u002Fmedia\u002F` are local\nonly and are not included in backup shards.\n\nKeep `~\u002F.telecrawl\u002Fage.key` private. If you lose it and no other recipient can\ndecrypt the backup, the encrypted backup cannot be restored.\n\n## Multi-Machine Backups\n\nOn another machine:\n\n```bash\ntelecrawl backup init --no-push\ncat ~\u002F.telecrawl\u002Fbackup.json\n```\n\nCopy that machine's public `recipient` into the first machine's\n`~\u002F.telecrawl\u002Fbackup.json`, then re-encrypt current shards:\n\n```bash\ntelecrawl backup push\n```\n\nThe private `AGE-SECRET-KEY-...` identity must not be committed or shared.\n\n## Reset\n\nRemove local state:\n\n```bash\nrm -rf ~\u002F.telecrawl\n```\n\nRemove only the archive:\n\n```bash\nrm -f ~\u002F.telecrawl\u002Ftelecrawl.db ~\u002F.telecrawl\u002Ftelecrawl.db-*\n```\n\nDo not delete `~\u002F.telecrawl\u002Fage.key` unless you have another working backup\nrecipient or you no longer need to restore existing encrypted backups.\n","telecrawl 是一个用于归档和搜索 Telegram 消息的命令行工具。它能够读取本地 Telegram Desktop 的 tdata 归档文件和 macOS 版本的 Postbox 数据库，并将这些数据存储为可搜索的 SQLite 数据库。此外，telecrawl 还支持将备份数据加密后上传到 GitHub。该工具注重本地优先，常规操作不会上传用户数据，只有在用户明确执行备份命令时才会上传加密后的数据片段。适合需要对 Telegram 聊天记录进行长期保存、检索或迁移的场景使用，尤其是对于重视隐私保护的用户而言。",2,"2026-06-11 04:06:06","CREATED_QUERY"]