
Template details
Inkline
A minimal, writer-first blog theme for Astro with one column, no required configuration, and almost no JavaScript.
About this template
Inkline is a minimal, writer-first blog theme for Astro that ships a single-column layout, works without configuration, and runs with almost no JavaScript. It is a static site template: you write Markdown or MDX posts with validated front matter, and the build produces a blog with a featured post on the home page, an archive grouped by year, tag pages, RSS, a sitemap and per-post social preview images.
What is Inkline?
Inkline is a blog theme built on Astro, distributed as an MIT-licensed static site project. It takes Markdown and MDX files with validated front matter (title, description, pubDate, plus optional updatedDate, tags, featured and draft flags) and generates a complete blog: home page with a featured post, year-based archive, tag pages, an About page, RSS feed, sitemap, robots.txt, canonical URLs and Open Graph tags. It is meant to be deployed to Cloudflare Workers static assets, and the repository includes a wrangler.jsonc that installs dependencies, builds the site and publishes the dist folder.
Key Features
- The inkline — a thin accent line along the top of every post that draws itself as you scroll, implemented in CSS only with no JavaScript.
- Reading mode — readers can adjust text size, column width and typeface, and the choices are remembered per device.
- Plain CSS with design tokens — no CSS framework; colors, fonts and widths are tokens at the top of
src/styles/global.css, and the Newsreader typeface is served from your own site with no external requests. - Pagefind search — full-text search that works on the built site (it only functions after
npm run build, testable withnpm run preview). - Social preview images — a 1200×630 image is generated at build time for every post at
/og/<post>.pngplus/og/default.png, drawn with Satori from the post title, description and date; disable withfeatures.ogImages: false. - Markdown and MDX posts — front matter is validated via
src/content.config.ts, with a copy button on code blocks, table of contents and previous/next links. - Accessibility and theming — light and dark themes with no flash on load, plus a skip link, visible focus states, semantic landmarks and reduced-motion support.
- SEO plumbing — RSS, sitemap,
robots.txt, canonical URLs, Open Graph tags and JSON-LD out of the box.
Who is it for?
- Writers and bloggers who want a one-column, distraction-free reading experience without configuring a theme.
- Developers on Astro who want a ready blog with validated content collections, RSS and OG images they can extend in TypeScript.
- Cloudflare Workers users who want a static blog deployed from a GitHub repo, with every push to
mainredeploying. - Self-hosters who care about no external font or asset requests; Newsreader is served from the site itself.
How does Inkline work?
Run npm install, edit src/config.ts to set the site title and url, add Markdown files to src/content/posts/, then run npm run build to publish. Requires Node 22.23.4 or newer. For Cloudflare, keep package.json, wrangler.jsonc, astro.config.ts and src/ at the repository top level, set the project name to match name in wrangler.jsonc, leave the build command empty, keep npx wrangler deploy as the deploy command, then set url in src/config.ts (or a SITE_URL build variable) so RSS, sitemap and social images use the right address. A NODE_VERSION build variable set to 24 fixes builds where the image's Node is too old for Astro.
FAQ
Is Inkline free?
Yes. Inkline is released under the MIT license, so you can use and modify it freely.
Does Inkline need JavaScript?
The theme ships almost no JavaScript; the inkline scroll accent is pure CSS. Search via Pagefind works on the built site, so it is only available after a build.
Can I use a custom domain?
Yes. Open the Worker in the Cloudflare dashboard, go to Settings → Domains & Routes → Add, then update url in src/config.ts to match.
What font does Inkline use for social images?
Social images are drawn with Satori, and the bundled font covers Latin text only; for other scripts you add a font covering them in src/utils/og.ts.















