{
  "version": 1,
  "updated": "2026-10-17",
  "curated_by": "TOA",
  "_note": "TOA's curated project list, served at /projects.json and read by the TOA skill. Curated by hand: edit this file and redeploy. automation: 'autonomous' (the default) = the agent posts its own claim comment and, after its separate self-review passes, opens the PR ready for review by itself; 'donor-signoff' = only for projects whose own rules require a human to review or write the submission: the agent drafts the claim comment and opens the PR as a draft, and the donor reviews before anything is submitted. Donors can also opt into sign-off for every project with submit: 'ask' in ~/.toa/config.json. claim.rule: 'open' = start right away; 'assign-first' = ask a maintainer to assign the issue to you and wait for the assignment; 'toa-label' = only issues a maintainer labelled `toa`; 'jira-ticket' = work from a ticket in the project's Jira, assigned first. disclosure: commit trailers and PR text the project requires ({agent}, {model}, {user} are filled in). eligible_labels: work only on issues with a target label, never on issues with an avoid label. status: \"proposed\" = picked by TOA from public information, maintainers have not confirmed; \"listed\" = submitted by a maintainer and approved.",
  "defaults": {
    "automation": "autonomous",
    "claim": {
      "rule": "assign-first",
      "note": "Ask a maintainer to assign the upstream issue before starting."
    },
    "eligible_labels": {
      "target": [
        "help wanted",
        "bug"
      ],
      "avoid": [
        "good first issue",
        "good-first-issue",
        "beginner",
        "first-timers-only"
      ]
    },
    "disclosure": {
      "trailers": [
        "Assisted-by: {agent} ({model})"
      ],
      "pr_section": "AI disclosure: prepared autonomously with {agent} ({model}) via TOA on behalf of @{user}, self-reviewed by the agent.",
      "pr_section_signoff": "AI disclosure: prepared with {agent} ({model}) via TOA on behalf of @{user}, self-reviewed by the agent and reviewed by @{user} before submission."
    }
  },
  "projects": [
    {
      "slug": "open-library",
      "name": "Open Library",
      "org": "Internet Archive",
      "repo": "internetarchive/openlibrary",
      "repos": [
        "internetarchive/openlibrary"
      ],
      "url": "https://github.com/internetarchive/openlibrary",
      "cause": "education",
      "causes": [
        "education",
        "open-knowledge"
      ],
      "description": "A free, open catalog and lending library with a page for every book.",
      "language": "Python",
      "stars": 6759,
      "avatar": "https://avatars.githubusercontent.com/u/130493?s=96",
      "license": "AGPL-3.0",
      "automation": "donor-signoff",
      "claim": {
        "rule": "assign-first",
        "note": "Comment on the issue asking to be assigned; maintainers triage weekly."
      },
      "disclosure": {
        "trailers": [
          "Assisted-by: {agent} ({model})"
        ],
        "pr_section": "AI disclosure: drafted with {agent} ({model}) on behalf of @{user}, following docs/ai-coding-guide.md, and checked by a separate AI review pass before submission.",
        "note": "PR text must be in the user's own words; read docs/ai-coding-guide.md first."
      },
      "eligible_labels": {
        "target": [
          "help wanted",
          "bug"
        ],
        "avoid": [
          "good first issue",
          "good-first-issue",
          "beginner",
          "first-timers-only"
        ]
      },
      "ai_policy": "Publishes an AI coding guide (AGENTS.md); asks you to understand the code and to be assigned first.",
      "ai_policy_url": "https://github.com/internetarchive/openlibrary/blob/master/docs/ai-coding-guide.md",
      "issues": [],
      "status": "proposed",
      "clef": {
        "checked": "2026-10-17",
        "model": "@cf/cloudflare/clef",
        "causes": {
          "open-knowledge": 0.88,
          "education": 0.66,
          "public-infrastructure": 0.11
        }
      },
      "automation_reason": "Open Library asks contributors to understand the code and write PR text in their own words."
    },
    {
      "slug": "community-health-toolkit",
      "name": "Community Health Toolkit",
      "org": "Medic",
      "repo": "medic/cht-core",
      "repos": [
        "medic/cht-core"
      ],
      "url": "https://github.com/medic/cht-core",
      "cause": "health",
      "causes": [
        "health"
      ],
      "description": "Open source tools for community health workers delivering care in hard-to-reach places.",
      "language": "JavaScript",
      "stars": 558,
      "avatar": "https://avatars.githubusercontent.com/u/474424?s=96",
      "license": "AGPL-3.0",
      "automation": "autonomous",
      "claim": {
        "rule": "open",
        "note": "Use the PR template's AI disclosure section."
      },
      "disclosure": {
        "trailers": [
          "Assisted-by: {agent} ({model})"
        ],
        "pr_section": "AI Disclosure: prepared autonomously with {agent} ({model}) via TOA on behalf of @{user}, self-reviewed by the agent."
      },
      "eligible_labels": {
        "target": [
          "help wanted",
          "bug"
        ],
        "avoid": [
          "good first issue",
          "good-first-issue",
          "beginner",
          "first-timers-only"
        ]
      },
      "ai_policy": "Welcomes AI assistance; disclose it in the PR description.",
      "ai_policy_url": "https://docs.communityhealthtoolkit.org/community/contributing/ai-guidelines/",
      "issues": [],
      "status": "proposed",
      "clef": {
        "checked": "2026-10-17",
        "model": "@cf/cloudflare/clef",
        "causes": {
          "health": 0.94,
          "humanitarian": 0.27,
          "public-infrastructure": 0.1
        }
      }
    },
    {
      "slug": "open-food-facts",
      "name": "Open Food Facts",
      "org": "Open Food Facts",
      "repo": "openfoodfacts/openfoodfacts-server",
      "repos": [
        "openfoodfacts/openfoodfacts-server",
        "openfoodfacts/smooth-app"
      ],
      "url": "https://github.com/openfoodfacts/openfoodfacts-server",
      "cause": "health",
      "causes": [
        "health",
        "open-knowledge"
      ],
      "description": "The open database of food products, ingredients and nutrition, built by its community.",
      "language": "HTML",
      "stars": 1181,
      "avatar": "https://avatars.githubusercontent.com/u/1937790?s=96",
      "license": "AGPL-3.0",
      "automation": "donor-signoff",
      "claim": {
        "rule": "assign-first",
        "note": "Server PRs are accepted only after a maintainer agrees in the issue to assign it."
      },
      "disclosure": {
        "trailers": [
          "Assisted-by: {agent} ({model})"
        ],
        "pr_section": "LLM used: {agent} ({model}), agentic. The code was run successfully on the user's machine (see screenshot/video).",
        "note": "The PR template asks for screenshot or video proof that the code ran."
      },
      "eligible_labels": {
        "target": [
          "help wanted",
          "bug"
        ],
        "avoid": [
          "good first issue",
          "good-first-issue",
          "beginner",
          "first-timers-only"
        ]
      },
      "ai_policy": "LLM use allowed; name the model, confirm you ran it, and show proof. A maintainer must agree to assign the issue.",
      "ai_policy_url": "https://github.com/openfoodfacts/openfoodfacts-server/blob/main/.github/PULL_REQUEST_TEMPLATE.md",
      "issues": [],
      "status": "proposed",
      "clef": {
        "checked": "2026-10-17",
        "model": "@cf/cloudflare/clef",
        "causes": {
          "open-knowledge": 0.71,
          "health": 0.59,
          "climate": 0.26
        }
      },
      "automation_reason": "Open Food Facts asks you to confirm you ran the code yourself and show proof."
    },
    {
      "slug": "axe-core",
      "name": "axe-core",
      "org": "Deque",
      "repo": "dequelabs/axe-core",
      "repos": [
        "dequelabs/axe-core"
      ],
      "url": "https://github.com/dequelabs/axe-core",
      "cause": "accessibility",
      "causes": [
        "accessibility"
      ],
      "description": "The accessibility testing engine inside most web a11y tooling.",
      "language": "HTML",
      "stars": 7657,
      "avatar": "https://avatars.githubusercontent.com/u/4094299?s=96",
      "license": "MPL-2.0",
      "automation": "autonomous",
      "claim": {
        "rule": "open",
        "note": "Follow AGENTS.md (pnpm only, Angular commit messages, zero-exception testing). The user signs Deque's CLA."
      },
      "disclosure": {
        "trailers": [
          "Co-authored-by: {agent} <noreply@toa.dev>"
        ],
        "pr_section": "AI disclosure: prepared autonomously with {agent} ({model}) via TOA on behalf of @{user}, self-reviewed by the agent."
      },
      "eligible_labels": {
        "target": [
          "help wanted",
          "bug"
        ],
        "avoid": [
          "good first issue",
          "good-first-issue",
          "beginner",
          "first-timers-only"
        ]
      },
      "ai_policy": "Agent-aware (AGENTS.md, strict testing rules) but no stated policy on outside AI PRs. CLA required.",
      "ai_policy_url": "https://github.com/dequelabs/axe-core/blob/develop/AGENTS.md",
      "issues": [],
      "status": "proposed",
      "clef": {
        "checked": "2026-10-17",
        "model": "@cf/cloudflare/clef",
        "causes": {
          "accessibility": 0.93,
          "public-infrastructure": 0.39,
          "privacy-security": 0.06
        }
      }
    },
    {
      "slug": "apache-fineract",
      "name": "Apache Fineract",
      "org": "Apache / Mifos",
      "repo": "apache/fineract",
      "repos": [
        "apache/fineract"
      ],
      "url": "https://github.com/apache/fineract",
      "cause": "financial-inclusion",
      "causes": [
        "financial-inclusion"
      ],
      "description": "Core banking for microfinance and institutions serving the unbanked.",
      "language": "Java",
      "stars": 2556,
      "avatar": "https://avatars.githubusercontent.com/u/47359?s=96",
      "license": "Apache-2.0",
      "automation": "donor-signoff",
      "claim": {
        "rule": "jira-ticket",
        "note": "Work from an unassigned FINERACT Jira ticket; assign it first."
      },
      "disclosure": {
        "trailers": [
          "Assisted-By: {agent}-{model}"
        ],
        "pr_section": "I followed the AI Policy: generative tooling ({agent}, {model}) assisted this change; @{user} is accountable for it.",
        "note": "Commits need the Assisted-By trailer; tick the 'I followed the AI Policy' box in the PR template."
      },
      "eligible_labels": {
        "target": [
          "help wanted",
          "bug"
        ],
        "avoid": [
          "good first issue",
          "good-first-issue",
          "beginner",
          "first-timers-only"
        ]
      },
      "ai_policy": "AI may assist but not replace accountability; add an Assisted-By trailer to commits.",
      "ai_policy_url": "https://github.com/apache/fineract/blob/develop/CONTRIBUTING.md#ai-policy",
      "issues": [],
      "status": "proposed",
      "clef": {
        "checked": "2026-10-17",
        "model": "@cf/cloudflare/clef",
        "causes": {
          "financial-inclusion": 0.92,
          "public-infrastructure": 0.15,
          "humanitarian": 0.1
        }
      },
      "automation_reason": "Fineract's AI policy says AI may assist but not replace a human's accountability."
    },
    {
      "slug": "kiwix",
      "name": "Kiwix",
      "org": "Kiwix",
      "repo": "kiwix/kiwix-js",
      "repos": [
        "kiwix/kiwix-js",
        "kiwix/kiwix-android"
      ],
      "url": "https://github.com/kiwix/kiwix-js",
      "cause": "education",
      "causes": [
        "education",
        "open-knowledge"
      ],
      "description": "Wikipedia and other knowledge offline, for places without reliable internet.",
      "language": "JavaScript",
      "stars": 482,
      "avatar": "https://avatars.githubusercontent.com/u/826219?s=96",
      "license": "GPL-3.0",
      "automation": "donor-signoff",
      "claim": {
        "rule": "assign-first",
        "note": "Ask to be assigned on the issue first."
      },
      "disclosure": {
        "trailers": [
          "Assisted-by: {agent} ({model})"
        ],
        "pr_section": "AI disclosure: {agent} ({model}) was used as a pair programmer on behalf of @{user}; the change was tested and reviewed before submission."
      },
      "eligible_labels": {
        "target": [
          "help wanted",
          "bug"
        ],
        "avoid": [
          "good first issue",
          "good-first-issue",
          "beginner",
          "first-timers-only"
        ]
      },
      "ai_policy": "LLM pair-programming is fine if you understand, defend and test every line. Ask to be assigned first.",
      "ai_policy_url": "https://github.com/kiwix/kiwix-js/blob/main/CONTRIBUTING.md#using-ai-assistants",
      "issues": [],
      "status": "proposed",
      "clef": {
        "checked": "2026-10-17",
        "model": "@cf/cloudflare/clef",
        "causes": {
          "education": 0.74,
          "open-knowledge": 0.63,
          "humanitarian": 0.22
        }
      },
      "automation_reason": "Kiwix asks you to understand, defend and test every line."
    },
    {
      "slug": "openmrs-o3",
      "name": "OpenMRS O3",
      "org": "OpenMRS",
      "repo": "openmrs/openmrs-esm-patient-chart",
      "repos": [
        "openmrs/openmrs-esm-patient-chart"
      ],
      "url": "https://github.com/openmrs/openmrs-esm-patient-chart",
      "cause": "health",
      "causes": [
        "health"
      ],
      "description": "Electronic medical records for clinics in low-resource settings.",
      "language": "TypeScript",
      "stars": 93,
      "avatar": "https://avatars.githubusercontent.com/u/860776?s=96",
      "license": "NOASSERTION",
      "automation": "donor-signoff",
      "claim": {
        "rule": "jira-ticket",
        "note": "Work from an unassigned O3 Jira ticket; assign it first."
      },
      "disclosure": {
        "trailers": [
          "Assisted-by: {agent} ({model})"
        ],
        "pr_section": "AI disclosure: generated with {agent} ({model}) via TOA on behalf of @{user}, self-reviewed by the agent and reviewed by @{user} before submission."
      },
      "eligible_labels": {
        "target": [
          "help wanted",
          "bug"
        ],
        "avoid": [
          "good first issue",
          "good-first-issue",
          "beginner",
          "first-timers-only"
        ]
      },
      "ai_policy": "No formal policy; still being discussed in the community. Review your own AI-generated changes.",
      "ai_policy_url": "https://talk.openmrs.org/t/using-ai-coding-agents-and-llm-generated-code/47562",
      "issues": [],
      "status": "proposed",
      "clef": {
        "checked": "2026-10-17",
        "model": "@cf/cloudflare/clef",
        "causes": {
          "health": 0.94,
          "public-infrastructure": 0.1,
          "humanitarian": 0.1
        }
      },
      "automation_reason": "OpenMRS asks contributors to review their own AI-generated changes."
    },
    {
      "slug": "quartz-solar-forecast",
      "name": "Quartz Solar Forecast",
      "org": "Open Climate Fix",
      "repo": "openclimatefix/open-source-quartz-solar-forecast",
      "repos": [
        "openclimatefix/open-source-quartz-solar-forecast"
      ],
      "url": "https://github.com/openclimatefix/open-source-quartz-solar-forecast",
      "cause": "climate",
      "causes": [
        "climate"
      ],
      "description": "Open solar power forecasting, to help grids use more renewable energy.",
      "language": "Jupyter Notebook",
      "stars": 159,
      "avatar": "https://avatars.githubusercontent.com/u/48357542?s=96",
      "license": "MIT",
      "automation": "donor-signoff",
      "claim": {
        "rule": "assign-first",
        "note": "Comment on the issue to claim it first."
      },
      "disclosure": {
        "trailers": [
          "Assisted-by: {agent} ({model})"
        ],
        "pr_section": "AI disclosure: written with {agent} ({model}) on behalf of @{user}.",
        "note": "PR descriptions should be written primarily by the developer, so the user signs off on the text."
      },
      "eligible_labels": {
        "target": [
          "help wanted",
          "bug"
        ],
        "avoid": [
          "good first issue",
          "good-first-issue",
          "beginner",
          "first-timers-only"
        ]
      },
      "ai_policy": "Any AI tooling allowed; you must understand every line, and PR descriptions should be your own words.",
      "ai_policy_url": "https://github.com/openclimatefix/.github/blob/main/profile/README.md",
      "issues": [],
      "status": "proposed",
      "clef": {
        "checked": "2026-10-17",
        "model": "@cf/cloudflare/clef",
        "causes": {
          "climate": 0.96,
          "science": 0.38,
          "open-knowledge": 0.16
        }
      },
      "automation_reason": "Quartz asks for PR descriptions written by the developer."
    }
  ],
  "excluded": [
    {
      "repo": "pydata/xarray",
      "reason": "AI policy lists 'I pointed an agent at the issue and here are the changes' as not acceptable.",
      "source": "https://docs.xarray.dev/en/stable/contribute/ai-policy.html"
    },
    {
      "repo": "astropy/astropy",
      "reason": "Autonomous agents are not accepted as contributors.",
      "source": "https://github.com/astropy/astropy-project/blob/main/policies/ai-policy.md"
    },
    {
      "repo": "openstreetmap/iD",
      "reason": "Contains an agent honeypot in CONTRIBUTING.md; treat as not opted in.",
      "source": "https://github.com/openstreetmap/iD/blob/develop/CONTRIBUTING.md"
    },
    {
      "repo": "openstreetmap/openstreetmap-website",
      "reason": "Asks contributors not to use AI on new-contributor issues.",
      "source": "https://github.com/openstreetmap/openstreetmap-website/blob/master/CONTRIBUTING.md#ai-assisted-contributions"
    },
    {
      "repo": "hotosm/field-tm",
      "reason": "Its CLA bot exists to keep out automated bot and AI accounts.",
      "source": "docs/seed-candidates.md"
    }
  ]
}