{"id":318055,"date":"2026-06-03T17:14:19","date_gmt":"2026-06-03T17:14:19","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/auto-release-posts-for-github\/"},"modified":"2026-06-03T17:13:50","modified_gmt":"2026-06-03T17:13:50","slug":"auto-release-posts-for-github","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/auto-release-posts-for-github\/","author":1973938,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.2","stable_tag":"1.0.2","tested":"7.0","requires":"7.0","requires_php":"8.2","requires_plugins":null,"header_name":"Auto Release Posts for GitHub","header_author":"Jake Goldman, Fueled (formerly 10up)","header_description":"Automatically generate blog posts from GitHub releases using AI.","assets_banners_color":"59714c","last_updated":"2026-06-03 17:13:50","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/jakemgold\/github-release-posts-wordpress","header_author_uri":"https:\/\/www.linkedin.com\/in\/jacobgoldman\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":32,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.2":{"tag":"1.0.2","author":"jakemgold","date":"2026-06-03 17:13:50"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3560194,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3560194,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3560207,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3560207,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.2"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3559786,"resolution":"1","location":"assets","locale":"","width":2000,"height":923},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3559786,"resolution":"2","location":"assets","locale":"","width":1496,"height":404},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3559786,"resolution":"3","location":"assets","locale":"","width":2000,"height":821},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3559786,"resolution":"4","location":"assets","locale":"","width":1952,"height":1370},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3559786,"resolution":"5","location":"assets","locale":"","width":1200,"height":559},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3559786,"resolution":"6","location":"assets","locale":"","width":1200,"height":798}},"screenshots":{"1":"Repositories tab \u2014 monitor multiple GitHub repos with last post version, status, and one-click post generation.","2":"Repository autocomplete \u2014 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.","3":"Release picker \u2014 generating a post manually lets you pick any historical release. An inline warning surfaces if a post already exists; regenerating creates a new revision and preserves the existing post date.","4":"Settings tab \u2014 view your AI connector status and configure audience level, custom prompt instructions, and notifications.","5":"Inline editing \u2014 per-repo settings including name, project link, post status, author, categories, tags, and featured image, following the familiar WordPress Quick Edit pattern.","6":"Generated post in the block editor \u2014 AI-written content with embedded images, plus the GitHub Release sidebar panel for source attribution and regeneration."}},"plugin_section":[],"plugin_tags":[2353,569,12702,1673,32400],"plugin_category":[],"plugin_contributors":[77761,77760,265682,78260],"plugin_business_model":[],"class_list":["post-318055","plugin","type-plugin","status-publish","hentry","plugin_tags-ai","plugin_tags-automation","plugin_tags-blog-post","plugin_tags-github","plugin_tags-releases","plugin_contributors-10up","plugin_contributors-jakemgold","plugin_contributors-retlehs","plugin_contributors-tott","plugin_committers-jakemgold"],"banners":{"banner":"https:\/\/ps.w.org\/auto-release-posts-for-github\/assets\/banner-772x250.png?rev=3560207","banner_2x":"https:\/\/ps.w.org\/auto-release-posts-for-github\/assets\/banner-1544x500.png?rev=3560207","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/auto-release-posts-for-github\/assets\/icon-128x128.png?rev=3560194","icon_2x":"https:\/\/ps.w.org\/auto-release-posts-for-github\/assets\/icon-256x256.png?rev=3560194","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/auto-release-posts-for-github\/assets\/screenshot-1.png?rev=3559786","caption":"Repositories tab \u2014 monitor multiple GitHub repos with last post version, status, and one-click post generation."},{"src":"https:\/\/ps.w.org\/auto-release-posts-for-github\/assets\/screenshot-2.png?rev=3559786","caption":"Repository autocomplete \u2014 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."},{"src":"https:\/\/ps.w.org\/auto-release-posts-for-github\/assets\/screenshot-3.png?rev=3559786","caption":"Release picker \u2014 generating a post manually lets you pick any historical release. An inline warning surfaces if a post already exists; regenerating creates a new revision and preserves the existing post date."},{"src":"https:\/\/ps.w.org\/auto-release-posts-for-github\/assets\/screenshot-4.png?rev=3559786","caption":"Settings tab \u2014 view your AI connector status and configure audience level, custom prompt instructions, and notifications."},{"src":"https:\/\/ps.w.org\/auto-release-posts-for-github\/assets\/screenshot-5.png?rev=3559786","caption":"Inline editing \u2014 per-repo settings including name, project link, post status, author, categories, tags, and featured image, following the familiar WordPress Quick Edit pattern."},{"src":"https:\/\/ps.w.org\/auto-release-posts-for-github\/assets\/screenshot-6.png?rev=3559786","caption":"Generated post in the block editor \u2014 AI-written content with embedded images, plus the GitHub Release sidebar panel for source attribution and regeneration."}],"raw_content":"<!--section=description-->\n<p>Auto Release Posts for GitHub 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.<\/p>\n\n<p>Built on the AI Client API and Connectors introduced in WordPress 7.0 \u2014 configure your AI provider (Anthropic, OpenAI, Google, or any other connector) once under Settings \u2192 Connectors, and this plugin uses whatever you've set up. No AI API keys to manage in the plugin itself.<\/p>\n\n<p><strong>How it works:<\/strong><\/p>\n\n<ol>\n<li><strong>Monitor<\/strong> \u2014 Add any GitHub repository and the plugin checks for new releases daily via WP-Cron.<\/li>\n<li><strong>Generate<\/strong> \u2014 When a new release is detected, the AI researches the release and writes a blog post tailored to your audience.<\/li>\n<li><strong>Publish<\/strong> \u2014 Posts are created as drafts for review, or published automatically based on your per-repository settings.<\/li>\n<\/ol>\n\n<p>You can also generate a post on demand at any time from the Repositories tab.<\/p>\n\n<p><strong>Features:<\/strong><\/p>\n\n<ul>\n<li>Monitor multiple GitHub repositories for new releases<\/li>\n<li>AI-powered post generation via WordPress Connectors \u2014 works with Anthropic, OpenAI, Google, and any other configured connector<\/li>\n<li>Significance-aware content \u2014 patch, minor, major, and security releases get tailored tone and structure<\/li>\n<li>Choose the research depth \u2014 Standard reviews release notes, linked issues and PRs, metadata, and the README; Deep adds commit messages and file changes since the last release<\/li>\n<li>SEO-friendly post slugs and excerpts generated automatically by AI<\/li>\n<li>Configurable publish\/draft workflow with per-repository overrides<\/li>\n<li>Per-repository post defaults (categories, tags, post status)<\/li>\n<li>Choose your post title format \u2014 prefix with project name and version, version only, or no auto-prefix (let the AI write the full title in single-project sites)<\/li>\n<li>Generate posts on demand for any historical release \u2014 pick from a version dropdown when a repo has multiple releases; older releases are automatically backdated to keep the archive in chronological order<\/li>\n<li>Custom prompt instructions to guide AI writing style, tone, and voice<\/li>\n<li>Regenerate posts with feedback \u2014 refine AI output directly from the block editor sidebar<\/li>\n<li>Email notifications on draft creation, publication, or both<\/li>\n<li>Source attribution in the block editor \u2014 see which GitHub release generated each post<\/li>\n<li>Idempotency \u2014 the same release never creates duplicate posts<\/li>\n<li>Optional project link support \u2014 enter a URL or WordPress.org slug for download CTAs<\/li>\n<li>Optional pre-release tracking per repository \u2014 track stable releases by default, or opt in to include betas, release candidates, and other pre-release versions<\/li>\n<\/ul>\n\n<p><strong>For developers:<\/strong><\/p>\n\n<ul>\n<li>Extensible via filter hooks at every stage of the pipeline<\/li>\n<li>Customize preferred AI models via the <code>ghrp_wp_ai_client_model_preferences<\/code> filter<\/li>\n<li>Override significance classification, prompt content, post terms, and post status per-release<\/li>\n<li>All prompt templates defined in code, versioned with the plugin<\/li>\n<\/ul>\n\n<p><strong>Requirements:<\/strong><\/p>\n\n<ul>\n<li>WordPress 7.0 or later<\/li>\n<li>PHP 8.2 or later<\/li>\n<li>At least one AI connector configured under Settings \u2192 Connectors (Anthropic, OpenAI, or Google recommended)<\/li>\n<\/ul>\n\n<p><em>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.<\/em><\/p>\n\n<h3>External Services<\/h3>\n\n<p>This plugin connects to external services to fetch release data and (via WordPress Connectors) generate post content. Each service is described below.<\/p>\n\n<p><strong>GitHub REST API<\/strong><\/p>\n\n<ul>\n<li>What it is: GitHub's REST API (<code>https:\/\/api.github.com<\/code>) is used to read release data and repository metadata, and \u2014 when a Personal Access Token is configured \u2014 to list repositories the token can access.<\/li>\n<li>What is sent: HTTP requests to <code>api.github.com<\/code> containing the repository owner and name. If a GitHub Personal Access Token is configured (in the Settings tab, or via the <code>GHRP_PAT<\/code> constant or environment variable), the token is sent in the Authorization header.<\/li>\n<li>When it is sent: Daily via WP-Cron (configurable via the <code>ghrp_check_frequency<\/code> filter), and on demand when generating, regenerating, or refreshing posts from the plugin's admin screens.<\/li>\n<li>Terms of Service: <a href=\"https:\/\/docs.github.com\/en\/site-policy\/github-terms\/github-terms-of-service\">https:\/\/docs.github.com\/en\/site-policy\/github-terms\/github-terms-of-service<\/a><\/li>\n<li>Privacy Policy: <a href=\"https:\/\/docs.github.com\/en\/site-policy\/privacy-policies\/github-privacy-statement\">https:\/\/docs.github.com\/en\/site-policy\/privacy-policies\/github-privacy-statement<\/a><\/li>\n<\/ul>\n\n<p><strong>Image sideloading from GitHub-hosted domains<\/strong><\/p>\n\n<ul>\n<li>What it is: When AI-generated post content references images hosted on <code>github.com<\/code>, <code>githubusercontent.com<\/code>, or <code>github.io<\/code>, the plugin downloads those images to the WordPress Media Library so posts render without external image dependencies.<\/li>\n<li>What is sent: HTTP GET requests to the specific image URLs referenced by the AI output. No data beyond a standard HTTP request.<\/li>\n<li>When it is sent: At post creation or regeneration time, for image URLs included in the AI-generated content. The allowed domains and limits are configurable via the <code>ghrp_sideload_allowed_domains<\/code>, <code>ghrp_max_sideload_images<\/code>, <code>ghrp_sideload_time_budget<\/code>, and related filters.<\/li>\n<li>Terms of Service and Privacy Policy: same as GitHub above.<\/li>\n<\/ul>\n\n<p><strong>AI providers (via WordPress Connectors)<\/strong><\/p>\n\n<ul>\n<li>What it is: AI-generated post content is produced by whichever AI connector you have configured under <strong>Settings \u2192 Connectors<\/strong> in WordPress 7.0+. The plugin does not call AI provider APIs directly \u2014 it dispatches prompts through the WordPress AI Client API.<\/li>\n<li>What is sent: The release title, release notes body, repository metadata (owner\/name, language, description), and any custom prompt instructions you have configured are sent to the AI provider selected by your connector. Optional Deep research mode additionally sends recent commit messages and file change summaries between releases.<\/li>\n<li>When it is sent: When a new release is detected by the daily scheduled check, when you click \"Generate post\" or \"Regenerate,\" and when regenerating from the block editor sidebar.<\/li>\n<\/ul>\n\n<p>Privacy and terms for the AI provider depend on which connector is configured. Common providers:<\/p>\n\n<ul>\n<li>Anthropic \u2014 <a href=\"https:\/\/www.anthropic.com\/legal\/consumer-terms\">Terms<\/a> \u2014 <a href=\"https:\/\/www.anthropic.com\/legal\/privacy\">Privacy<\/a><\/li>\n<li>OpenAI \u2014 <a href=\"https:\/\/openai.com\/policies\/terms-of-use\">Terms<\/a> \u2014 <a href=\"https:\/\/openai.com\/policies\/privacy-policy\">Privacy<\/a><\/li>\n<li>Google AI \u2014 <a href=\"https:\/\/policies.google.com\/terms\">Terms<\/a> \u2014 <a href=\"https:\/\/policies.google.com\/privacy\">Privacy<\/a><\/li>\n<\/ul>\n\n<h3>Source Code<\/h3>\n\n<p>The complete, human-readable source code for this plugin is published at:\nhttps:\/\/github.com\/jakemgold\/github-release-posts-wordpress<\/p>\n\n<p><strong>Bundled JavaScript.<\/strong> The minified files under <code>dist\/js\/<\/code> are built from the source files under <code>assets\/js\/<\/code> using the @10up\/scripts toolkit (which wraps Webpack). To rebuild:<\/p>\n\n<pre><code>npm install &amp;&amp; npm run build\n<\/code><\/pre>\n\n<p>Source-to-build mapping:<\/p>\n\n<ul>\n<li><code>dist\/js\/admin.js<\/code> is built from <code>assets\/js\/admin\/index.js<\/code><\/li>\n<li><code>dist\/js\/editor.js<\/code> is built from <code>assets\/js\/editor\/index.js<\/code><\/li>\n<li><code>dist\/css\/admin-style.css<\/code> is built from <code>assets\/css\/admin\/style.css<\/code><\/li>\n<\/ul>\n\n<p>Both source and build outputs ship with the plugin, so the source is available locally as well as in the public repository.<\/p>\n\n<p><strong>Third-party libraries.<\/strong> The plugin has no third-party PHP dependencies. The <code>vendor\/<\/code> directory only contains Composer's own PSR-4 autoloader scaffolding generated from the plugin's own classes \u2014 it does not include any external libraries. The <code>composer.json<\/code> <code>require<\/code> block requires only <code>php: &gt;=8.2<\/code>. PAT encryption uses libsodium, which has been part of PHP core since 7.2.<\/p>\n\n<p><strong>Bundled npm packages used at build time<\/strong> (development only \u2014 not shipped at runtime): <code>@10up\/scripts<\/code> (which itself bundles Webpack, ESLint, Babel, and the build-time-only <code>wp-prettier<\/code> and <code>eslint-plugin-jsdoc<\/code> overrides). All declared in <code>package.json<\/code> and <code>package-lock.json<\/code>. None of these end up in the distributed plugin.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin files to <code>\/wp-content\/plugins\/auto-release-posts-for-github\/<\/code>, or install via the WordPress Plugins screen.<\/li>\n<li>Activate the plugin through the Plugins screen in WordPress.<\/li>\n<li>Go to <strong>Tools \u2192 Release Posts<\/strong> to configure your AI provider and add repositories.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"which%20ai%20providers%20are%20supported%3F\"><h3>Which AI providers are supported?<\/h3><\/dt>\n<dd><p>The plugin uses WordPress Connectors (built into WordPress 7.0+) to communicate with AI providers. Any connector installed on your site will work. We recommend Anthropic (Claude Opus 4.7), OpenAI (GPT-5.5), or Google (Gemini 2.5 Pro) for best results. Configure your connector under Settings \u2192 Connectors.<\/p><\/dd>\n<dt id=\"do%20i%20need%20a%20github%20api%20key%3F\"><h3>Do I need a GitHub API key?<\/h3><\/dt>\n<dd><p>No. The plugin uses the public GitHub API for public repositories. Adding an optional Personal Access Token raises the API rate limit from 60 to 5,000 requests per hour and replaces the \"owner\/repo\" text field on the Repositories tab with a dropdown of repos the token can access.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20private%20repositories%3F\"><h3>Does it work with private repositories?<\/h3><\/dt>\n<dd><p>Yes. Add a GitHub Personal Access Token in the Settings tab. A fine-grained token scoped to the specific repositories you want to monitor is recommended; a classic token with the <code>repo<\/code> scope also works.<\/p><\/dd>\n<dt id=\"how%20often%20does%20the%20plugin%20check%20for%20new%20releases%3F\"><h3>How often does the plugin check for new releases?<\/h3><\/dt>\n<dd><p>By default, the plugin checks daily via WP-Cron. Developers can change this to hourly, twice daily, or weekly using the <code>ghrp_check_frequency<\/code> filter.<\/p><\/dd>\n<dt id=\"can%20i%20customize%20the%20ai-generated%20content%3F\"><h3>Can I customize the AI-generated content?<\/h3><\/dt>\n<dd><p>Yes, in two ways. Site owners can enter custom prompt instructions in the Settings tab to guide the AI's writing style, tone, and voice. Developers can use filter hooks (<code>ghrp_prompt<\/code>, <code>ghrp_prompt_title_guidance<\/code>, <code>ghrp_prompt_content_guidance<\/code>) for full control over the prompt sent to the AI.<\/p><\/dd>\n<dt id=\"can%20i%20edit%20or%20regenerate%20a%20post%20after%20it%27s%20created%3F\"><h3>Can I edit or regenerate a post after it's created?<\/h3><\/dt>\n<dd><p>Yes. Generated posts are standard WordPress posts and can be edited normally in the block editor. A Release Attribution panel in the editor sidebar lets you regenerate the content with optional feedback \u2014 for example, \"make it shorter\" or \"emphasize the security fix.\"<\/p><\/dd>\n<dt id=\"what%20shows%20up%20in%20the%20block%20editor%20for%20generated%20posts%3F\"><h3>What shows up in the block editor for generated posts?<\/h3><\/dt>\n<dd><p>A Release Attribution panel appears in the document sidebar, showing which GitHub release the post was generated from with a link to the release notes. From this panel you can also regenerate the post content with feedback.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.2<\/h4>\n\n<p>Addresses WordPress.org reviewer feedback on prefix consistency.<\/p>\n\n<ul>\n<li>Renamed plugin constants <code>GITHUB_RELEASE_POSTS_VERSION<\/code>, <code>_URL<\/code>, <code>_PATH<\/code>, <code>_INC<\/code> to <code>GHRP_VERSION<\/code>, <code>GHRP_URL<\/code>, <code>GHRP_PATH<\/code>, <code>GHRP_INC<\/code> for prefix consistency.<\/li>\n<li>Renamed the GitHub PAT environment variable \/ PHP constant from <code>GITHUB_RELEASE_POSTS_PAT<\/code> to <code>GHRP_PAT<\/code>. Sites that supplied the token via <code>wp-config.php<\/code> or an environment variable must update the constant\/var name.<\/li>\n<li>Renamed the admin JavaScript global from <code>ctbpAdmin<\/code> \/ <code>ctbpFetch<\/code> to <code>ghrpAdmin<\/code> \/ <code>ghrpFetch<\/code>, completing the v0.9.0 rebrand. Removed remaining <code>[CTBP]<\/code> debug-log prefixes and internal placeholder markers from the v0.9.0 era.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<p>Pre-publication fixes addressing automated and manual review feedback. Since 1.0.0 was withheld during the WordPress.org review process, this is the first version actually shipping to the directory; Composer-installed sites at 1.0.0 should update to pick up the bug fixes below.<\/p>\n\n<p><strong>Bug fixes<\/strong><\/p>\n\n<ul>\n<li>Editor \"Regenerate\" now refreshes the post content in place. Previously, regeneration updated the post on the server but left the editor's local state holding the old content; a subsequent Save could clobber the regenerated content with stale blocks.<\/li>\n<li>Adding a repository no longer leaves it stuck if the browser closes or AI generation fails between the page redirect and the inline generate call. The next scheduled cron run now correctly picks up unfinished first posts.<\/li>\n<li>Manual \"Generate post\" for a release whose previous post was sent to Trash now creates a fresh draft (matching documented intent). Previously the existing trashed post short-circuited the insert and the user received a success response with no new draft.<\/li>\n<li>Trashed generated posts are no longer auto-restored by unrelated workflow events.<\/li>\n<li>The cron worker lock is now atomic at the database level, eliminating a small race window when two cron workers run simultaneously.<\/li>\n<li>The 120-second AI request timeout is now applied correctly. Previously the filter was removed before the underlying HTTP request fired, so long-running generations silently hit the default 30-second timeout.<\/li>\n<li>Post lookup is now deterministically ordered by post ID descending, so the most recently inserted post wins when both a trashed predecessor and an active post exist for the same release.<\/li>\n<\/ul>\n\n<p><strong>Compliance with WordPress.org Plugin Directory guidelines<\/strong><\/p>\n\n<ul>\n<li>Direct-access guards (<code>if ( ! defined( 'ABSPATH' ) ) exit;<\/code>) added to every PHP class file.<\/li>\n<li>Replaced heredoc syntax (disallowed by Plugin Check) with standard double-quoted string concatenation in the AI prompt builder.<\/li>\n<li>The cron-results admin notice is now scoped to the plugin's own settings page (Guideline 11). It no longer appears on every wp-admin screen.<\/li>\n<li>Removed <code>load_plugin_textdomain()<\/code>; WordPress auto-loads translations for plugins hosted on the directory since version 4.6.<\/li>\n<li>New \"Source Code\" section in the readme documents the public GitHub repository, source-to-build mapping for the bundled JavaScript, and the build command (Guideline 4).<\/li>\n<li>Form-handler reads of <code>$_SERVER['REQUEST_METHOD']<\/code> and <code>$_GET['page']<\/code> now apply <code>isset()<\/code>, <code>wp_unslash()<\/code>, and <code>sanitize_key()<\/code> per WordPress coding standards.<\/li>\n<li>Removed stray <code>.DS_Store<\/code> \/ <code>.gitkeep<\/code> files from the distribution zip; included <code>composer.json<\/code> and <code>composer.lock<\/code> so reviewers can verify the (no-third-party-PHP-dependencies) manifest.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li><strong>Plugin renamed to Auto Release Posts for GitHub<\/strong> for WordPress.org compatibility (the prior name began with a trademark, which the Plugin Directory guidelines disallow). The WordPress.org slug and text domain are now <code>auto-release-posts-for-github<\/code>. The Composer package name (<code>github-release-posts\/github-release-posts<\/code>), main plugin file, PHP namespace, hook prefix (<code>ghrp_*<\/code>), and REST namespace (<code>ghrp\/v1<\/code>) are unchanged \u2014 existing Composer-installed sites are unaffected.<\/li>\n<li>New <strong>External Services<\/strong> section in the readme covering the GitHub REST API, image sideloading from GitHub-hosted domains, and AI provider connectors \u2014 meets the WordPress.org disclosure requirement for plugins that contact third-party services.<\/li>\n<li>Smarter display naming on add \u2014 names are pulled from the repo's README first heading when possible (e.g., \"Ads.txt\" instead of \"ads-txt\"), with a cleaned-up slug as fallback.<\/li>\n<li>New per-repo \"Include pre-releases\" option to opt into tracking beta\/RC versions. Off by default.<\/li>\n<li>Adding a repository now redirects immediately; the first post generates in the background instead of blocking the page for 30\u201360 seconds.<\/li>\n<\/ul>\n\n<p><strong>For developers<\/strong><\/p>\n\n<ul>\n<li>Modernized the admin and editor JavaScript: <code>var<\/code> \u2192 <code>let<\/code>\/<code>const<\/code>, template literals, <code>URL.canParse()<\/code> for URL validation, full <code>wp-prettier<\/code> compliance. Build output is byte-stable; runtime behavior is unchanged.<\/li>\n<li>Toolchain: pinned <code>eslint-plugin-jsdoc@^46.10.1<\/code> and <code>prettier@npm:wp-prettier@2.2.1-beta-1<\/code> via <code>package.json<\/code> <code>overrides<\/code> to fix a JSDoc plugin crash on Node 20+ and to honor the codebase's WordPress paren-spacing style.<\/li>\n<li>JS lint and PHPCS now both pass with zero errors and zero warnings.<\/li>\n<li>Pre-release security review and hardening pass \u2014 KSES sanitization on AI\/GitHub-sourced content at all save boundaries (defense-in-depth against prompt-injected HTML in release notes), output escaping for REST response data in admin JS, Unicode bidi-control character stripping in extracted display names, and tighter capability checks on release-attribution post meta REST endpoints.<\/li>\n<li>Engineering pass \u2014 PHPStan analysis now runs clean, dead constants and unused methods removed, several type-annotation gaps closed, cron lock guaranteed-released via try\/finally so a single failing release can no longer block the next scheduled run.<\/li>\n<\/ul>\n\n<h4>0.11.1<\/h4>\n\n<ul>\n<li>Installable via Composer (<code>composer require github-release-posts\/github-release-posts<\/code>) for Composer-managed WordPress sites such as Roots\/Bedrock. Bootstrap now detects when the plugin is loaded through the consumer's Composer autoloader and skips the local vendor\/autoload.php require \u2014 Composer-installed sites no longer see the spurious \"missing Composer dependencies\" admin notice that 0.11.0 surfaced.<\/li>\n<\/ul>\n\n<h4>0.11.0<\/h4>\n\n<p><strong>New<\/strong><\/p>\n\n<ul>\n<li>Repository picker on the Add Repository field. With a GitHub Personal Access Token configured, the field becomes a searchable list of repositories your token can access, grouped by owner. You can still type any public <code>owner\/repo<\/code> to track a repository that isn't in the list.<\/li>\n<li>The Personal Access Token can be supplied via a <code>GHRP_PAT<\/code> PHP constant in <code>wp-config.php<\/code> or an environment variable of the same name, for sites that prefer not to store secrets in the database.<\/li>\n<li>PAT validation indicator on Settings \u2014 a green check or yellow warning confirms whether GitHub accepts the token.<\/li>\n<\/ul>\n\n<p>The repository picker and external PAT configuration are built on initial work contributed by <a href=\"https:\/\/github.com\/retlehs\">Ben Word<\/a>.<\/p>\n\n<p><strong>Improvements<\/strong><\/p>\n\n<ul>\n<li>The editor's \"Regenerate\" button now uses the post's actual release (it was incorrectly always pulling the latest) and respects the title format you set in Settings.<\/li>\n<li>Better support for editorial-workflow plugins like Edit Flow and PublishPress \u2014 their custom post statuses are now recognized for titles, email links, and the repository table.<\/li>\n<li>Releases with many images no longer risk timing out \u2014 image processing has sensible limits and falls back gracefully on partial failures.<\/li>\n<li>Trashing a generated post now stops scheduled checks from recreating it. Clicking \"Generate post\" manually still creates fresh content for trashed releases when you want a new one.<\/li>\n<li>Hardened the admin against potentially malformed data in release tags from tracked repositories.<\/li>\n<li>Sites using a weekly release-check frequency now schedule correctly on plugin activation.<\/li>\n<li>Missing Composer dependencies show a friendly admin notice instead of a fatal error.<\/li>\n<\/ul>\n\n<p><strong>For developers<\/strong><\/p>\n\n<ul>\n<li>PHP namespace renamed from <code>Jakemgold\\GitHubReleasePosts<\/code> to <code>GitHubReleasePosts<\/code>. Composer package renamed from <code>jakemgold\/github-release-posts<\/code> to <code>github-release-posts\/github-release-posts<\/code>.<\/li>\n<li>New filter hooks: <code>ghrp_max_sideload_images<\/code>, <code>ghrp_sideload_time_budget<\/code>, <code>ghrp_sideload_max_consecutive_failures<\/code>, <code>ghrp_sideload_request_timeout<\/code>, <code>ghrp_skip_accessible_repo<\/code>.<\/li>\n<\/ul>\n\n<p>Thanks to <a href=\"https:\/\/github.com\/tott\">Thorsten Ott<\/a> for the code review that prompted many of the improvements and internal refactors in this release.<\/p>\n\n<h4>0.10.0<\/h4>\n\n<ul>\n<li>New: <strong>Post title format<\/strong> setting (Settings \u2192 Post Creation \u2192 Post Titles). Choose between the existing \"{Project name} {version} \u2014 {subtitle}\" prefix, a \"Version X.Y \u2014 {subtitle}\" prefix, or no auto-prefix (the AI writes the full title \u2014 recommended for sites focused on a single project).<\/li>\n<li>New: <strong>Version picker for the \"Generate post\" button.<\/strong> When a repository has multiple GitHub releases, an admin picker lets you generate a post for any historical release \u2014 useful for backfilling an archive. Older releases automatically have their post date set to one hour after the release was published, keeping the archive in chronological order.<\/li>\n<li>New: Inline conflict warning in the version picker when a post already exists for the selected tag \u2014 no surprise modal.<\/li>\n<li>New: Success affordance \u2014 after generating, a green checkmark appears next to the Generate post button, linked to the new post for one-click access.<\/li>\n<li>New: <code>ghrp_post_title<\/code> filter for full programmatic override of generated post titles.<\/li>\n<li>Tweak: Title prompt guidance is now project-neutral and gives the AI explicit direction on varying title openings across an archive (encouraging mid-title or version-led phrasings instead of always leading with project name + version).<\/li>\n<li>Tweak: The Last Post column flash on the Repositories tab no longer fires when generating a post for a non-latest release (since the new post would not actually be the most recent).<\/li>\n<\/ul>\n\n<h4>0.9.2<\/h4>\n\n<ul>\n<li>Fix: Show a warning notice at the top of the plugin admin page (both tabs) when no AI connector is configured or ready. Previously the warning was buried inside the AI Connector status field on the Settings tab and was cached for up to a minute, so it didn't always reflect the current state after toggling connectors.<\/li>\n<\/ul>\n\n<h4>0.9.1<\/h4>\n\n<ul>\n<li>Fix: Plugin now fails gracefully on WordPress versions older than 7.0 instead of fataling. Adds explicit WordPress and PHP version checks before loading the autoloader, and shows an admin notice explaining the requirements.<\/li>\n<\/ul>\n\n<h4>0.9.0<\/h4>\n\n<ul>\n<li>Plugin renamed and rebranded to <strong>GitHub Release Posts<\/strong>.<\/li>\n<li>Folder, slug, text domain, PHP namespace, hooks, options, REST routes, and CSS\/JS prefixes all updated to match the new name.<\/li>\n<li>Plugin slug: <code>github-release-posts<\/code> (folder + text domain + WP.org slug).<\/li>\n<li>PHP namespace: <code>GitHubReleasePosts<\/code>.<\/li>\n<li>Hook\/option\/transient prefix: <code>ghrp_*<\/code> (was <code>ctbp_*<\/code>).<\/li>\n<li>REST namespace: <code>ghrp\/v1<\/code> (was <code>ctbp\/v1<\/code>).<\/li>\n<li>No automatic migration from prior pre-release versions \u2014 uninstall and reinstall on a clean site.<\/li>\n<\/ul>\n\n<h4>0.8.1<\/h4>\n\n<ul>\n<li>New: Deep research depth \u2014 optionally fetches commit messages and file change summaries between releases for richer AI context. Useful when release notes are sparse.<\/li>\n<li>New: Research Depth setting (Standard \/ Deep) in the Post Creation section of Settings.<\/li>\n<li>Tweak: Post Audience changed from a dropdown to radio buttons for clearer scanning.<\/li>\n<li>Tweak: Post Creation section now appears before GitHub on the Settings tab.<\/li>\n<li>Tweak: Cleaner page header copy on Tools \u2192 Release Posts.<\/li>\n<li>Tweak: Updated readme phrasing \u2014 describes researching releases, not just reading notes.<\/li>\n<\/ul>\n\n<h4>0.8.0<\/h4>\n\n<ul>\n<li>Requires WordPress 7.0+ with Connectors API.<\/li>\n<li>AI generation via WordPress Connectors \u2014 supports Anthropic, OpenAI, Google, and any configured connector.<\/li>\n<li>Preferred model list with automatic fallback (Claude Opus 4.7, GPT-5.5, Gemini 2.5 Pro).<\/li>\n<li>Connector status panel replaces manual provider\/API key configuration.<\/li>\n<li>Improved notification emails with contextual subject lines and post titles.<\/li>\n<li>Test notification email feature.<\/li>\n<\/ul>","raw_excerpt":"Automatically generate blog posts from GitHub releases using AI.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/318055","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=318055"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/jakemgold"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=318055"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=318055"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=318055"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=318055"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=318055"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=318055"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}