{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "Blogin",
  "home_page_url": "https://blogin.dev/",
  "feed_url": "https://blogin.dev/feed.json",
  "items": [
    {
      "id": "https://blogin.dev/reference/template-expressions/",
      "url": "https://blogin.dev/reference/template-expressions/",
      "title": "Template Expressions",
      "date_published": "2026-08-15T00:00:00Z",
      "content_text": "Blogin's layouts are HAML. What HAML does not define is the language inside = ..., - if ..., and #{...}. Ruby HAML embeds Ruby. Blogin embeds a small language of its own."
    },
    {
      "id": "https://blogin.dev/guide/overview/",
      "url": "https://blogin.dev/guide/overview/",
      "title": "Overview",
      "date_published": "2026-07-20T00:00:00Z",
      "content_text": "Blogin is a static blog generator written in C++. Point it at a directory of Markdown files and it produces a directory of plain HTML you can host anywhere. There is no database and no runtime. What…"
    },
    {
      "id": "https://blogin.dev/cli/blogin-init/",
      "url": "https://blogin.dev/cli/blogin-init/",
      "title": "blogin init",
      "date_published": "2026-07-04T00:00:00Z",
      "content_text": "Scaffold a new site in a directory, with a starter post, layouts, and a blogin.json. What it writes builds with nothing to fill in first."
    },
    {
      "id": "https://blogin.dev/reference/haml-compatibility/",
      "url": "https://blogin.dev/reference/haml-compatibility/",
      "title": "HAML Compatibility",
      "date_published": "2026-08-15T00:00:00Z",
      "content_text": "There is no HAML standard. Ruby HAML is a reference implementation that embeds Ruby, and every implementation embeds some host language. The structural syntax is what carries across, and the…"
    },
    {
      "id": "https://blogin.dev/guide/getting-started/",
      "url": "https://blogin.dev/guide/getting-started/",
      "title": "Getting Started",
      "date_published": "2026-07-19T00:00:00Z",
      "content_text": "Install"
    },
    {
      "id": "https://blogin.dev/cli/blogin-new/",
      "url": "https://blogin.dev/cli/blogin-new/",
      "title": "blogin new",
      "date_published": "2026-07-01T00:00:00Z",
      "content_text": "Create a new post file from a title. It writes <section>/<today>-<slug>.md with title, date, an empty tags list, and an empty description filled in, the slug derived from the title."
    },
    {
      "id": "https://blogin.dev/reference/data-file-yaml/",
      "url": "https://blogin.dev/reference/data-file-yaml/",
      "title": "Data File YAML",
      "date_published": "2026-08-15T00:00:00Z",
      "content_text": "Blogin reads YAML in two places: data/*.yaml (or .yml, with subdirectories becoming nested maps), which a layout reads through data, and _data.yaml (or _data.yml) in a content directory, which is…"
    },
    {
      "id": "https://blogin.dev/guide/writing-posts/",
      "url": "https://blogin.dev/guide/writing-posts/",
      "title": "Writing Posts",
      "date_published": "2026-07-18T00:00:00Z",
      "content_text": "A post is a Markdown file with a --- front matter block:\n---\ntitle: My Post\ndate: 2026-07-20\ntags: [cpp, web]\ndescription: A short summary.\n---\nThe body goes here.\nRun blogin new \"My Post\" to scaffold one with the front matter filled in.\nupdated is the date the post last changed, in the same form as date. It becomes article:modified_time and the post's <lastmod> in the sitemap. noindex: true asks search engines to leave the post out of their index and leaves it out of the sitemap.\nimage names the picture a link preview shows for the post, such as image: /assets/images/my-post.png. See Metadata and SEO.\nNo key is required. A post with no title takes one from its filename, with any leading date and the extension removed and each word capitalized, so 2026-07-20-my-post.md is titled My Post. The date falls back to a date at the front of the filename, the slug follows the title, and the layout follows the section. draft, date, description, summary, slug, layout, order, toc, tags, aliases, image, updated, and noindex are read. draft: true leaves a post out of the build unless you pass blogin build --drafts. Any other key is read only when taxonomies in blogin.json names it, and then it groups posts the way tags does.\nSlugs\nA slug comes from the title, lowercased, keeping only ASCII letters and digits. Any run of other characters, including whitespace, punctuation, and non-ASCII letters such as é, becomes a single hyphen, with none at the start or end. A title written only in non-ASCII characters needs an explicit slug. Three characters carry the whole meaning of a name and are spelled out rather than dropped: + becomes plus, # becomes sharp, and & becomes and. So a c++ tag is c-plus-plus and a c tag is c, two pages rather than one overwriting the other.\nSet slug in front matter to choose the URL yourself.\nMarkdown\nThe body is CommonMark, with GitHub Flavored Markdown for the extensions: tables, task lists, strikethrough, and fenced code blocks with an info string. Footnotes, reference links, attribute lists, math, and Mermaid diagrams are covered below and in Math and Diagrams.\n| Column | Column |\n| --- | --- |\n| a | b |\n\n- [x] done\n- [ ] not done\n\n~~struck through~~\nDefinition lists\nA paragraph followed by a line starting with :  becomes a term and its definition:\nTerm\n: what it means\nwhich renders as:\n<dl>\n<dt>Term</dt>\n<dd>what it means</dd>\n</dl>\nOne term takes as many definitions as you give it, and a list holds as many terms as you like:\n--src <dir>\n: the content directory\n: defaults to `content`\n\n--out <dir>\n: where the site is written\nA definition holds inline markup, so : with *emphasis* works. The CLI pages on this site are written this way.\nLinks and images\nA link or an image takes an optional attribute list in braces right after the closing paren. Use key=value for an attribute, .name for a class, and #name for an id:\n[the docs](https://example.com){target=_blank rel=noopener .external}\n\n![A cat](/images/cat.png){.rounded #hero}\nWrap an image in a link to make the image itself clickable. The attribute list belongs to the link, so a linked thumbnail opens its full-size version in a new tab:\n[![A cat](/images/cat-thumb.png)](/images/cat.png){target=_blank}\nThat renders an <img> inside the <a>, and the image keeps any attribute list of its own:\n[![A cat](/images/cat-thumb.png){.thumb}](/images/cat.png){target=_blank}\nReference links and footnotes\nLinks can carry their target in a separate definition rather than inline. Write [text][label] in the body and define the label anywhere in the file:\nSee [the home page][home] for more.\n\n[home]: https://example.com \"Optional title\"\nA collapsed form, [text][], uses the text as the label. Labels match case-insensitively, and an undefined reference is left as literal text.\nFootnotes use [^label] where the note is cited, with a matching definition:\nA claim that needs a source[^src].\n\n[^src]: The cited source.\nFootnotes are numbered in the order they are first referenced and collected into a footnotes section at the end of the post, each with a link back to its reference. Reference and footnote definition lines never render as content.\nSections\nThe subdirectory a file sits in under content/ is its section, and the section is both the URL prefix and the layout selector. A file at content/posts/hello.md titled Hello becomes /posts/hello/, written as public/posts/hello/index.html, or /posts/hello with \"clean-urls\": true. The last part of the URL is the post's slug, not its filename. The post renders through layouts/posts/show.haml when present, otherwise layouts/show.haml. Nested directories become nested sections and nested nav entries.\nSummaries\nA listing and a feed entry show a short summary of each post rather than the whole body. Blogin picks the summary in this order:\nA summary in front matter, used verbatim.\nThe text before a `"
    },
    {
      "id": "https://blogin.dev/cli/blogin-build/",
      "url": "https://blogin.dev/cli/blogin-build/",
      "title": "blogin build",
      "date_published": "2026-07-03T00:00:00Z",
      "content_text": "Render the content tree to static HTML, writing feeds, a sitemap, and the search index alongside the pages."
    },
    {
      "id": "https://blogin.dev/guide/layouts/",
      "url": "https://blogin.dev/guide/layouts/",
      "title": "Layouts",
      "date_published": "2026-07-17T00:00:00Z",
      "content_text": "Blogin renders pages with its own HAML engine. A build wraps each post's rendered body in show.haml inside base.haml, and each section listing in index.haml inside base.haml."
    },
    {
      "id": "https://blogin.dev/cli/blogin-serve/",
      "url": "https://blogin.dev/cli/blogin-serve/",
      "title": "blogin serve",
      "date_published": "2026-07-02T00:00:00Z",
      "content_text": "Build the site and serve it locally, rebuilding when anything under the site directory changes. blogin.json is read once at startup, so an edit to it takes effect when you restart the server. A…"
    },
    {
      "id": "https://blogin.dev/guide/template-data/",
      "url": "https://blogin.dev/guide/template-data/",
      "title": "Template Data",
      "date_published": "2026-07-22T00:00:00Z",
      "content_text": "Every layout renders against a context object. A method call in HAML is a call on that object, so = title runs the context's title method and - for posts iterates its posts collection. There are two…"
    },
    {
      "id": "https://blogin.dev/guide/data-files/",
      "url": "https://blogin.dev/guide/data-files/",
      "title": "Data files",
      "date_published": "2026-07-21T00:00:00Z",
      "content_text": "A data/ directory beside content/ holds structured values that layouts read directly, so a list of authors, a set of social links, or a navigation table lives in one place rather than being repeated…"
    },
    {
      "id": "https://blogin.dev/cli/blogin-clean/",
      "url": "https://blogin.dev/cli/blogin-clean/",
      "title": "blogin clean",
      "date_published": "2026-07-05T00:00:00Z",
      "content_text": "Remove the output directory produced by a build, leaving the content, layouts, and configuration in place."
    },
    {
      "id": "https://blogin.dev/guide/css-frameworks/",
      "url": "https://blogin.dev/guide/css-frameworks/",
      "title": "CSS Frameworks",
      "date_published": "2026-07-16T00:00:00Z",
      "content_text": "Blogin adds framework-specific classes to the HTML it writes, taken from the profile you name in the css-framework config key. The renderer itself knows no framework. It asks the profile for a named…"
    },
    {
      "id": "https://blogin.dev/guide/syntax-highlighting/",
      "url": "https://blogin.dev/guide/syntax-highlighting/",
      "title": "Syntax Highlighting",
      "date_published": "2026-07-15T00:00:00Z",
      "content_text": "Set \"highlight\": true in blogin.json and Blogin highlights fenced code during the build. Highlighting is server-side: there is no client JavaScript, and the pages work without it."
    },
    {
      "id": "https://blogin.dev/guide/math-and-diagrams/",
      "url": "https://blogin.dev/guide/math-and-diagrams/",
      "title": "Math and Diagrams",
      "date_published": "2026-07-21T00:00:00Z",
      "content_text": "Blogin parses math and Mermaid diagrams into markup that a client-side renderer turns into equations and graphics. The build stays static, and the rendering happens in the browser."
    },
    {
      "id": "https://blogin.dev/guide/feeds-and-search/",
      "url": "https://blogin.dev/guide/feeds-and-search/",
      "title": "Feeds and Search",
      "date_published": "2026-07-14T00:00:00Z",
      "content_text": "Every build with at least one post emits feeds, a sitemap, and a search index."
    },
    {
      "id": "https://blogin.dev/guide/pagination/",
      "url": "https://blogin.dev/guide/pagination/",
      "title": "Pagination",
      "date_published": "2026-07-10T00:00:00Z",
      "content_text": "Any listing that holds more posts than page-size splits into numbered pages. A section listing, the home page, and every taxonomy term page paginate the same way, with the same URLs and the same…"
    },
    {
      "id": "https://blogin.dev/guide/metadata-and-seo/",
      "url": "https://blogin.dev/guide/metadata-and-seo/",
      "title": "Metadata and SEO",
      "date_published": "2026-07-21T00:00:00Z",
      "content_text": "Blogin emits per-page metadata for search engines and social cards, and a site-wide robots.txt, without any template work beyond a single call in the page head."
    },
    {
      "id": "https://blogin.dev/guide/previewing-and-building/",
      "url": "https://blogin.dev/guide/previewing-and-building/",
      "title": "Previewing and Building",
      "date_published": "2026-07-13T00:00:00Z",
      "content_text": "The preview server"
    },
    {
      "id": "https://blogin.dev/guide/configuration/",
      "url": "https://blogin.dev/guide/configuration/",
      "title": "Configuration",
      "date_published": "2026-07-12T00:00:00Z",
      "content_text": "Site-wide settings live in blogin.json beside the content directory. Every key is optional. Command-line options override the file."
    },
    {
      "id": "https://blogin.dev/guide/internationalization/",
      "url": "https://blogin.dev/guide/internationalization/",
      "title": "Internationalization",
      "date_published": "2026-07-21T00:00:00Z",
      "content_text": "List the languages you write in and Blogin builds each into its own subtree."
    },
    {
      "id": "https://blogin.dev/guide/themes/",
      "url": "https://blogin.dev/guide/themes/",
      "title": "Themes",
      "date_published": "2026-07-21T00:00:00Z",
      "content_text": "A theme is a reusable set of layouts and assets. Put one under themes/<name>/ with its own layouts/, static/, and assets/, and select it in blogin.json:"
    },
    {
      "id": "https://blogin.dev/guide/deploying/",
      "url": "https://blogin.dev/guide/deploying/",
      "title": "Deploying",
      "date_published": "2026-07-11T00:00:00Z",
      "content_text": "blogin build writes a self-contained public/ directory. Deploying is copying that directory to any static host."
    },
    {
      "id": "https://blogin.dev/guide/cookbook/",
      "url": "https://blogin.dev/guide/cookbook/",
      "title": "Cookbook",
      "date_published": "2026-07-09T00:00:00Z",
      "content_text": "A Blogin site is customized in six places. This page is the index: what each one reaches, and where the detail lives."
    }
  ]
}
