A WordPress plugin that automatically generates blog posts from GitHub releases using AI.
Monitors GitHub repositories for new releases and uses AI to research each release and generate a human-readable blog post about it. Posts can be automatically published or held as drafts for review, with email notifications when new posts are ready.
Built on the AI Client API and Connectors introduced in WordPress 7.0 — configure your AI provider (Anthropic, OpenAI, Google, or any other connector) once under Settings → Connectors, and this plugin uses whatever you've set up. No AI API keys to manage in the plugin itself.
Built by Jake Goldman, founder of 10up, and now a Partner / Advisor at Fueled since the merger with 10up.
- Monitor — Add any GitHub repository and the plugin checks for new releases daily via WP-Cron.
- Generate — When a new release is detected, the AI researches the release and writes a blog post tailored to your audience.
- Publish — Posts are created as drafts for review, or published automatically based on your per-repository settings.
You can also generate a post on demand at any time from the Repositories tab.
Monitor multiple GitHub repos with last post version, status, and one-click post generation.
With a GitHub Personal Access Token configured, the Add Repository field suggests from the repositories your token can access, grouped by owner. You can still type any public owner/repo to track a repository that isn't in the list.
Generating a post manually lets you pick any historical release, not just the latest. If a post already exists for the selected release, an inline warning surfaces — regenerating creates a new revision and preserves the existing post date so the archive stays in chronological order.
View your AI connector status and configure audience level, custom prompt instructions, and notifications.
Per-repo settings including name, project link, post status, author, categories, tags, and featured image — following the familiar WordPress Quick Edit pattern.
AI-written content with embedded images, plus the GitHub Release sidebar panel for source attribution and regeneration.
- Monitor multiple GitHub repositories for new releases
- Monorepo support — repositories releasing multiple packages are monitored per package, with a picker to choose exactly which packages get posts (see Monorepo support)
- AI-powered post generation via WordPress Connectors — works with Anthropic, OpenAI, Google, and any other configured connector
- Significance-aware content — patch, minor, major, and security releases get tailored tone and structure
- Choose the research depth — Standard reviews release notes, linked issues and PRs, metadata, and the README; Deep adds commit messages and file changes since the last release
- SEO-friendly post slugs and excerpts generated automatically by AI
- Configurable publish/draft workflow with per-repository overrides
- Per-repository post defaults (categories, tags, post status, author, featured image)
- Choose your post title format — prefix with project name and version, version only, or no auto-prefix (let the AI write the full title in single-project sites)
- Generate posts on demand for any historical release — pick from a version dropdown when a repo has multiple releases; older releases are automatically backdated to keep the archive in chronological order
- Custom prompt instructions to guide AI writing style, tone, and voice
- Regenerate posts with feedback — refine AI output directly from the block editor sidebar
- Email notifications on draft creation, publication, or both
- Source attribution in the block editor — see which GitHub release generated each post
- Idempotency — the same release never creates duplicate posts
- Optional project link support — enter a URL or WordPress.org slug for download CTAs
- Optional pre-release tracking per repository (off by default)
- Optional AI disclosure note appended to generated posts
Repositories that release multiple packages from one codebase — tags like @headstartwp/core@1.6.1 alongside @headstartwp/next@1.5.1 — are detected automatically and monitored per package, so coordinated sibling releases each get their own post.
| Tag style | Example | Derived package |
|---|---|---|
| npm / changesets (scoped) | @headstartwp/core@1.6.1 |
@headstartwp/core |
| npm / changesets | create-astro@5.2.2 |
create-astro |
name + -v + version |
admin-v2.4.0 |
admin |
| name + version | admin-2.4.0 |
admin |
Plain tags (v3.0.0, 3.0.0) form the repository's default stream. A repository whose releases all describe a single project — even in one of the package shapes above — is treated as single-package, and nothing changes for it.
Detected monorepos show a Packages option in the repository's inline edit: create posts for all packages (the default — no filter, so packages added in the future are included too), or choose a fixed set (stored explicitly, so new packages stay excluded until checked). Selections are stored as comma-separated tag patterns matched with fnmatch() semantics — *, ?, and [0-9] are supported, brace expansion is not, and matching is case-sensitive, as git tags are.
- Each scheduled check inspects one bounded snapshot of the repository's 25 most recent release records.
- Every release belongs to a stream — its package, or the default stream for plain tags — and each stream keeps its own cursor, so sibling releases published between checks are never skipped.
- At most one release per stream is generated per check: a package publishing several versions between checks gets its newest eligible version.
- Releases that already have a post are never re-processed, and the first check after upgrading records current releases without generating a burst of posts.
- Changing Include pre-releases or the package selection is forward-only: monitoring continues under the new settings without generating newly eligible older releases. Generate draft is the deliberate backfill tool.
- Once a repository is observed releasing multiple packages, post titles, URL slugs, and admin labels use readable package naming ("HeadstartWP core 1.6.1 — …"). Single-package repositories keep their raw-tag naming byte-for-byte.
For tagging schemes the plugin does not recognize, or dynamic rules, supply patterns with the ghrp_repo_tag_patterns filter:
add_filter( 'ghrp_repo_tag_patterns', function ( $patterns, $identifier, $repo ) {
if ( 'acme/monorepo' === $identifier ) {
return 'platform/*, sdk-[0-9]*';
}
return $patterns;
}, 10, 3 );Return a comma-separated list of glob patterns, or an empty string for no filtering. The returned value must be deterministic — it participates in the stored eligibility policy, and a value that changed on every run would re-baseline (and therefore never post) on every run. The Packages picker reflects stored selections only; filter-supplied patterns apply at generation time.
- WordPress 7.0 or later
- PHP 8.2 or later
- At least one AI connector configured under Settings → Connectors (Anthropic, OpenAI, or Google recommended)
- Download the latest release zip from Releases.
- In WordPress admin, go to Plugins → Add New → Upload Plugin and upload the zip.
- Activate the plugin.
- Go to Tools → Release Posts to configure your AI provider and add repositories.
Composer-managed WordPress sites (Roots/Bedrock and similar) can install the plugin from Packagist:
composer require github-release-posts/github-release-postsThis assumes your project uses composer/installers and routes WordPress plugins to wp-content/plugins/. If it doesn't, add this to your project's composer.json:
{
"require": {
"composer/installers": "^2.0"
},
"extra": {
"installer-paths": {
"wp-content/plugins/{$name}/": ["type:wordpress-plugin"]
}
}
}Activate the plugin in WordPress admin as usual, then go to Tools → Release Posts.
The plugin uses a GitHub Personal Access Token (PAT) to read release data. A PAT is optional for public repositories — without one, GitHub limits the plugin to 60 API requests per hour. Adding a PAT raises that to 5,000 per hour, replaces the "owner/repo" text field with a dropdown of repositories the token can access, and is required to access private repositories. The Settings page shows a green check once GitHub confirms the token.
Create a fine-grained PAT and add it to WordPress
A fine-grained token can be scoped to a single user or organization and to specific repositories — ideal for a "service account" that monitors a known set of releases.
- Go to github.com/settings/personal-access-tokens/new.
- Token name — something descriptive, e.g.
My Site — Auto Release Posts for GitHub. - Expiration — pick a value that fits your security policy.
- Resource owner — choose your user account or an organization you belong to.
- Repository access — choose Only select repositories and pick the repos you want to monitor. (Or All repositories if you'd rather not maintain the list here.)
- Repository permissions — set all four to Read-only:
- Contents — required for releases and commit comparisons.
- Metadata — required (auto-selected).
- Issues — used during AI prompt enrichment.
- Pull requests — used during AI prompt enrichment.
- Click Generate token and copy the
github_pat_…value immediately — GitHub won't show it again. - Provide the token to the plugin in one of two ways:
- Environment variable or constant (recommended) — define
GHRP_PATas an environment variable or as a PHP constant inwp-config.php. The plugin reads the constant first, then the env var, then the database. When set this way, the value never lives in the WordPress database, and the Settings field becomes read-only. - WordPress admin — go to Tools → Release Posts → Settings, paste the token into the Personal Access Token field, and click Save Settings.
- Environment variable or constant (recommended) — define
The plugin is extensible via filter hooks at every stage of the pipeline:
| Filter | Purpose |
|---|---|
ghrp_default_post_status |
Default status when creating a repo (default: draft) |
ghrp_default_categories |
Default categories for new repos |
ghrp_default_tags |
Default tags for new repos |
ghrp_post_status_options |
Post status dropdown choices |
ghrp_post_status |
Override status per-release before it's applied |
ghrp_post_title |
Override the final post title (after format prefixing) |
ghrp_post_terms |
Override categories/tags per-release |
ghrp_post_featured_image |
Override featured image per-release |
ghrp_ai_disclosure_text |
Customize or suppress the AI disclosure note |
ghrp_max_release_body_length |
Truncation threshold for large release bodies |
ghrp_sideload_allowed_domains |
Domains allowed for image sideloading |
ghrp_check_frequency |
WP-Cron schedule (default: daily) |
ghrp_repo_tag_patterns |
Tag patterns for monorepo package selection (see Monorepo support) |
ghrp_skip_accessible_repo |
Exclude repositories from the add-repo picker (default: archived and dot-prefixed repos) |
ghrp_register_ai_providers |
Register custom AI provider connectors |
ghrp_wp_ai_client_model_preferences |
Ordered list of preferred model IDs for WordPress Connectors |
ghrp_openai_reasoning_effort |
Reasoning effort level for OpenAI models (default: high) |
ghrp_generate_prompt |
Full prompt customization |
ghrp_release_body |
Filter release body before prompt building |
npm start # Dev build with watch
npm run build # Production build
composer install # Install PHP dependencies
composer test # Run PHPUnit tests
vendor/bin/phpcs --standard=phpcs.xml.dist includes/ # WPCS lint- Ben Word (Roots) — GitHub repository picker and external PAT configuration (#2)
- Thorsten Ott (Fueled, formerly 10up) — Engineering review feedback
GPL-2.0-or-later. See LICENSE.
Auto Release Posts for GitHub is an independent project. It is not affiliated with, endorsed by, or sponsored by GitHub, Inc. or the WordPress Foundation. "GitHub" and "WordPress" are used here for descriptive purposes only.






