{"id":50720695,"url":"https://github.com/openclaw/imsgcrawl","last_synced_at":"2026-06-10T00:00:42.402Z","repository":{"id":363467650,"uuid":"1260815127","full_name":"openclaw/imsgcrawl","owner":"openclaw","description":"it crawls your imessages. crawlkit-pilled repo","archived":false,"fork":false,"pushed_at":"2026-06-09T02:21:32.000Z","size":112,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-09T04:18:13.663Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/openclaw.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null},"funding":{"github":["moltbot"]}},"created_at":"2026-06-05T22:49:14.000Z","updated_at":"2026-06-09T02:21:35.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/openclaw/imsgcrawl","commit_stats":null,"previous_names":["openclaw/imsgcrawl"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/openclaw/imsgcrawl","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openclaw%2Fimsgcrawl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openclaw%2Fimsgcrawl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openclaw%2Fimsgcrawl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openclaw%2Fimsgcrawl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/openclaw","download_url":"https://codeload.github.com/openclaw/imsgcrawl/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openclaw%2Fimsgcrawl/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34130642,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-09T02:00:06.510Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-10T00:00:24.172Z","updated_at":"2026-06-10T00:00:42.379Z","avatar_url":"https://github.com/openclaw.png","language":"Go","funding_links":["https://github.com/sponsors/moltbot"],"categories":[],"sub_categories":[],"readme":"---\nwritten_by: ai\n---\n\n# imsgcrawl\n\n`imsgcrawl` is a local-first iMessage crawler. It reads Apple Messages through\na temporary read-only SQLite snapshot, syncs a source-native archive, and gives\nhumans or agents a small command surface for status, chat listing, transcript\nreading, search, and contact export.\n\nThe default output is for humans first and agents second: bounded, readable,\nand explicit about follow-up commands. Use `--json` for machines, scripts,\ntests, CrawlBar, or other workflows that need stable fields and local IDs.\n\n## Quick Start\n\n```bash\nimsgcrawl status\nimsgcrawl sync\nimsgcrawl chats\nimsgcrawl messages --chat 42\nimsgcrawl search \"candles budget\"\nimsgcrawl contacts export\n```\n\nList commands are bounded by default. They show how many rows were returned and\nhow to ask for more. Use `--all` only when you really want complete local\noutput.\n\n## What You See\n\nExamples below use fake Trump cinematic universe fixture data, not real\nMessages output.\n\n### Metadata\n\n```text\niMessage Crawl (imsgcrawl)\nLocal-first iMessage archive crawler.\n\nCapabilities: metadata, status, sync, chats, messages, search, contact-export\n\nAgent-facing commands:\n  status          imsgcrawl --json status\n  sync            imsgcrawl --json sync\n  chats           imsgcrawl --json chats\n  messages        imsgcrawl --json messages\n  search          imsgcrawl --json search\n  contact-export  imsgcrawl --json contacts export\n\nMachine output: add --json to print the structured manifest.\n```\n\n### Status And Sync\n\n`status` is a safe readiness check. It reports counts, not message contents.\n\n```text\nStatus: ok\nMessages source and archive are readable.\n\nMessages source:\n  Database: /Users/example/Library/Messages/chat.db\n  Handles: 6\n  Chats: 4\n  Messages: 12\n\nLocal archive:\n  Database: /Users/example/.imsgcrawl/archive.db\n  Last sync: 2026-06-07T09:15:02Z\n  Handles: 6\n  Chats: 4\n  Participants: 8\n  Messages: 12\n```\n\n`sync` refreshes the local archive and prints what it imported.\n\n### Chats\n\n`chats` shows the chat ID needed for `messages --chat`, plus enough context for\na human or agent to choose the right conversation.\n\n```text\nChats: showing 3 of 4, newest first.\nMore: imsgcrawl chats --limit 4\nAll: imsgcrawl chats --all\nOpen: imsgcrawl messages --chat CHAT_ID\n\nchat  kind    msgs  latest            conversation\n42    group   6     2026-06-07 09:10  Cabinet Group (Elon, JD, Xi, +1 more)\n17    direct  3     2026-06-07 08:55  Failing Elon\n9     direct  2     2026-06-06 22:03  JD Vance\n```\n\n### Messages\n\n`messages` is a wrapped table for scanning. Message bodies stay in the `text`\ncolumn and are not truncated; row limits control size.\n\n```text\nMessages in Cabinet Group (chat 42): showing 3 of 6, newest-first.\nMore: imsgcrawl messages --chat 42 --limit 6\nAll: imsgcrawl messages --chat 42 --all\nSearch: imsgcrawl search QUERY\n\ndate              from        text\n2026-06-07 09:10  me          The candles budget is CORRECT.\n2026-06-07 09:09  JD Vance    Sir, I have prepared bullet points:\n                              - The hum is louder\n                              - The couch remains loyal\n2026-06-07 09:08  Failing Elon  (attachment)\n```\n\n### Search\n\n`search` shows which conversation a hit came from and keeps the full matched\ntext in the table. Use JSON when an agent or script needs local chat IDs.\n\n```text\nSearch \"candles budget\": showing 1 of 1.\nUse --json when you need local chat IDs for follow-up commands.\n\ndate              from  conversation                  text\n2026-06-07 09:10  me    Cabinet Group (Elon, JD,      The candles budget is CORRECT.\n                         Xi, +1 more)\n```\n\n### Contacts\n\n`contacts export` is intentionally narrow: display name plus phone numbers.\n\n```text\nDonald        +15550100\nJD Vance      +15550101\nFailing Elon  +15550102\n```\n\n## JSON Mode\n\nText is the agent/human reading surface. JSON is the machine/workflow surface.\nIt includes local IDs and stable field names, so code can pipe it through `jq`\nor feed it to crawlkit/CrawlBar-style consumers.\n\n```bash\nimsgcrawl --json status\nimsgcrawl --json chats --limit 20\nimsgcrawl --json messages --chat 42 --limit 20\nimsgcrawl --json search --limit 20 \"candles budget\"\nimsgcrawl --json contacts export\n```\n\nSearch JSON keeps the envelope small and parseable:\n\n```json\n{\n  \"schema_version\": \"crawlkit.control.v1\",\n  \"app_id\": \"imsgcrawl\",\n  \"command\": \"search\",\n  \"returned\": 1,\n  \"total\": 1,\n  \"limit\": 20,\n  \"complete\": true,\n  \"query\": \"candles budget\",\n  \"items\": [\n    {\n      \"chat_id\": \"42\",\n      \"chat_title\": \"Cabinet Group\",\n      \"sender_label\": \"me\",\n      \"text\": \"The candles budget is CORRECT.\"\n    }\n  ]\n}\n```\n\n## Privacy\n\nMessages data contains private names, phone numbers, emails, and conversation\ncontents. Do not publish raw output from a real Messages database. Tests and\npublic examples must use fake fixture data.\n\n## Development\n\nThe repo is designed to be tested through the real `imsgcrawl` binary.\n\nWith Nix/devenv:\n\n```bash\ndirenv allow\ngo install ./cmd/imsgcrawl\nimsgcrawl status\n```\n\nWithout Nix, install Go `1.26.2` or newer, then use the normal Go workflow:\n\n```bash\ngo test ./...\ngo install ./cmd/imsgcrawl\nimsgcrawl status\n```\n\nInstall `jq` if you want to run the smoke transcript or inspect JSON examples.\n\n## Agent Smoke Transcript\n\nUse the smoke transcript when reviewing whether the CLI actually works for an\nagent. It runs the real `imsgcrawl` on `PATH`, uses a temporary archive, and\nwrites exact stdout/stderr for progressive text and JSON commands to `/tmp`.\n\n```bash\nscripts/agent-smoke-transcript.sh --query \"candles budget\"\n```\n\nThe script prints paths to `review.txt`, `manifest.jsonl`, `commands.tsv`, and\nthe raw stdout/stderr directory. These artifacts contain local Messages-derived\noutput. Keep them local unless the user explicitly asks to share them.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopenclaw%2Fimsgcrawl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fopenclaw%2Fimsgcrawl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopenclaw%2Fimsgcrawl/lists"}