{"id":314697,"name":"Green Goods","description":"Measures, tracks, and rewards the impact on gardens with a simple Progressive Web App.","url":"https://github.com/greenpill-dev-guild/green-goods","last_synced_at":"2026-06-03T08:00:41.548Z","repository":{"id":242139512,"uuid":"793298191","full_name":"greenpill-dev-guild/green-goods","owner":"greenpill-dev-guild","description":"Bringing community and environmental actions onchain to better measure, track and reward impact on local communities with a simple PWA.","archived":false,"fork":true,"pushed_at":"2026-05-15T02:28:14.000Z","size":166071,"stargazers_count":22,"open_issues_count":0,"forks_count":5,"subscribers_count":1,"default_branch":"develop","last_synced_at":"2026-05-15T04:33:38.841Z","etag":null,"topics":["attestations","collaboration","community","environment","ethereum","filecoin","foundry","greenpill","ipfs","knowledge-garden","local-first","p2p","pwa","regen-coordination","solidity","storacha","tailwindcss","typescript","vite"],"latest_commit_sha":null,"homepage":"https://greengoods.app","language":"TypeScript","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"greenpill-dev-guild/camp-green","license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/greenpill-dev-guild.png","metadata":{},"created_at":"2024-04-29T00:11:50.000Z","updated_at":"2026-05-13T15:53:30.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/greenpill-dev-guild/green-goods","commit_stats":null,"previous_names":["greenpill-dev-guild/green-goods"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/greenpill-dev-guild/green-goods","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/greenpill-dev-guild%2Fgreen-goods","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/greenpill-dev-guild%2Fgreen-goods/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/greenpill-dev-guild%2Fgreen-goods/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/greenpill-dev-guild%2Fgreen-goods/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/greenpill-dev-guild","download_url":"https://codeload.github.com/greenpill-dev-guild/green-goods/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/greenpill-dev-guild%2Fgreen-goods/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33160167,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-17T22:39:12.733Z","status":"ssl_error","status_checked_at":"2026-05-17T22:39:10.741Z","response_time":107,"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"}},"owner":{"login":"greenpill-dev-guild","name":"Greenpill Dev Guild","uuid":"148837355","kind":"organization","description":"We're a collective of regen developers building tools for Greenpill chapters and regen communities.","email":null,"website":null,"location":null,"twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/148837355?v=4","repositories_count":2,"last_synced_at":"2024-03-15T01:28:40.225Z","metadata":{"has_sponsors_listing":false,"funding":{"github":["greenpill-dev-guild"],"custom":[{"url":"https://explorer.gitcoin.co/#/projects/0x4f354435756ee1c1ea18402a559874cd2bb918ad795b7e361e1257425e57a7de","label":"Gitcoin"},{"url":"https://giveth.io/project/greenpill-dev-guild","label":"Giveth"}]}},"html_url":"https://github.com/greenpill-dev-guild","funding_links":["https://github.com/sponsors/greenpill-dev-guild",{"url":"https://explorer.gitcoin.co/#/projects/0x4f354435756ee1c1ea18402a559874cd2bb918ad795b7e361e1257425e57a7de","label":"Gitcoin"},{"url":"https://giveth.io/project/greenpill-dev-guild","label":"Giveth"}],"total_stars":2,"followers":null,"following":null,"created_at":"2023-12-12T20:11:27.023Z","updated_at":"2024-03-15T01:28:40.260Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/greenpill-dev-guild","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/greenpill-dev-guild/repositories"},"packages":[{"id":14389630,"name":"github.com/greenpill-dev-guild/green-goods","ecosystem":"go","description":null,"homepage":null,"licenses":null,"normalized_licenses":[],"repository_url":"https://github.com/greenpill-dev-guild/green-goods","keywords_array":[],"namespace":null,"versions_count":1,"first_release_published_at":"2026-05-05T19:36:26.000Z","latest_release_published_at":"2026-05-05T19:36:26.000Z","latest_release_number":"v1.1.0","last_synced_at":"2026-06-01T07:43:52.459Z","created_at":"2026-05-06T12:38:04.557Z","updated_at":"2026-06-01T07:43:52.459Z","registry_url":"https://pkg.go.dev/github.com/greenpill-dev-guild/green-goods","install_command":"go get github.com/greenpill-dev-guild/green-goods","documentation_url":"https://pkg.go.dev/github.com/greenpill-dev-guild/green-goods#section-documentation","metadata":{},"repo_metadata":{},"repo_metadata_updated_at":"2026-05-06T15:26:43.860Z","dependent_packages_count":0,"downloads":null,"downloads_period":null,"dependent_repos_count":0,"rankings":{"downloads":null,"dependent_repos_count":5.10009395951028,"dependent_packages_count":4.778736471275303,"stargazers_count":null,"forks_count":null,"docker_downloads_count":null,"average":4.939415215392792},"purl":"pkg:golang/github.com/greenpill-dev-guild/green-goods","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/go/github.com/greenpill-dev-guild/green-goods","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/go/github.com/greenpill-dev-guild/green-goods","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/go/github.com/greenpill-dev-guild/green-goods/dependencies","status":null,"funding_links":[],"critical":null,"issue_metadata":null,"versions_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Fgreenpill-dev-guild%2Fgreen-goods/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Fgreenpill-dev-guild%2Fgreen-goods/version_numbers","latest_version_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Fgreenpill-dev-guild%2Fgreen-goods/latest_version","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Fgreenpill-dev-guild%2Fgreen-goods/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Fgreenpill-dev-guild%2Fgreen-goods/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Fgreenpill-dev-guild%2Fgreen-goods/codemeta","maintainers":[],"registry":{"name":"proxy.golang.org","url":"https://proxy.golang.org","ecosystem":"go","default":true,"packages_count":2155515,"maintainers_count":0,"namespaces_count":791500,"keywords_count":113139,"github":"golang","metadata":{"funded_packages_count":53899},"icon_url":"https://github.com/golang.png","created_at":"2022-04-04T15:19:22.939Z","updated_at":"2026-06-02T05:03:22.111Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/namespaces"}}],"commits":{"id":1749983,"full_name":"greenpill-dev-guild/green-goods","default_branch":"develop","total_commits":1888,"total_committers":10,"total_bot_commits":22,"total_bot_committers":2,"mean_commits":188.8,"dds":0.04661016949152541,"past_year_total_commits":1741,"past_year_total_committers":8,"past_year_total_bot_commits":21,"past_year_total_bot_committers":2,"past_year_mean_commits":217.625,"past_year_dds":0.030442274554853488,"last_synced_at":"2026-06-01T07:01:54.688Z","last_synced_commit":"a30e8f59bf937e42d1457a12b552b13a65eefbac","created_at":"2024-09-17T12:51:50.460Z","updated_at":"2026-06-01T07:01:28.333Z","committers":[{"name":"Afo","email":"contact@afolabi.info","login":"Oba-One","count":1800},{"name":"0xWildhare","email":"sschell1979@gmail.com","login":"0xWildhare","count":31},{"name":"Tarun Gupta","email":"tarungupta_er@rediffmail.com","login":"Tarun-k-Gupta","count":18},{"name":"copilot-swe-agent[bot]","email":"198982749+Copilot","login":"Copilot","count":16},{"name":"dependabot[bot]","email":"49699333+dependabot[bot]","login":"dependabot[bot]","count":6},{"name":"Cursor Agent","email":"cursoragent@cursor.com","login":"cursoragent","count":6},{"name":"Athus","email":"atsaudio@gmail.com","login":"AtsKotzen","count":5},{"name":"Alexander Mangel","email":"cygnusfear@gmail.com","login":"Cygnusfear","count":3},{"name":"Claude","email":"noreply@anthropic.com","login":null,"count":2},{"name":"mrcn","email":"marcin.uxa@gmail.com","login":"mrcn","count":1}],"past_year_committers":[{"name":"Afo","email":"contact@afolabi.info","login":"Oba-One","count":1688},{"name":"Tarun Gupta","email":"tarungupta_er@rediffmail.com","login":"Tarun-k-Gupta","count":18},{"name":"copilot-swe-agent[bot]","email":"198982749+Copilot","login":"Copilot","count":16},{"name":"Cursor Agent","email":"cursoragent@cursor.com","login":"cursoragent","count":6},{"name":"dependabot[bot]","email":"49699333+dependabot[bot]","login":"dependabot[bot]","count":5},{"name":"Athus","email":"atsaudio@gmail.com","login":"AtsKotzen","count":5},{"name":"Claude","email":"noreply@anthropic.com","login":null,"count":2},{"name":"Alexander Mangel","email":"cygnusfear@gmail.com","login":"Cygnusfear","count":1}],"commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/greenpill-dev-guild%2Fgreen-goods/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-06-03T00:00:11.051Z","repositories_count":6253329,"commits_count":884142722,"contributors_count":35040088,"owners_count":1162444,"icon_url":"https://github.com/github.png","host_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories"}},"issues_stats":{"full_name":"greenpill-dev-guild/green-goods","html_url":"https://github.com/greenpill-dev-guild/green-goods","last_synced_at":"2026-05-31T08:00:51.016Z","status":null,"issues_count":222,"pull_requests_count":146,"avg_time_to_close_issue":7817704.479166667,"avg_time_to_close_pull_request":541373.3301886793,"issues_closed_count":96,"pull_requests_closed_count":106,"pull_request_authors_count":8,"issue_authors_count":8,"avg_comments_per_issue":0.19369369369369369,"avg_comments_per_pull_request":1.6986301369863015,"merged_pull_requests_count":78,"bot_issues_count":0,"bot_pull_requests_count":32,"past_year_issues_count":121,"past_year_pull_requests_count":101,"past_year_avg_time_to_close_issue":2417981.3191489363,"past_year_avg_time_to_close_pull_request":766892.9838709678,"past_year_issues_closed_count":47,"past_year_pull_requests_closed_count":62,"past_year_pull_request_authors_count":7,"past_year_issue_authors_count":6,"past_year_avg_comments_per_issue":0.2892561983471074,"past_year_avg_comments_per_pull_request":1.9603960396039604,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":28,"past_year_merged_pull_requests_count":39,"created_at":"2024-09-17T12:51:51.145Z","updated_at":"2026-05-31T08:00:51.017Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/greenpill-dev-guild%2Fgreen-goods","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/greenpill-dev-guild%2Fgreen-goods/issues","issue_labels_count":{"story":42,"contract":32,"state-logic":31,"task":29,"component":28,"design":23,"enhancement":21,"documentation":18,"api":14,"bug":14,"client":10,"admin":9,"shared":6,"infrastructure":5,"polish":4,"good first issue":3,"javascript":3,"spike":1,"impact-reporting":1,"size: large":1,"status: ready":1,"sprint: active":1,"priority: high":1},"pull_request_labels_count":{"dependencies":31,"javascript":27,"contract":20,"component":18,"api":16,"state-logic":15,"documentation":4,"database":2,"automated/claude":2,"automated/codex":2,"infrastructure":2,"enhancement":1,"admin":1,"codex":1,"hacktoberfest-accepted":1},"issue_author_associations_count":{"MEMBER":156,"NONE":63,"COLLABORATOR":3},"pull_request_author_associations_count":{"MEMBER":90,"NONE":55,"OWNER":1},"issue_authors":{"Oba-One":196,"c-georgen":14,"marcaumdesign":4,"cauetomaz":3,"moose-code":2,"Cygnusfear":1,"NFTthat":1,"kitblake":1},"pull_request_authors":{"Oba-One":101,"dependabot[bot]":31,"Cygnusfear":6,"Tarun-k-Gupta":4,"adigulalkari":1,"saket0392":1,"fly-io[bot]":1,"didaunesp":1},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-06-01T00:00:19.192Z","repositories_count":14741415,"issues_count":33353441,"pull_requests_count":110068718,"authors_count":11287350,"icon_url":"https://github.com/github.png","host_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories","owners_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/owners","authors_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors"},"past_year_issue_labels_count":{"task":29,"enhancement":21,"state-logic":20,"story":18,"component":18,"contract":15,"documentation":15,"bug":14,"client":10,"api":10,"admin":9,"design":8,"shared":6,"polish":4,"infrastructure":3,"javascript":3,"good first issue":2,"spike":1,"sprint: active":1,"size: large":1,"status: ready":1,"priority: high":1,"impact-reporting":1},"past_year_pull_request_labels_count":{"dependencies":27,"javascript":27,"component":3,"api":3,"documentation":2,"state-logic":2,"automated/claude":2,"automated/codex":2,"contract":2,"infrastructure":2,"hacktoberfest-accepted":1,"admin":1,"codex":1,"enhancement":1},"past_year_issue_author_associations_count":{"MEMBER":118,"NONE":3},"past_year_pull_request_author_associations_count":{"MEMBER":60,"NONE":34,"OWNER":1},"past_year_issue_authors":{"Oba-One":114,"cauetomaz":2,"moose-code":2,"c-georgen":1,"kitblake":1,"NFTthat":1},"past_year_pull_request_authors":{"Oba-One":60,"dependabot[bot]":27,"Tarun-k-Gupta":4,"adigulalkari":1,"didaunesp":1,"fly-io[bot]":1,"saket0392":1},"maintainers":[{"login":"Oba-One","count":232,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/Oba-One"},{"login":"c-georgen","count":14,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/c-georgen"},{"login":"cauetomaz","count":2,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/cauetomaz"},{"login":"adigulalkari","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/adigulalkari"},{"login":"NFTthat","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/NFTthat"}],"active_maintainers":[{"login":"Oba-One","count":174,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/Oba-One"},{"login":"cauetomaz","count":2,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/cauetomaz"},{"login":"adigulalkari","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/adigulalkari"},{"login":"c-georgen","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/c-georgen"},{"login":"NFTthat","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/NFTthat"}]},"events":{"total":{"DeleteEvent":66,"PullRequestEvent":144,"ForkEvent":3,"IssuesEvent":486,"WatchEvent":10,"IssueCommentEvent":186,"PushEvent":441,"PullRequestReviewCommentEvent":192,"PullRequestReviewEvent":165,"CreateEvent":108,"CommitCommentEvent":55},"last_year":{"DeleteEvent":55,"PullRequestEvent":114,"ForkEvent":2,"IssuesEvent":464,"WatchEvent":3,"IssueCommentEvent":169,"PushEvent":362,"PullRequestReviewCommentEvent":192,"PullRequestReviewEvent":143,"CreateEvent":96,"CommitCommentEvent":44}},"keywords":["attestations","collaboration","community","environment","ethereum","filecoin","foundry","greenpill","ipfs","knowledge-garden","local-first","p2p","pwa","regen-coordination","solidity","storacha","tailwindcss","typescript","vite"],"dependencies":[],"score":null,"created_at":"2025-04-20T00:10:48.393Z","updated_at":"2026-06-03T08:00:41.550Z","avatar_url":"https://github.com/greenpill-dev-guild.png","language":"TypeScript","category":"Biosphere","sub_category":"Biodiversity Citizen Science","monthly_downloads":0,"total_dependent_repos":0,"total_dependent_packages":0,"readme":"# Green Goods\n\n[![Version](https://img.shields.io/badge/version-1.0.0-blue.svg)](https://github.com/greenpill-dev-guild/green-goods/releases)\n[![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)\n\n**Bringing community and environmental actions onchain to better measure, track and reward impact.**\n\nGreen Goods is an offline-first platform for documenting ecological and social work and proving impact on-chain. Operators approve gardener submissions, and the protocol anchors results in Ethereum attestation infrastructure.\n\n## Getting Started\n\n### Prerequisites\n\nInstall **Node.js 22+** and **Git**. Install **OrbStack or Docker Desktop** if you plan to run the full stack or indexer locally. Node includes `npm`, and `npm run setup` installs Bun automatically if it is missing.\n\n**Optional tools:** Foundry is needed for contract work. `cloudflared` is useful for mobile-device PWA testing. macOS and Linux are supported natively; use WSL2 or a dev container on Windows.\n\n### Clone\n\n[![Clone on GitHub](https://img.shields.io/badge/Clone-on%20GitHub-2da44e?logo=github)](https://github.com/greenpill-dev-guild/green-goods)\n\nUse GitHub's **Code** button to choose the SSH or HTTPS remote that matches your local Git setup. Then run the setup commands from the repo root.\n\n### Agent-Assisted Setup\n\nIf you are using Codex, Claude Code, or another coding agent, start by loading [ONBOARDING.md](./ONBOARDING.md). It gives the agent the repo context, setup flow, environment model, and first-run checks before it starts changing files.\n\n```text\nRead ONBOARDING.md and AGENTS.md, then walk me through first-time setup for this repo.\nStart with prerequisites, run npm run setup, check web readiness, start the browser\nstack, and explain any env blockers before making changes.\n```\n\n### Setup\n\n#### Install dependencies\n\n```bash\nnpm run setup\n```\n\nAfter setup, use `bun` for repo scripts and package operations. `npm run setup` is the only documented npm entrypoint because fresh machines may not have Bun yet.\n\n#### Environment defaults\n\nGreen Goods uses a single root `.env`, materialized from `.env.template` via the [1Password CLI](https://developer.1password.com/docs/cli/) (`op inject`). Bun, Vite, and Node read it natively — no per-command secret fetch.\n\n```bash\nbun run env:template:init   # one-time: scaffold .env.template from .env.schema\nbun run env:sync             # materialize .env from .env.template (runs `op inject`)\nbun run env:check            # validate .env satisfies .env.schema\n```\n\n`.env.schema` defines the contract; `.env.template` is the team-shared file with `op://Vault/Item/field` refs for shared secrets and plain values for non-secrets. Keep personal local-only credentials directly in `.env`.\n\n| Variable | Needed for | Default setup state |\n| --- | --- | --- |\n| `APP_ENV` | Local tooling mode | Generated as `development` |\n| `VITE_CHAIN_ID` | Client/admin chain selection | Generated for Sepolia |\n| `VITE_DEV_CHAIN_MODE` | Optional local fork marker | Set by the repo-native dev stack for Green Goods fork mode |\n| `VITE_LOCAL_FORK_RPC_URL` | Optional local fork RPC | Set by the repo-native dev stack to `http://127.0.0.1:3009` |\n| `VITE_ENVIO_INDEXER_URL` | Local indexer reads | Generated for local GraphQL; needs the indexer running for live local data |\n| `VITE_PINATA_JWT` | Upload-capable media | Add only when testing uploads |\n| `VITE_PIMLICO_API_KEY` | Passkey auth | Add only when testing passkey flows |\n| `VITE_WALLETCONNECT_PROJECT_ID` | Wallet auth | Add only when testing wallet flows |\n| `TELEGRAM_BOT_TOKEN` | Agent service | Add only when running a useful local agent |\n\nFor shared team secrets, edit `.env.template` and set the value to `op://Vault/Item/field`, then run `bun run env:sync`. For personal local credentials, set the variable directly in the root `.env`. Never create package-level `.env` files.\n\n### Check readiness\n\n```bash\nbun run dev:health\n```\n\n`bun run dev:health` runs the repo-native full-stack doctor. Use\n`bun run dev:doctor -- --profile web` when you only need the browser-facing\nreadiness check.\n\n### Start stack\n\n```bash\nbun run dev\n```\n\nStarts the repo-native PM2 full stack and opens the review URLs. The default\nchain target is an Arbitrum One fork on port `3009`, so client/admin reads and\nwallet writes use chain id `42161` while transactions are mined only in local\nAnvil state.\n\nPlain local Anvil is still available for contract-only work, but it is\nexplicit-only:\n\n```bash\ndev stop green-goods:anvil-arbitrum\ndev launch green-goods:anvil\n```\n\nFor fork-mode transaction testing, use a dedicated dev browser profile and a\ndisposable wallet. The Arbitrum fork launcher keeps Anvil startup output quiet\nso fork RPC credentials do not appear in logs; local test-account details are\nwritten to `packages/contracts/.generated/runtime/arbitrum-fork.json` with the\nfork endpoint redacted. Import one of those local-only accounts, configure that\nwallet to use `http://127.0.0.1:3009` on chain `42161`, and never use a real\neveryday wallet profile with Anvil keys. `?mockAuth=operator` is only a UI state\noverride; it does not sign transactions.\n\n### Testing\n\n```bash\nbun run dev:smoke:web\nbun run dev:smoke:full\n```\n\nRun `bun run dev:smoke:web` after the browser stack is starting. Run\n`bun run dev:smoke:full` after `bun run dev` when you need proof that the\nbrowser surfaces, local agent, local indexer/Hasura/Postgres, and Arbitrum fork\nare all responding. The local indexer stack mirrors the configured live\nnetworks into local Docker services, so reliable lag proof requires\n`ENVIO_API_TOKEN`; without it, HyperSync can rate-limit and the full smoke\nshould fail on indexer lag instead of pretending the local mirror is current.\n\n## Tech Stack\n\n### Stack Overview\n\n- Node.js 22+ provides `npm` for first-clone setup.\n- `npm run setup` installs Bun, installs dependencies, and creates the root `.env`.\n- Bun is the workspace runtime after setup.\n- `.env.schema` (key contract) + `.env.template` (1Password refs) materialize `.env` via `bun run env:sync` (`op inject`).\n- The repo-native PM2 stack manages normal single-repo local dev services.\n- The shared dev workbench is for cross-repo orchestration and narrow targets.\n- Docker powers full-stack indexer development.\n- Storybook runs from the shared package.\n- Full-stack work adds Docker-backed indexer services, the agent, tunnel, and workflow-specific env or secrets.\n\n### Core Local URLs\n\nClient and admin can start with generated defaults. Live data, uploads, authenticated onchain flows, and the local agent depend on the matching env and services.\n\n| Surface | URL | Started by |\n| --- | --- | --- |\n| Client PWA + editorial website | \u003chttps://localhost:3001\u003e | `bun run dev`; narrow target: `dev launch green-goods:client` |\n| Admin | \u003chttps://localhost:3002\u003e | `bun run dev`; narrow target: `dev launch green-goods:admin` |\n| Docs | \u003chttp://localhost:3003\u003e | `bun run dev`; narrow target: `dev launch green-goods:docs` |\n| Storybook | \u003chttp://localhost:3004\u003e | `bun run dev`; narrow target: `dev launch green-goods:storybook` |\n| Agent | \u003chttp://localhost:3005/health\u003e | `bun run dev`; narrow target: `dev launch green-goods:agent` |\n| Indexer | \u003chttp://localhost:3006/v1/graphql\u003e | `bun run dev` with Docker running; narrow target: `dev launch green-goods:indexer-graphql` |\n| Arbitrum fork | \u003chttp://127.0.0.1:3009\u003e | started automatically by `bun run dev`; narrow target: `dev launch green-goods:anvil-arbitrum` |\n\n### Dev Commands\n\n#### Start the local stack\n\n```bash\nbun run dev\n```\n\nRuns the repo-native Green Goods PM2 stack. The default stack starts the\nArbitrum fork, then the app surfaces that depend on it. The client opens both\nreview presentations on port `3001`:\n\n- \u003chttps://localhost:3001/?presentation=pwa\u003e\n- \u003chttps://localhost:3001/?presentation=website\u003e\n\nFor cross-repo orchestration or a narrower workbench target, use the global\nworkbench from anywhere:\n\n```bash\ndev launch green-goods:client\ndev launch green-goods:admin\ndev launch green-goods:indexer-graphql\n```\n\n#### Use local Anvil wallets\n\nFork-mode transaction testing uses wallet auth, not mock auth:\n\n1. Start the fork-backed stack with `bun run dev`.\n2. Open a dedicated dev browser profile.\n3. Add a wallet network named `Green Goods Local Arbitrum Fork` with RPC\n   `http://127.0.0.1:3009`, chain id `42161`, and currency symbol `ETH`.\n4. Import one disposable Anvil-funded account from\n   `packages/contracts/.generated/runtime/arbitrum-fork.json`; the fork\n   endpoint is redacted in that generated file.\n5. Connect that wallet in the app and sign normally.\n\nThe fork uses the real Arbitrum deployment artifact, but writes are mined only\nin local Anvil state. Restarting the fork resets local chain state. Passkey and\nsmart-account writes are intentionally blocked in fork mode until local account\nabstraction infrastructure exists. `?mockAuth=operator` is useful for UI state\nreview, but it does not sign transactions and cannot replace the wallet step.\n\n#### Start full local stack\n\nCheck full-stack readiness first:\n\n```bash\nbun run dev:doctor -- --profile full\n```\n\nThen start the full repo-native stack:\n\n```bash\nbun run dev\n```\n\nUse the full stack for Docker/indexer, agent, or local transaction work. Run the\nfull doctor first; some services need workflow-specific env or secrets before\nthey are useful.\n\nAfter the stack is up, run the non-mutating full-local smoke:\n\n```bash\nbun run dev:smoke:full\n```\n\nThis proves both client presentations, admin, docs, Storybook, local agent\nhealth, Anvil chain id `42161`, deployed Arbitrum bytecode on the fork, funded\nAnvil accounts, local Envio/Hasura GraphQL, local indexer service health, and\nthe Postgres TCP listener. The indexer lag check proves the local read model is\nclose enough to live configured chain state for review; set `ENVIO_API_TOKEN` in\nthe root `.env` for reliable HyperSync catch-up. It does not submit\ntransactions.\n\n#### Start production-backed local stack\n\nGreen Goods has three local-development modes. Use the production-backed modes\nonly when you intentionally want local browser surfaces to talk to live\ninfrastructure.\n\n| Mode | Command | Chain target | Indexer | Agent/API | Writes |\n| --- | --- | --- | --- | --- | --- |\n| Fully local default | `bun run dev` | Arbitrum fork on `http://127.0.0.1:3009` with chain id `42161` | Local Docker-backed Envio/Hasura on `3006`-`3008` | Local agent on `3005` | Wallet writes are mined only in local Anvil state |\n| Hosted production-backed | `bun run dev:prod` | Arbitrum One `42161` | Hosted production indexer | `https://agent.greengoods.app` | Wallet-confirmed writes are real Arbitrum transactions |\n| Local live-indexer mirror | `bun run dev:prod:mirror` | Arbitrum One `42161` | Local Docker-backed Envio/Hasura indexing live Arbitrum | `https://agent.greengoods.app` | Wallet-confirmed writes are real Arbitrum transactions |\n\nStart hosted production-backed mode from the repo root:\n\n```bash\nbun run dev:prod\n```\n\n`bun run dev:prod` starts the client, admin, docs, and Storybook locally. It\ndoes not start local Anvil, the local indexer, the local agent, or a public\ntunnel. The stack overlays Arbitrum One (`VITE_CHAIN_ID=42161`), the hosted\nproduction indexer, and `https://agent.greengoods.app`, then runs a read-only\nproduction smoke after the local ports are ready.\n\nLive wallet writes are allowed in production-backed modes. If you connect a\nwallet on Arbitrum One and confirm a transaction, it is a real production\ntransaction and can spend funds. The automatic smoke never submits transactions.\n\nThe production smoke proves:\n\n| Check | What it proves |\n| --- | --- |\n| Local browser ports | Client `3001`, admin `3002`, docs `3003`, and Storybook `3004` respond |\n| RPC chain id | The configured Arbitrum RPC returns `eth_chainId=42161` |\n| Contract bytecode | At least one deployed Arbitrum contract address from `packages/contracts/deployments/42161-latest.json` has bytecode |\n| Production agent health | `https://agent.greengoods.app/health` returns HTTP 200 with `status: \"ok\"` |\n| Indexer GraphQL | Hosted production indexer, or the local mirror in mirror mode, returns Arbitrum chain metadata |\n| Indexer lag | Indexed block is within the smoke threshold of Arbitrum head; override with `--max-indexer-lag-blocks \u003cblocks\u003e` when debugging |\n| Local-service boundary | `dev:prod` skips local indexer services; `dev:prod:mirror` expects local indexer services |\n\nThe production smoke does not prove a full click-through, wallet confirmation,\nor production transaction broadcast. Use this manual live-write checklist when\nyou need that proof:\n\n1. Use a dedicated QA wallet with only the funds you intend to risk.\n2. Select Arbitrum One in the wallet.\n3. Start `bun run dev:prod` or `bun run dev:prod:mirror`.\n4. Navigate to the action you need to validate and stop at wallet confirmation\n   if you only need reachability proof.\n5. Broadcast only when the test intentionally mutates production state.\n6. Record the route, wallet network, expected contract/action, and transaction\n   hash if a broadcast is intentionally submitted.\n\nThe hosted production agent has two health surfaces: `/health` and `/ready`.\nThe local production smoke intentionally uses `/health`. `/ready` is stricter\nand can return 503 while optional AI/voice model readiness is still loading,\neven when the agent, webhook, and routine API are usable.\n\nFor local indexer development against live Arbitrum, use the mirror mode:\n\n```bash\nbun run dev:prod:mirror:health\nbun run dev:prod:mirror\n```\n\nThis starts the same browser surfaces plus the local Docker-backed\nPostgres/Hasura/Envio stack on ports `3006`-`3008`, while still targeting\nArbitrum One rather than the local fork. The mirror smoke checks local GraphQL,\nthe local indexer service, and indexer lag against live Arbitrum head; if it\nfails lag, the mirror is reachable but not caught up enough to trust for\nproduction-data review.\n\n`bun run dev:health` and `bun run dev:prod:mirror:health` warn or fail clearly\nwhen `ENVIO_API_TOKEN` is missing for reliable HyperSync catch-up. Without it,\nthe containers can still become healthy, but the local mirror may stall or\nreceive `429 Too Many Requests` from HyperSync and smoke should fail on indexer\nlag. Set `ENVIO_API_TOKEN` directly in the root `.env`, or set\n`ENVIO_API_TOKEN_OP_REF` in `.env.template` and run `bun run env:sync`.\n\nRun the production checks on demand:\n\n```bash\nbun run dev:prod:health -- --json\nbun run dev:prod:mirror:health -- --json\nbun run dev:prod:smoke\nbun run dev:prod:smoke -- --mode mirror\nbun run dev:prod:smoke -- --max-indexer-lag-blocks 5000\n```\n\nExpected production-backed port boundary:\n\n- `dev:prod`: `3001`-`3004` listening; `3005`-`3009` free.\n- `dev:prod:mirror`: `3001`-`3004` and `3006`-`3008` listening; `3005` and\n  `3009` free.\n\n`bun run dev:web`, `bun run dev:stack`, and `bun run dev:stack:stop` remain\navailable for focused PM2 debugging. Day-to-day agent and developer work should\nuse `bun run dev`.\n\n#### Stop local services\n\n```bash\nbun run dev:stop\n```\n\n## Contributing\n\n### Guides\n\nRead the [Greenpill Dev Guild contributing guide](https://github.com/greenpill-dev-guild/.github/blob/main/CONTRIBUTING.md) and the full [How to Contribute](https://docs.greengoods.app/builders/how-to-contribute) guide before opening a pull request.\n\n### Before Pushing\n\nRun each command from the repo root before pushing.\n\n#### Check formatting\n\n```bash\nbun run format:check\n```\n\n#### Run lint\n\n```bash\nbun run lint\n```\n\n#### Run tests\n\n```bash\nbun run test\n```\n\n#### Build workspace\n\n```bash\nbun run build\n```\n\n### Funded Scoped Work\n\nPaid implementation work is grant-dependent and must be clearly scoped with maintainers before work begins. Green Goods does not run open-ended bounties.\n\n## Resources\n\n### Documentation\n\n- [Developer Getting Started](https://docs.greengoods.app/builders/getting-started) - setup, env bootstrap, local services, and first-run workflow\n- [Architecture](https://docs.greengoods.app/builders/architecture) - system design, boundaries, and diagrams\n- [Builder API Index](https://docs.greengoods.app/builders/packages/api-index) - package APIs, contracts, and shared surfaces\n- [Operations](https://docs.greengoods.app/builders/operations) - build, deploy, environment, and workflow references\n- [How to Contribute](https://docs.greengoods.app/builders/how-to-contribute) - contributor workflow and expectations\n\n### Agent References\n\n- [ONBOARDING.md](./ONBOARDING.md) - paste into Claude Code on day one for a guided setup walkthrough\n- [AGENTS.md](./AGENTS.md) - runtime rules and repo invariants for Codex and other coding agents\n- [CLAUDE.md](./CLAUDE.md) - Claude Code commands, patterns, and working conventions\n\n### Community and Security\n\n- [Code of Conduct](https://github.com/greenpill-dev-guild/.github/blob/main/CODE_OF_CONDUCT.md)\n- [Security Policy](https://github.com/greenpill-dev-guild/.github/blob/main/SECURITY.md)\n- [MIT License](./LICENSE)\n","funding_links":[],"readme_doi_urls":[],"works":{},"citation_counts":{},"total_citations":0,"keywords_from_contributors":["conservation","biodiversity","biodiversity-monitoring","impact","regenerative","smart-contracts"],"project_url":"https://ost.ecosyste.ms/api/v1/projects/314697","html_url":"https://ost.ecosyste.ms/projects/314697"}