Loading...
Loading...
GitHub integration
Connect a repository and Seology scans the code of your Next.js, React or HTML site for SEO issues. It opens a pull request with each fix, and you review and merge it like any other change.
Sign up, then open the Scan page in the app. The free Starter plan is enough to scan a repository and open pull requests.
Paste a fine-grained personal access token that has read and write access to Contents and Pull requests. The token is saved in your browser and sent to Seology only to call the GitHub API. You can remove it from the Scan page at any time.
Seology lists the 30 most recently updated repositories your account owns. Choose one and it reads the default branch. Scanning changes nothing. You get a list of issues with the file, the line, a severity and a score out of 100.
Click Open fix PR on one issue, or Fix all to fix every fixable issue, one pull request per file. For each one Seology fetches the file, generates the corrected version, creates a branch named seology/fix-<timestamp> from your default branch, commits the file and opens a pull request.
Each pull request is an ordinary GitHub pull request against your default branch. Read the diff, let your checks run, then merge or close it. Seology does not merge and does not deploy.
The scanner reads HTML files, Next.js layout and page files, Pages Router _app and _document, index files, arobots.txt at the root or in public/, and next.config. Every finding comes with a file and a line number. Items marked report only are listed for you and do not get a pull request.
// app/pricing/page.tsx
+ import type { Metadata } from "next";
+
+ export const metadata: Metadata = {
+ title: "Pricing",
+ description: "Compare plans and see what each one includes.",
+ };
+
export default function PricingPage() {
// components/TeamPhoto.tsx
- <Image src="/team.jpg" width={800} height={450} />
+ <Image src="/team.jpg" width={800} height={450} alt="The team at the office" />An example of the kind of change. Each fix is its own pull request, and the wording in a real one is generated from your file.
In the App Router, the title and description come from the Metadata API, not a hand-written head tag. Export a static metadata object from a layout.tsx or page.tsx, or export an async generateMetadata function when the values depend on route params or fetched data. In current Next.js, params is a Promise, so await it. Both exports work only in Server Components, and a segment can export one or the other, not both. Set title.template in the root layout so each page supplies only its own title.
Set metadataBase once in the root layout, then give each page alternates: { canonical: "/pricing" }. Next.js resolves the path against the base and renders the canonical link tag. A relative URL with no metadataBase is a build error.
Add app/sitemap.ts with a default export that returns an array of { url, lastModified } entries, typed as MetadataRoute.Sitemap. Next.js serves it at /sitemap.xml. app/robots.ts works the same way with MetadataRoute.Robots, and is where you point crawlers at the sitemap. Build both from the same data as your routes so they cannot drift apart.
next/image requires an alt prop. Describe what the image shows, and use alt="" only for decoration.
Render structured data as a <script type="application/ld+json"> tag inside the page or layout component, passing JSON.stringify output through dangerouslySetInnerHTML. The Next.js docs recommend replacing < with \u003c in that string, so a value from your data cannot close the script tag.
Server Components are the default, so the HTML response already contains your content. Client Components are prerendered too, but anything fetched in useEffect after load is missing from that HTML, and not every crawler runs JavaScript. Fetch content on the server if it should be indexed.
For scanning and pull requests you create a fine-grained personal access token with read and write access to Contents and Pull requests, limited to the repositories you choose. The token is saved in your browser and sent with each request so Seology can call the GitHub API. Adding a repository as a site through GitHub sign-in is a separate step that requests the read:user and repo OAuth scopes, and that token is stored encrypted.
Yes, if your token has access to the repository. The repository list shows the 30 most recently updated repositories that your account owns, public or private.
There is no monorepo-specific support. The scanner walks the whole repository tree and reads the first 50 matching files, and you cannot point it at one package or subdirectory. robots.txt is only checked at the repository root or in a top-level public/ folder.
Next.js App Router layout and page files, Pages Router _app and _document files, React index files, and static HTML. The page checks run on .html, .htm, .tsx and .jsx files, and on .js files that contain JSX.
Nothing changes on your default branch. The seology/fix branch stays in the repository until you delete it. Because the scanner reads the default branch, the same issue shows up again on the next scan.
Scanning does not use credits. Each pull request uses one AI credit. The free Starter plan includes 30 AI credits a month, shared with the agent chat and drafts. Growth is $29 a month with 300 credits, and Scale is $99 a month with 1,500.
Scanning is free and changes nothing. The Starter plan includes 30 AI credits a month, and each pull request uses one.