Skip to content

jakemgold/github-release-posts-wordpress

Repository files navigation

Auto Release Posts for GitHub — WordPress Plugin

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.

How it works

  1. Monitor — Add any GitHub repository and the plugin checks for new releases daily via WP-Cron.
  2. Generate — When a new release is detected, the AI researches the release and writes a blog post tailored to your audience.
  3. 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.

Screenshots

Repositories tab

Monitor multiple GitHub repos with last post version, status, and one-click post generation.

Repositories tab

Repository autocomplete

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.

Repository autocomplete

Release picker

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.

Release picker

Settings tab

View your AI connector status and configure audience level, custom prompt instructions, and notifications.

Settings tab

Inline editing

Per-repo settings including name, project link, post status, author, categories, tags, and featured image — following the familiar WordPress Quick Edit pattern.

Inline editing

Generated post in the block editor

AI-written content with embedded images, plus the GitHub Release sidebar panel for source attribution and regeneration.

Block editor

Features

  • 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

Monorepo support

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.

Recognized tag shapes

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.

Choosing packages

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.

How monitoring works

  • 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.

Custom tag patterns in code

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.

Requirements

  • WordPress 7.0 or later
  • PHP 8.2 or later
  • At least one AI connector configured under Settings → Connectors (Anthropic, OpenAI, or Google recommended)

Installation

From a release zip

  1. Download the latest release zip from Releases.
  2. In WordPress admin, go to Plugins → Add New → Upload Plugin and upload the zip.
  3. Activate the plugin.
  4. Go to Tools → Release Posts to configure your AI provider and add repositories.

With Composer

Composer-managed WordPress sites (Roots/Bedrock and similar) can install the plugin from Packagist:

composer require github-release-posts/github-release-posts

This 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.

GitHub access

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.

  1. Go to github.com/settings/personal-access-tokens/new.
  2. Token name — something descriptive, e.g. My Site — Auto Release Posts for GitHub.
  3. Expiration — pick a value that fits your security policy.
  4. Resource owner — choose your user account or an organization you belong to.
  5. 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.)
  6. 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.
  7. Click Generate token and copy the github_pat_… value immediately — GitHub won't show it again.
  8. Provide the token to the plugin in one of two ways:
    • Environment variable or constant (recommended) — define GHRP_PAT as an environment variable or as a PHP constant in wp-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.

For developers

Filters

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

Development

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

Contributors

License

GPL-2.0-or-later. See LICENSE.

Trademarks

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.

Like what you see?

Work with the 10up WordPress Practice at Fueled

About

WordPress plugin that monitors GitHub repositories for new releases and uses AI to research each release and write a human-readable blog post about it.

Topics

Resources

Stars

18 stars

Watchers

0 watching

Forks

Packages

 
 
 

Contributors

Languages