{"id":343075,"date":"2026-07-28T14:57:48","date_gmt":"2026-07-28T14:57:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/posts-to-github\/"},"modified":"2026-07-28T14:57:25","modified_gmt":"2026-07-28T14:57:25","slug":"posts-to-github-md","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/posts-to-github-md\/","author":33831,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.5.13","stable_tag":"1.5.13","tested":"7.0.2","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Posts to GitHub","header_author":"Gioxx","header_description":"Export published posts as Markdown files to a GitHub repository.","assets_banners_color":"","last_updated":"2026-07-28 14:57:25","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/gioxx\/wp-posts-to-github","header_author_uri":"https:\/\/gioxx.org","rating":0,"author_block_rating":0,"active_installs":0,"downloads":24,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.5.13":{"tag":"1.5.13","author":"Gioxx","date":"2026-07-28 14:57:25"}},"upgrade_notice":{"1.5.0":"<p>Bulk export now uses one commit for the whole batch by default; uncheck &quot;Bulk export method&quot; in Settings to keep one commit per post.<\/p>"},"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.5.13"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[151,273611,1859,1673,4608],"plugin_category":[59],"plugin_contributors":[230503],"plugin_business_model":[],"class_list":["post-343075","plugin","type-plugin","status-publish","hentry","plugin_tags-backup","plugin_tags-corpus","plugin_tags-export","plugin_tags-github","plugin_tags-markdown","plugin_category-utilities-and-tools","plugin_contributors-gioxx","plugin_committers-gioxx"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/posts-to-github-md.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Posts to GitHub exports your published posts as Markdown files, with YAML front matter, to an existing GitHub repository (public or private). The goal is to build, over time, a text corpus of your writing that's useful for training or guiding a consistent writing style in tools like Claude.<\/p>\n\n<p>Features:\n* Export a single post from its edit screen, with live status and trace log\n* Bulk export from a dedicated Posts screen: filters, pagination, multi-page selection, stoppable progress\n* Single commit and push for the whole bulk export batch by default (opt out for one commit per post), with automatic retry on GitHub rate limits either way\n* Optional automatic export of newly published posts and automatic re-export of updated posts, both in the background via WP-Cron\n* Read-only view of posts that were exported but are no longer published (draft, private, scheduled or trashed)\n* Connection test and automatic branch detection against the configured GitHub repository\n* WP-CLI commands for scripted single or bulk exports\n* English by default, with an included Italian translation\n* Git Updater compatible for seamless updates from GitHub<\/p>\n\n<p>The plugin never creates the repository, never uploads binary images (they stay as absolute links to the source site), and only works on published <code>post<\/code> content.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to GitHub's REST API (<code>api.github.com<\/code>) to write your exported posts to a repository you own and configure. It is a core, opt-in part of the plugin's function: nothing is sent until you set a Personal Access Token and target repository in Settings and trigger an export (manually, in bulk, or via the optional automatic-export setting).<\/p>\n\n<p>On each export, the plugin sends the post title, content converted to Markdown, and basic metadata (date, categories, tags, slug) as the file content of a commit to the repository and branch you configured. It also calls the API to test the connection, detect the default branch, and read\/create the file\/commit needed for the export. No data is sent to any third party other than GitHub, and no data is sent unless you have explicitly configured the plugin.<\/p>\n\n<p>This service is provided by GitHub, Inc.: <a href=\"https:\/\/docs.github.com\/en\/site-policy\/github-terms\/github-terms-of-service\">GitHub Terms of Service<\/a> and <a href=\"https:\/\/docs.github.com\/en\/site-policy\/privacy-policies\/github-privacy-statement\">GitHub Privacy Statement<\/a>.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Copy the whole plugin folder to <code>wp-content\/plugins\/post-to-github-md\/<\/code> (the <code>vendor\/<\/code> folder with dependencies is already included: no need to run Composer).<\/li>\n<li>Activate the plugin through the 'Plugins' menu in WordPress.<\/li>\n<li>Go to <strong>Settings \u2192 Posts to GitHub<\/strong> and configure a GitHub Personal Access Token and target repository.<\/li>\n<li>Export posts individually from the post edit screen, in bulk from <strong>Posts \u2192 Export to GitHub<\/strong>, or automatically on publish via the \"Automatic export\" setting.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20create%20the%20github%20repository%20for%20me%3F\"><h3>Does this create the GitHub repository for me?<\/h3><\/dt>\n<dd><p>No, the target repository must already exist before configuring the plugin.<\/p><\/dd>\n<dt id=\"does%20it%20upload%20images%3F\"><h3>Does it upload images?<\/h3><\/dt>\n<dd><p>No. Images in the post content remain absolute links to your site; nothing binary is uploaded to GitHub.<\/p><\/dd>\n<dt id=\"what%20post%20types%20are%20supported%3F\"><h3>What post types are supported?<\/h3><\/dt>\n<dd><p>Only the <code>post<\/code> post type, with \"published\" status.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.5.13<\/h4>\n\n<ul>\n<li>First release published to the WordPress.org SVN repository.<\/li>\n<li>Fixed the bundled <code>POTOGH_VERSION<\/code> constant, which was out of sync with the plugin header.<\/li>\n<li>Release packaging now strips <code>vendor\/*\/bin<\/code> directories, addressing a WordPress.org review note about non-plugin files in the distributed zip.<\/li>\n<\/ul>\n\n<h4>1.5.12<\/h4>\n\n<ul>\n<li>Aligned the text domain with the plugin slug (<code>posts-to-github-md<\/code>) across all files and the plugin header.<\/li>\n<li>Sanitized the <code>branch<\/code> and <code>base_folder<\/code> settings with <code>sanitize_text_field()<\/code> instead of trimming only.<\/li>\n<li>Removed bundled translation files (<code>.po<\/code>\/<code>.mo<\/code>\/<code>.pot<\/code>); translations are now handled via translate.wordpress.org.<\/li>\n<\/ul>\n\n<h4>1.5.11<\/h4>\n\n<ul>\n<li>The export status text (\"Exported on ...\") in the bulk export table is now a direct link to the file on GitHub, opening in a new tab.<\/li>\n<li>Added the <code>Release Asset: true<\/code> plugin header so Git Updater installs the clean production zip instead of the raw <code>main<\/code> branch zip.<\/li>\n<\/ul>\n\n<h4>1.5.10<\/h4>\n\n<ul>\n<li>Silenced the remaining informational <code>meta_query<\/code> slow-query warnings from the WordPress Plugin Check tool with justified <code>phpcs:ignore<\/code> annotations: the plugin's export-status filters query its own <code>_potogh_exported_at<\/code>\/<code>_potogh_path<\/code> post meta and have no WP_Query alternative.<\/li>\n<\/ul>\n\n<h4>1.5.9<\/h4>\n\n<ul>\n<li>Fixed remaining WordPress Plugin Check findings from a second review pass: nonce-verification and input-sanitization ignore annotations that only covered part of a multi-line statement now cover the whole block.<\/li>\n<\/ul>\n\n<h4>1.5.8<\/h4>\n\n<ul>\n<li>Addressed WordPress Plugin Check findings ahead of directory submission: missing translators comments, unordered placeholders, unescaped pagination output, missing ABSPATH guard, deprecated load_plugin_textdomain() call, and outdated \"Tested up to\" header.<\/li>\n<\/ul>\n\n<h4>1.5.7<\/h4>\n\n<ul>\n<li>Failed exports now record an error message on the post, shown as a warning in the post edit metabox, the bulk export table, and the \"Exported, no longer published\" view, instead of failing silently in the background.<\/li>\n<li>\"Exported, no longer published\" view: added \"Delete from GitHub\" and \"Ignore\" actions per post.<\/li>\n<li>Fixed \"Invalid request. sha wasn't supplied\" error when re-exporting a post whose GitHub file sha wasn't recorded locally: the plugin now looks up the file's current sha on GitHub before writing, instead of only relying on cached post meta.<\/li>\n<\/ul>\n\n<h4>1.5.6<\/h4>\n\n<ul>\n<li>The bulk export screen's \"posts per page\" is now set via the native WordPress Screen Options panel instead of a custom dropdown.<\/li>\n<li>Faster pagination on the bulk export screen: most filter combinations now paginate at the database level instead of loading every matching post into memory.<\/li>\n<\/ul>\n\n<h4>1.5.5<\/h4>\n\n<ul>\n<li>Plugin renamed from \"WordPress Posts to GitHub\" to \"Posts to GitHub\" to comply with the WordPress trademark policy.<\/li>\n<\/ul>\n\n<h4>1.5.4<\/h4>\n\n<ul>\n<li>\"Test connection\" moved next to the Repository field.<\/li>\n<li>The Repository field is now locked (read-only) once a repository is configured; click \"Change repository\" to unlock and edit it.<\/li>\n<\/ul>\n\n<h4>1.5.3<\/h4>\n\n<ul>\n<li>\"Save Changes\" on the Settings page no longer requires re-running \"Test connection\" on every visit; only the first setup or changes to token\/repository\/branch require it.<\/li>\n<\/ul>\n\n<h4>1.5.2<\/h4>\n\n<ul>\n<li>Added a \"Settings\" quick link on the Plugins list screen.<\/li>\n<li>The author's name in the Settings page footer now links to gioxx.org.<\/li>\n<li>Settings page title changed to \"Export posts to GitHub: Settings\" for clarity.<\/li>\n<\/ul>\n\n<h4>1.5.1<\/h4>\n\n<ul>\n<li>Category and tag filters on the bulk export screen now show a live post count per term, computed against the currently active filters.<\/li>\n<li>Bulk export now uses the single-commit batch method only when 2 or more posts are selected; exporting a single post always uses the per-post commit flow, regardless of the \"Bulk export method\" setting.<\/li>\n<li>Bulk export no longer force-reloads the page when done; status icons and stat tiles already update live, and successfully exported posts are automatically deselected.<\/li>\n<li>Fixed a fatal error on the export screen caused by the wrong taxonomy name being used for tag counts.<\/li>\n<\/ul>\n\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>Bulk export now writes the whole selected batch to GitHub in a single commit and push (via the Git Data API) instead of one commit per post, cutting API calls from ~2N to about 5 and largely avoiding rate limits. Opt-out setting included to keep one commit per post.<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>Add optional automatic re-export of updated posts, a read-only view of exported-but-unpublished posts, automatic retry on GitHub rate limits, uninstall data cleanup (with an opt-out setting), and WP-CLI commands.<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>Add optional automatic export of newly published posts, scheduled via WP-Cron so the Publish button is never delayed.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Unify bulk export into its own Posts screen, with filters (status, search, category, tag, month), WP-native pagination, multi-page selection, a stoppable live progress\/log panel, and export status stat tiles.<\/li>\n<li>Add GitHub connection test and automatic branch detection in Settings.<\/li>\n<li>Numerous UX refinements and bug fixes across the settings and export screens (spinners, icon\/status sync, layout, accessibility).<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Add plugin metadata, repository URL parsing, status icons, and full English\/Italian localization.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release: single-post and bulk export to a GitHub repository via the Contents API.<\/li>\n<\/ul>","raw_excerpt":"Export published WordPress posts as Markdown files (with YAML front matter) to a GitHub repository.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/343075","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=343075"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/gioxx"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=343075"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=343075"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=343075"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=343075"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=343075"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=343075"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}