{"id":51529452,"url":"https://github.com/bh2smith/recipe-circles","last_synced_at":"2026-07-09T01:01:42.797Z","repository":{"id":367919617,"uuid":"1282803601","full_name":"bh2smith/recipe-circles","owner":"bh2smith","description":null,"archived":false,"fork":false,"pushed_at":"2026-07-05T11:24:37.000Z","size":326,"stargazers_count":0,"open_issues_count":9,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-05T12:07:02.111Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://recipe-circles.vercel.app","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bh2smith.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"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}},"created_at":"2026-06-28T07:59:23.000Z","updated_at":"2026-07-05T10:32:20.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/bh2smith/recipe-circles","commit_stats":null,"previous_names":["bh2smith/recipe-circles"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/bh2smith/recipe-circles","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bh2smith%2Frecipe-circles","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bh2smith%2Frecipe-circles/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bh2smith%2Frecipe-circles/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bh2smith%2Frecipe-circles/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bh2smith","download_url":"https://codeload.github.com/bh2smith/recipe-circles/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bh2smith%2Frecipe-circles/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35282899,"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-07-08T02:00:06.796Z","response_time":61,"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":[],"created_at":"2026-07-09T01:01:41.859Z","updated_at":"2026-07-09T01:01:42.772Z","avatar_url":"https://github.com/bh2smith.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Circles Recipes\n\nA standalone [Circles](https://aboutcircles.com) mini-app: a community cookbook where users sign in\nwith their Circles account, post recipes, comment, and **charge gCRC to unlock** their best dishes.\n\nBuilt for the [circles/garage](https://garage.aboutcircles.com) builder program.\n\n## How it works\n\n- **Auth** — no passwords. Users sign in through the hosted Circles connector iframe\n  (`/crc-signin`), which owns the passkey + Safe. Our page talks to it over `postMessage`. A\n  Sign-In-With-Ethereum challenge is signed with the Safe (ERC-1271) and verified **on-chain** to\n  establish a session cookie.\n- **Recipes \u0026 comments** — stored in Postgres. Recipes belong to their author; anyone signed in can\n  comment.\n- **Paywall** — a recipe can have a price in **gCRC** (the Gnosis group token, a wrapped ERC-20).\n  To unlock, the reader's connector sends `transfer(author, price)`; the server then **verifies the\n  payment on Gnosis Chain** (matching `Transfer(from=payer, to=author, value≥price)`) before\n  revealing the body. The body is never sent to an unauthorized client.\n\n## Stack\n\nNext.js 16 (App Router) · Postgres + Drizzle ORM · viem · shadcn/ui + Tailwind v4 · deploy on Vercel.\n\n## Local development\n\n```bash\nbun install\n\n# 1. Postgres (any instance works). Example with Docker:\ndocker run -d --name circles-pg -e POSTGRES_PASSWORD=postgres \\\n  -e POSTGRES_DB=circles_recipe -p 5433:5432 postgres:17-alpine\n\n# 2. Configure env\ncp .env.example .env.local   # then edit values (see below)\n\n# 3. Migrate + run\nbun run db:migrate\nbun run dev                  # http://localhost:3000\n```\n\n### Environment variables\n\n| Var | Purpose |\n| --- | --- |\n| `DATABASE_URL` | Postgres connection string (Neon in production). |\n| `SESSION_SECRET` | 32+ byte secret signing the session JWT. |\n| `NEXT_PUBLIC_CONNECTOR_HOST` | Circles connector host (default `https://circles.gnosis.io`). |\n| `NEXT_PUBLIC_CIRCLES_RPC_URL` | Circles indexer RPC (profiles, balances). |\n| `GNOSIS_RPC_URL` | Gnosis Chain RPC used server-side to verify payments. |\n| `NEXT_PUBLIC_GCRC_ERC20_ADDRESS` | **Required for paid recipes** — wrapped ERC-20 contract of the gCRC group token. Free recipes work without it. |\n\n\u003e ⚠️ **gCRC address is not yet pinned.** Set `NEXT_PUBLIC_GCRC_ERC20_ADDRESS` to the canonical\n\u003e Gnosis group's wrapped ERC-20 before enabling paid recipes. Until then, the unlock flow is\n\u003e disabled gracefully (free recipes are fully functional).\n\n## Deploy (Vercel)\n\n```bash\nvercel link\n# Provision a database (Vercel Marketplace → Neon Postgres) — sets DATABASE_URL\nvercel env add SESSION_SECRET           # + the NEXT_PUBLIC_* and GNOSIS_RPC_URL vars\nvercel env pull .env.local\nbun run db:migrate                      # against the Neon DATABASE_URL\nvercel deploy --prod\n```\n\nThe app needs only HTTPS and a public URL — the passkey ceremony runs inside the `gnosis.io`\nconnector iframe, so it works on any `*.vercel.app` domain.\n\n## Submitting to circles/garage\n\n1. Builder profile: \u003chttps://garage.aboutcircles.com/signup\u003e\n2. Register the app (name, pitch, live URL, repo): \u003chttps://garage.aboutcircles.com/register\u003e\n\nRegister before the weekly Sunday deadline. You can iterate and resubmit each week.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbh2smith%2Frecipe-circles","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbh2smith%2Frecipe-circles","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbh2smith%2Frecipe-circles/lists"}