Using Polaris
SEO features
What Polaris CMS does for search: RSS per language, a live sitemap, share images, JSON-LD, hreflang, IndexNow pings on publish and Google Search Console checks.
Polaris splits SEO into two parts. The CMS module stores what search needs (titles, meta descriptions, focus keywords, publish times, translations, image sizes) and does the work that happens on publish: the SEO score, IndexNow pings and the indexing checks. The site's templates (the blog pages, the feed, the sitemap and the share images that come with the starters) turn it into markup. This page describes both as they run on scentro.pl, the newest version.
On-page#
- Title and meta description come from the post. The meta description falls back to the excerpt.
- Canonical URL on every post and listing, with the site's trailing slash.
/blog/xredirects to/blog/x/with a301. - One
h1per page: the post title. A#heading in the body is rendered ash2. - Images in the body get
loading="lazy",decoding="async"and, for uploaded ones, their real width and height (no layout shift); a figure's caption is a real<figcaption>. - Table of contents for posts with 3 or more headings, linking to stable heading ids.
- The SEO score in the editor checks the basics before a post goes out. See the 11 checks.
hreflang#
On a two-language site, a post's hreflang alternates (en, pl and x-default) are emitted only when its translation is live. A translation that is still a draft or scheduled for later adds nothing, so search engines are never sent to a page that doesn't exist. Blog index and category pages always carry alternates, because both language versions exist.
Thin listings stay out#
Blog index and category pages with fewer than 3 live posts are noindex, follow and are left out of the sitemap. They become indexable on their own as posts go live.
RSS#
An RSS 2.0 feed per language (/blog/rss.xml, /pl/blog/rss.xml on scentro.pl) with the 30 newest live posts: absolute links, publish dates, author, category and tags, the meta description, and the featured image as an enclosure. Scheduled posts enter the feed at their publish time.
Sitemap#
/sitemap.xml is rendered per request, so it always lists every live post without a rebuild. It contains the site's static pages, the blog listings that are indexable, and every live post, with xhtml:link alternates for posts that have a live translation. Without a database the static pages are still listed.
Share images#
Every post gets a 1200 × 630 share card at /blog/og/<slug>.jpg: the featured image beside the title, or the title alone on a branded background. The URL carries a ?v= version that changes on every edit, so social networks fetch the new card instead of a cached one.
Structured data#
- Posts:
BlogPosting(headline, description, URL, language, images, published and modified dates, section, keywords, word count, author, publisher) and aBreadcrumbList. - Listings:
Blogfor the index,CollectionPagefor a category, each with aBreadcrumbList; the index lists its posts asBlogPostingitems.
IndexNow#
Set INDEXNOW_KEY (8 to 128 letters, digits or dashes) and the site serves the key file at /<key>.txt. From then on:
- a
saveorset-statusthat publishes a post pings IndexNow for its URL; - a scheduled post that goes live is pinged when the housekeeping tick (or
/api/cron/daily) flips its status; - Admin → IndexNow submits any set of your URLs by hand.
IndexNow reaches Bing, Yandex, Seznam, Naver and the other engines that take part. Google does not use it: give Google the sitemap in Search Console.
Google Search Console checks#
Admin → Indexing runs Search Console's URL Inspection API, one URL at a time, and shows the verdict, coverage state, last crawl, robots state and the canonical Google chose. It only reads: there is no public API to submit ordinary pages to Google.
Setup: create a service account in Google Cloud with the Search Console API enabled, add its email as a user on your Search Console property, and set GOOGLE_SERVICE_ACCOUNT_JSON (the whole key file as one line). Set GOOGLE_SEARCH_CONSOLE_SITE_URL when the property is not <your site URL>/, for example sc-domain:example.com. The admin signs the token with node:crypto; there is no Google SDK to install.
The admin stays out of search#
Every /studio response is noindex, nofollow and no-store, and drafts are never rendered on public URLs.
In the kit versions#
The Astro and Next.js starters that go with the kit ship the same pieces in their own templates: RSS, a blog sitemap, share images, JSON-LD, robots.txt and llms.txt, plus tag pages. They are single-language, so there is no hreflang pairing.
Open source under MIT. Public release on GitHub and npm in preparation. Roadmap.