Changelog

September 3, 2026

Configurable redirects for every site

Sites can now declare their own redirects on their theme configuration, with reserved groups for landing, info, and not-found routing. Curvenote Reader also surfaces non-PDF downloads as their own labelled buttons in the article bar, and recognizes many more download formats by icon.

Curvenote SCMS

Site-configurable redirects. Sites can declare redirects on their own theme configuration record, the same way they declare design. An ordered rules list supports :param, :splat, and :path bindings, alongside reserved $landing, $info, and $notFound groups matched in that order — so a rule can carve an exception out of a blanket $info redirect. Destinations default to 302, forward the incoming query string, must be http(s), and are skipped when they would send a request back to itself, which makes the same configuration safe to serve from two hostnames without looping. Theme-owned paths like /api/*, /sitemap.xml, /robots.txt, /favicon.ico, and /login are only redirected by a rule that names them literally, so a blanket $info or $notFound cannot break the sitemap or the auth flow. The sitemap filters its path list through the same matcher, so a redirected URL is never advertised as canonical.

Curvenote Reader

Article-bar downloads for non-PDF formats. Non-PDF downloads can now surface as their own labelled buttons in the article bar next to the existing PDF button. Set article_bar_downloads: true to show a button for every download, a number to cap how many are shown, or leave the default false to keep the current behavior. Every download still appears in the actions menu either way, and the buttons are hidden on small screens.

Article downloads sit beside the PDF button in the article bar, each with its own label and format icon, so readers reach the materials behind a paper without opening the actions menu.

Figure 1:Article downloads sit beside the PDF button in the article bar, each with its own label and format icon, so readers reach the materials behind a paper without opening the actions menu.

More recognized download-format icons. Videos (mp4, avi, mov), spreadsheets (csv, xls, xlsx), presentations (ppt, pptx, key), and code and notebooks (py, r, html, ipynb) now get icons of their own instead of falling back to a generic file icon. MECA and OMEX submission bundles move from the generic archive icon to a distinct one, so they read as packaged submissions rather than plain zip archives. Icons also fall back to the filename extension when the format is unknown, so a download always shows something meaningful.

Untitled admonitions drop their header row. A non-collapsible admonition without a title no longer opens the coloured panel with a stray icon and an empty line of padding above the content — an untitled admonition is now just its body in the panel. Titled and collapsible admonitions are unchanged.

Abbreviations backmatter only when the article uses abbreviations. A page that declared frontmatter abbreviations it never used previously showed an enabled but empty Abbreviations section, and an outline entry, that rendered nothing. The gate and the rendered section now read from the same list, so they cannot disagree.

Hero has a bottom margin. Content after a hero section no longer runs straight into the hero’s background.

Landing preset hides the license description by default. It joins the abbreviation list and the bibliography as content the landing preset drops. Set hide_license_description: false to bring it back.

Restyled Curvenote and supported-by footers. Both footers now sit on the same neutral stone background, their social icons are limited to Bluesky and LinkedIn, the supported-by footer defaults to “Hosted by” instead of “Supported by”, and the link row is a single “Terms & Privacy” link in place of separate Mission and Legal links — matching the Curvenote footer.

Curvenote Theme

Redirects wired into the app. A site’s theme_config.redirects rules take effect in three places in Curvenote Theme. Root middleware handles matched routes, so a redirect short-circuits before any route loader fetches content. A new splat route handles paths that match no route at all. The $info and home loaders apply the $notFound group when the CDN has no page for a slug that otherwise routes fine — article routes deliberately do not, since a mistyped DOI showing an error page is better than it silently bouncing off-site. Wiring the splat route also means an unknown URL now renders the styled error page inside the real site header and footer instead of the bare fallback.

A hide_site_footer design option. Sites can suppress the shared journal footer entirely. A configured brand footer still renders on its own; if there is none, nothing is output at all. The brand-footer text fields become optional to match.