Skip to main content

Sync Plugins from GitHub

Import plugins from one or more external GitHub repositories into your organization, and keep them fresh automatically. Point Willow at a repo that contains plugins, and Willow discovers every plugin in it, imports them, and (optionally) re-imports them once a day so your marketplace always reflects the source repository.

This is the inbound counterpart to publishing: GitHub Integration and Managed Marketplace Sync push your plugins to GitHub, whereas source repos pull plugins from GitHub into Willow.

Where to find it

Go to Plugins → Plugins Settings (or click the gear icon on the plugins list page) and open the Sync from GitHub card.

How it works

  1. You register one or more source repositories and pick the authentication mode used to read each one.
  2. On demand — or on a daily schedule — Willow discovers the plugins in each repo and imports them.
  3. Imported plugins are then republished to your organization's marketplace targets (the managed repo and/or your own GitHub Integration), so downstream hosts (Cursor, Claude, GitHub Copilot, Codex) pick them up.

Plugins are discovered via the repository's .claude-plugin/marketplace.json, falling back to scanning the plugins/ folder if no manifest is present. All plugins in the repo are imported together — you don't select individual plugins for a source repo.

Each repo is processed in isolation, so a failure syncing one repo never blocks the others.

Add a source repo

  1. In the Sync from GitHub card, click Add repo.
  2. Choose an Authentication mode (see Authentication modes below).
  3. Enter the repository in owner/repo format (a full https://github.com/owner/repo URL also works).
  4. Click Add repo.

The repo is saved to your source list along with the auth mode you selected. Nothing is imported yet — use Sync (or wait for the daily auto-sync) to import its plugins.

Authentication modes

The authentication mode is chosen per repo when you add it, and it is reused for every later sync (manual and scheduled).

ModeWhen to useNotes
PublicPublic repositoriesNo credentials required. Subject to GitHub's unauthenticated rate limit (~60 requests/hour).
Personal GitHub OAuthPrivate repos you can access with your own accountRequires connecting your GitHub account. Raises the rate limit to ~5,000 requests/hour. Only offered when GitHub OAuth is configured for your deployment.
Organization GitHub AppPrivate repos your org's GitHub App can accessUses your organization's configured GitHub App. Only offered when an org GitHub App is set up.

If neither OAuth nor an org GitHub App is configured, repos are read in Public mode.

Per-repo controls

Each source repo row exposes:

  • Sync — imports all of that repo's plugins right now, ignoring the daily schedule and the once-per-day guard.
  • Remove — removes the repo from your source list (already-imported plugins are left in place).
  • Auto-sync daily — a toggle that opts the repo into the daily auto-sync. When on, all plugins in the repo are re-imported automatically each day.

The row also shows the last result at a glance: Synced <date> on success, or Last sync failed (hover for the error) when the most recent sync errored.

Use Sync all now in the card header to sync every configured repo immediately.

Daily auto-sync

Turn on Auto-sync daily for a repo and Willow re-imports it automatically, so plugins stay in sync with the source repository without manual work.

  • The scheduler attempts the auto-sync twice a day (at 00:00 and 12:00 UTC). Running twice is purely for resilience — a missed or failed morning run is retried in the evening.
  • Each repo still syncs at most once per UTC day. Once a repo has synced successfully today, it is skipped until tomorrow.
  • Unchanged repos are skipped. If the repository's latest commit is the same as the commit recorded at the last sync, the repo is skipped — nothing is re-imported when there is nothing new. (If the current commit can't be determined, the sync runs anyway.)
  • Only repos with the Auto-sync daily toggle enabled are included. The on-demand Sync / Sync all now actions ignore both the toggle and the once-per-day guard.

After a successful auto-sync that imported at least one plugin, Willow republishes the org's marketplace so the changes propagate to your configured GitHub targets.

Recent sync activity

When a plugin source repo is configured, the card shows a Recent sync activity list of the most recent auto-sync and "Sync all" runs. Each entry shows:

  • the repository,
  • the number of plugins imported,
  • a status icon — success, partial (some plugins failed), or error,
  • an error message when the run failed, and
  • the timestamp.

Use Refresh to reload the list. Viewing sync activity requires monitor-read permission; if you don't have it, the activity list is simply hidden.

Troubleshooting

  • No plugins found — the repo must expose plugins via .claude-plugin/marketplace.json or a plugins/ folder. Confirm the structure and the branch you expect Willow to read.
  • Authentication failed / 401 — for Personal GitHub OAuth, reconnect your GitHub account; for Organization GitHub App, confirm the app is installed on the repo. Public mode can't read private repositories.
  • Hitting rate limits — Public mode is limited to ~60 requests/hour. Switch to OAuth or the org GitHub App to raise the limit to ~5,000/hour.
  • Auto-sync didn't run — confirm the Auto-sync daily toggle is on. Remember the repo is skipped if it already synced today or if its latest commit is unchanged. Use Sync to force an immediate import.
  • Partial status — some plugins in the repo failed to import while others succeeded. Check Recent sync activity for the failing plugin names and errors.