{"id":50143042,"url":"https://github.com/uinaf/lincrawl","last_synced_at":"2026-05-24T02:36:49.149Z","repository":{"id":358753932,"uuid":"1242812200","full_name":"uinaf/lincrawl","owner":"uinaf","description":"Local-first Linear work-graph archive CLI","archived":false,"fork":false,"pushed_at":"2026-05-19T00:41:06.000Z","size":161,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-19T00:55:12.343Z","etag":null,"topics":["age-encryption","archive","cli","crawler","crawlkit","linear","sqlite"],"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/uinaf.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":"docs/roadmap.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-05-18T19:26:36.000Z","updated_at":"2026-05-19T00:36:05.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/uinaf/lincrawl","commit_stats":null,"previous_names":["uinaf/lincrawl"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/uinaf/lincrawl","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/uinaf%2Flincrawl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/uinaf%2Flincrawl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/uinaf%2Flincrawl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/uinaf%2Flincrawl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/uinaf","download_url":"https://codeload.github.com/uinaf/lincrawl/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/uinaf%2Flincrawl/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33419556,"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":"online","status_checked_at":"2026-05-24T02:00:06.296Z","response_time":57,"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":["age-encryption","archive","cli","crawler","crawlkit","linear","sqlite"],"created_at":"2026-05-24T02:36:48.195Z","updated_at":"2026-05-24T02:36:49.143Z","avatar_url":"https://github.com/uinaf.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# lincrawl\n\nLocal-first Linear work-graph archive CLI.\n\n`lincrawl` syncs Linear teams, projects, issues, comments, labels, and\nworkflow states into a private local SQLite archive, runs FTS5 search\noffline, exports a canonical JSONL dump, and publishes encrypted\n`*.jsonl.zst.age` snapshots to a tenant-controlled store that\nsubscribers can verify and re-import. Read-only against Linear by\nconstruction.\n\nThis repository is the generic crawler core. Tenant credentials, real\nworkspace identifiers, issue bodies, comments, snapshots, logs, reports,\nscreenshots, and transcript-derived examples do not belong here.\n\n## Install\n\nFrom a checkout:\n\n```bash\ngo run ./cmd/lincrawl version --json\n./scripts/smoke\n```\n\n## Quick start\n\nKeep local state outside tracked paths:\n\n```bash\nexport LINCRAWL_HOME=/tmp/lincrawl-home\ngo run ./cmd/lincrawl doctor --offline --json\n```\n\nOffline path with synthetic fixtures (no `LINEAR_API_KEY` required):\n\n```bash\ngo run ./cmd/lincrawl sync --fixture testdata/synthetic --json\ngo run ./cmd/lincrawl search \"ingest\" --json\ngo run ./cmd/lincrawl show LIN-1 --json\n```\n\nLive path against Linear (reads `LINEAR_API_KEY` from `.env.local` or env):\n\n```bash\ngo run ./cmd/lincrawl sync --entities --json\ngo run ./cmd/lincrawl sync --updated-since 24h --max-issues 200 --json\ngo run ./cmd/lincrawl sync --resume --max-issues 1000 --json\ngo run ./cmd/lincrawl sync --issue LIN-42 --json\n```\n\n## Commands\n\nJSON by default everywhere. Errors are JSON envelopes on stderr.\n\n| Command | Purpose |\n|---|---|\n| `doctor --offline` | Report resolved paths and redacted credential presence |\n| `describe` | Machine-readable schema for every command (args, flags, exit codes, field masks, mutually-exclusive groups) |\n| `status` | Local archive row counts |\n| `sync` | Ingest from `--fixture`, `--stdin`, `--entities`, `--updated-since`, `--resume`, or `--issue`; supports `--dry-run`, `--ndjson`, `--max-issues`, `--page-size` |\n| `search \u003cquery\u003e` | FTS5 search; supports `--fields`, `--limit`, `--raw`, `--ndjson` |\n| `show \u003cid-or-identifier\u003e` | Resolve one issue by UUID or `TEAM-N`; supports `--fields` |\n| `query --graphql … --vars …` | Pass-through to the Linear GraphQL API for raw queries |\n| `export --out \u003cpath\u003e` | Canonical NDJSON dump of the local archive; `--out` is sandboxed to CWD |\n| `archive --fixture … --recipient … --out …` | Encrypt a fixture directory as an `*.jsonl.zst.age` snapshot |\n| `publish --recipient … --out …` | Encrypt the entire local archive as a publishable snapshot |\n| `import --in … --identity …` | Decrypt + ingest a `*.jsonl.zst.age` snapshot into the local archive |\n| `store verify \u003cpath\u003e` | Verify a tenant store's `manifest.json` + canonical artifact layout |\n| `subscribe \u003cpath\u003e --identity …` | Verify a tenant store, then ingest every listed snapshot |\n| `guard` | Scan the working tree for tenant leaks, plaintext archives, secrets |\n| `version` | Build version, commit, date |\n\nRound-trip via NDJSON:\n\n```bash\nlincrawl export --out ./snapshots/lincrawl.jsonl --json\nLINCRAWL_HOME=$(mktemp -d) lincrawl sync --stdin --json \\\n  \u003c ./snapshots/lincrawl.jsonl\n```\n\n## Configuration\n\n`LINEAR_API_KEY` is the only required key, and only for live calls. Put it\nin a git-ignored `.env.local`. `LINCRAWL_HOME` overrides the XDG data dir.\nSee [`.env.example`](.env.example) for the full set.\n\n## Docs\n\n- [Agent guide](AGENTS.md) — operator/agent contract\n- [Agent skill](skills/lincrawl/SKILL.md) — structured per-workflow guidance\n- [Architecture](docs/architecture.md) — CLI, store, sync shape\n- [Roadmap](docs/roadmap.md) — what's done and what's next\n- [Tenant data boundary](docs/tenant-data-boundary.md) — what stays out\n- [Bootstrap plan](docs/plans/bootstrap-claude-prompt.md) — original prompt\n- [Contributing](CONTRIBUTING.md) — local setup and validation\n- [Security](SECURITY.md) — private vulnerability reporting\n\n## Verification\n\n```bash\n./scripts/verify           # tidy, vet, test, race, smoke, guard, release-check, whitespace\n./scripts/local-live-smoke # opt-in bounded live Linear proof, env-gated\n```\n\nCI runs `verify` on every PR and push. Tagged releases (`v0.0.x`) come\nfrom `main` via semantic-release + GoReleaser; see [Distribution](docs/distribution.md).\n\n## Acknowledgements\n\nBuilt on [`openclaw/crawlkit`](https://github.com/openclaw/crawlkit) for\nthe SQLite open / PRAGMA cocktail / schema-version / read-only / state\nprimitives. The CLI surface, agent-DX shape, structured error envelope,\nand release pipeline mirror conventions from sibling crawlers in the\n[`openclaw`](https://github.com/openclaw) family.\n\n## License\n\nMIT. See [License](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fuinaf%2Flincrawl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fuinaf%2Flincrawl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fuinaf%2Flincrawl/lists"}