{"id":50138662,"url":"https://github.com/openclaw/graincrawl","last_synced_at":"2026-05-24T00:01:18.067Z","repository":{"id":356025074,"uuid":"1230521569","full_name":"openclaw/graincrawl","owner":"openclaw","description":"Local-first Granola notes archive with SQLite, Markdown export, snapshots, and TUI browsing. 🌾 ","archived":false,"fork":false,"pushed_at":"2026-05-17T10:43:35.000Z","size":1059,"stargazers_count":4,"open_issues_count":4,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-05-17T12:27:53.992Z","etag":null,"topics":[],"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":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"docs/security.md","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-05-06T04:35:51.000Z","updated_at":"2026-05-17T10:04:13.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/openclaw/graincrawl","commit_stats":null,"previous_names":["vincentkoc/graincrawl","openclaw/graincrawl"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/openclaw/graincrawl","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openclaw%2Fgraincrawl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openclaw%2Fgraincrawl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openclaw%2Fgraincrawl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openclaw%2Fgraincrawl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/openclaw","download_url":"https://codeload.github.com/openclaw/graincrawl/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openclaw%2Fgraincrawl/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":[],"created_at":"2026-05-24T00:00:41.370Z","updated_at":"2026-05-24T00:01:18.056Z","avatar_url":"https://github.com/openclaw.png","language":"Go","funding_links":["https://github.com/sponsors/moltbot"],"categories":[],"sub_categories":[],"readme":"\u003cimg src=\"docs/graincrawl_banner.jpg\" alt=\"graincrawl banner\"/\u003e\n\n# 🌾 graincrawl\n\n`graincrawl` archives Granola notes, transcripts, panels, people, workspaces,\nand sync metadata into a private local SQLite store.\n\nIt is local-first, read-only against Granola, and shaped like the other crawl\napps: stable JSON output, Markdown export, crawlkit snapshots, and a terminal\nbrowser over the archived SQLite data.\n\n## Current Scope\n\n- sync notes from Granola's private desktop API session\n- import plaintext `cache-v6.json` as an offline fallback\n- retain transcripts, panels, people, workspaces, and raw source payloads\n- export notes to Markdown\n- browse archived notes with the shared crawlkit TUI\n- create/import portable crawlkit snapshots\n- keep encrypted JSON, OPFS, Keychain, and helper paths behind explicit unlock\n  surfaces\n\n## Install\n\n```bash\nbrew install openclaw/tap/graincrawl\n```\n\nFrom source:\n\n```bash\ngo install github.com/openclaw/graincrawl/cmd/graincrawl@latest\n```\n\n## Quick Start\n\n```bash\ngraincrawl init\ngraincrawl doctor\ngraincrawl sync --source private-api\ngraincrawl status\ngraincrawl notes\ngraincrawl tui\n```\n\nUse JSON for automation:\n\n```bash\ngraincrawl doctor --json\ngraincrawl status --json\ngraincrawl notes --json\ngraincrawl tui --json\n```\n\n## Commands\n\n```bash\ngraincrawl version\ngraincrawl init\ngraincrawl doctor\ngraincrawl check-update\ngraincrawl metadata\ngraincrawl status\ngraincrawl sync --source private-api\ngraincrawl sync --source desktop-cache\ngraincrawl runs\ngraincrawl notes\ngraincrawl search \"decision\"\ngraincrawl --json sql \"select count(*) as notes from notes;\"\ngraincrawl note get \u003cid\u003e\ngraincrawl transcripts get \u003cid\u003e\ngraincrawl panels get \u003cid\u003e\ngraincrawl people\ngraincrawl workspaces\ngraincrawl sources\ngraincrawl unlock\ngraincrawl secrets\ngraincrawl export markdown --out ./granola-notes\ngraincrawl snapshot create --out ./graincrawl-snapshot\ngraincrawl import ./graincrawl-snapshot\ngraincrawl tui\ngraincrawl completion zsh\n```\n\n## Shared crawlkit surfaces\n\n`graincrawl metadata` exposes crawlkit control metadata for scripts and status\ndashboards.\n\n`graincrawl snapshot create` and `graincrawl import` use `crawlkit/snapshot` so\narchives can move between machines without touching the live Granola profile.\n\n`graincrawl tui` uses `crawlkit/tui` over archived notes. The detail pane is\nfed from SQLite, including note text, transcript chunks, panels, and retained\nsource metadata.\n\n## Distribution\n\nReleases use GoReleaser for GitHub release assets and Linux packages, plus a\nsource-built Homebrew formula in `openclaw/tap`.\n\n`graincrawl` checks for new GitHub releases at most once every 24 hours during\ninteractive CLI use and prints a short upgrade hint when a newer version is\navailable. The check is skipped for JSON output, CI, non-terminal stderr, and\ndevelopment builds. Run `graincrawl check-update` to check explicitly, or\ndisable passive checks with `CRAWLKIT_NO_UPDATE_CHECK=1` or\n`GRAINCRAWL_NO_UPDATE_CHECK=1`.\n\nSee [docs/distribution.md](docs/distribution.md).\n\n## Safety Model\n\n`graincrawl` never writes to Granola app data. It reads from Granola's private\nread endpoints or local files and stores its own archive under the configured\ngraincrawl paths.\n\nEncrypted JSON, OPFS, Electron safeStorage, and macOS Keychain paths require\nexplicit unlock flow. Ordinary `doctor`, `status`, `notes`, `export`, and `tui`\ncommands must not surprise-prompt Keychain.\n\nSee [docs/security.md](docs/security.md).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopenclaw%2Fgraincrawl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fopenclaw%2Fgraincrawl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopenclaw%2Fgraincrawl/lists"}