Changelog

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.

Extensions get first-class rows in the work timeline

A new API that lets Curvenote SCMS extensions contribute their own rows to the work-version timeline. Alongside it, deployers get a real hand on dashboard task layout, and Curvenote-hosted sites open on the submissions listing with a refreshed submission details page.

Curvenote SCMS

Extensions get first-class rows in the work timeline. Curvenote SCMS extensions can now register ExtensionTimelineItem descriptors and have them rendered alongside the built-in kinds on the work-version timeline.

Deployers control dashboard task sections, and Check My Work carries a NEW badge. The dashboard now takes a dashboard.tasks.sections config: each section names a heading, a set of task categories to include, and an optional ordered list of task ids to pin. Unlisted eligible tasks append after in alphabetical order. Task ids come from each extension’s task definitions and from any built-in tasks the deployer opts in. On the dashboard itself, the Check My Work task card now carries a small green NEW badge in its top-right corner, so operators can flag freshly added tasks to their contributors at a glance.

A deployer-configured task section on the dashboard: the heading, which tasks appear, and their order all come from config, and recently added cards carry a green NEW badge.

Figure 1:A deployer-configured task section on the dashboard: the heading, which tasks appear, and their order all come from config, and recently added cards carry a green NEW badge.

Curvenote Sites

Sites open on the submissions listing. Visitors landing on a Curvenote-hosted site are now taken straight to the submissions listing instead of the older inbox placeholder, so the first click already shows the site’s queue.

A refreshed site-admin submission details page. The submission details page opens with a scannable summary card — title, authors, description, DOI, published date — replacing the older social-media card. Collection, kind, slug, and publication-date edits move out of ad-hoc popovers into confirmable dialogs behind a shared editor shell, so accidental attribute or slug changes are caught before they land. Kind editing now stays safe when the current collection is missing, and the details card carries an inline status banner for the submission’s state.

The refreshed submission details page leads with a scannable summary card and an inline status banner, then lists the editable attributes — publication date, collection, kind, slug, and DOI — each behind a confirmable dialog, with the version timeline underneath.

Figure 2:The refreshed submission details page leads with a scannable summary card and an inline status banner, then lists the editable attributes — publication date, collection, kind, slug, and DOI — each behind a confirmable dialog, with the version timeline underneath.

Curvenote sites can ship their own render plugins

Sites can now ship their own render plugins reaching the Curvenote CLI, Curvenote Theme, and the Reader together, so a site can customize how its content renders without a theme rebuild. Alongside that, Curvenote SCMS now runs end-to-end against a local S3-compatible storage stack out of the box, and Curvenote Theme picks up two article-layout options that make content-grid and centered-logo choices selectable from config for the first time.

Curvenote SCMS

Curvenote SCMS runs fully local, out of the box. The stack now boots end-to-end against a local S3-compatible object store, so contributors and operators evaluating Curvenote SCMS can bring the whole system up on a fresh clone without cloud credentials. Signed upload URLs and content-delivery reads route through a browser-reachable endpoint, and a shared bucket-resolution helper makes sure that files copied between public and private buckets after upload still sign against the right host.

Base-platform hooks for a new Foundry extension. Curvenote SCMS gains the platform pieces an extension needs to run a scoped upload wizard: richer descriptions in the Create Work dropdown, a resume-draft route so an extension can pick up a partially uploaded work, and an optional path filter on document-preview fetches so a wizard can request a main-manuscript-only preview without changing behavior for anything else.

A coordinated ecosystem security upgrade across Curvenote SCMS and the Curvenote CLI clears a batch of open security advisories together, and lifts the shared routing, token, and validation libraries onto aligned versions so future dependency updates land in one place instead of split across packages.

Curvenote Reader

Backmatter and the “On this page” outline read from one table. The list of backmatter sections — with each section’s anchor, title, visibility, and design gating — is now the single source of truth for both the outline and the Backmatter component, so the two can no longer drift out of sync. Two bugs come out with it: a footnote-reference that had no matching footnote definition no longer reports a footnotes section that will not actually render, and abbreviations declared in frontmatter are now detected in the no-argument callers where they were previously missed.

The “On this page” outline and the Backmatter component now read from the same table, so sections like Acknowledgements, Footnotes, Abbreviations, and References are now also listed.

Figure 1:The “On this page” outline and the Backmatter component now read from the same table, so sections like Acknowledgements, Footnotes, Abbreviations, and References are now also listed.

openRxiv Labs — Curvenote Reader

openRxiv Labs

This section covers work on the openRxiv Reader, part of openRxiv Labs — the openRxiv preprint reader powered by Curvenote Reader.

JATS ingestion gets more forgiving. Article subjects are now normalized consistently across the JATS conversion pipeline, and articles that use a bare <table> element (without a <table-wrap> parent) are now ingested cleanly — fixing article rendering for JATS documents that don’t wrap tables the “standard” way.

Cold-start and route-bundle fixes. The openRxiv Reader now loads its own app configuration before the runtime tries to resolve it (fixing an intermittent cold-start crash).

Curvenote Theme

Sites can ship their own render plugins. Curvenote Theme now loads site-declared render plugins at page load, keeps them across configuration reloads, and rewrites plugin URLs locally against the site’s content-delivery origin — so a site operator can drop in a customized renderer for a directive or a figure type without a theme rebuild. See documentation on adding a render plugin to a site for the details.

A fancy-note directive drawn by a renderer the site ships itself: the body is ordinary MyST, while the badge, frame, and striped background come entirely from the site’s own plugin.

Figure 2:A fancy-note directive drawn by a renderer the site ships itself: the body is ordinary MyST, while the badge, frame, and striped background come entirely from the site’s own plugin.

Two design options reshape article layout. A new content_grid option makes the article-grid variants — default (with a margin column), centered, and left-pinned — selectable from a site’s design configuration. A companion center_nav_logo option lifts the site logo out of the header flow and centers it, with nav links moved to the left so they cannot collide with it.

Buttons render with a pointer cursor again. A recent regression in the underlying design system’s preflight stripped the pointer cursor from every unstyled button; the shared button base now sets it once so every button in every Curvenote theme shows the right cursor.

Curvenote CLI

Anonymous curvenote start and curvenote build. The Curvenote CLI no longer requires a login token to run curvenote start or curvenote build, so continuous-integration jobs and first-time users can preview and build a Curvenote site on a fresh install without an account.

Site-shipped render plugins on the CLI side. The CLI bundles a site’s own render plugins as part of build, start, and deploy — with an incremental cache that skips rebundling when the source graph has not changed, and a soft-fail path that continues the build with a clear error if a plugin cannot be emitted.