Skip to main content
If your site is built from code (Astro, Next.js, Hugo, Eleventy, Jekyll, or plain HTML) and deploys from GitHub through Cloudflare Pages, Vercel, Netlify or GitHub Pages, you don’t need a CMS. The GitHub connector writes each finished article as a file in your repository. Your host sees the commit and deploys it, the same as when your team pushes a change. You can choose how changes land:
  • Commit straight to the branch. The article goes live on the next deploy.
  • Open a pull request for each article. Someone on your team reviews and merges it, then it deploys.
You sign in with GitHub. There is no token to create or paste. Access goes through Composio, which holds the GitHub authorization for us. You can revoke it at any time from GitHub (Settings → Applications → Authorized OAuth Apps) or by disconnecting in SEOsorted.

Before you start

  • The GitHub account you connect needs write access to the repository. Only repositories it can push to are listed.
  • For a repository owned by a GitHub organization, the organization may need to approve the app first. If the repository doesn’t appear, an organization owner can approve it under Organization settings → Third-party access → OAuth app policy.
  • Know which folder your site reads blog posts from (for example src/content/blog in Astro, content/posts in Hugo, _posts in Jekyll) and which branch your host deploys.

Step 1: Connect GitHub

  1. In SEOsorted, open Settings → Connections and choose GitHub.
  2. Sign in to GitHub if asked, then click Authorize.
  3. You’re brought back to SEOsorted, where GitHub shows Setup required — pick a repository.

Step 2: Choose where articles go

Click Finish setup and fill in: Click Save. We check that the account can push to the repository and that the branch exists before saving. Each article becomes one file named after its slug, for example src/content/blog/how-to-choose-a-crm.md. Its live URL is your Site URL, plus your blog path (Settings → Website, /blog by default), plus the slug.

What the file contains

Markdown and MDX

The article body in Markdown, with this frontmatter:
metaTitle is added when the SEO title differs from the headline. Fields with no value are left out. If your content collection uses different names (for example pubDate instead of date), map them in your site’s schema or layout. The values are always written under these names. The MDX format escapes { and } and self-closes <br>, <hr> and <img> tags, so the file compiles as MDX.

HTML

A complete page: <title>, meta description, canonical link, Open Graph tags, the article’s JSON-LD schema, then the article inside <article>. It has no site header, footer or styles. Use it when your site serves HTML files as they are, or when a build step wraps them in your layout.

Images

Images stay on SEOsorted’s image host and are referenced by URL. Nothing is added to your repository except the article file.

Re-publishing, unpublishing and deleting

In pull request mode, every change goes through a branch named seosorted/<slug> (or seosorted/remove-<slug> for deletions) and a pull request into your branch. Re-publishing while that pull request is still open adds a commit to it, so you don’t get a second pull request.

Tracking AI crawlers

Track AI crawlers on the site built from your repository. For GitHub Pages or S3, put the domain behind Cloudflare: follow Cloudflare (any site). For Netlify, Next.js and other hosts and frameworks, pick your option in Which option to pick.

Troubleshooting

The connected account can’t push to it. Ask for write access, or reconnect with an account that has it. For organization repositories, the organization may need to approve the app (see Before you start).
Your branch requires pull requests or status checks, so commits can’t be pushed to it directly. Open Configure on the GitHub connection and switch How to publish to Open a pull request for each article.
  • In pull request mode, the pull request isn’t merged yet.
  • Your host hasn’t finished deploying. Check its deploy log for the commit.
  • The folder or URL doesn’t match how your site routes pages. Check that Folder for articles is the folder your site builds posts from, and that your blog path (Settings → Website) matches the URL your site serves them at.
Your layout reads frontmatter fields under different names. Map our field names (see What the file contains) in your content schema or layout.