Skip to content

Commit c62af1c

Browse files
Release blog post (#1920)
* Draft release post * Not draft for preview * Updates * Fix date * Typst post forthcoming * link to engine extension dev blog post * Update date --------- Co-authored-by: Gordon Woodhull <gordon.woodhull@posit.co>
1 parent afe4421 commit c62af1c

4 files changed

Lines changed: 332 additions & 0 deletions

File tree

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
[CoryMcCartan](https://github.com/CoryMcCartan),
2+
[DanChaltiel](https://github.com/DanChaltiel),
3+
[Data-Wise](https://github.com/Data-Wise),
4+
[FrankwaP](https://github.com/FrankwaP),
5+
[Joao-O-Santos](https://github.com/Joao-O-Santos),
6+
[LukasDSauer](https://github.com/LukasDSauer),
7+
[MBe-iUS](https://github.com/MBe-iUS),
8+
[MarcoPortmann](https://github.com/MarcoPortmann),
9+
[MariaBarrioSchez](https://github.com/MariaBarrioSchez),
10+
[MateusMolina](https://github.com/MateusMolina),
11+
[Selbosh](https://github.com/Selbosh),
12+
[ThePurox](https://github.com/ThePurox),
13+
[TucoFernandes](https://github.com/TucoFernandes),
14+
[aecoleman](https://github.com/aecoleman),
15+
[amirhome61](https://github.com/amirhome61),
16+
[andrewheiss](https://github.com/andrewheiss),
17+
[azankl](https://github.com/azankl),
18+
[bensoltoff](https://github.com/bensoltoff),
19+
[bruvellu](https://github.com/bruvellu),
20+
[byzheng](https://github.com/byzheng),
21+
[cbrnr](https://github.com/cbrnr),
22+
[chendaniely](https://github.com/chendaniely),
23+
[chi-raag](https://github.com/chi-raag),
24+
[christopherkenny](https://github.com/christopherkenny),
25+
[coatless](https://github.com/coatless),
26+
[cynthiahqy](https://github.com/cynthiahqy),
27+
[darwindarak](https://github.com/darwindarak),
28+
[davidskalinder](https://github.com/davidskalinder),
29+
[dmenne](https://github.com/dmenne),
30+
[fconil](https://github.com/fconil),
31+
[fkgruber](https://github.com/fkgruber),
32+
[fkohrt](https://github.com/fkohrt),
33+
[fredguth](https://github.com/fredguth),
34+
[gadenbuie](https://github.com/gadenbuie),
35+
[github-actions[bot]](https://github.com/apps/github-actions),
36+
[gsathler-vi](https://github.com/gsathler-vi),
37+
[hamgamb](https://github.com/hamgamb),
38+
[herosi](https://github.com/herosi),
39+
[icarusz](https://github.com/icarusz),
40+
[idavydov](https://github.com/idavydov),
41+
[jeremy886](https://github.com/jeremy886),
42+
[jkrumbiegel](https://github.com/jkrumbiegel),
43+
[jmcphers](https://github.com/jmcphers),
44+
[jonas37](https://github.com/jonas37),
45+
[jorherre](https://github.com/jorherre),
46+
[jreades](https://github.com/jreades),
47+
[jromanowska](https://github.com/jromanowska),
48+
[jtbayly](https://github.com/jtbayly),
49+
[juleswg23](https://github.com/juleswg23),
50+
[juliasilge](https://github.com/juliasilge),
51+
[kathsherratt](https://github.com/kathsherratt),
52+
[kusnezoff-alexander](https://github.com/kusnezoff-alexander),
53+
[lrrichter](https://github.com/lrrichter),
54+
[lwjohnst86](https://github.com/lwjohnst86),
55+
[maelle](https://github.com/maelle),
56+
[matthiasbaitsch](https://github.com/matthiasbaitsch),
57+
[mipmip](https://github.com/mipmip),
58+
[mstrms2000](https://github.com/mstrms2000),
59+
[multimeric](https://github.com/multimeric),
60+
[mvuorre](https://github.com/mvuorre),
61+
[mykolaskrynnyk](https://github.com/mykolaskrynnyk),
62+
[nichtich](https://github.com/nichtich),
63+
[nithinmkp](https://github.com/nithinmkp),
64+
[nrichers](https://github.com/nrichers),
65+
[orbsmiv](https://github.com/orbsmiv),
66+
[paytonej](https://github.com/paytonej),
67+
[petrelharp](https://github.com/petrelharp),
68+
[phongphuhanam](https://github.com/phongphuhanam),
69+
[pm-gusmano](https://github.com/pm-gusmano),
70+
[posit-snyk-bot](https://github.com/posit-snyk-bot),
71+
[prosoitos](https://github.com/prosoitos),
72+
[rabyj](https://github.com/rabyj),
73+
[sasja-san](https://github.com/sasja-san),
74+
[sbwiecko](https://github.com/sbwiecko),
75+
[serialc](https://github.com/serialc),
76+
[spaette](https://github.com/spaette),
77+
[spraetor](https://github.com/spraetor),
78+
[stragu](https://github.com/stragu),
79+
[szimmer](https://github.com/szimmer),
80+
[the-solipsist](https://github.com/the-solipsist),
81+
[thomasp85](https://github.com/thomasp85),
82+
[yyzeng](https://github.com/yyzeng),
83+
[zhe00a](https://github.com/zhe00a).
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
# Run using `quarto run get-contribs.R`
2+
3+
library(tidyverse)
4+
library(gh)
5+
library(glue)
6+
7+
last_release <- "2025-09-05T00:00:00Z"
8+
milestone <- "v1.9"
9+
10+
quarto_staff_vec <-
11+
c("allenmanning", "cderv", "cscheid", "cwickham", "dragonstyle",
12+
"jjallaire", "jooyoungseo", "kevinushey", "mcanouil",
13+
"rich-iannone", "gordonwoodhull", "tarleb", "vezwork", "mine-cetinkaya-rundel")
14+
15+
# Get milestone number -----
16+
17+
milestones <- gh("/repos/{owner}/{repo}/milestones",
18+
owner = "quarto-dev",
19+
repo = "quarto-cli")
20+
21+
milestone_number <- map_int(milestones, "number")[map_chr(milestones, "title") == milestone]
22+
23+
# Get cli issues tagged with current milestone -----
24+
25+
quarto_issues <-
26+
gh(
27+
endpoint = "/repos/quarto-dev/quarto-cli/issues",
28+
.limit = 2000,
29+
.progress = FALSE,
30+
.params = list(
31+
state = "all",
32+
milestone = milestone_number
33+
)
34+
)
35+
36+
quarto_issues_tbl <- map(quarto_issues, \(x) data.frame(login = x$user$login, html_url = x$user$html_url)) |>
37+
list_rbind()
38+
39+
# Get web issues since last release -----
40+
41+
quarto_web_issues <-
42+
gh(
43+
endpoint = "/repos/quarto-dev/quarto-web/issues",
44+
.limit = 1500,
45+
.progress = FALSE,
46+
.params = list(
47+
state = "all",
48+
since = last_release
49+
)
50+
)
51+
52+
quarto_web_issues_tbl <- map(quarto_web_issues, \(x) data.frame(login = x$user$login, html_url = x$user$html_url)) |>
53+
list_rbind()
54+
55+
# Put together, exclude staff and write to file -----
56+
57+
cli_and_web_users <- bind_rows(quarto_web_issues_tbl, quarto_issues_tbl) |>
58+
filter(!(login %in% quarto_staff_vec)) |>
59+
arrange(login) |>
60+
distinct()
61+
62+
strings <- cli_and_web_users |>
63+
glue_data("[{login}]({html_url}), ")
64+
65+
strings[length(strings)] <- str_c(str_sub(strings[length(strings)], 1, -3), ".")
66+
67+
strings |> write_lines("_contribs.md")
68+
Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
---
2+
title: Quarto 1.9
3+
description: |
4+
Quarto 1.9 adds publishing to Posit Connect Cloud, LLM-friendly website output, major Typst improvements, experimental PDF accessibility standards, and list tables for complex table content.
5+
categories:
6+
- Quarto 1.9
7+
- Releases
8+
author: Charlotte Wickham
9+
date: "2026-03-24"
10+
image: thumbnail.png
11+
image-alt: "Quarto 1.9"
12+
---
13+
14+
Quarto 1.9 is out! You can get the current release from the [download page](/docs/download/index.qmd).
15+
16+
Sharing your work just got easier with integrated Posit Connect Cloud publishing. Typst users will appreciate book project support and article layouts, while experimental PDF accessibility standards bring PDF/A and PDF/UA compliance to both LaTeX and Typst. This release also introduces LLM-friendly output for websites, the `quarto use brand` command for keeping your brand assets in sync, and list tables for authoring complex tables with familiar bullet syntax.
17+
18+
You can read about these improvements and some other highlights below. You can find all the changes in this version in the [Release Notes](/docs/download/changelog/1.9/).
19+
20+
## Publish to Posit Connect Cloud
21+
22+
You can now publish documents and websites to [Posit Connect Cloud](https://connect.posit.cloud) directly from the command line.
23+
For example, publish your Quarto website project with:
24+
25+
```{.bash filename="Terminal"}
26+
quarto publish posit-connect-cloud
27+
```
28+
29+
Posit Connect Cloud is a hosted platform for sharing data applications and documents without managing your own infrastructure. It includes a free tier for unlimited static document publishing.
30+
Read more in [Publishing > Posit Connect Cloud](/docs/publishing/posit-connect-cloud.qmd).
31+
32+
## Improvements to Typst Support
33+
34+
Quarto 1.9 brings substantial improvements to Typst output:
35+
36+
- [Book projects](/docs/books/book-output.qmd#typst-output) can now render to Typst via the bundled `orange-book` extension, with chapter numbering, cross-references, and professional textbook styling.
37+
- [Article layout](/docs/authoring/article-layout.qmd) support lets you place content in the margins, create full-width figures, or add side notes.
38+
- New options: `mathfont`, `codefont`, `linestretch`, `linkcolor`, `citecolor`, `filecolor`, `thanks`, and `abstract-title`.
39+
- [Theorem styling](/docs/output-formats/typst.qmd#theorems) with four appearance options: `simple`, `fancy`, `clouds`, or `rainbow`.
40+
41+
We'll have a detailed blog post on all the Typst improvements soon.
42+
43+
## PDF Accessibility (Experimental)
44+
45+
We're rolling out experimental support for PDF accessibility standards in 1.9. The new `pdf-standard` option enables PDF/A archival formats and PDF/UA accessibility compliance for both LaTeX and Typst outputs. Alt text from `fig-alt` attributes now passes through to PDF for screen reader support, and Typst gains support for alt text on cross-referenced equations.
46+
47+
Read more in our [PDF Accessibility and Standards blog post](/docs/blog/posts/2026-03-05-pdf-accessibility-and-standards/) or the documentation for [LaTeX](/docs/output-formats/pdf-basics.qmd#pdf-accessibility-standards) and [Typst](/docs/output-formats/typst.qmd#pdf-accessibility-standards).
48+
49+
## Output for LLMs
50+
51+
Quarto can now generate [llms.txt](https://llmstxt.org/) format output for your website, making your content more accessible to large language models and AI-powered tools.
52+
53+
Enable it in your website configuration:
54+
55+
```{.yaml filename="_quarto.yml"}
56+
website:
57+
title: "My Documentation"
58+
llms-txt: true
59+
```
60+
61+
When you render your site, Quarto creates:
62+
63+
- An `llms.txt` index file at the root of your site listing all pages
64+
- A `.llms.md` markdown file alongside each HTML page (e.g., `guide.html` gets `guide.llms.md`)
65+
66+
The markdown files contain clean versions of your content---navigation, sidebars, and scripts are stripped out; tables, code blocks, and callouts are converted to standard markdown.
67+
68+
Read more, including how to customize what appears in LLM output, in [Websites > Output for LLMs](/docs/websites/website-llms.qmd).
69+
70+
## `quarto use brand` Command
71+
72+
Keep your project's brand assets in sync with an external source using the new `quarto use brand` command:
73+
74+
```{.bash filename="Terminal"}
75+
quarto use brand myorg/shared-brand
76+
```
77+
78+
The command copies brand files from a GitHub repository, local directory, or zip archive into your project's `_brand/` directory. Quarto walks you through each step---confirming trust for remote sources, creating the directory if needed, and asking whether to overwrite or remove files.
79+
80+
See [Guide > Brand](/docs/authoring/brand.qmd#quarto-use-brand) for `--dry-run`, `--force`, and other options.
81+
82+
## List Tables
83+
84+
List tables provide a new syntax for creating tables with complex content---multiple paragraphs, code blocks, or nested lists---using familiar bullet syntax instead of grid table formatting:
85+
86+
::: {layout-ncol="2"}
87+
88+
:::: {}
89+
90+
```` markdown
91+
::: {.list-table}
92+
- - Function
93+
- Description
94+
95+
- - `sum()`
96+
- Add values:
97+
98+
```python
99+
sum([1, 2, 3])
100+
```
101+
102+
- - `len()`
103+
- Count items:
104+
105+
- Works on lists
106+
- Works on strings
107+
:::
108+
````
109+
110+
::::
111+
112+
:::: {}
113+
114+
::: {.list-table}
115+
- - Function
116+
- Description
117+
118+
- - `sum()`
119+
- Add values:
120+
121+
```python
122+
sum([1, 2, 3])
123+
```
124+
125+
- - `len()`
126+
- Count items:
127+
128+
- Works on lists
129+
- Works on strings
130+
:::
131+
132+
::::
133+
134+
:::
135+
136+
Each top-level bullet represents a row; nested bullets represent cells. This syntax is much easier to maintain than grid tables, especially when cells contain code or other block elements.
137+
138+
List tables support all the usual table features: captions, cross-references, column widths, and alignment. Thanks to Martin Fischer for the original development, with contributions from Albert Krewinkel and William Lupton.
139+
140+
Find all the details in [Guide > Tables](/docs/authoring/tables.qmd#list-tables).
141+
142+
## Other Highlights
143+
144+
- [Search Result Highlighting](/docs/websites/website-search.qmd#search-result-highlighting): Improved highlighting of search terms on destination pages, with persistent marks, automatic tab activation for matches inside tabsets, and cross-element highlighting for multi-word searches.
145+
146+
- Privacy-focused features for websites:
147+
148+
- [A privacy-first default for cookie consent](/docs/websites/website-tools.qmd#cookie-consent): The default for cookie consent has changed to `type: express`, providing opt-in consent that blocks cookies until users explicitly agree. This privacy-conscious default is designed with modern privacy regulations in mind.
149+
150+
- [Algolia Search Insights avoids cookies](/docs/websites/website-search.qmd#cookie-consent-and-user-tracking): Use Algolia Insights now uses persistent cookies only if `cookie-consent` is active, and the user has opted-in.
151+
152+
- [Use Plausible Analytics](/docs/websites/website-tools.qmd#plausible-analytics): Add privacy-friendly Plausible Analytics to websites via the `plausible-analytics` configuration option.
153+
154+
- [`aria-label` for videos](/docs/authoring/videos.qmd#accessibility-label): Improve accessibility of embedded videos by providing custom descriptive labels for screen readers instead of the default "Video Player" label.
155+
156+
- [New `syntax-highlighting` Option](/docs/output-formats/pdf-basics.qmd#syntax-highlighting): Replaces the deprecated `highlight-style` (Pandoc 3.8). Supports style names, custom `.theme` files, `none`, or `idiomatic` for format-native highlighting.
157+
158+
- Metadata and brand extensions now work without a `_quarto.yml` project. A temporary default project is created in memory.
159+
160+
- [Engine extensions](/docs/extensions/engine.qmd) allow replacement of the execution engine:
161+
- Julia is now a bundled extension instead of being built-in.
162+
- **quarto-marimo** will soon change from a filter extension to an engine extension.
163+
- New `quarto create extension engine` command.
164+
- New `quarto call build-ts-extension` command.
165+
- New **Quarto API** for engine extensions to use. (This is in flux and will not be documented for the next few releases, but [there is a dev blog post about it](https://quarto-dev.github.io/dev-notes/posts/2026-03-04/).)
166+
167+
Dependency updates:
168+
169+
- `pandoc` updated to 3.8.3
170+
- `typst` updated to 0.14.2
171+
- `esbuild` updated to 0.25.10
172+
- `deno` updated to 2.4.5
173+
- `mermaid` updated to 11.12.0
174+
175+
## Acknowledgements
176+
177+
We'd like to say a huge thank you to everyone who contributed to this release by opening issues and pull requests:
178+
179+
{{< include _contribs.md >}}
180+
181+
The airplane departure emoji in the [listing and social card image](thumbnail.png) for this post comes from [OpenMoji](https://openmoji.org/){.external}– the open-source emoji and icon project. License: [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/#){.external}
56.6 KB
Loading

0 commit comments

Comments
 (0)