{"id":50138676,"url":"https://github.com/openclaw/slacrawl","last_synced_at":"2026-05-24T00:01:20.909Z","repository":{"id":342919679,"uuid":"1175609689","full_name":"openclaw/slacrawl","owner":"openclaw","description":"cli terminal app for slack with sqlite backend","archived":false,"fork":false,"pushed_at":"2026-05-18T07:05:59.000Z","size":510,"stargazers_count":170,"open_issues_count":0,"forks_count":14,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-05-18T08:33:28.600Z","etag":null,"topics":["cli","openclaw","slack","slack-api","slackbot","terminal"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/openclaw.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","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":null,"dco":null,"cla":null},"funding":{"github":["moltbot"]}},"created_at":"2026-03-07T23:49:16.000Z","updated_at":"2026-05-18T07:06:04.000Z","dependencies_parsed_at":null,"dependency_job_id":"b3044224-ff8c-48df-8813-b953dc8e00ee","html_url":"https://github.com/openclaw/slacrawl","commit_stats":null,"previous_names":["vincentkoc/slacrawl","openclaw/slacrawl"],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/openclaw/slacrawl","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openclaw%2Fslacrawl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openclaw%2Fslacrawl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openclaw%2Fslacrawl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openclaw%2Fslacrawl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/openclaw","download_url":"https://codeload.github.com/openclaw/slacrawl/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openclaw%2Fslacrawl/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33416315,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-23T22:14:44.296Z","status":"ssl_error","status_checked_at":"2026-05-23T22:14:43.778Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["cli","openclaw","slack","slack-api","slackbot","terminal"],"created_at":"2026-05-24T00:00:50.143Z","updated_at":"2026-05-24T00:01:20.901Z","avatar_url":"https://github.com/openclaw.png","language":"Go","funding_links":["https://github.com/sponsors/moltbot"],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e💾 slacrawl\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eA Go-based CLI for mirroring Slack workspace data into local SQLite\u003cbr\u003e for search, querying, and offline inspection.\u003c/strong\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"./LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/github/license/vincentkoc/slacrawl\" alt=\"License\"\u003e\u003c/a\u003e\n  \u003cimg src=\"https://img.shields.io/badge/go-1.26.3%2B-00ADD8\" alt=\"Go 1.26.3+\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/storage-SQLite-003B57\" alt=\"SQLite\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/platform-macOS%20%7C%20Linux-lightgrey\" alt=\"Platform\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"screenshot.png\" alt=\"slascrawl Demo\"/\u003e\n\u003c/p\u003e\n\n## Why slacrawl?\n\nSlack search is convenient until you need your own workflow, your own retention, or your own queries. `slacrawl` is a Go-based CLI that pulls Slack workspace metadata and message history into SQLite so you can inspect it without depending on the Slack UI.\n\nData stays on your machine. You can run it in API mode, desktop mode, or a hybrid workflow that combines both. That covers one-shot syncs, live tailing over Socket Mode, and local desktop recovery or \"wiretap\" style inspection from Slack Desktop artifacts already on your machine.\n\n## Included\n\n- local SQLite storage with full-text search backed by SQLite FTS5\n- workspace, channel, user, and message sync\n- thread reply backfill when a user token is available\n- DM and MPIM sync when a user token is available\n- incremental API history sync by default, with `--full` reserved for deliberate backfills\n- `sync --latest-only` for cheap incremental refreshes on already-seeded channels\n- mention extraction for structured querying\n- read-only SQL access for ad hoc analysis\n- `doctor` diagnostics for config, database, token, and desktop-source checks\n- desktop-local ingestion of workspace metadata, channels, users, cached channel messages, drafts, read markers, recent-channel hints, and custom-status metadata\n- optional Socket Mode live tailing via app token\n- periodic desktop refresh with `watch`\n- git-backed archive publishing, subscription, and read-time auto-refresh\n\n## Current Coverage\n\n- multi-workspace storage and filtering\n- multi-workspace API sync when `[[workspaces]]` is configured\n- multi-workspace live tailing when per-workspace app tokens are configured\n- public channels\n- private channels\n- top-level messages\n- channel threads\n- local FTS search\n- read-only SQL access\n- macOS Slack Desktop discovery\n- optional Slack file media caching\n\n## Not Yet Included\n\n- write-back actions\n- public Marketplace-style distribution hardening\n- desktop-local message extraction beyond the documented bootstrap surface\n\nIf one of those gaps matters to your workflow, open an issue so it can be tracked explicitly.\n\n## Requirements\n\n- Go `1.26.3+`\n- `node` if you want richer desktop-local IndexedDB blob decoding\n- a Slack bot token for standard API sync\n- an app token if you want to use `tail`\n- an optional user token for fuller historical thread coverage\n- macOS Slack Desktop only if you want desktop-local discovery\n\n## Install\n\n\u003cdetails open\u003e\n\u003csummary\u003eHomebrew (macOS)\u003c/summary\u003e\n\n```bash\nbrew tap vincentkoc/tap\nbrew install slacrawl\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eLinux packages from GitHub Releases\u003c/summary\u003e\n\nDownload the package that matches your platform from the [latest release](https://github.com/openclaw/slacrawl/releases/latest).\n\nDebian/Ubuntu:\n\n```bash\ncurl -LO https://github.com/openclaw/slacrawl/releases/latest/download/slacrawl_0.6.0_amd64.deb\nsudo dpkg -i slacrawl_0.6.0_amd64.deb\n```\n\nRHEL/Fedora:\n\n```bash\ncurl -LO https://github.com/openclaw/slacrawl/releases/latest/download/slacrawl-0.6.0-1.x86_64.rpm\nsudo rpm -i slacrawl-0.6.0-1.x86_64.rpm\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eBuild from source\u003c/summary\u003e\n\n```bash\ngit clone https://github.com/openclaw/slacrawl.git\ncd slacrawl\ngo build -o bin/slacrawl ./cmd/slacrawl\n./bin/slacrawl --help\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eDocker\u003c/summary\u003e\n\n```bash\ndocker build -t slacrawl .\ndocker run --rm -e SLACK_BOT_TOKEN -v \"$PWD/.slacrawl:/data\" slacrawl doctor\ndocker run --rm -e SLACK_BOT_TOKEN -e SLACK_APP_TOKEN -v \"$PWD/.slacrawl:/data\" slacrawl tail\n```\n\nThe image stores config, SQLite data, cache, and Git snapshot state under `/data`. Desktop/wiretap mode needs an explicit host mount to the Slack Desktop data directory.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eRun without building a binary\u003c/summary\u003e\n\n```bash\ngit clone https://github.com/openclaw/slacrawl.git\ncd slacrawl\ngo run ./cmd/slacrawl --help\n```\n\n\u003c/details\u003e\n\n## Quick Start\n\n```bash\nexport SLACK_BOT_TOKEN=\"xoxb-...\"\nexport SLACK_APP_TOKEN=\"xapp-...\"\nexport SLACK_USER_TOKEN=\"xoxp-...\"\n\ngo run ./cmd/slacrawl init\ngo run ./cmd/slacrawl doctor\ngo run ./cmd/slacrawl sync --source bot\ngo run ./cmd/slacrawl search --workspace T01234567 \"incident\"\ngo run ./cmd/slacrawl analytics trends --weeks 4\ngo run ./cmd/slacrawl tail --repair-every 30m\ngo run ./cmd/slacrawl watch --desktop-every 5m\n```\n\nIf you built the binary, replace `go run ./cmd/slacrawl` with `./bin/slacrawl`.\n\n`tail` is the live API side of the tool. `watch` is the recurring desktop-side refresh loop.\n\n## Visibility Model\n\nTreat one `slacrawl` config/database as one Slack visibility boundary. The archive should mean \"what this bot/account/profile can see\", not a blend of unrelated personal and company backups.\n\n- `--source bot` is an alias for `--source api`; it crawls Slack through configured bot/user tokens\n- `--source wiretap` is an alias for `--source desktop`; it reads the local Slack Desktop cache\n- `--source all` runs API first, then desktop enrichment\n- `[share]` is a backup/restore target for the current DB, not a second Slack source\n\nFor separate company and personal archives, use separate configs with separate `db_path` and `[share].remote` values.\n\nChoose the path that matches your setup:\n\n- use `sync --source bot` for normal token-backed incremental syncs\n- use `sync --source bot --full` only when you want a deliberate full backfill\n- use `sync --source bot --latest-only` when you only want fresh deltas on channels that already have local history\n- use `sync --source wiretap` when you want local desktop recovery only\n- use `watch` when you want desktop-local state to refresh into SQLite continuously\n\n## Commands\n\n- `init` creates a starter config file\n- `doctor` checks config, DB access, token presence, FTS, and desktop source availability\n- `report` summarizes archive activity and git-share freshness without writing SQL\n- `publish` exports the local SQLite archive into a git repo as compressed JSONL shards plus a manifest\n- `subscribe` configures a git-backed reader that can run without Slack credentials\n- `update` pulls and imports the latest git snapshot\n- `sync` performs a one-shot crawl from bot/API, wiretap/desktop, or both\n- `import` imports a Slack export ZIP or extracted export directory\n- `tail` listens for live events through Socket Mode, including one tail per configured workspace\n- `watch` refreshes desktop-local state on a schedule\n- `search` runs local FTS queries, optionally filtered by workspace\n- `messages` lists stored messages with filters\n- `mentions` lists structured mention records\n- `sql` runs read-only SQL against the local database\n- `users` lists synced users\n- `channels` lists synced channels\n- `status` prints workspace and sync status\n- `metadata --json`, `status --json`, and `doctor --json` expose crawlkit\n  control/status payloads for launchers, automation, and CI\n- `check-update` checks GitHub Releases for newer OpenClaw builds; interactive\n  terminal runs also print a cached daily stderr notice unless\n  `SLACRAWL_NO_UPDATE_CHECK=1` or `CRAWLKIT_NO_UPDATE_CHECK=1` is set\n- `digest` prints a per-channel activity summary for a time window\n- `analytics` groups analytics subcommands (`digest`, `quiet`, `trends`)\n- `completion` prints shell completion for `bash` or `zsh`\n\n## Importing a Slack Export\n\n```bash\nslacrawl import ./my-export.zip --workspace T01234567\nslacrawl import ./extracted-export/ --workspace T01234567 --dry-run\n```\n\nSet `SLACK_USER_TOKEN` with `im:history`, `mpim:history`, `im:read`, and `mpim:read` scopes to include DMs and MPIMs in API sync.\n\n## Analytics\n\n- `analytics digest [--since 7d] [--workspace X] [--channel C]`\n- `analytics quiet [--since 30d] [--workspace X]`\n- `analytics trends [--weeks 8] [--workspace X] [--channel C]`\n\nPlanned follow-ups: `health`, `response-times`, `threads-stale`, `activity`.\n\n## Output Modes\n\nThe CLI supports three output modes:\n\n- `--format text` for the styled default terminal view\n- `--format json` or `--json` for machine-readable output\n- `--format log` for line-oriented automation-friendly output\n\nColor is disabled automatically when stdout is not a TTY. You can also force plain text with `--no-color` or `NO_COLOR=1`.\n\n## Make Targets\n\n```bash\nmake build\nmake test\nmake run ARGS=\"status\"\nmake generate-sqlc\nmake completion\n```\n\nCompletion files are generated into `dist/completions/`.\n\n## Shell Completion\n\nGenerate completion scripts with:\n\n```bash\ngo run ./cmd/slacrawl completion bash\ngo run ./cmd/slacrawl completion zsh\n```\n\nOr use the Makefile:\n\n```bash\nmake completion\n```\n\nTypical install locations:\n\n```bash\n# bash\ngo run ./cmd/slacrawl completion bash \u003e /usr/local/etc/bash_completion.d/slacrawl\n\n# zsh\nmkdir -p \"${HOME}/.zsh/completions\"\ngo run ./cmd/slacrawl completion zsh \u003e \"${HOME}/.zsh/completions/_slacrawl\"\n```\n\n## Default Paths\n\n- config: `~/.slacrawl/config.toml`\n- database: `~/.slacrawl/slacrawl.db`\n- cache: `~/.slacrawl/cache`\n- logs: `~/.slacrawl/logs`\n\n## Configuration\n\nFor one workspace, keep using the top-level `[slack.bot]`, `[slack.app]`, and `[slack.user]` token config.\n\nFor multiple API workspaces or multiple live wiretap/tail sessions, add `[[workspaces]]` entries with per-workspace token env vars:\n\n```toml\nworkspace_id = \"T01234567\"\n\n[[workspaces]]\nid = \"T01234567\"\ndefault = true\n\n[[workspaces]]\nid = \"T08976543\"\nbot_token_env = \"SLACK_CLIENT_BOT_TOKEN\"\napp_token_env = \"SLACK_CLIENT_APP_TOKEN\"\nuser_token_env = \"SLACK_CLIENT_USER_TOKEN\"\n```\n\nBy default, each workspace entry automatically looks for `SLACK_\u003cWORKSPACE_ID\u003e_BOT_TOKEN`, `SLACK_\u003cWORKSPACE_ID\u003e_APP_TOKEN`, and `SLACK_\u003cWORKSPACE_ID\u003e_USER_TOKEN`, so you only need the `id` in the common case. Top-level `enabled` flags still apply globally, which avoids repeating `enabled = true` per workspace.\n\nWithout `--workspace`, `sync --source bot` and `tail` fan out across every configured workspace entry. Read commands such as `search`, `messages`, `mentions`, `users`, and `channels` accept `--workspace` to scope the shared local database when needed.\n\nFile media downloads are opt-in. SQLite stores file metadata and cache pointers; bytes live under `cache_dir/media`.\n\n```toml\n[sync]\nfile_media = false\nmax_file_bytes = 104857600\n```\n\nUse `sync --with-media` or `files fetch` when you want to populate the local cache.\n\n```bash\ngo run ./cmd/slacrawl files --filename runbook\ngo run ./cmd/slacrawl files fetch --missing --max-bytes 104857600\ngo run ./cmd/slacrawl sync --source bot --latest-only --with-media\n```\n\n## Git Archive Sharing\n\nUse git-share mode when one machine has Slack credentials and should publish snapshots, while other machines only need a local read-only archive.\n\nTypical split:\n\n- publisher machine: runs `sync`, then `publish --push`\n- subscriber machine: runs `subscribe`, then reads from local SQLite with optional read-time auto-refresh\n\nGit-backed archive sharing is configured under `[share]`:\n\n```toml\n[share]\nremote = \"git@github.com:your-org/private-slacrawl-archive.git\"\nrepo_path = \"~/.slacrawl/share\"\nbranch = \"main\"\nauto_update = true\nstale_after = \"15m\"\n```\n\nBehavior:\n\n- `publish` writes gzipped JSONL shards plus `manifest.json` into `repo_path`\n- cached non-DM/non-private file media is included by default; use `--no-media` to omit it\n- `subscribe` writes a git-reader config, disables Slack API and desktop sources for that config, clones the repo, and imports the snapshot\n- pass `--db` to `subscribe` when you want the reader archive to land in a non-default SQLite path\n- `update` pulls and re-imports only when the manifest changes\n- `status`, `search`, `messages`, `mentions`, `sql`, `users`, `channels`, and `report` auto-refresh stale git snapshots before reading when `auto_update = true`\n- `sync --source bot` and `sync --source all` warm from the git snapshot before hitting Slack when a share remote is configured\n- `status` and `doctor` surface the current git-share repo, last import time, and whether the local snapshot is stale\n\n### `publish`\n\n`publish` is the writer-side command. It exports the current SQLite archive into the git share repo and can commit/push it in one step.\n\n```bash\ngo run ./cmd/slacrawl publish --remote /path/to/private/slacrawl-archive.git --push\ngo run ./cmd/slacrawl publish --repo ~/.slacrawl/share --branch main --message \"archive: daily refresh\" --push\n```\n\nRelevant flags:\n\n- `--repo` chooses the local git working repo path\n- `--remote` sets or overrides the git remote used for publish\n- `--branch` chooses the target branch\n- `--message` sets the git commit message\n- `--no-commit` exports files without creating a git commit\n- `--push` pushes the new commit to `origin`\n- `--no-media` omits cached media files from the snapshot\n\n### `subscribe`\n\n`subscribe` is the reader-side setup command. It clones the git archive, writes a share-reader config, disables live Slack sources for that config, and imports the snapshot into SQLite.\n\n```bash\ngo run ./cmd/slacrawl subscribe --repo ~/.slacrawl/share --db ~/.slacrawl/slacrawl.db /path/to/private/slacrawl-archive.git\ngo run ./cmd/slacrawl subscribe --remote git@github.com:your-org/private-slacrawl-archive.git --stale-after 30m\ngo run ./cmd/slacrawl subscribe --repo ~/.slacrawl/share --no-import --no-auto-update /path/to/private/slacrawl-archive.git\n```\n\nRelevant flags:\n\n- `--repo` chooses the local clone path\n- `--db` chooses the SQLite file used by the reader\n- `--branch` chooses which branch to track\n- `--remote` stores the remote in config without requiring it as a positional arg\n- `--stale-after` controls when read-time refresh considers the local snapshot stale\n- `--no-auto-update` disables read-time refresh for search/status/report-style commands\n- `--no-import` skips the initial snapshot import\n- `--no-media` skips restoring cached media files\n\n### `update`\n\n`update` is the explicit reader-side refresh. Use it when you want to pull and import on demand instead of waiting for automatic stale checks.\n\n```bash\ngo run ./cmd/slacrawl update\ngo run ./cmd/slacrawl update --repo ~/.slacrawl/share --branch main\n```\n\n### `report`\n\n`report` is the fastest human-readable archive summary and is especially handy in git-share mode because it shows the current archive footprint plus share freshness.\n\n```bash\ngo run ./cmd/slacrawl report\n```\n\nTypical publish / subscribe flow:\n\n```bash\n# publisher\ngo run ./cmd/slacrawl sync --source bot --latest-only\ngo run ./cmd/slacrawl publish --remote /path/to/private/slacrawl-archive.git --push\n\n# subscriber\ngo run ./cmd/slacrawl subscribe --repo ~/.slacrawl/share --db ~/.slacrawl/slacrawl.db /path/to/private/slacrawl-archive.git\ngo run ./cmd/slacrawl search incident\n```\n\nThe starter config lives in [`config.example.toml`](./config.example.toml). By default it points to these environment variables:\n\n- `SLACK_BOT_TOKEN`\n- `SLACK_APP_TOKEN`\n- `SLACK_USER_TOKEN`\n\nDesktop discovery is enabled by default and uses:\n\n```text\n~/Library/Containers/com.tinyspeck.slackmacgap/Data/Library/Application Support/Slack\n```\n\nDesktop config notes:\n\n- set `[slack.desktop].enabled = false` to disable desktop ingestion\n- leave `[slack.desktop].path = \"\"` to auto-detect the macOS Slack path\n- set a custom absolute path if Slack Desktop data lives elsewhere\n- set `[slack.bot]`, `[slack.app]`, or `[slack.user]` `enabled = false` to ignore that token source entirely\n\nSeparate visibility profiles should use separate config files:\n\n```toml\n# ~/.slacrawl/company.toml\ndb_path = \"~/.slacrawl/company.db\"\n\n[share]\nremote = \"git@github.com:your-org/company-slacrawl-archive.git\"\nrepo_path = \"~/.slacrawl/company-share\"\n```\n\n```toml\n# ~/.slacrawl/personal.toml\ndb_path = \"~/.slacrawl/personal.db\"\n\n[share]\nremote = \"git@github.com:your-user/personal-slacrawl-archive.git\"\nrepo_path = \"~/.slacrawl/personal-share\"\n```\n\n## Typical Workflow\n\n```bash\ngo run ./cmd/slacrawl init\ngo run ./cmd/slacrawl sync --source bot\ngo run ./cmd/slacrawl status\ngo run ./cmd/slacrawl report\ngo run ./cmd/slacrawl digest --since 7d\ngo run ./cmd/slacrawl channels\ngo run ./cmd/slacrawl messages --channel C12345678 --limit 20\ngo run ./cmd/slacrawl mentions --limit 20\ngo run ./cmd/slacrawl sql 'select channel_id, count(*) as messages from messages group by channel_id order by messages desc limit 10;'\n```\n\n## Notes on Coverage\n\n- Full historical thread reply coverage in public and private channels depends on providing a user token.\n- `tail` requires an app token because it uses Socket Mode.\n- SQLite FTS5 is the built-in full-text index that powers fast local text search without an external search server.\n- Indexed text is sanitized before it reaches FTS, so malformed UTF-8, zero-width junk, and odd whitespace do not poison search.\n- Desktop-local support is broader than simple discovery, but still not a full write-back or export-import path.\n\n## Development\n\n```bash\ngo test ./...\ngo build ./cmd/slacrawl\n```\n\nSee [`CONTRIBUTING.md`](./CONTRIBUTING.md) for contribution workflow and [`SPEC.md`](./SPEC.md) for the implementation contract.\n\nDeep-dive docs:\n\n- [`docs/configuration.md`](./docs/configuration.md)\n- [`docs/desktop-mode.md`](./docs/desktop-mode.md)\n\n---\n\nBuilt by \u003ca href=\"https://github.com/vincentkoc\"\u003eVincent Koc\u003c/a\u003e · \u003ca href=\"./LICENSE\"\u003eMIT\u003c/a\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopenclaw%2Fslacrawl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fopenclaw%2Fslacrawl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopenclaw%2Fslacrawl/lists"}