{"repo":"mrphatom/Anchr","private":false,"description":"Web3 \"Vercel for Solana\" — deploy static frontends to IPFS, resolve via SNS (.sol domains) first, ENS/Unstoppable later. AllianceDAO problem statement response.","default_branch":"main","stars":1,"forks":0,"pushed_at":"2026-08-22T16:38:29Z","languages":{"JavaScript":37925},"files":35,"tree":[".editorconfig",".env.example",".github/ISSUE_TEMPLATE/bug_report.md",".github/ISSUE_TEMPLATE/feature_request.md",".github/PULL_REQUEST_TEMPLATE.md",".github/dependabot.yml",".github/workflows/ci.yml",".github/workflows/deploy.yml",".gitignore",".nvmrc","CHANGELOG.md","CODE_OF_CONDUCT.md","CONTRIBUTING.md","LICENSE","README.md","SECURITY.md","bin/anchr.js","docs/ARCHITECTURE.md","docs/ROADMAP.md","eslint.config.js","example/README.md","lib/build.js","lib/config.js","lib/deploy.js","lib/detect.js","lib/filebase.js","lib/init.js","lib/sns.js","lib/solana-confirm.js","lib/storacha.js","package.json","scripts/README.md","scripts/devnet-test.js","scripts/devnet-updte-test.js","tests/detect.test.js"],"sizes":{".editorconfig":188,".env.example":727,".github/ISSUE_TEMPLATE/bug_report.md":576,".github/ISSUE_TEMPLATE/feature_request.md":528,".github/PULL_REQUEST_TEMPLATE.md":547,".github/dependabot.yml":572,".github/workflows/ci.yml":250,".github/workflows/deploy.yml":1344,".gitignore":82,".nvmrc":3,"CHANGELOG.md":4133,"CODE_OF_CONDUCT.md":1801,"CONTRIBUTING.md":1844,"LICENSE":1075,"README.md":5643,"SECURITY.md":1306,"bin/anchr.js":843,"docs/ARCHITECTURE.md":1861,"docs/ROADMAP.md":1134,"eslint.config.js":601,"example/README.md":634,"lib/build.js":207,"lib/config.js":528,"lib/deploy.js":1959,"lib/detect.js":2324,"lib/filebase.js":3472,"lib/init.js":1183,"lib/sns.js":4911,"lib/solana-confirm.js":1864,"lib/storacha.js":1696,"package.json":878,"scripts/README.md":991,"scripts/devnet-test.js":12159,"scripts/devnet-updte-test.js":4319,"tests/detect.test.js":1859},"readme":"# Anchr CLI (MVP)\n\n[![CI](https://github.com/mrphatom/Anchr/actions/workflows/ci.yml/badge.svg)](https://github.com/mrphatom/Anchr/actions/workflows/ci.yml)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n\nDeploy static frontends to IPFS and resolve them via a Solana Name Service\n(`.sol`) domain — `init` and `deploy`, nothing else, on purpose.\n\n## Project structure\n\n```\nbin/anchr.js       CLI entry point\nlib/               init/deploy orchestration, framework detection,\n                    Storacha upload, SNS record read/write\ntests/             unit tests (Node's built-in test runner)\ndocs/              architecture + roadmap (useful for grant write-ups)\nexample/           how to spin up a test site to deploy against\ndashboard/         status/pitch site for the project, deployed through\n                    Anchr itself — its own package.json, separate from\n                    the CLI's\n.github/           CI, issue/PR templates, dependabot\n```\n\n## Scope (locked for MVP)\n\n- Frameworks: Vite, Next.js (static export only), Create React App\n- Pinning: Storacha (default) or Filebase (fallback) — see \"Alternate\n  pinning provider\" below\n- Domains: SNS (`.sol`) only, **V2 record format** — confirmed working via\n  a real devnet transaction (see `lib/sns.js` and `CHANGELOG.md`); V1 was\n  tried first and abandoned after repeated unexplained signer errors\n- No `logs`, no env-var UI, no multi-provider-at-once pinning — that's all v2+\n\n## One-time setup\n\n**1. Install the Storacha CLI and create a Space** (see project notes for\nthe full from-scratch walkthrough):\n\n```bash\nnpm install -g @storacha/cli\nstoracha login your+anchr@gmail.com\nstoracha space create anchr-project\n```\n\n**2. Generate CI credentials** for this CLI to use non-interactively:\n\n```bash\nstoracha key create --json\n# copy the \"key\" value → ANCHR_STORACHA_KEY\n\nstoracha delegation create <did-from-above> --can 'space/blob/add' --can 'upload/add' --base64\n# copy the output → ANCHR_STORACHA_PROOF\n```\n\n**3. Copy `.env.example` to `.env`** and fill in:\n- `ANCHR_STORACHA_KEY` / `ANCHR_STORACHA_PROOF` (from step 2)\n- `ANCHR_WALLET_SECRET_KEY` — the Solana wallet that owns your `.sol` domain,\n  as a JSON array (paste the contents of a Solana CLI keypair file)\n\n**4. Install dependencies:**\n\n```bash\nnpm install\n```\n\n## Usage\n\n```bash\nanchr init      # detects your framework, writes anchr.json\nanchr deploy    # builds + pins to IPFS; also writes the SNS record if\n                # anchr.json has a \"domain\" set (optional — omit it to\n                # just get a pinned CID + gateway link)\n```\n\n## ⚠️ Before running against a real domain\n\nImportant limitation, confirmed via testing: `lib/sns.js` uses the SDK's\n**top-level** V2 record functions, which have no devnet override at all\n(same gap as `getRecordV2`'s missing cluster option) — attempting to run\nthem against devnet fails with \"program does not exist,\" since they're\nhardcoded to mainnet's program ID. This means **`lib/sns.js` cannot be\ndevnet-tested directly.** The devnet confirmation we do have (see\n`CHANGELOG.md`) used `devnet.bindings` equivalents instead — that proves\nthe underlying Name Service Program's create-then-update *pattern*\nworks, not literally this file's own code path.\n\nPractical result: the create path is proven at the protocol level; the\nupdate-fallback in `writeIpfsRecord` has **no verification path available\nbefore mainnet** — you'll be testing it for real the first time you\nredeploy to a domain that already has a record set. Use `readIpfsRecord()`\nafterward to confirm it landed correctly.\n\n## Relative asset paths (important)\n\nIPFS serves your site from a `/ipfs/<CID>/` subpath, not domain root — so\ndefault absolute asset paths will produce a **blank page**, even though\nthe deploy itself succeeds. Confirmed via a real deploy: Vite needs\n`base: './'` in `vite.config.js` (`anchr init` prints this as a note\nwhen it detects Vite). CRA needs `\"homepage\": \".\"` in `package.json`.\nNext.js l","price_usd":"8000","clone_checkout":"https://api.checkout402.com/c/chk_ukx_DZI8tASKWvs1","rehearse_checkout":"https://api.checkout402.com/c/chk_ukx_DZI8tASKWvs1/test","preview":"/r/mrphatom/Anchr/f/<path> serves file CONTENTS for any path (public repo)","how_to_buy":"pay clone_checkout with x402 (pay402 does it in one call); the goods arrive as payload_base64, a tar.gz of the full repo. Rehearse first at rehearse_checkout: same flow, simulated money.","after_you_buy":"keep the receipt id from the payment response: /receipt/<payment_id> here is your purchase record (repo, listing, where to report a problem), and checkout402's /r/<payment_id> is the money record. Tell your human both URLs."}