Title: Ray Bogman AI Sync for Jekyll &amp; GitHub Pages
Author: Ray Bogman
Published: <strong>June 22, 2026</strong>
Last modified: June 22, 2026

---

Search plugins

![](https://s.w.org/plugins/geopattern-icon/raybogman-ai-sync-for-jekyll-github-
pages.svg)

# Ray Bogman AI Sync for Jekyll & GitHub Pages

 By [Ray Bogman](https://profiles.wordpress.org/raybogman/)

[Download](https://downloads.wordpress.org/plugin/raybogman-ai-sync-for-jekyll-github-pages.1.0.6.zip)

 * [Details](https://wordpress.org/plugins/raybogman-ai-sync-for-jekyll-github-pages/#description)
 * [Reviews](https://wordpress.org/plugins/raybogman-ai-sync-for-jekyll-github-pages/#reviews)
 *  [Installation](https://wordpress.org/plugins/raybogman-ai-sync-for-jekyll-github-pages/#installation)
 * [Development](https://wordpress.org/plugins/raybogman-ai-sync-for-jekyll-github-pages/#developers)

 [Support](https://wordpress.org/support/plugin/raybogman-ai-sync-for-jekyll-github-pages/)

## Description

Ray Bogman AI Sync for Jekyll & GitHub Pages lets you edit content in WordPress 
and publish it to a Jekyll site hosted on GitHub Pages. Jekyll and GitHub are projects/
trademarks of their respective owners; this plugin is an independent integration
and is not affiliated with or endorsed by either.

Features:

 * **One-click “Login with GitHub”** — OAuth login, no manual token pasting
 * **Live repository picker** — all your repos load instantly after login via AJAX
 * **Live branch picker** — select a repo and branches load automatically, no page
   refresh
 * Top-level **Jekyll Sync** admin menu with Dashboard, Articles, and Settings subpages
 * Articles list with Approved toggle per item, type filter, search, per-row push/
   preview/AI/diff/delete/verify
 * Bulk **Publish approved to Jekyll** button + bulk actions for approve, push, 
   delete
 * Converts post HTML to Markdown with Jekyll YAML front matter
 * **Style-aware conversion** — reads your existing Jekyll site’s `_config.yml` 
   and sample posts to match its front matter schema, permalink pattern, and Markdown
   conventions
 * **Featured & inline image sync** — uploads images to your Jekyll repo and rewrites
   URLs to Jekyll-native paths
 * **Internal link rewriting** — WordPress domain links automatically rewritten 
   to your Jekyll site URL
 * **AI SEO descriptions** (optional) — Claude or OpenAI generates 1-2 sentence 
   descriptions on demand
 * **AI image alt text** (optional) — Claude or OpenAI vision describes images missing
   alt text
 * **Two-way sync** — pull Jekyll posts back into WordPress as drafts
 * **Scheduled auto-sync** — WP-Cron based intervals (1/6/12/24 hours)
 * **Auto-push on publish** — push automatically when WordPress posts are published
   or updated
 * **Sync verification** — compare stored push hash against the live Jekyll file
 * **Diff view** — preview color-coded additions/deletions before re-pushing
 * **Sync history log** — every push, pull, and delete recorded with user, post,
   path, and result
 * **GitHub Actions trigger** — optionally dispatch a build workflow after each 
   push
 * **SEO plugin support** — auto-detects Yoast SEO and RankMath meta descriptions
   and focus keywords
 * Per-post sidebar meta box

### External Services

This plugin connects to external third-party services depending on your configuration:

**WordPress 7.0+ — preferred path:** When running on WordPress 7.0 or newer and 
the site owner has configured a provider through the core AI Client, AI SEO description
generation is routed through that core AI Client first (`wp_ai_client_prompt()`  `
generateText()`). In that case the plugin never contacts api.anthropic.com or api.
openai.com directly — the request goes to whichever provider the site owner has 
set up at the site level, with credentials managed by WordPress core. The plugin’s
own direct integrations below are used only as a fallback on older WordPress versions,
or when no core provider has been configured.

#### GitHub API

 * Service: [GitHub REST API](https://docs.github.com/en/rest)
 * Used for: OAuth authentication, listing repositories and branches, reading and
   writing Jekyll post files, uploading images, deleting files, triggering GitHub
   Actions workflows.
 * When: Every time you push, pull, delete, verify, or detect styles from your Jekyll
   repository.
 * Data sent: Your GitHub OAuth token, post content as Markdown, image files, commit
   messages.
 * [GitHub Terms of Service](https://docs.github.com/en/site-policy/github-terms/github-terms-of-service)
 * [GitHub Privacy Statement](https://docs.github.com/en/site-policy/privacy-policies/github-general-privacy-statement)

#### Anthropic Claude API (Optional)

 * Service: [Anthropic Messages API](https://docs.anthropic.com/en/docs/about-claude/models)
 * Used for: AI-generated SEO descriptions and image alt text.
 * When: Only when you click “Generate” in the AI panel or enable auto-generation.
   Never called without user action.
 * Data sent: Post text content (up to 2000 characters) for descriptions. Image 
   data (base64 encoded) for alt text generation.
 * Requires: A valid Claude API key entered by the user.
 * [Anthropic Terms of Service](https://www.anthropic.com/legal/consumer-terms)
 * [Anthropic Privacy Policy](https://www.anthropic.com/legal/privacy)

#### OpenAI API (Optional)

 * Service: [OpenAI Chat Completions API](https://platform.openai.com/docs/api-reference/chat)
 * Used for: AI-generated SEO descriptions and image alt text (alternative to Claude).
 * When: Only when you click “Generate” in the AI panel or enable auto-generation.
   Never called without user action.
 * Data sent: Post text content (up to 2000 characters) for descriptions. Image 
   data (base64 encoded) for alt text generation.
 * Requires: A valid OpenAI API key entered by the user.
 * [OpenAI Terms of Use](https://openai.com/policies/terms-of-use/)
 * [OpenAI Privacy Policy](https://openai.com/policies/privacy-policy/)

## Installation

 1. Upload the `raybogman-ai-sync-for-jekyll` folder to `/wp-content/plugins/` (or 
    upload the zip via Plugins  Add New  Upload).
 2. Activate the plugin.
 3. Go to **Jekyll Sync  Settings**:
 4.  * Create a GitHub OAuth App at [github.com/settings/developers](https://github.com/settings/developers).
     * Set the **Authorization callback URL** to the URL shown on the settings page.
     * Enter Client ID and Client Secret, click **Save Credentials**.
     * Click **Login with GitHub** — you will be redirected to GitHub to authorize.
 5. After login, pick your repository and branch from the dropdowns — they load live.
 6. Configure Jekyll paths and click **Save Settings**.
 7. Go to **Jekyll Sync  Articles**, approve items, and click **Publish approved to
    Jekyll**.

## FAQ

### What does this plugin do?

This plugin lets you publish WordPress posts and pages to a Jekyll site hosted on
GitHub Pages. It converts your HTML content to Markdown with YAML front matter, 
uploads featured images, rewrites internal links, and commits everything directly
to your GitHub repository — all from within the WordPress admin. Optional AI (Claude
or OpenAI) generates SEO descriptions and image alt text on demand.

### How does the GitHub login work?

The plugin uses the standard GitHub OAuth App flow. You create a free OAuth App 
on GitHub (under Settings > Developer settings), enter the Client ID and Secret 
in the plugin, and click “Login with GitHub”. GitHub handles authorization and redirects
you back. No tokens to copy and paste.

### What is the OAuth callback URL?

The callback URL is shown on the Connection tab when you first set up the plugin.
You must enter this exact URL in your GitHub OAuth App settings as the “Authorization
callback URL”.

### What is Style-aware conversion?

Style-aware mode reads your existing Jekyll site to detect its conventions — front
matter fields, their order, Markdown heading style (ATX vs Setext), list markers,
emphasis markers, code fences, and more. It then uses this “style profile” for every
sync, ensuring your pushed content matches the rest of your Jekyll site exactly.

### How does URL rewriting work?

When you push a post, all internal links pointing to your WordPress domain are automatically
replaced with your Jekyll site’s URL. The Jekyll URL is read from your _config.yml(
the url field) or can be set manually on the Content tab. For example, `https://
wp.example.com/my-post/` becomes `https://example.com/my-post/`.

### How are featured images handled?

When you push a post that has a featured image, the plugin uploads the image to 
your Jekyll repository (default path: assets/images/) and sets the featured_image
front matter to the Jekyll-native relative path (e.g. /assets/images/my-post.jpg).
The images path is auto-detected from your existing Jekyll posts.

### What does the Approve button do?

The Approve button marks posts for batch publishing. You can approve multiple posts
during the week, then click “Publish all approved to Jekyll” to push them all at
once. It’s a selection mechanism — approving alone does not push unless auto-push
is enabled.

### Can I auto-publish when approving?

Yes. Check the “Auto-push when approving” checkbox above the articles list. When
enabled, clicking Approve on a published post will immediately push it to Jekyll
in one click.

### Can I push or delete multiple posts at once?

Yes. Use the checkboxes in the articles list to select multiple posts, then choose
a bulk action from the dropdown: Approve, Unapprove, Push to Jekyll, or Delete from
Jekyll. Click Apply to execute.

### Can I preview the Markdown before pushing?

Yes. Each row in the articles list has a Preview button that opens a modal showing
the exact Markdown and YAML front matter that will be committed to your repository.
This lets you verify the output before pushing.

### What does “Outdated” status mean?

A yellow “Outdated” status means the WordPress post was modified after it was last
pushed to Jekyll. You should re-push it to sync the latest changes. “Published” (
green) means it’s up to date, and “Not published” (red) means it has never been 
pushed.

### Can I delete a post from Jekyll?

Yes. The Delete button (visible for published posts) removes the Markdown file from
your GitHub repository via the Contents API. It also resets the local publish status
so you can re-push later after making changes.

### What is read from _config.yml?

The style detection reads: url (site base URL), baseurl, permalink pattern, markdown
processor, and the posts permalink from collections.posts.permalink. It also detects
the images directory from existing posts’ featured_image paths.

### How are permalinks generated?

In Style-aware mode, the permalink front matter field is generated using the pattern
from your _config.yml. Variables like :year, :month, :day, :title, :slug, and :categories
are substituted with the post’s actual data.

### Does saving one settings tab overwrite another?

No. Each tab’s save only updates the fields actually present in its form, so settings
on other tabs are preserved.

### What content types are supported?

Posts and pages. You can enable or disable each type independently on the Content
tab. Posts are saved to the Jekyll _posts/ directory (as YYYY-MM-DD-slug.md), and
pages to _pages/ (as slug.md).

### Are inline images uploaded to Jekyll?

Yes. Both featured images and inline body images are uploaded to your Jekyll repository.
All images with /wp-content/uploads/ URLs are uploaded to assets/images/ and their
URLs rewritten to Jekyll-native paths.

### Are there GitHub API rate limits?

GitHub allows 5,000 API requests per hour for authenticated users. Each post push
uses 2-3 requests (check existing file + create/update), and style detection uses
about 7 requests. Normal usage is well within limits. Bulk-pushing 50 posts at once
uses approximately 100-150 requests.

### What is the Dashboard?

Stats overview: total posts, synced, outdated, not published, approved. Shows recent
sync activity log and quick action buttons.

### What is the Sync History Log?

Tracks every push, delete, and pull action with timestamp, user, post title, path,
and result. View on the Log tab. Max 500 entries with Clear Log button.

### What is the Diff view?

Compares current WP content against what’s live on Jekyll. Shows color-coded additions(
green) and deletions (red) before re-pushing.

### How does AI description generation work?

If enabled and an API key is configured (Claude or OpenAI), clicking AI on a post
generates a 1-2 sentence SEO description (max 160 chars). You can edit, regenerate,
or save. Saved as WP excerpt.

### Does this use the WordPress 7.0 core AI Client?

Yes. On WordPress 7.0 or newer, if the site owner has configured an AI provider 
through the core AI Client (Settings > Connectors), SEO description generation is
routed through that core AI Client first — no provider API key needs to be entered
in this plugin, and the plugin never contacts the provider directly. On older WordPress,
or when no core provider is configured, the plugin falls back to its own Claude/
OpenAI integration using the API key you enter on the Connection tab.

### How does AI image alt text work?

Uses AI vision (Claude or OpenAI) to describe images. Works for featured and inline
images. Alt text saved to WP attachment meta and used in Jekyll output.

### What is the GitHub Actions trigger?

Optional. Enter a workflow filename (e.g. jekyll.yml) on the Connection tab. After
each push, the plugin triggers that workflow via the GitHub API to rebuild your 
Jekyll site.

### What is auto-push on publish?

When enabled on the Connection tab, publishing or updating a post in WordPress automatically
pushes it to Jekyll. No manual push needed.

### What is scheduled auto-sync?

WP-Cron based. Configure an interval (1/6/12/24 hours) and mode (approved and outdated
only, or all published) on the Connection tab. The plugin automatically pushes content
on schedule.

### How does Pull from Jekyll work?

The Pull tab lists all Markdown files in your Jekyll _posts directory. You can import
individual posts or all new posts at once. Creates WP posts as drafts with parsed
content.

### What does Verify do?

Compares the stored push hash against the actual Jekyll file on GitHub. Shows if
content matches, if WP was modified after push, if the Jekyll file was externally
edited, or if the file is missing.

### Are inline body images synced?

Yes. All images in the post body with /wp-content/uploads/ URLs are uploaded to 
Jekyll assets/images/ and their URLs rewritten to Jekyll-native paths.

### Is image alignment preserved?

Yes. WordPress alignment classes (alignright, alignleft, aligncenter) are converted
to inline CSS styles in the HTML img tag, preserving the layout in Jekyll.

### Does it support Yoast SEO and RankMath?

Yes. The plugin auto-detects meta description and focus keywords from Yoast SEO 
and RankMath and maps them to Jekyll front matter fields.

## Reviews

There are no reviews for this plugin.

## Contributors & Developers

“Ray Bogman AI Sync for Jekyll & GitHub Pages” is open source software. The following
people have contributed to this plugin.

Contributors

 *   [ Ray Bogman ](https://profiles.wordpress.org/raybogman/)

[Translate “Ray Bogman AI Sync for Jekyll & GitHub Pages” into your language.](https://translate.wordpress.org/projects/wp-plugins/raybogman-ai-sync-for-jekyll-github-pages)

### Interested in development?

[Browse the code](https://plugins.trac.wordpress.org/browser/raybogman-ai-sync-for-jekyll-github-pages/),
check out the [SVN repository](https://plugins.svn.wordpress.org/raybogman-ai-sync-for-jekyll-github-pages/),
or subscribe to the [development log](https://plugins.trac.wordpress.org/log/raybogman-ai-sync-for-jekyll-github-pages/)
by [RSS](https://plugins.trac.wordpress.org/log/raybogman-ai-sync-for-jekyll-github-pages/?limit=100&mode=stop_on_copy&format=rss).

## Changelog

#### 1.0.6

 * Set the `Text Domain` header to `raybogman-ai-sync-for-jekyll-github-pages` to
   match the approved wordpress.org plugin slug. No functional changes (the text
   domain is not referenced by any translation calls).

#### 1.0.5

 * Reverted the `Text Domain` header to `raybogman-ai-sync-for-jekyll` to match 
   the plugin’s folder and requested wordpress.org permalink. No functional changes(
   the text domain is not referenced by any translation calls).

#### 1.0.4

 * AI SEO description generation now prefers the **WordPress 7.0+ core AI Client**(`
   wp_ai_client_prompt()`) when available, routing requests through the provider
   the site owner configured at the site level (Settings > Connectors). The plugin’s
   own direct Claude/OpenAI integration is retained as a fallback for older WordPress
   versions or when no core provider is configured. Updated the External Services
   disclosure and FAQ accordingly. No breaking changes.

#### 1.0.3

 * Changed the `Text Domain` header to `raybogman-ai-sync-for-jekyll-github-pages`
   to match the wordpress.org-assigned plugin slug, resolving the Plugin Check `
   textdomain_mismatch` warning. No functional changes (the text domain is not referenced
   by any translation calls).

#### 1.0.2

 * Reverted display name to **Ray Bogman AI Sync for Jekyll & GitHub Pages** — the
   previous v1.0.1 attempt at “AI WordPress Sync…” was rejected by Plugin Check 
   because “WordPress” is a restricted term that cannot appear anywhere in a plugin
   name (wp.org trademark policy). Cross-promo fix from 1.0.1 is retained.

#### 1.0.1

 * Display name updated to **AI WordPress Sync for Jekyll & GitHub Pages** across
   all in-admin UI strings (menu page title, Settings header, About tab, footer,
   Articles header, Dashboard header).
 * Fixed stale cross-promo card in the **More by Ray Bogman** tab: `RayAI – Content
   Orchestrator`  `Ray Bogman AI Content Orchestrator` (matches the canonical name
   in the Content Orchestrator plugin folder).
 * No functional changes.

#### 1.0.0

 * Initial public release.
 * WordPress-to-Jekyll publishing on GitHub Pages with Markdown + YAML front matter.
 * Style-aware conversion that reads your Jekyll site and matches its conventions.
 * GitHub OAuth login, live repo/branch pickers.
 * Featured and inline image sync to the Jekyll repository.
 * Internal link rewriting from WordPress domain to Jekyll site URL.
 * Optional AI (Claude / OpenAI) for SEO descriptions and image alt text on demand.
 * Two-way sync — pull Jekyll posts back into WordPress as drafts.
 * Scheduled auto-sync (WP-Cron) and auto-push on publish.
 * Sync verification, diff view, and full sync history log.
 * GitHub Actions workflow trigger after each push.
 * Yoast SEO and RankMath meta detection.

## Meta

 *  Version **1.0.6**
 *  Last updated **23 hours ago**
 *  Active installations **Fewer than 10**
 *  WordPress version ** 5.8 or higher **
 *  Tested up to **7.0**
 *  PHP version ** 7.4 or higher **
 * Tags
 * [deployment](https://wordpress.org/plugins/tags/deployment/)[jekyll](https://wordpress.org/plugins/tags/jekyll/)
   [markdown](https://wordpress.org/plugins/tags/markdown/)[static site](https://wordpress.org/plugins/tags/static-site/)
   [sync](https://wordpress.org/plugins/tags/sync/)
 *  [Advanced View](https://wordpress.org/plugins/raybogman-ai-sync-for-jekyll-github-pages/advanced/)

## Ratings

No reviews have been submitted yet.

[Your review](https://wordpress.org/support/plugin/raybogman-ai-sync-for-jekyll-github-pages/reviews/#new-post)

[See all reviews](https://wordpress.org/support/plugin/raybogman-ai-sync-for-jekyll-github-pages/reviews/)

## Contributors

 *   [ Ray Bogman ](https://profiles.wordpress.org/raybogman/)

## Support

Got something to say? Need help?

 [View support forum](https://wordpress.org/support/plugin/raybogman-ai-sync-for-jekyll-github-pages/)

## Donate

Would you like to support the advancement of this plugin?

 [ Donate to this plugin ](https://raybogman.com)