Repository navigation
Releases: pndv/typst-renderer
Release list
0.6.2
What's Changed
[0.6.2] - 2026-09-25
Added
- A notification when a tinymist you installed yourself is older than the version the plugin is tested with. A
tinymist from Cargo, Homebrew, Scoop, winget or a manual download is never written over; instead the plugin tells you
which version it expects, once per IDE session, with a link to that release's notes. Skip this version keeps it
quiet until a plugin update moves to a newer tinymist, and Don't ask again switches it off — it can be turned back
on under Settings > Tools > Typst Renderer. A tinymist newer than the tested version is left alone.
Changed
- tinymist updated to v0.15.8 (from v0.15.2). Every command the plugin sends, and the shape of every answer it
reads back, was checked against the new version and found unchanged; the live preview's own page was rebuilt upstream
and still renders in the IDE's embedded browser.
Fixed
- A tinymist downloaded by the plugin now follows the plugin when it updates. A binary used to be downloaded once
and kept for good, so plugin updates that moved to a newer tinymist never reached existing installs — they stayed on
whatever version they first downloaded. Downloads now live in a folder named after the version the plugin is built
for, so a plugin update that changes it fetches the matching tinymist the next time a.typfile is opened, and
removes the old one once nothing is running it. A plugin release that moves back to an earlier tinymist rolls the
binary back the same way. - No language-server start attempt for a restored
.typtab whose folder no longer exists. A file opened from
outside the project, whose folder had since been deleted or belonged to another machine, was still handed to a new
language server on the next IDE start, which failed and logged aWorkingDirectoryNotFoundException. The folder is
now checked on disk first. - Downloading tinymist from the settings while the language server was running failed on Windows, which refuses to
delete or overwrite the image file of a live process. The old binary is now moved aside to free the name and removed
once nothing is running it — and if the replacement cannot be completed, the original is put back rather than
leaving no language server at all.
Full Changelog: 0.6.1...0.6.2
0.6.1
What's Changed
Fixed
- Syntax colouring now covers the Typst-specific semantic tokens. Constructs such as booleans, headings, raw blocks,
references, labels and markup emphasis were reported by tinymist under token type names the platform does not
recognise, so they were left uncoloured. These are now mapped to matching IntelliJ text attributes, and semantic
tokens are requested for the Typst language regardless of the platform's built-in language restriction (issue #115).
Changed
- Build tooling updated to Gradle 9.7.1.
Pull Requests
Full Changelog: 0.6.0...0.6.1
0.6.0
What's Changed
Added
- A "New → Typst File" action is now available. Right-click a directory in the Project view — or use File → New —
and choose Typst File to create a.typfile with the right extension and icon already applied, instead of using
New → File and typing the extension by hand (issue #126). - Ten live templates for common Typst patterns. Type an abbreviation and press Tab to expand boilerplate
for a heading, figure, table, math block, list, footnote,setrule,showrule, import, or page-setup rule, with
tab-stop navigation between the placeholders. Available under Settings > Editor > Live Templates > Typst, and
scoped to.typfiles only (issue #123).
Changed
- The Typst file icon has been redesigned. The previous icon reused the plugin's own "renderer" branding, which
looked out of place as a file icon; the new one follows the JetBrains file-icon style used by languages like JS and TS
(issue #116). - Opening
.typfiles no longer repeatedly re-scans the filesystem for the tinymist binary — the resolved path is now
cached. The plugin'sbin/download directory is no longer created as a side effect of every lookup, only when a
binary is actually downloaded there (issue #54). - Reduced token and PSI overhead on documents with large blocks of indentation or blank lines: the lexer now groups a
run of whitespace into a single token instead of creating one token per character (issue #55).
Fixed
- Closed a latent gap in the Typst Output console's disposal wiring where a console rebuilt mid-session (not currently
reachable through any existing action) could be left live but silently unreferenced, permanently dropping further
output. Defensive fix; no known way to trigger it today (issue #125).
PRs
- Changelog update -
0.5.1by @github-actions[bot] in #119 - Improve whitespace handling and enhance binary management in TinymistManager by @pndv in #121
- Update Typst SVG Icon (fixes #116) by @pndv in #122
- Update dependency com.squareup.okhttp3:mockwebserver to v5.5.0 by @renovate[bot] in #120
- Add Live Templates Support for Typst Language by @pndv in #124
- Improve console disposal logic in TypstOutputToolWindowFactory by @pndv in #125
- Add "New Typst File" action by @pndv in #127
- Release 0.6.0 by @pndv in #128
Full Changelog: 0.5.1...0.6.0
0.5.1
Added
-
Renaming a
.typfile now updates the files that import it. Renamingchapter.typused to leave every
#import "chapter.typ"elsewhere in the project pointing at a file that no longer existed, so the document stopped
compiling until each one was corrected by hand. The rename now asks tinymist which paths the change invalidates and
rewrites them in the same step, so a single undo takes the whole thing back (issue #114). -
A file can be renamed from its own import statement. Put the cursor on the path in
#import "chapter.typ": *,
press Shift+F6, and the file on disk is renamed along with every path that refers to it — useful when the
file you want to rename is one you are reading about rather than one you have in front of you (issue #114).
Fixed
-
Renaming a
.typfile is no longer silently ignored. Choosing Rename on a.typfile in the Project view —
or pressing Shift+F6 on it — did nothing at all: no dialog, no error, no change. The plugin's symbol-rename
support was claiming the file-rename action as well and then had nothing to do with it, which left the IDE's own file
rename with no chance to run. Symbol rename inside the editor was unaffected and continues to work as before (issue
#114). -
The rename dialog is pre-filled with the right name. It offered a name worked out by scanning the text around the
cursor rather than the one the language server reported, so anything that was not a plain identifier came through
truncated — renaming an import path calledchapter.typwas offered aschapter. The server's name is now used for
every rename (issue #114). -
Rename is no longer sent to the wrong language server. With a
.typfile open from outside the project, a rename
could be handed to the server responsible for that outside folder, which knows nothing about the project's files and
answers nothing — so the rename appeared to refuse for no reason, reporting that the symbol could not be renamed. The
request now goes to the server that owns the file, and waits for one that has finished starting up (issue #114).
Infrastructure
- Gradle upgraded to 9.7.0
Known issues
- Renaming a
.typfile straight after starting the IDE does not update the files that import it. The import paths
are worked out by the tinymist language server, which does not start until the first.typfile is opened — so a
rename done before that renames the file and leaves every#import "old.typ"untouched, without saying so. Opening
any.typfile first is enough to avoid it. Being fixed for 0.5.2 (issue #117).
What's Changed
- Changelog update -
0.5.0by @github-actions[bot] in #113 - Fix rename refactoring (#114) and Release 0.5.1 by @pndv in #118
Full Changelog: 0.5.0...0.5.1
0.5.0
Added
- Live preview that updates as you type. The preview pane can now render through tinymist's own preview engine
instead of exporting a PDF and displaying it. Edits appear in the pane within a few milliseconds of the keystroke — no
save, no export, and only the changed part of the page is redrawn. A Live / PDF toggle in the preview toolbar
chooses the renderer per editor tab, so several.typfiles can be open in different modes; the new Default preview
mode setting picks what a freshly opened tab starts in. Live preview is the default. If it cannot start — an old
tinymist, a refused port — the pane falls back to the PDF renderer on its own and says so in the Typst Output console.
Compile and Export write a PDF and report to the console whichever renderer the pane is using, and never
switch it: a pane in PDF mode reloads, a pane in Live mode carries on rendering live (issue #109). - Editors showing the same document share one live preview. With a main entry pinned, every open chapter compiles
through that main, so they all display the same document — one render serves them all, started when the first such tab
opens and stopped when the last one closes. With no main entry pinned, every file gets its own live preview, as do
.typfiles outside the project (issue #109). - The live preview follows the cursor. It scrolls to the part of the document you are editing, keeps up as you move
around, and re-syncs when you switch back to a tab — so the preview shows the passage you are working on rather than
wherever you last left it. Turn it off with Scroll the live preview to follow the cursor in Settings > Tools >
Typst. Two things to know: editors sharing one live preview scroll together, because the scroll belongs to the shared
render rather than to a pane; and a file opened for the very first time has its cursor at the start, so the preview
begins at the top of the document until you move it (issue #109). - Click the preview to jump to the source. Clicking a spot in the live preview takes the editor to the matching
place in the.typfile that produced it, opening the file if it is not already open — useful in a multi-file
project, where the passage you are looking at often lives in a chapter you do not have in front of you (issue #109). - Pin a main entry file for multi-file projects. In a project where
main.typ#includes a tree of chapter files,
opening a chapter on its own used to compile it in isolation, so every cross-file reference (@ch:casespointing at a
label declared elsewhere) reported "label does not exist" — errors that vanished only whenmain.typwas reopened.
Right-click a.typfile and choose Pin as Typst Main File (or set it in Settings > Tools > Typst > Project
Overrides) and the whole project is compiled through that entry instead: cross-references resolve, the editor stops
reporting phantom errors, and the preview shows the complete document while you edit any chapter. Unpin Typst Main
File reverts to compiling whichever file is focused. The pin is re-applied automatically whenever the language
server restarts (issue #97).
Fixed
- tinymist is no longer re-downloaded after every plugin update. The managed binary was kept inside the plugin's
own installation folder, which an update deletes and replaces, so each upgrade silently threw it away and downloaded
it again. It now lives alongside the IDE's other cached data and survives updates. Upgrading to this version
downloads it once more, into the new location. - The preview no longer gets stuck on "Compiling…" after a compile fails. A failed compile now keeps its error pane on
screen until the next successful compile, instead of being painted over by the waiting splash and hiding the
diagnostic (issue #98). .typfiles outside the project are compiled as themselves even when a main entry is pinned, rather than being
redirected to the project's document (issue #99).- Several reliability problems on the compile path (issue #101):
- Compiling no longer fails with "failed to persist temporary file: Access is denied" when several editor tabs refresh
at once; simultaneous compiles of the same document are now merged into one. - Compile requests are no longer sent to the wrong language server, which reported "file not found" for files that
exist — most visibly after a file was created or replaced outside the IDE. - Applying a project setting no longer leaves out-of-project
.typfiles without a language server until their editor
is closed and reopened. - Compile now saves modified files first, so it no longer produces a PDF of the previously saved text while
reporting success. - A language server that stops unexpectedly is restarted automatically, instead of leaving the preview waiting
indefinitely.
- Compiling no longer fails with "failed to persist temporary file: Access is denied" when several editor tabs refresh
Changed
- Saving no longer writes a PDF while the preview is in Live mode. Previously the preview refreshed by exporting, so
every save left an updated PDF in the export directory (target/by default) as a side effect. A live preview renders
without producing a file, so with the new default the PDF on disk is written only when you ask for one — Compile
(Ctrl+Shift+T) or Export. If you relied on save-writes-a-PDF (a build script watching
target/, an external viewer open on the file), switch the preview toolbar toggle to PDF, or set Default preview
mode to PDF to restore the previous behaviour everywhere. - The preview follows your typing rather than your saves. In Live mode the pane no longer waits for
Ctrl+S. It can be put back on a save cadence with the Update live preview on every keystroke setting
without leaving Live mode. - A compile error leaves the Live preview showing the last good version, not an error page. The live renderer keeps
the most recent successful render, so a document that has never compiled shows an empty pane instead of a message.
The errors themselves are unaffected — they appear in the editor gutter and in the Typst Output console as
before. Switch the pane to PDF for the previous behaviour, where a failed compile replaces the preview with an
error page. - Jumping from the preview to the source does not move the keyboard focus when the target file is already open in
front of you: the line is highlighted, but the cursor stays where it was and typing still goes to the preview. Click
into the editor to carry on. Jumping to a file that is not already open behaves normally, placing the cursor and
moving focus with it. This is the IDE's handling of the language server's request rather than a limit of Typst
itself, and it is being tracked for a follow-up. - The bundled tinymist language server is now pinned to v0.15.2 (from v0.14.18). Users who already have an
auto-downloaded tinymist keep their existing binary — the new pin applies to fresh downloads.
0.4.3
Fixed
- The live PDF preview no longer crashes with
NoClassDefFoundError: com/intellij/ui/jcef/JBCefApp
on the 2026.2 line. From build 262 the platform ships JCEF as a separate bundled plugin (com.intellij.modules.jcef)
that is no longer on every plugin's classpath by default; the plugin now declares a dependency on it so the embedded
browser previewer loads. .typfiles opened from outside the project (a résumé in the home directory, a one-off letter on another drive)
now get a language server, so compile and the live preview work for them. The platform only lets a plugin start an LSP
for files inside the project's content roots; such files now get their own tinymist client rooted at the file's
folder, started explicitly on editor open and swept up at project startup. The exported PDF lands in the configured
export directory (defaulttarget/) next to the file (issue #92).
Changed
- The minimum supported build is now
262(2026.2); the supported range is262.*. The 2026.1 (261)
line is no longer supported — the JCEF split that broke the preview only exists from 262, and pinning the baseline
there keeps the plugin descriptor honest.
Infrastructure
- Six extension-dependent integration tests are now gated behind a plugin-loaded check. The minimal 2026.2 test
framework omitsintellij.libraries.lucene.common, which excludes the plugin from plugin-set resolution so its
extensions never register; the affected tests skip with a logged reason on that platform and run in full again once a
complete test framework ships. The real IDE is unaffected — the JetBrains Plugin Verifier reports the plugin
compatible withIU-262.8665.258.
0.4.2
A maintenance release: auto-format now works on prose-heavy documents, and the plugin is compatible with the 2026.2
line following the migration to the platform's LspClient integration API.
What's Changed
- Changelog update -
0.4.1by @github-actions[bot] in #75 - Update versions and dependencies by @pndv in #76
- Centralise Workflow Action Versioning by @pndv in #77
- Update qodana to v2026.1.3 by @renovate[bot] in #78
- Update Gradle to v9.6.0 by @renovate[bot] in #79
- Add Gradle wrapper version drift-guard and realign gradleVersion by @pndv in #82
- Update dependency org.jetbrains.intellij.platform to v2.17.0 by @renovate[bot] in #81
- Migrate to LspClient API and Update Build Compatibility by @pndv in #84
- Update Gradle to version 9.6.1 by @pndv in #86
Full Changelog: 0.4.1...0.4.2
0.4.1
What's Changed
- Changelog update -
0.4.0by @github-actions[bot] in #49 - Enhance PDF Export Handling, Modal Progress Handling and Remove obsolete code by @pndv in #73
Full Changelog: 0.4.0...0.4.1
0.4.0
What's Changed
- Migrate to tinymist LSP for PDF export and compilation by @pndv in #48
- Improve localisation, UI consistency, and theming support by @pndv in #43
- Update dependency mozilla/pdf.js to v6 by @renovate[bot] in #41
- Update dependency com.squareup.okhttp3:mockwebserver to v5 by @renovate[bot] in #39
- Update codecov/codecov-action action to v7 by @renovate[bot] in #46
Full Changelog
[0.4.0] - 2026-06-10
The plugin now compiles entirely through the bundled tinymist language server — the standalone typst
command-line binary is no longer invoked. This release stops using the typst CLI; the CLI-backed code remains
in the tree, unwired, as a revert hatch and will be removed in a later release.
Added
- Per-project export directory setting (
typstExportPath, defaulttarget) on the project-scoped settings page.
The plugin wraps it as tinymist's$root/<dir>/$dir/$nameoutput template, so the source tree is mirrored under the
chosen directory and every file keeps a unique output path. TinymistCommands— a typed wrapper over tinymist'sworkspace/executeCommandsurface (tinymist.exportPdf,
tinymist.pinMain,tinymist.getServerInfo), with a structuredExportPdfResult(Exported/Failed/
Unavailable) that carries tinymist's formatted compile diagnostic instead of scraping stderr.
Changed
- Manual Compile now triggers a tinymist
tinymist.exportPdfexport rather than spawning atypst compile
subprocess. The PDF is written to the configured export directory and the path is taken from tinymist's response. - PDF preview now drives compilation itself: opening a preview, or saving the previewed file, runs a debounced
tinymist.exportPdfand reloads the panel from the returned path — there is notypst watchsubprocess. A successful
render hot-swaps the PDF in place (preserving scroll); the panel falls back to a full reload only when the viewer page
is not currently shown. - Preview startup is gated on the language server being ready: while tinymist is still starting, the panel shows a
waiting page and polls for readiness rather than reporting spurious "no PDF returned" errors. Transient export
failures while the server is up are retried briefly before surfacing a hard error. - The compile diagnostic shown in the Typst Output console is now tinymist's own formatted
error: …text
(multi-line, with file-location links preserved), replacing the previous stderr parsing. - The tinymist binary is pinned to v0.14.18 as the download target, which includes the workspace-root output-path
fix required for the default export layout.
Removed
- The explicit Watch action — both the editor right-click "Watch Typst File" entry and the Watch toggle on the Typst
Output toolbar. An open preview now recompiles automatically on every save and so serves as the live watch; the
standalone "watch and write to the project without an open preview" workflow is dropped for the time being. - The typst CLI settings UI — the "Compilation (Typst CLI)" group (binary-path field, "Download typst" button,
status row, and auto-compile-on-save checkbox) has been removed from the Typst settings page, since compilation now
goes through tinymist. The underlying settings keys and download service are retained internally for now.
Tests
TinymistCommandsTest— covers the export-path extraction, error formatting, and Rust-debug unescaping helpers.TypstFilePreviewerDecisionsTest— covers the preview pipeline's readiness-poll, transient-retry, and
hot-swap-vs-full-navigation decisions, plus theExportPdfResultcontract.TinymistLspServerDescriptorTest— covers the export-directory → output-path template construction.
Infrastructure
- PDF.js held at the 4.10.x line with a Renovate
<5.0.0ceiling and a build-gate assertion, so an automated bump can't
silently move past what the bundled JCEF Chromium supports.
Full Changelog: 0.3.0...0.4.0
0.3.0
What's Changed
- Add hyperlinked Typst diagnostics in Typst Output window
- Add project-level overrides,
- Refine CLI argument handling
- Improve release workflow
- Extract reusable logic
- Enhance test coverage
Full Changelog: 0.2.0...0.3.0