Changelog

This page tracks what we ship in Flowershow.

  1. Readers can take your pages to ChatGPT and Claude

    A page menu to copy any page as Markdown or open it in ChatGPT or Claude, and an auto-generated llms.txt that indexes your whole site for AI assistants.

    More and more readers come to a docs page or tutorial with an AI assistant open. Two new settings make it easy for them, and both are off until you turn them on.

    • Page actions. A Copy page button beside each page title copies the page as Markdown. Its menu can also open the page's Markdown, or start a ChatGPT or Claude chat that reads the page. Turn it on with "showPageActions": true in config.json or under Settings → Features. See Page actions.
    • llms.txt. Your site can now serve an auto-generated llms.txt at /llms.txt. It lists your published pages with their titles, descriptions and links to their Markdown, so an AI assistant can find its way around your site. Drafts and hidden pages are left out, and a llms.txt you publish yourself still wins. Turn it on with "enableLlmsTxt": true. See llms.txt.

    Both are on for these docs: try the Copy page menu at the top of any docs page, or see flowershow.app/llms.txt.

    Fixes

    • The Markdown access docs no longer say every page has a .md version. Pages published from .html files don't.
  2. Redirect a whole folder with one rule

    Moved or renamed a folder? One redirect rule now sends every page in it to its new address, and redirects no longer hide pages you still publish.

    When you move a section of your site, every old link to it used to need its own redirect. Now one rule covers the whole folder. End from with /*, and put :splat in to where the rest of the path should go:

    {
      "redirects": [
        { "from": "/notes/*", "to": "/garden/:splat" }
      ]
    }
    

    /notes/recipes/bread now goes to /garden/recipes/bread, and /notes goes to /garden. The target can be another site too, such as "https://handbook.example.com/:splat". We used this ourselves to replace 28 redirect rules for our old Markdown guides with one.

    • Your pages always win. A redirect now only applies when nothing is published at the old path. Before, a forgotten rule could hide a page you had since added back, so visitors never reached it. If you do want visitors sent away from a page, unpublish or delete it and the redirect takes over.
    • First match wins, so a rule for one renamed page goes above the folder rule.

    See URL redirects for all the options.

  3. Comments on drafts, redesigned

    Pages open for feedback now say so in a bar at the top, comments sit beside the text instead of over it, and on phones they open in a sheet that keeps the passage in view.

    We redesigned how reviewers comment on your drafts when annotations are on. Same feature, same fl annotations pull for your agent; it's now easier to notice and easier to read.

    • A bar at the top. A slim bar under your site's navigation tells reviewers the page is open for comments, how many there are, and has a Show comments button. It replaces the small button in the bottom-left corner, which people missed.
    • Comments beside the text, not over it. On wide screens the list docks on the right and the page makes room for it, so nothing you're reading is hidden. Click highlighted text to jump to its comment, or a comment's quote to jump to the passage.
    • A bottom sheet on phones. Tap highlighted text and the comments open in a sheet over the lower half of the screen, with the page scrolled so the passage sits just above it. Writing a comment works with the keyboard open. Tap ✕ or swipe down to close.
    • Lighter to write. Select text, click Comment, type and Post (⌘/Ctrl+Enter works). Your name is asked once and remembered.
    • Tidier list. Comments are in page order with "2 days ago"-style times. Comments whose text you've since rewritten move to a collapsed Not found on page group, so they're not lost.
    assets/changelog-commenting-redesign-phone

    On the page these are now called comments; the setting, the annotations config key and the fl annotations commands keep their names. Try it on the demo draft, or see Annotations.

  4. Our blog, before and after: what a few lines of config can do

    We rebuilt the Flowershow blog's front page with the new magazine view and public-domain cover art. The whole change is a few lines of frontmatter, and you can do the same on your site.

    We gave the Flowershow blog a new front page. Before, it was one long column of posts with small screenshots. Now it opens like a magazine: a big lead story, two more beside it, a "More posts" column, then everything else grouped by year. Every post has its own cover, a Japanese bird-and-flower woodblock print by Hokusai or Hiroshige.

    Before

    assets/changelog-blog-before

    After

    assets/changelog-blog-after

    The whole layout is in the blog's README.md:

    ---
    title: Blog
    description: Guides, deep dives and the thinking behind Flowershow.
    layout: list
    list:
      view: magazine
      featured: 1
      group: year
    ---
    
    • view: magazine gives the newspaper-style front page. It works with any number of posts, and on a phone it becomes one column.
    • featured: 1 puts the newest post in the big centre spot.
    • group: year adds a year heading to the rest of the posts.
    • Covers come from each post's image:. One style of picture for every post makes the page look designed rather than assembled. Our prints are public domain, from the Met's Open Access collection, the Rijksmuseum and Wikimedia Commons; the full list is here. Posts without an image get a soft tile in your accent colour.

    We also tidied the page: shorter, sentence-case titles, a one-line intro that points to the changelog for feature updates, and a link to subscribe instead of a full signup form.

    See A magazine front page for your blog for what the view does, and Listing pages for every option.

  5. A magazine front page for your blog

    view: magazine turns a blog index into a newspaper-style front page: a big hero, two stories, a More posts column, then the rest. Blog lists also get larger, square thumbnails and tidier meta lines.

    Your blog index can now open like a newspaper front page. Add view: magazine to a layout: list page or a ```blog block:

    ---
    title: Blog
    layout: list
    list:
      view: magazine
    ---
    
    • A front page on page 1: a big hero in the middle (your featured: true post, or the latest), two stories with large images on the left, and a "More posts" column with small thumbnails on the right, divided by thin rules. The rest follow under "Recent posts", with pages.
    • Looks right with any number of posts: one, two, three or five posts each get a layout of their own, and posts without images still fit.
    • Phones and tablets: the hero goes on top, then the columns; on a phone everything is one column.
    • Serif titles from your site's body font. Rename or hide the two headings with headings: { more: Latest, recent: none }.

    Every list looks better too, with nothing to change:

    • Larger 3:2 thumbnails (180px wide) with square corners, in lists, grids and post covers.
    • When most posts have an image, the others get a quiet placeholder tile, so titles stay lined up.
    • Dates and authors in small uppercase letters (--list-meta-transform: none turns that off); group headings (group: year) in your accent colour.
    • --list-title-font switches every listing title to another font, e.g. a serif, from your custom.css.

    Polish

    • Listing pages keep the title, description and intro together above the rule, with a small RSS button when your site has a feed ("enableRss": true).
    • Posts without an image get a soft tile in your accent colour instead of a grey letter; magazine stories without one are clean text-only cards.
    • Covers get a hairline edge, and in dark mode they are dimmed slightly so white screenshots don't glare.
    • Titles and summaries are plain text: no stray ``` or code ticks, and code text is kept, so sentences stay whole. Text like Array<string> and <https://…> links are kept too.
    • Author names in "More posts" wrap onto a second line instead of being cut short.
    • A list or compact page with a sidebar now uses the same column as your other pages instead of a narrower centred one. Without a sidebar, "Edit this page" sits in the page's reading column instead of off to the left.
    • A magazine page's title uses the same serif as its stories, and "Recent posts" lines up with the front page above it.
    • Listing pages no longer show the site-wide comments box or leave a blank gap above the footer.
    • For themes and custom.css: on listing pages your intro is now wrapped in .listing-page-intro and the list in .listing-page-listing (which draws the rule), and the title sits in .page-header-title-row with .page-header-actions when there is a feed link. --list-rest-max-width no longer defaults to 48rem: the magazine's lower rows follow the front page grid, and the variable only caps them when you set it.

    See A magazine front page and Styling in Listing pages.

    Themes: the official themes support the magazine view from v0.1.10: square images, the full three-column front page and properly sized hero titles. Leaf keeps a 2px corner on its bordered grid cards. If you pin a theme version (theme: leaf@v0.1.9), move to v0.1.10 or later. If your custom.css sets --list-card-radius, it still wins.

  6. Blog indexes and lists of pages in plain Markdown

    A blog/ folder now lists itself, and a ```blog block or layout: list shows any folder as a blog index, a grid, a compact archive or a team page, and every post gets a proper post page. Works in .md.

    You can now list the pages of any folder without MDX or components. Add layout: list to a folder's README.md, or put a ```blog block on any page:

    • A blog/ or posts/ folder lists itself, at any depth: with no README, /blog is a paginated index; a README or Obsidian folder note with only prose gets the list underneath.
    • Zero config: newest first, with images, dates, descriptions and author names, 20 per page.
    • Latest posts anywhere: ```blog with limit: 3 on your home page.
    • List and grid views: thumbnails on the left (or media: thumb right), covers in the grid, and a letter tile for grid cards without an image (or your own defaultImage). sort, where and fields choose what each card shows.
    • Compact archives: view: compact gives one line per post (date, then title), grouped by year on a layout: list page.
    • Team pages: view: people shows a folder of people as portraits with name, role and bio; people without a photo get their initials.
    • A featured post: featured: 1 puts the post marked featured: true (or the latest) in a large hero above the rest; with view: grid that's a magazine-style home page.
    • Grouping: group: year, month, folder or any field (group: team) adds a heading before each group.
    • Dates in your language with the new locale setting.
    • Clear errors: a wrong key shows a card that names it and suggests the fix.
    • Posts that look like posts: every dated page in a blog/ or posts/ folder (or in a layout: list folder of dated pages) gets a reading column, a big title with your description, the author's photo and the date, your image as a cover, and at the end its tags, previous and next links and three "Read more" cards (same tag first). Works in .md and .mdx. See Post pages.
    assets/changelog-post-pages

    Themes: the official themes were updated for the new layouts. If you pin a theme version (theme: leaf@v0.1.8), move to v0.1.9 or later; if your custom.css restyles .list-component, scope those rules to .list-component:not([data-view]) to keep them on the old <List /> only.

    See Listing pages. The <List /> component keeps working; the docs show how to switch.

    ⚠️ Check your site

    • A blog/ or posts/ README, index page or folder note with only prose now gets a generated list under it, in a reading-width column. Add list: false to its frontmatter to keep it as before. See A blog with nothing to write.
    • ```list and ```blog code blocks now render as lists. To show one as code, wrap it in four backticks.
    • draft: true in frontmatter now hides a page from listings (including <List /> and changelog timelines), the RSS feed, the sitemap, site search, tag pages and the sidebar, and asks search engines not to index it. The page itself stays reachable at its URL. Worth checking if you imported posts from Hugo, Jekyll or Astro that still carry it. See Which pages are listed.
    • Dated pages in a blog/ or posts/ folder, or in a layout: list folder of mostly dated pages, now use the post layout: a narrower column, tags at the end instead of under the title, and new previous/next and "Read more" links. The image in a post's frontmatter now shows as a cover, uncropped, unless the post already shows it in its text or it is a small or square image such as a logo; add showImage: false to a post to hide it (the image stays its social card), layout: default to keep a page as it was, or postLayout: false to the folder's README for the whole folder. See Turning it off.
    • Author names link only to a page whose name matches exactly, preferring people/ and authors/ folders. See Author pages.

    Fixes

    • A page number past the last page of a list (?page=99) is now a 404, as on the changelog, instead of an empty page.
    • Pages 2 and on of a paginated list block now point search engines at themselves rather than at page 1.
    • Generated blog/ and posts/ listing pages (folders without a README) are now in the sitemap.
    • A list block inside a changelog entry no longer shows page links on the changelog timeline.
    • <List /> no longer lists pages marked publish: false.
    • <List /> pagination shows one ... per gap instead of one per hidden page.
    • The RSS feed no longer fails when a post has an unusual title, author or description (a number, or a wiki link).
  7. Mermaid, Obsidian Bases and PDF embeds now work in plain Markdown

    Mermaid diagrams, Obsidian Bases, the PDF viewer and code-block copy buttons now work in .md pages. You no longer need to switch to MDX.

    Several features used to work only in MDX pages, so you had to rename a file to .mdx or set syntaxMode: mdx to get them. They now work in ordinary .md pages too:

    • Mermaid diagrams: ```mermaid code blocks render as diagrams. See Mermaid diagrams.
    • Obsidian Bases: ```base blocks render as table, cards and list views. See Obsidian Bases.
    • PDF embeds: ![[report.pdf]] and <iframe src="report.pdf"> open in the built-in PDF viewer.
    • Copy button on code blocks: every code block gets one.

    If you switched pages to MDX only for these features, you can switch them back.

  8. Add JavaScript to a single page

    Premium sites can load their own JavaScript files on one page with the new scripts frontmatter field, and it runs on every visit.

    You can now add interactivity to a single page, like a calculator, a toggle or a chart, without loading that code across your whole site. List your .js files in the page's frontmatter:

    ---
    title: Pricing calculator
    scripts:
      - /js/calculator.js
    ---
    

    ⭐️ Page scripts are a Premium feature. Premium is $5/month or $50/year per site. See pricing

    • Runs on every visit: on a full page load, when readers navigate to the page from elsewhere on your site, and when they come back to it.
    • Your files or a CDN: use paths from your site root or relative to the page, or https:// URLs. Up to 10 scripts per page, run in order.
    • Works in .md and .mdx pages.
    • Premium only. On free sites the field is ignored.

    See Page scripts for path rules and a script template that is safe to run on repeat visits.

    Fixes

    • The Publishing HTML docs said <script> tags in Markdown pages don't run. Inline scripts in .md pages do run on a full page load, but not when readers reach the page by clicking a link within the site. The docs now say so and point to page scripts.
  9. Customize your site even more

    Premium sites can replace the default footer and navbar with their own HTML, any page can hide the navbar or footer, and brand fonts, tag colors and list cards are easier to style.

    Your site can now look even more like the rest of your brand. Add a _footer.html file at the root of your site and it replaces the default footer on every page; add a _navbar.html and it replaces the navbar content. For landing pages that bring their own header, you can hide the site navbar and footer page by page.

    ⭐️ Custom footers and navbars are Premium features. Premium is $5/month or $50/year per site. See pricing

    • Custom footer (Premium): write _footer.html as an HTML fragment, with links, images and Tailwind classes. Relative href and src paths resolve from your site root on every page (in pages they resolve from the page's own folder). It replaces the whole default footer, and it's never served as a page of its own.
    • Custom navbar (Premium): write _navbar.html the same way to replace the navbar content (logo, links, dropdowns, CTA) with your own. The bar stays sticky and keeps search and the dark-mode toggle if you've turned them on. Page links navigate instantly, the current page is marked, and a <details> element gives you a dropdown or a mobile menu with no JavaScript.
    • Hide the navbar or footer on a page (all plans): set showNavbar: false and/or showFooter: false in a page's frontmatter. Pair them with layout: plain for a fully bespoke landing page. You can also set them in config.json to hide the navbar or footer site-wide.

    Follow the step-by-step guide Give your site a custom navbar and footer, or see Footer configuration and Navbar configuration for details.

    More ways to style your site

    • Brand fonts without a giant custom.css: publish your .woff2 files alongside your site and point to them from custom.css, or import Google Fonts. See Custom fonts.
    • Tag pill colors: recolor tag pills with four CSS variables (--color-tag-pill-text, -bg, -text-hover, -bg-hover). See Tags.
    • List cards: the <List> component has documented, stable class names, including new hooks for item links and the empty and error states. See List component.
    • Full-width plain pages: layout: plain pages already span the full width, so full-bleed sections need no 100vw workaround. See Custom styles.

    Fixes

    • custom.css now loads as a stylesheet the browser caches, instead of being copied into every page, so pages are smaller and repeat visits are faster. Relative url() paths in custom.css (like url('fonts/Brand.woff2')) now resolve from your site root; previously they resolved against each page's URL and broke on nested pages.
    • The custom styles docs said Flowershow uses CSS cascade layers so custom.css always wins. It doesn't: custom.css loads after the theme, so a rule with equal or higher specificity wins. The docs now say so.
    • Setting --navbar-height in your CSS now actually changes the navbar's height, and heading anchor links and the changelog's sticky date follow it too. Before, only the sidebar and table of contents moved.
  10. Show reading time in the page header

    Pages can show an estimated reading time, like "8 min read", next to the authors and date.

    Long guides and essays can now tell readers up front how long they'll take. Turn on reading time and the page header shows an estimate like "8 min read", next to the authors and date.

    • Site-wide: toggle Show Reading Time under Settings → Content in the dashboard, or set "showReadingTime": true in config.json. It's off by default.
    • Per page: set showReadingTime: true or false in a page's frontmatter to override the site setting.
    • How it's calculated: word count at 200 words per minute, rounded up.

    See Page headers for details.

Built with LogoFlowershow