{"id":34404913,"url":"https://github.com/ryanwaits/secondlayer","last_synced_at":"2026-06-30T09:31:42.693Z","repository":{"id":295376743,"uuid":"989947385","full_name":"ryanwaits/secondlayer","owner":"ryanwaits","description":"Agent-native indexing layer for Stacks","archived":false,"fork":false,"pushed_at":"2026-06-28T03:35:46.000Z","size":13676,"stargazers_count":5,"open_issues_count":0,"forks_count":3,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-28T05:15:27.588Z","etag":null,"topics":["clarity","react","stacks","typescript"],"latest_commit_sha":null,"homepage":"https://secondlayer.tools","language":"TypeScript","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/ryanwaits.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":"audits/status-toolbar-prototypes.html","citation":null,"codeowners":null,"security":null,"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":"2025-05-25T07:10:51.000Z","updated_at":"2026-06-28T03:35:50.000Z","dependencies_parsed_at":"2025-05-25T08:26:10.579Z","dependency_job_id":"e4d22c8d-62cc-430d-9de4-326a90cdf7e8","html_url":"https://github.com/ryanwaits/secondlayer","commit_stats":null,"previous_names":["ryanwaits/codegen","ryanwaits/secondlayer"],"tags_count":557,"template":false,"template_full_name":null,"purl":"pkg:github/ryanwaits/secondlayer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryanwaits%2Fsecondlayer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryanwaits%2Fsecondlayer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryanwaits%2Fsecondlayer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryanwaits%2Fsecondlayer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ryanwaits","download_url":"https://codeload.github.com/ryanwaits/secondlayer/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryanwaits%2Fsecondlayer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34961543,"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-30T02:00:05.919Z","response_time":92,"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":["clarity","react","stacks","typescript"],"created_at":"2025-12-20T07:00:45.936Z","updated_at":"2026-06-30T09:31:42.686Z","avatar_url":"https://github.com/ryanwaits.png","language":"TypeScript","funding_links":[],"categories":["Clarity Resources"],"sub_categories":["Developer Tools"],"readme":"# Secondlayer\n\n[![Status](https://img.shields.io/badge/status-public-111111)](https://secondlayer.tools/status)\n\nThe hosted indexer for Stacks. Curl decoded chain data keyless in ten seconds\n(**Index**), deploy a one-file TypeScript indexer and get hosted Postgres\ntables behind a public REST API (**Subgraphs**), or consume the raw signed\nevent firehose + parquet dumps to build your own (**Streams**) — no node, no\ninfra. Webhooks and an MCP server included. See [STRATEGY.md](STRATEGY.md).\n\n```bash\ncurl \"https://api.secondlayer.tools/v1/index/events?event_type=ft_transfer\u0026limit=5\"\n```\n\n- **Hosted** — managed platform, free during open beta. Reads are public; a key\n  gates writes.\n- **Self-host** — the whole stack is MIT-licensed. `docker compose up` runs\n  indexer + API + processor on your own hardware.\n\n## Quickstart (hosted)\n\n```bash\nbun add -g @secondlayer/cli\n\nsl login\nsl project create my-app \u0026\u0026 sl project use my-app\n\n# Index a contract into a typed, queryable Postgres table\nsl subgraphs scaffold SP1234ABCD.my-contract -o subgraphs/my-contract.ts\nsl subgraphs deploy subgraphs/my-contract.ts --start-block \u003crecent-block\u003e\nsl subgraphs query my-contract \u003ctable\u003e --sort _block_height --order desc\n\n# Push new rows to a webhook\nsl subscriptions create my-hook --runtime node \\\n  --subgraph my-contract --table \u003ctable\u003e --url https://\u003chost\u003e/webhook\n```\n\nSubscriptions are polymorphic. The above is a **subgraph** subscription (fires on\na subgraph table's rows). A **chain** subscription fires on raw chain events with\nno subgraph — a turnkey webhook on a contract, event, function, or trait — and is\ncreated via the SDK, REST, or MCP with a `triggers` array:\n\n```typescript\nimport { SecondLayer, trigger } from \"@secondlayer/sdk\";\n\nconst sl = new SecondLayer({ apiKey: \"sk-sl_...\" });\nconst { subscription, signingSecret } = await sl.subscriptions.create({\n  name: \"amm-swaps\",\n  url: \"https://my-app.com/webhook\",\n  triggers: [trigger.contractCall({ contractId: \"SP....amm\", functionName: \"swap-*\" })],\n});\n```\n\nFull walkthrough → [QUICKSTART](packages/subgraphs/QUICKSTART.md) ·\ncommands → [CLI reference](packages/cli/README.md).\n\n## Read it from anywhere\n\nReads are public for **public** subgraphs (managed deploys default public; private\nones need the owner's `sk-sl_` key); the SDK defaults to `https://api.secondlayer.tools`.\n\n```typescript\nimport { SecondLayer } from \"@secondlayer/sdk\";\n\nconst sl = new SecondLayer();\nconst { rows, next_cursor, tip } = await sl.subgraphs.rows(\"my-contract\", \"\u003ctable\u003e\", {\n  order: \"desc\",\n  limit: 25,\n});\n```\n\n```bash\ncurl \"https://api.secondlayer.tools/v1/subgraphs/my-contract/\u003ctable\u003e?_limit=25\"\n```\n\nPages are `_id`-keyset: pass `?cursor=\u003cnext_cursor\u003e` to resume, `_order=asc|desc`\nfor direction.\n\n**MCP** — point any MCP client at `bunx -p @secondlayer/mcp secondlayer-mcp`\n(`SECONDLAYER_API_URL=https://api.secondlayer.tools`). Set `SL_API_KEY` to\nenable writes (deploy/manage). See [MCP README](packages/mcp/README.md).\n\n## Packages\n\nTwo TypeScript SDKs, one chooser: **`@secondlayer/sdk`** talks to the platform\n(query subgraphs, manage webhooks/keys); **`@secondlayer/stacks`** is low-level\nchain primitives (Clarity decoding, reads). Most apps only need `sdk`.\n\n| Package | Description |\n|---|---|\n| [`@secondlayer/cli`](packages/cli/README.md) | `sl` binary — auth, projects, subgraph deploy, Clarity code-gen |\n| [`@secondlayer/sdk`](packages/sdk/README.md) | TypeScript SDK — typed subgraph queries, webhooks |\n| [`@secondlayer/mcp`](packages/mcp/README.md) | MCP server — subgraphs + scaffolding for AI agents |\n| [`@secondlayer/stacks`](packages/stacks/README.md) | viem-style Stacks client — public/wallet, BNS, AI-SDK tools |\n| [`@secondlayer/subgraphs`](packages/subgraphs/README.md) | `defineSubgraph()` — declarative schema, triggers + handlers |\n| [`@secondlayer/shared`](packages/shared/README.md) | Shared db, schemas, crypto helpers |\n| [`@secondlayer/api`](packages/api/README.md) | REST API — hosted + self-host modes |\n\n## Self-host\n\n```bash\ngit clone https://github.com/ryanwaits/secondlayer\ncd secondlayer\ncp docker/.env.example docker/.env   # fill in secrets\ndocker compose -f docker/docker-compose.yml up -d\n```\n\n[OSS quickstart](docker/oss/README.md) · operations \u0026 backups in [docker/docs/](docker/docs/).\n\n## Development\n\n```bash\nbun install \u0026\u0026 bun run build \u0026\u0026 bun run test\n```\n\nReleases flow through [Changesets](https://github.com/changesets/changesets):\n`bun run version` to bump, `bun run release` to publish.\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fryanwaits%2Fsecondlayer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fryanwaits%2Fsecondlayer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fryanwaits%2Fsecondlayer/lists"}