This repository contains blog posts for Swetrix.
This project uses Prettier to ensure consistent formatting of Markdown files.
npm run format- Format all Markdown filesnpm run format:check- Check if files need formatting (without making changes)
Blog posts follow the regular markdown syntax, with the following additional features.
Every blog post must contain a metadata block at the beginning of the file.
---
title: 'Title of the blog post'
intro: 'Intro of the blog post' (optional)
seoTitle: 'Short title for search and social previews' (optional; falls back to title)
seoDescription: 'Concise description for search and social previews' (optional; falls back to intro)
date: November 28, 2025 (optional)
modified: September 24, 2026 (optional; date of the latest substantive update)
image: "https://cdn.swetrix.com/file/article-cover.webp" (optional; absolute image URL)
hidden: false (true/false) - if true, the post will not be visible on the /blog page, but is still accessible at the direct URL
standalone: true (true/false) - if true, the post will be displayed as a standalone page, without the /blog prefix
author: Author name (optional)
twitter_handle: Author Twitter handle (optional; without the @ prefix)
---Dates may use the existing November 28, 2025 format or a quoted ISO date such as "2025-11-28". The frontend converts valid dates to ISO for structured data and time metadata. modified is optional and must not precede date; without it, no modification date is claimed.
The optional image URL supplies the article's Open Graph, Twitter card, and Schema.org image. It does not add a cover to the article body or blog listing. When image is absent, both social previews and article structured data use the generated Open Graph image. RankPine's publishing webhook stores its top-level featuredImage.url in this field when provided.
Article headings automatically populate the floating navigation with server-rendered anchor links, so new posts do not need a ::TABLE_OF_CONTENTS:: marker.
You can include UI components in your blog posts. They follow the syntax of ::COMPONENT_NAME::.
Available components:
::TABLE_OF_CONTENTS::- autogenerated table of contents for the blog post based on the headings in the post.::CTA:TIME_TO_SWITCH::- a CTA section to switch to Swetrix from other analytics tools.::CTA:TIME_TO_DITCH_GOOGLE::- a CTA section to ditch Google Analytics and switch to Swetrix.::SWETRIX_LOGO::- a Swetrix logo, font size inherited from the surrounding text.
✅, ⚠️ and ❌ emojis are replaced with proper SVG entities on render.