[1.33.0] - 2026-11-09
Added
- A welcome file that shows every feature, in your language.
comdtex.mdwas a Spanish-only tour from March that predated data tables, plots from data, units, callouts, footnotes, Mermaid, and the whole computational biology layer. It is now written in English or Spanish (the interface language) with a live example of each feature, and a newcomdtex-examplesfolder holds what those examples read: a biology note (pipeline values withval(), gene and species conventions, accession links, a:::seqblock, supplementary numbering), CSV and JSON results files and a figure. - Restore example files in the command palette writes a fresh copy of the welcome and example files whenever you want one. Any file you changed is kept beside it as
name-old.mdfirst.
Changed
- English is the default interface language. A new install starts in English; Settings > General > Language switches to Spanish. Installs that already saved their settings keep the language they had.
- New-from-template documents follow the interface language. The notes, article, problem set, theorem sheet, research note, Overleaf paper, thesis and lecture-notes templates were Spanish for everyone; an English interface now creates them with English headings and prompts (same structure). Journal templates were already English and custom templates are untouched.
- Old welcome files are updated. The welcome file used to be created only when missing, so a vault never saw a newer one. On open, an untouched copy from an earlier version is now replaced by the current one; an edited copy is kept as
comdtex-old.mdbefore it is replaced; a copy you turned into your own note is left alone. - A deleted welcome file stays deleted. It used to come back every time the vault opened without saved tabs.
- LaTeX export speaks the document's language. An English document (interface in English, or
lang: enin its frontmatter) exported Spanish theorem names,Figura~\ref,Tabla~\ref,sección~\refand\usepackage[spanish]{babel}. It now exports Theorem, Figure, Table, Section and English babel; journal classes get English theorem names too. Spanish documents export exactly as before. - Generated folder files, the
macros.mdstarter and the Help panel samples follow the interface language. Task, calendar and index files were always written in Spanish, and so were the comments of a newmacros.mdand the examples in the Help panel. - Insert snippets use English placeholders in the English interface (text, item, title, statement and the rest), where they were Spanish in every language.
- The preview shown while no file is open is now a short pointer to
comdtex.mdin the interface language, instead of a second Spanish-only tour.
Fixed
- Saving a .tex file no longer rewrites its references. Every open and save added another name in front of each figure, table and section reference (
Figura~\ref{fig:a}becameFigura~Figura~\ref{fig:a}, then three, and so on),\ref{thm:x}was saved as@thm:x, which is not LaTeX, and a reference at the end of a sentence took the full stop into its label. References now round-trip byte for byte. The names follow the language the file was written in (Figura or Figure), and new files use the document language; a bare\ref{fig:x}or a hand-writtenFig.~\refis left as written. - The local agent CLI works inside your vault. The AI assistant's CLI provider (
claude -p,opencode run) was started without a working directory, so it ran wherever ComdTeX was launched and could only reach the folders its own settings allow (often just /tmp and Downloads), never your notes. It now runs in the open vault, is told so, and reads files there; edits still go through the editor. - Shorthands inside display math.
$$frac(1, 2)$$,$$sum(n=1, 100)$$and labeled inline math such as$sqrt(2)$ {#eq:x}reached the preview as raw text since 1.1.0. Exports were not affected. - Embeds written in code stay code.
`![[note]]`in inline code or a fenced block was expanded into a "Not found" box instead of showing the syntax. - The new welcome file appears in the file tree right away, instead of after the next refresh.
- Biology journal templates start clean. The biology check flagged PLOS, ONE, LB, DOI and URL as gene symbols in the PLOS, Bioinformatics, bioRxiv and BMC templates, and asked PLOS and Bioinformatics papers for a Data availability section the templates did not have. Common publishing and statistics acronyms are no longer read as genes, and both templates now include the section.
[1.32.0] - 2026-11-03
Added
- Ctrl+P finds more than file names. Past the first letter, a plain search also lists matching commands, headings of the open document, labels from the vault, citations (Enter inserts it) and settings by name (Enter opens the right tab), each as its own short group under the files. Prefixes (
>,@,#,[,:,?) work exactly as before. Files now show an icon for spreadsheets, bibliographies and code or data files. - Commands accept verb plus noun and synonyms.
Abrir Configuración,open settings,abrir ajustesandpreferenciasall find the Settings command (filler verbs are ignored, ajustes, configuración and preferencias are treated as the same word, and words can come in any order). - Typos in file names are forgiven. When nothing matches, Ctrl+P offers "Similar files" within one or two typos of every word you typed (
itroductionfindsintroduction.md). - Dataset names after
val(. Typingval(offers the datasets declared with:::data{#data:name}in the note, with the file each one reads, and accepts them typed asname,@nameordata:name. - Completion understands Spanish and accents.
teorema,lema,demostración,matriz,raíz,fracciónand other Spanish names find the block types and shorthands;\alfa,\raiz,\infinitofind the LaTeX commands; wikilinks, citations and labels match without accents (teoriafindsTeoría) and wikilinks accept the words in any order (gap spectralfindsspectral-gap). - LaTeX commands by part of the name.
\arrownow lists\rightarrow,\leftarrowand the rest after the prefix matches, and inside math a bare word such asalpha,alfaorinfoffers the symbol with its backslash. - References by word. After
@,@theorem:,@teorema:,@ecuacion:and the like complete to the short kind, and@mixinglists labels of any kind whose name or title contains the word, inserting the full@thm:mixing. - Choose your typography. Settings now has three typeface pickers: interface (General), editor (Editor) and preview (Preview). Each offers Default (the current look, so nothing changes until you choose), a short list of suggested stacks (Inter, Fira Code, Cascadia Code, Source Code Pro, Latin Modern, EB Garamond, Georgia and more) and every font installed on your system, each name shown in its own typeface with a live sample underneath. The editor list shows only monospace fonts. The desktop app scans system fonts once per session on a background thread; nothing is downloaded.
Fixed
- Highlight colours show their swatch. The Textos > Resaltar submenu and the palette entries rendered an empty square instead of the colour; each entry now shows the highlight colour it inserts, in every theme.
- In-app updates no longer break installs made by the Arch installer. On Arch-based distros the one-line installer runs ComdTeX unpacked, with its bundled libwayland removed. The updater replaced that copy with a raw AppImage, which needs FUSE 2 to start and lost the patch, so after an update ComdTeX could stop opening from the launcher and the terminal. Unpacked copies (and source builds) now show the update with a "Copy update command" button that copies the installer command instead of installing; AppImage,
.deband Windows installs still update in place. If an earlier update already left you with a copy that does not start, run the installer again. - The installer warns when FUSE 2 is missing. Outside Arch, the one-line installer now checks for
libfuse.so.2, which the AppImage needs and newer distros (Ubuntu 24.04, among others) no longer install by default, and names the package to install. - The update banner no longer overflows. When the release notes are only a link, the banner shows a "Release notes" link instead of the raw URL, and longer notes wrap inside the card.
[1.31.0] - 2026-11-03
ComdTeX for computational biology, and in-app updates that finally arrive. Highlights:
- Your paper reads your pipeline's results:
val(stats, pvalue, p)prints a number from a CSV or JSON results file, the same in the preview and every export. - Biology conventions: accession numbers link to their database, gene symbols follow your organism (
comdtex.organism), species are named in full before they are abbreviated, and a note asks for a Data availability section. All opt-in withcomdtex.domain: biology. - Supplementary figures and tables numbered S1, S2 after a
<!-- supplement -->line, and:::seqblocks for DNA, RNA and protein. - PubMed citations by PMID or PMCID, and templates for PLOS, Bioinformatics, BMC and bioRxiv.
- Quarto, R Markdown and Jupyter:
.qmdand.Rmdopen and save untouched, and notebooks import. - In-app updates work: from this version on, ComdTeX tells you when a new one is out.
Added
- The paper reads your pipeline's results.
val(stats, pvalue)puts a number from a results file (CSV or JSON, declared once with:::data) into your prose and math, by row key, spreadsheet cell (B4) or JSON path (metrics.auc), with optional formats3sf,.2f,.2eandp(p < 0.001). It composes withsi(val(stats, effect, 3sf), mg/L), prints the same number in the preview and in every export, refreshes when the results file changes, and a missing value shows a visible note plus an editor warning. - Accession numbers link to their database. With
comdtex.domain: biology, ids such asMN908947.3,NM_000546.6,SRR1234567,PRJNA123456,GSE12345,E-MTAB-1234andENSG00000141510become links in the preview and\hrefin the LaTeX export (alsoPDB 1ABCandUniProt P04637, only when the database name is written). Code, math, existing links and headings are left alone, and your file is never changed. The editor also notes when a biology document cites accessions, mentions sequencing data or has a References section but no Data availability section. - The biology check knows mouse genes from human ones. Add
comdtex.organism: human | mouse | rat | zebrafish | drosophila | yeast | bacterianext tocomdtex.domain: biologyand the check follows that organism's gene and protein conventions:TP53for human,Trp53for mouse and rat,tp53for zebrafish,CDC28andCdc28pfor yeast,lacZandLacZfor bacteria. It warns about an italic gene in the wrong case (*TRP53*in a mouse paper), a protein set in italics (*Cdc28p*,*LacZ*) and a gene that is not italic, and stays quiet on lines that compare organisms. With an organism set, an upright symbol is reported only when the sentence calls it a gene ("the TP53 gene"), since upright capitals are usually proteins. The check also warns whenE. coliappears beforeEscherichia coli, and knows a few more model-organism genera. Ctrl+. italicizes, un-italicizes or fixes the case in one undoable edit (the E. coli order warning has no quick fix). Warnings only, never automatic rewrites. - Supplementary material numbering. Put
<!-- supplement -->on its own line and every figure and table after it restarts at 1 with an S prefix: the preview captions read "Figure S1" and "Table S1",@fig:and@tbl:references follow, and the Labels panel shows the same numbers. The LaTeX export restarts the figure and table counters at that point (S1,S2, ...), and the text exports (Markdown, Obsidian, DOCX, PDF) spell out the S references. The marker is an HTML comment, so it is invisible in Obsidian. Equations keep one numbering. - Sequence blocks.
:::seqshows DNA, RNA and protein sequences the way methods sections do: FASTA records or raw lines in numbered groups of 10, with GC content and length, highlighted ranges (highlight: 12-31 primer-F), motifs and their reverse complement (motif: GAATTC,revcomp: yes), and a legend. Invalid characters are reported in place instead of being drawn. LaTeX exports a plain monospace listing with the ranges in a legend; other exports get a fenced block. - Cite a PubMed paper by its PMID. In the Citation Manager, paste a PMID (
PMID: 12345678), a PMCID (PMC1234567) or a PubMed or PMC link. When the paper has a DOI you get the full CrossRef entry, otherwise one is built from PubMed, and either way thepmid(andpmcid) is saved in the entry. - Journal templates for computational biology. The Journals section of the template picker now has PLOS (PLOS ONE and PLOS Computational Biology), Bioinformatics (OUP), a bioRxiv preprint and BMC (BMC Bioinformatics, Genome Biology). Each sets
comdtex.texclass, a citation style and the biology typography checks, and comes with the sections the journal expects plus a table, a figure, units and a species name to start from. Export as .tex produces the PLOS layout (wide left margin, line numbers), a two-column Bioinformatics article, a bioRxiv preprint with affiliations and line numbers, or a BMC article with line numbers. All four use the standardarticleclass (the publishers' own classes are not in TeX Live), so they compile anywhere, including the built-in engine. - Write in Quarto and R Markdown, and bring Jupyter notebooks in.
.qmdand.Rmdfiles now show in the file tree, search, the graph and the label scan, and open as Markdown. ComdTeX does not run code (that stays with Quarto or knitr), and these files are saved exactly as you opened them: code chunks, chunk options such as#| label: fig-x,::: {.callout-note}blocks and the YAML header are never rewritten. You can also name a new noteanalysis.qmdorreport.Rmd. Import document now accepts.ipynb: Markdown and code cells become text and fenced code, text outputs follow the cell, and image outputs are saved in a-mediafolder next to the note.
Fixed
- In-app updates work. No release had ever published the
latest.jsonmanifest the app reads, and only the AppImage was signed, so the update banner never appeared. Releases now sign the AppImage, the.deband the Windows installer and publish the manifest, which the release refuses to skip if a signature is missing. The AppImage replaces itself, the Windows installer runs on its own, and the.debasks for your password. Installs of 1.30.0 will see the next version.
[1.30.0] - 2026-10-23
A new look and a much smarter editor. Highlights:
- New design: the slate and chalk palette of the ComdTeX site, in dark, light (paper) and high contrast, with bundled fonts, Lucide icons and a preview that reads like a typeset paper (switch to sans in Settings).
- Editor that understands ComdTeX: its own highlighting for math, environments, labels, references and citations; suggestions that appear as you type
[[,[@,@thm:,[^,{#and\; Ctrl+click and F12 to jump to a note, label or BibTeX entry, Shift+F12 for usages; Ctrl+. quick fixes. - Shortcuts changed to the VS Code convention: Ctrl+P goes to a file, Ctrl+Shift+P (or F1) opens the commands, and the preview toggle moved to Ctrl+Alt+P.
- Files are created and renamed inline in the tree, inside the folder they will live in.
- Many data-safety fixes. This release includes 1.29.1, which was never published on its own.
Added
- Quick fixes for the editor's warnings (Ctrl+.). The lightbulb now offers a fix for most markers: close an unclosed
$$or:::, remove a stray:::, create the note behind a missing[[link]](it never overwrites an existing one and you stay on the document you were writing), add a BibTeX stub for an unknown[@key]toreferences.bib, normalize a ragged table, fill a{{?}}gap with the AI (only when the AI is on), add or drop arguments of a shorthand such asfrac(a), add a missing footnote definition and rename a duplicate label. Mistyped references, citation keys, note names, block types and cross-file paths get up to three "did you mean" suggestions, and a label that lives in another note can be rewritten to its@path@kind:nameform. Every fix is a normal edit, so one undo reverts it. - The editor checks much more. Warnings now cover
@thm:,@lem:,@cor:,@prop:,@def:,@ex:,@exc:,@fig:,@tbl:and@sec:references (not only@eq:), cross-file@path@def:xreferences (note missing, or label missing in that note), unknown:::typeblocks, undefined and unused[^footnotes], duplicate labels, images that do not exist (resolved from the note's folder first, like the preview) and LaTeX that KaTeX cannot parse in$...$and$$...$$(shorthands such asfrac(a, b)and your macros are understood). - Go to definition and find usages in the editor. Ctrl+click or F12 on
[[note]],[[note#heading]]or![[note]]opens the note (at the heading); on@thm:x,@doc@def:xor@[folder/doc]@def:xit jumps to the label, in this note or another; on[@key]it opensreferences.bibat the entry. Shift+F12 lists every usage of a label, a citation key or a note across the vault in a peek, and a result in another note opens that note at the line. Jumps to another note join the Back and Forward history, and navigable spans are underlined on Ctrl hover. - Richer hover cards. A grouped citation
[@a; @b, p. 3]shows one card per key;[[note]]previews any note in the vault, not only open tabs (or just the section for[[note#heading]]);@eq:xshows the same equation number as the preview; references to theorems, lemmas and the like show the title, number and first lines of the body, also across files. - The editor understands ComdTeX syntax. Math (
$..$,$$..$$) gets its own quiet colours with no stray emphasis or headings inside,:::type[title]{#label}fences show type, title and label, special blocks (pseudocode, truth, graph, plot, commdiag) colour their keywords, and references, citations, wikilinks, gaps, keep marks, footnotes, tasks and frontmatter are all recognisable. Fenced code loads JavaScript, TypeScript, Python, shell, YAML and LaTeX highlighting on demand, and.texfiles now have a LaTeX grammar. - One palette, several modes. Ctrl+P now goes to a file (fuzzy search, the folder shown next to the name, recent files first,
note#headingto jump into another note, and a Create note row when nothing matches). Ctrl+Shift+P opens the commands. Prefixes switch inside the same box:>commands,@headings, environments and labels of this document,#labels across the vault (Alt+Enter inserts a reference),[citations from references.bib (Enter inserts[@key], or appends; @keyinside an existing citation),:12go to a line,?lists the modes. The old quick switcher is this files mode. - A smarter search. Matches are ranked instead of listed in one pile:
insshows the Insert commands,scffinds "Save current file", accents are ignored (but not the ñ), the matching letters are highlighted, and the result count is announced to screen readers. - Recent and pinned commands. The last 8 commands you ran come first, frequent ones rank higher, and Alt+P (or the pin button on a row) pins a command to the top. Shortcuts are shown as key caps and now come from one list, so Ctrl+Shift+A and Ctrl+Shift+E are shown too.
- Commands for where the cursor is. A Here group on the commands view offers Normalize table and Table editor in a table, Fill gap with AI on a
{{?}}, Convert to display math in inline math, and Change environment type inside a theorem or similar block. - Palette keyboard and screen-reader support. The selected row scrolls into view, the list is a proper combobox with options, Enter is ignored while an input method is composing, rows run on click, and at most 60 rows are drawn with a "keep typing to narrow" hint.
- Autocomplete that opens when you need it.
[[,[@,@thm:,[^,{#and\now show their suggestions the moment you type them, instead of nothing at all, and accepting one never leaves a doubled]]or]. Footnotes list the ones your document already defines plus the next free number. - Citations you can search the way you remember them.
[@finds an entry by key, author, title or year, shows "Levin & Peres 2017" with the title and a card with the journal, and keeps suggesting after;and, @in[@a; @b, p. 3]. - Wikilinks that show where a note lives. Suggestions show the folder, notes with the same name are inserted as the shortest unique path (
[[physics/intro]], which resolves and renders as a link), and[[note#lists that note's headings. - Smart references.
@thm:lists this file's labels first with their number and title ("Theorem 2 · Mixing time"), then the environments of other files, inserted as@path@thm:name(@[my folder/note]@thm:namewhen the path has spaces). Equations, figures, tables and sections of other files, which cannot be cited, are no longer offered.@path@completes vault notes,{#offers a unique label from the title or heading, labels you typed a moment ago appear at once, andCtrl+Spaceon a suggestion previews the equation (drawn with KaTeX) or the environment's first line. - Frontmatter and data blocks complete. Inside the leading
---block: keys and values (lang,comdtex.texclass,comdtex.citestyle,comdtex.domain, today's date). Inside:::csvand:::data: your CSV file names and then the column headers of the file. Pressing Enter on a:::typeline writes the closing:::. - About a thousand LaTeX commands with previews.
\completion is now generated from the commands KaTeX renders (it used to list 78), with the glyph and argument placeholders (\frac{}{},\begin{pmatrix}), your macros first, and suggestions as you type inside math.npm run gen:latexregenerates the list after a KaTeX upgrade. - Shorthand signature help. Typing
frac(a,showsfrac(num, den)with the current argument highlighted, using the same argument counts as the linter. - The preview is typeset like a paper. Libertinus Serif at a 68-character measure, theorem environments in the amsthm style (bold run-in label, italic statement, "Proof." with a tombstone), booktabs tables with the caption above, a title block with an abstract, and print that follows the same layout. Settings > Preview > Document style switches to a sans face with the same spacing.
- Syntax highlighting in preview code blocks for about 18 common languages, offline and themed with the
--syn-*colours.
Changed
- New files and folders are named right in the file tree. The "New file" and "New folder" buttons, the context menu ("New file here" also works on a file, using its folder) and the new "New file" and "New folder" commands open a row inside the folder where the item will live, at the right indent, with the file icon, focused and scrolled into view. Type a name and press Enter (blur also creates it when the name is valid; Escape cancels). The folder is always the same: the selected folder, else the folder of the selected file, else the folder of the note you are editing, else the vault root. A name without an extension becomes
.md;.tex,.bib,.csvand.typare kept. While you type, a message under the input explains what is wrong (empty, characters Windows or Linux refuse, only dots, leading or trailing spaces and dots, reserved Windows names, a name that already exists in that folder in any capitalisation) and Enter is disabled. After creating, the note opens in a tab, is selected in the tree and the cursor is in the editor. The old input at the top of the sidebar, with its small "in" label that always pointed at the vault root, is gone. - Rename is inline for files and folders. Double-click, F2 or "Rename" edit the name in its own row with the base name selected (the extension stays unselected), the same validation as creating, Escape to restore and blur to commit. Folders can be dragged too, you can drop on the empty tree area to move an item to the vault root, the drop target highlight clears reliably, and the moved item stays selected with its folder open.
- Every other way to create a note says where it goes. The palette's "Create" row shows the full destination ("Create papers/new-note.md"), uses the same target folder and explains why a name cannot be used. "New from template" now has a Folder picker (preselected with the same rule) and shows "Creates papers/draft.md" under the name, refusing names that exist. The quick fix "Create note" and "Create note" on a broken link in the vault statistics put the note next to the note that links to it (or in the folder a
[[folder/note]]link names, creating it if needed), and the quick fix selects it in the tree without leaving your document. Clicking a link to a missing note in the preview asks before creating it, naming the destination. Daily notes and the other toasts name the folder too. - Sensible default locations in native dialogs. Every export dialog (Markdown, LaTeX, PDF, Word, Beamer, HTML, Typst, Anki, Save as) opens in the note's folder with the note's name, the vault backup and the project LaTeX export default to the vault's own location, and "Create vault" suggests a folder in Documents with its title in your language.
- No more native prompts. Adding a comment and "Save as template" ask for text in the app's own dialog (focus trapped, Escape cancels, an empty value cannot be confirmed) instead of
window.prompt, which Tauri webviews block or draw badly. - Keyboard shortcuts follow VS Code. Ctrl+P goes to a file, Ctrl+Shift+P opens the command palette (F1 too), and the preview toggle moved from Ctrl+Shift+P to Ctrl+Alt+P. Ctrl+; still goes to a file.
- Editor warnings follow the interface language. The linter's messages were Spanish only; they now come from the language tables, and every marker carries a stable code that the quick fixes use.
- One icon set. Toolbar sections, window controls, tabs, the file tree, toasts, panels, modals, the Git and AI panels, templates and the welcome screen now use Lucide icons (monochrome, one stroke weight, curated in
src/icons.tsx) instead of a mix of text glyphs, colour emoji and hand-drawn SVGs. Highlight colours show small swatches drawn from the--mark-*tokens, and preview callouts draw their icon with a CSS mask (adata-iconhook, no emoji in the HTML), so it follows the callout colour and is left out of non-HTML exports. Every icon-only button has an accessible name. - Inserting or deleting a block no longer redraws everything below it. The preview matched blocks by position, so a new paragraph near the top re-created every equation, diagram and image after it. Blocks are now matched by content (ignoring their source line), unchanged ones keep their live element and only a minimal set is moved or inserted.
- The link graph is a canvas, laid out off the main thread. It used to freeze the app while it computed 80 rounds of all-pairs repulsion and re-rendered the whole SVG on every hover. Layout now runs in a Web Worker with Barnes-Hut repulsion and cooling that stops on convergence (2,000 notes and 6,000 links in about 0.7 s, 1,000 in 0.3 s), is deterministic, and starts from the previous positions, so a new note appears beside the notes it links to and the rest barely moves. Drawing is Canvas 2D at the screen's pixel ratio, sized to the panel (it is no longer clipped at the sidebar width), with wheel and drag pan and zoom, Ctrl+wheel pinch, hover and click hit-testing through a spatial index, and no React render per mouse move. Colours come from the theme tokens and follow theme changes.
- Local and Global graph. With a note open the graph shows that note and the notes up to one or two links away; Global shows the whole vault. Nodes are coloured by top-level folder and sized by degree, hovering a node highlights its links and names its neighbours, click opens the note and double-click centres it. Labels thin out with the zoom level and never overlap. The search and
tag:filters still dim what does not match. - The graph is keyboard and screen-reader friendly. The canvas has an accessible name, Tab moves into a list of the current note's neighbours (Enter opens one and the node lights up on the canvas), and
+,-,0and the arrow keys zoom, fit and pan. With reduced motion the final layout is drawn at once instead of gliding. - Mermaid 12, with the new look. Diagrams now use Mermaid 12's
neolook and its ELK layout (loaded only when a diagram is drawn), coloured from the app's design tokens, so they follow the dark, light and high-contrast themes and re-draw when you switch. A note can keep the old look withlook: classicandlayout: dagrein its Mermaid frontmatter or an%%{init}%%line. Exported diagrams still use a print palette. - Faster start. The welcome screen no longer downloads Monaco (3.6 MB): a build helper had been parked in the Monaco chunk, so the entry preloaded it. The first load is now 1.5 MB instead of 5.3 MB. KaTeX ships woff2 only (the ttf and woff copies were dead weight in every webview we target), the export pipeline, the symbol picker and the version-control bar load on demand, and the entry chunk went from 840 kB to 621 kB.
- A new look. The interface moves to a slate and chalk palette shared with the ComdTeX site: a dark theme in slate, a light theme on cream paper with slate ink, and a high contrast theme in black, white and yellow. The editor uses the bundled JetBrains Mono, and the three themes now pass WCAG contrast checks for text, links, callouts and theorem boxes (the light theme callouts and theorem boxes were hard to read before). Every theme shows the same keyboard focus ring.
- Sidebar panels share one layout. Every panel starts with the same header (title and count), lists use one row style, and search results can be collapsed per file.
- The vault-wide label scan behind
@eq:/@fig:autocomplete runs in a background worker and only rescans notes that changed, so typing in a large vault no longer stalls on it. npm auditis clean again: Excalidraw's unusedsassdependency is moved past thebracesadvisory.eslint-plugin-react-hooksis on 7.1.
Fixed
- Clicking in the preview goes to the right line, and the preview follows the editor again. Blocks with math, citations, references or a labelled heading had no source line, so clicking them did nothing; the preview only followed the cursor by section and counted the title and the bibliography as sections, landing one heading off. Every block now carries its line (math, citations, references and labels are ignored when matching), display equations, tables, callouts and figures included, a click on a block without one uses the nearest block before it, and moving the cursor brings the matching block into view. Clicking a theorem or another environment no longer jumps to the top of the note when its opening line has a space before the label (
:::theorem[T] {#thm:x}, the form a reopened callout takes). - An exponent at the end of a line of display math is no longer swallowed. A line such as
x^2inside$$was read as a block id (^2) and the equation lost its exponent in the preview. Block ids now need a space before the^(as in Obsidian) and are never looked for inside display math. - Current AI models by default. The suggested models were retired by their providers (
claude-3-5-sonnet-latest,gemini-1.5-flash), so turning the assistant on with the defaults failed. The defaults are nowclaude-opus-5-5,gpt-5.6andgemini-3.6-flash, and a saved retired default is moved forward on start (a model you typed yourself is left alone). - Ctrl+K Ctrl+0 and Ctrl+K Ctrl+J fold and unfold again when the AI assistant is off. Ctrl+K was always taken by the inline AI edit, even with AI disabled. With AI on, the new palette commands Fold all and Unfold all do the same.
- Security: markdown-it updated to 14.3.3 for two quadratic-time denial-of-service advisories (GHSA-vfgh-jcmw-g37q, GHSA-gfr2-rv44-r23c): a crafted note could freeze the preview.
- Security: TLS certificate checks updated (
rustls-webpki0.103.16,webpki-roots1.0.11) for RUSTSEC-2026-0381, -0382 and -0383, which let distrusted intermediates pass. The updater no longer bundles thezipcrate (RUSTSEC-2026-0367, -0368, -0369): updates arrive as a plain installer or AppImage, never as an archive. - Typing with AltGr works again on Windows. On Spanish, German and French keyboards the characters
|,@,#,~,¬,€,{,[and](AltGr plus 1, 2, 3, 4, 6, E, 7, 8 and 9, depending on the layout) were swallowed because Windows reports AltGr as Ctrl+Alt and the bookmark jump (Ctrl+Alt+1 to 9) took the key. Ctrl+Alt+P and Ctrl+; no longer fire on AltGr characters either, and a bookmark key with nothing saved in that slot is left alone. - Shortcuts and Escape stay out of an open palette or dialog. Escape in the palette used to also leave focus mode, and shortcuts such as F11 or Ctrl+Alt+P acted behind it. Ctrl+P and Ctrl+Shift+P still switch the palette's mode.
- Tab no longer escapes the palette in the commands view, and focus stays where an action put it: running a menu entry or palette command that moves you into the editor no longer snaps focus back to the menu button. Escape also closes a menu opened with the mouse.
- The files palette stays fast in very large vaults. Past about 15,000 notes every keystroke used to take 300 ms or more.
- Palette fixes. Changing an environment type or converting math from the palette does nothing (and says so) when the text changed while the palette was open; jumping to a heading of a note that was not open no longer lingers;
note#headingreads what you have typed, loads notes it has not read yet, and Create note explains that a vault is needed when none is open;:::sm theoremand:::lg theoremcount as theorems in the outline and the Here commands; a reference such as@notes/a@def:xkeeps its path; F1 opens the commands from anywhere, not only inside the editor; Alt+P pins only on its own (not on Ctrl+Alt+P); pins are capped and dropped when their command no longer exists; the Save As file filter and a screen-reader label are translated, and the palette dialog is named after its current mode. - Ticking a task in the preview edits that task. In a note with frontmatter the click landed on a line above it, and could flip a different task. The click now only edits a line that holds a task in the expected state.
- Renaming a note no longer overwrites an edit made in another program. When you had kept the other program's version in a conflict, renaming the note saved your typing over it.
- Links are updated only when the rename really happens. If the new name was taken, every
[[link]]used to be rewritten anyway. - A new file created where a Windows-style (CRLF) file was deleted starts with normal line endings.
- Quick fixes and link updates read the text you just typed, not a copy up to a quarter of a second old.
- Dropping an image onto the editor no longer replaces an existing file in
assets/. It now picks a free name (photo-2.png), as pasting already did. - Creating a folder that already exists says so instead of reporting success, and an arrow-key walk through the tree skips the contents of collapsed folders.
- Conversion notices speak your language and appear once. The note about a block kept as text when opening or saving a file was always in Spanish and could show twice when tabs were restored.
- A citation that is not in references.bib no longer breaks the bibliography layout. Its line was squeezed into the narrow number column.
- Escape closes the Git panel and returns focus to its button.
- Fewer false alarms from the editor's warnings.
@eq:xdefined in a note you embed with![[note]]is no longer reported, the@eq:xinside@note@eq:xis no longer checked as a local reference, and a citation such as[@a; @b]marks each missing key on its own text instead of putting several markers on the whole bracket. Code fences that follow an emoji were masked at the wrong place, so$$inside them could be flagged. - Equation hover ignores
$$inside code fences. The number shown on hover could be off by one when a fenced block quoted display math. - No false "something went wrong" toast when Monaco cancels a pending highlight as a tab switches.
- Typing
$or a backtick in a note auto-closes again. The editor's markdown settings were replaced by Monaco's built-in ones the first time a note opened, so auto-closing of$and backticks and selection wrapping never took effect. - The quick switcher showed the file name twice. The right-hand column now shows the folder.
- Snippet placeholders and a few palette labels were always Spanish. "Salto de línea", "Snippets / autocompletado" and the
texto,ítem,tarea,códigoplaceholders now follow the interface language. - Reference completion no longer fires on the inner part of a cross-file reference.
@gp/note@def:used to offer this file's labels and insert a bare name that rendered as a broken reference. - The classic menu bar works from the keyboard. The Archivo, Edición, Vista and Vault menus only opened on a mouse press. Enter, Space or the down arrow now opens a menu, the arrow keys move through it and across menus, Escape closes it and returns focus, and screen readers announce a menu bar with menus and items.
- Nested lists nest again. An indented sub-item under a list item rendered as plain text with a leading dash.
- No stray blank lines around equations and environments in the preview.
- A collapsed sidebar can be reopened. Collapsing it left no visible control to bring it back. It now leaves a slim rail with the expand button.
- Escape and Tab work in the quick switcher, the command palette and the LaTeX error dialog. The quick switcher re-created its text field every time it took focus, which swallowed keystrokes and made Escape unreliable; the palette and the LaTeX error dialog had no focus trap at all. All three now keep Tab inside, close on Escape (the palette steps out of a sub-menu first) and give focus back where it was. The word-goal hint in Settings also sits under its own row now instead of under Vim mode.
- English interface, English document words. The preview printed "Definición", "Demostración", "Teorema" and "Figura", the Labels panel said "SECCIONES" and "ECUACIONES", and Document Lab messages were Spanish. They now follow the interface language, and the same goes for the headings, references, figure and table captions and the bibliography title in the preview and in the Markdown, Obsidian, DOCX, Typst, Beamer and Reveal.js exports. A note can set its own with
lang: enorlanguage: esin its frontmatter, which wins over the interface. The LaTeX export is unchanged and still names things through babel. Spanish stays as it was. - Escape closes the citation manager and the table editor. Both ignored the key. They now behave like the other dialogs: focus moves in, Tab stays inside, Escape closes them and focus goes back to where it was.
- Plots no longer clip the curve, and the legend is readable. The automatic y range dropped the lowest and highest few percent of a curve, so a decay ending at 0.057 was cut off at 0.1. A curve's real extremes are now inside the frame (an asymptote is still ignored). The legend swatch no longer sits on top of its label, and its text is at least as large as the tick labels.
- A proof shows one end mark. The proof environment added its own box in the corner, so a note that also ended with
$\square$showed two. The mark the author typed is dropped (also in the LaTeX export, whereproofadds its own) and the single mark now sits at the end of the last line. - Images load from the note's own folder.
inpapers/doc.mddid not load because every relative image path was read from the vault root. The note's folder is now tried first and the vault root stays as the fallback, in the preview, in Document Lab and when a LaTeX export copies its images. - Grouped citations work.
[@a; @b]and[@a; @b, p. 3]now render as one bracket ([1, 2], or(Rudin, 1976; Smith, 2001)in author-year styles), export as a single\cite{a,b}, and are checked key by key.[@a][@b]still renders as two markers. - Document Lab no longer cries wolf. Diagnostics flagged every
[@key]citation as not found and every local image as missing, because it never saw the bibliography or the image files. It now uses the vault bibliography and every file in the vault, and resolves image paths relative to the document first, then the vault root. Its messages follow the interface language. - No more false "Something went wrong" toast. The browser's harmless "ResizeObserver loop" notices are no longer reported as errors.
- Focus mode toggles once. The "Focus mode on/off" notice no longer fires twice, and React no longer warns about updating the toast area while the app renders.
- Files with Windows line endings stay that way. A
.mdor.texfile saved with CRLF came back with LF on its first save, so every line showed up as changed in git. The line ending is now remembered per file, follows renames and moves, and new lines get the same ending. - The link graph and the task list now cover the whole vault. Both panels only looked at documents open in tabs, so links and tasks in closed notes were missing. They now read every note through the same mtime-gated index vault search uses (an unchanged file is never read twice), and an open tab's unsaved text still wins over the disk copy. Ticking a task in a note that is not open edits that file safely: the line is re-checked against the file as it is now, and nothing is written if it changed.
- Callouts survive open and save byte for byte.
> [!tip] Hiwas saved as> [!tip] Tip: Hi, because the environment name was baked into the title. The name is now written only when the callout type alone would reopen as a different environment (Theorem: Pyth). - No more
<!--cmdx type=... -->line in the editor. Callouts that no environment reproduces exactly (folded ones,[!theorem]without a prefix,[!NOTE],[!my-type]) now stay ordinary callouts in the editor and are saved as written. Editor text from older builds that still carries the marker loads and saves correctly. - Theorems keep their numbers outside LaTeX. DOCX, Typst, Beamer, Markdown, Obsidian and Reveal.js exports lost environment numbering and printed references as raw
@thm:x. They now read "Teorema 2 (Title)" and "Teorema 2", the same as the preview. A reference to an environment in another note cannot be numbered there, and the pre-export notice says so. - Writing statistics survive a restart. The Focus panel kept words, active time and pomodoros only for the running session. Totals are now kept per day (up to a year), the daily goal counts the whole day, and a Today section shows today and the last seven days.
- Typing a code fence no longer leaves a stray backtick. Typing three backticks now gives exactly three, and a fenced block typed with Enter closes exactly as typed; inline
codestill closes its backtick. - A dollar sign is no longer closed where it is not math. "costs $5 each" and
echo $HOME(in a code fence or inline code) keep a single$; a$is closed only after whitespace or an opening bracket. A price is no longer taken for the start of math, so Enter after "costs $5 and sum" breaks the line instead of accepting a shorthand, and Enter never accepts a suggestion that opened by itself in math until you move the selection. - References to notes with accents or special characters now resolve. Completion, quick fixes and the palette wrote
@Álgebra/Teoría@thm:x, which the preview, the linter and go to definition could not read; they now write@[Álgebra/Teoría]@thm:xwhenever the path has anything beyond letters, digits and_ . / -. Typing@Álgoffers the note, and a path written with a different accent encoding (macOS) still matches. - Find usages works across more than 40 notes. The references list used to close the previews of its own first results once it grew past 40 notes; the previews are now trimmed only between searches.
- Accepting a reference no longer eats the punctuation after the cursor. With the cursor in
see @thm:|.or@lem:|-style, choosing a label used to delete the period or the "-style"; only the rest of the label itself is replaced now. - Two quick fixes wrote the wrong text. "Close the $$ block" inside a
:::environment put the closing$$after the closing:::(it now stops before the:::or a heading), and "Add the missing arguments" appended another,every time onfrac(a, )(it now counts the argument slots already written). - A
---line at the top of a note is not always a header. When it is a divider above prose, typing no longer pops up frontmatter keys that Enter could accept. - Enter on a
:::nameline inside a code fence no longer adds a closing:::. Fenced code is left exactly as typed. - The usages list can no longer swallow your typing. The preview of another note inside Find Usages was editable but was never saved; it is read-only now.
- Hovering
[[note#heading]]shows that section even when the note has not been loaded yet (it used to show the top of the note). - Citation links in long notes no longer re-read references.bib for every key, and the bibliography is located with the same path join as the open tabs, so Go to definition on a citation finds its tab on Windows.
- Go to definition, find usages, hovers and link underlines work in
.texfiles. F12 on\ref{x}goes to its label,\cite{key}opens the entry in references.bib, and Shift+F12 lists the uses of a label or key (the\eqref,\autoref,\crefand natbib/biblatex citation commands are understood). Before, they only worked in Markdown notes.
[1.29.1] - 2026-10-15
Fixed
- Opening a Markdown note no longer destroys its tables. A pipe table with rows was rewritten on open into a header-only shorthand, and the next autosave wrote back the header and nothing else. Tables with rows are now left as they are, and nothing inside a code block or inline code is ever treated as a table.
- Saving keeps what a note says about itself. Environment labels such as
{#thm:pyth}were dropped on save, so every@thm:pythreference broke on the next autosave. Callouts also lost their fold marker (-or+) and any type the app did not know (danger,quote) became a plain note. All of them now survive a save and a reopen, checked by a round-trip test over forty fixtures. - Closing a tab whose save failed no longer throws your edits away. A full disk, a read-only file or a cancelled conflict prompt made the save fail quietly and the tab closed anyway. The tab now stays open and says why.
- Rename, move and create no longer overwrite an existing file. Dragging a note onto a folder that already held one with the same name replaced it. The app now refuses and says so. Open tabs inside a renamed or moved folder follow it, and renaming a file without typing its extension keeps the old one instead of hiding the file from the tree.
- Unsaved edits are written before you switch or create a vault, instead of being dropped with the old tab list.
- Replace across the vault inserts exactly what you typed.
$$,$&and$1were expanded even with regular expressions off, so replacing with display math wrote$x$into every file. It also overwrote unsaved edits in open tabs with the disk copy; it now applies to the text you see. - Recovered drafts no longer overwrite newer files. A draft is restored only if it is newer than the file on disk, and a restored draft is saved again. Open tabs are restored on restart again: the tab list was being cleared on startup before it could be read.
- A character deleted right after a pause could stay on disk while the editor no longer showed it, and ticking a checkbox in the preview reset the undo history and could undo recent typing. Both now work from the editor's live text.
- Exports that broke on ordinary notes. A code block in a language LaTeX does not know (JSON, YAML, Mermaid) failed the PDF export, and code could end its own block early. Backslashes printed as
\{}, and a link containing%commented out the rest of the line. DOCX, Beamer and Typst exports to a folder outside the vault, such as the Desktop, failed on a temporary file; temporary files now live in a hidden.comdtex/tmpfolder inside the vault. A vault backup over an existing zip replaces it instead of adding to it, and Reveal.js slides no longer split inside code blocks and load a fixed reveal.js version. - Exports say what they will lose. The compatibility check that only the Document Lab panel used now runs before exporting, and a short notice lists the features the target format cannot keep. The export still goes ahead.
- Opening an exported file or a backup from the app works. The permission to open a path was missing, so successful Beamer, HTML and backup exports reported failure.
- The Git panel handles files with spaces or accents in their names, and renamed files, and tells apart "git is not installed", "this folder is not a repository" and any other git error, which it now shows instead of claiming git is missing.
Security
- The preview no longer accepts page-wide styles, overlays or forms from a note. A
<style>block could hide the interface, an element with a fixed position could cover it, and a form could pose as a login prompt. They are removed, while math, diagrams and task checkboxes keep working. - Links in the preview open in your browser instead of replacing the app window, and the app refuses any navigation away from its own pages.
- Opening a cloned repository as a vault cannot run its code. Git runs with
core.fsmonitor, hooks and theext::transport disabled for every command the app issues. This also means your own git hooks do not run on commits made from the Git panel; commit from a terminal if you rely on them. - Choosing the filesystem root, your home folder or a system folder as a vault is refused by the desktop layer too, not only by the interface.
- Dependencies updated to clear the production audit findings: DOMPurify 3.4.17, markdown-it 14.3, KaTeX 0.19, pdf.js 6, Mermaid 11.17 and the Tauri plugins, with the Rust crates matched to them. One finding remains, in a build-time dependency of Excalidraw that has no fix upstream.
Changed
- Faster start. The Spanish and English spelling dictionaries left the main bundle and load only when spellcheck is on: the main chunk went from 2.2 MB to 0.8 MB.
- A crash in one part of the window no longer blanks the whole app. The preview, the editor and every panel and dialog fail on their own with a Retry button, and the error screen is translated. Uncaught errors are reported once, as a notice, instead of failing silently.
- Accessibility. Every dialog is announced as one, with its name; the quick switcher returns focus where it was; notices and the compile status are read out by screen readers.
- Releases are built only after lint, type checks, unit tests, clippy and rustfmt pass. Continuous integration also checks formatting and the coverage floor rose to match the real figure.
[1.29.0] - 2026-09-28
Added
- Settings has a search box. Thirty-four options across seven tabs, grouped by what they belong to rather than by the word you have in your head, meant looking for "autosave" involved opening three tabs. Type a word, click the result, and it opens the right tab and marks the row. A guard test fails the build if an option is ever added to Settings without being added to what search can find.
- The app links to the documentation. It never did: the short line under a control and the long explanation on the site had no way to reach each other. Settings now links to the page for the tab you are on, the Help panel links to the documentation, and the missing-tools banner links to the new troubleshooting page.
- A troubleshooting page, covering the failures that actually happen: the TeX package server outages that stall a compile, which external tool each export needs, building the AppImage on Arch, Google Drive overwriting silently where Dropbox and OneDrive leave a conflict copy, and the API key falling back out of the OS keychain on Linux setups without one.
Fixed
- The repository's own notes claimed ComdTeX checks for
gitat startup and that the missing-tools banner names every tool. Neither is true:gitis not probed (the Git panel reports its own absence) and the banner only ever namespandocandzip. The documentation now says what the code does. - The new documentation links pointed at pages that don't exist. They assumed a language segment in the URL (
/en/settings,/es/troubleshooting); the site keeps language client-side and serves every page at/docs/<page>, so every link from Settings, the Help panel and the missing-tools banner led to a 404. They now point at the real URLs.
[1.28.0] - 2026-08-06
Added
- Every setting now says what it is for, inside the app. Nineteen of the thirty-four options in Settings were a label and a control with nothing else: what autosave delay means for your work, what preview theme is good for, what a word goal does, what to type as a base URL. Each one now carries a line underneath it. The web guide carries the long form, with a step-by-step walkthrough for connecting an AI provider and the four Focus timer durations that live outside the modal and had never been documented.
Changed
- Bring your own AI now means any provider, not the five that happened to be allow-listed. The settings accepted any endpoint while the app only permitted requests to a fixed list of hosts compiled into it, so pointing ComdTeX at OpenRouter, DeepSeek, LM Studio or a lab server failed with nothing useful to show for it. Requests now leave through the desktop layer instead of the browser layer, so any provider reachable over https works, and so does one running on your own machine. The security barrier did not move: an address that is not https or local is still refused, and the app still ships no keys and makes no request until you enable it.
- Sync says where your vault actually stands before it offers you a switch. It presented a cloud folder and version control as two equivalent options, when they are not: git keeps a history and stops on a conflict, while a synced folder keeps a copy and leaves a second file with a longer name. The Sync settings now open with your situation in one sentence, the single next step for it, and a button that takes you to the Git panel. The cloud toggles remain underneath, as what they are: a safety net for vaults kept in a synced folder.
Added
- Test connection, in AI settings. A settings form that never proves it works leaves you guessing, and a rejected key, a model name that does not exist and a service that is not running all look the same. The test sends the smallest possible real request and tells you which of the four it is. The assistant now names the same causes the same way when a message fails, instead of forwarding the provider's raw text.
- A warning for a git repository inside a synced cloud folder. The cloud client and git write to the same internal files, and the repository is corrupted sooner or later; it is silent until the day it is not. ComdTeX now says so, and says to move the vault out and share it with a remote instead.
Fixed
- Backlinks no longer read the whole vault from disk. Opening the panel, or switching files with it open, re-read every file in the vault. It now asks the vault's own search, which keeps files cached until they change on disk.
- Draft saving no longer re-serializes every stored draft. The crash-recovery list is kept in memory with storage as its mirror, instead of parsing and rewriting up to twenty whole documents every time one of them changes while you type.
- The equation cache no longer empties itself. On reaching its limit it discarded everything, including equations rendered moments earlier in the same document, exactly on the heaviest documents; it now discards only the oldest.
- Removed 33 translation strings that were declared and translated in both languages and displayed nowhere.
[1.27.1] - 2026-08-06
Fixed
- Data blocks can find their data.
:::csvand:::datablocks rendered "not found in this vault" for every spreadsheet in the app, while every test passed: the resolver that feeds the preview and all export paths was built from a list of documents that deliberately holds only.mdand.texfiles, so a.csvwas never among them. Data files now travel in their own list, read once per change in the set of paths so an untouched file keeps the same string reference and the parse cache still short-circuits while you type. A target that carries a folder (archive/growth.csv) now wins over a bare name match, which is how an author disambiguates two files with the same name. - Duplicate Line no longer advertises a shortcut that does something else. The Edit menu showed
Ctrl+Shift+D, which opens the daily note; the underlying editor action ships with no binding at all. It now showsShift+Alt+Down, which really does duplicate the line.
Changed
- The vault graph no longer relays itself on every keystroke. Its layout is eighty steps of an all-pairs force simulation, and it was rebuilt on every character typed while the Graph panel was open. It is now reused unless the graph's shape (its files, their tags, their links) actually changes, so typing prose leaves the layout alone.
- Fewer full-document passes per render. The task-list rewrite, the table-of-contents marker and the section-id pass each scanned the whole document even when it contained none of them; they now skip the way the code-masking pass already did. The file tree's memoisation is no longer defeated by a callback rebuilt on every render, and the CSV parse cache is bounded like every other cache in the app.
[1.27.0] - 2026-08-06
Fixed
- The exported .tex now carries what it needs to compile. The generated file referenced
\includegraphics{figure.png}and\bibliography{references}, but the export copied neither the images norreferences.bib, so anyone exporting to submit to a journal or upload to Overleaf received a broken bundle and had to gather the files by hand. Exporting as .tex now copies every referenced local image next to it (rewriting the reference to the bare filename so relative paths cannot break) andreferences.bibwhen the document cites anything, and says how many files it placed alongside. Remote URLs and data URIs are left alone. - Footnotes, callouts and highlights survive the LaTeX export. They rendered correctly in the preview and were lost or printed literally in the PDF, because the exporter built its own bare markdown-it instance without the plugins and callout preprocessing the preview has. Now
[^1]becomes a real\footnote{}with its nested markup escaped,> [!warning] Titlebecomes a titled box coloured by callout type,==text==becomes\hl{}, a coloured<mark>becomes a\colorbox, and<u>becomes\underline{}. The packages they need (tcolorbox, soul, xcolor) load only when the document actually uses the feature. - Every file the user owns is written atomically. Eight paths wrote directly instead of through the crash-safe helper the repository documents as mandatory, including both paths that save
references.bib(a crash mid-write could truncate an entire bibliography), the creation of any new file from a template, the vault README,macros.mdand the daily note. All of them now write to a temporary file and rename it into place, and a guard test fails if a future handler reaches for the direct call again.
[1.26.0] - 2026-08-06
Added
Plots of your data, not only of your formulas. A
:::plotblock can now name a dataset instead of a function, and draws one series per column::::plot[Growth by strain] @data:growth x: time y: (S1, S2, S3) kind: line error: sd :::Four shapes:
line(a line with a marker at every real measurement),scatter(markers only),bars(grouped by category) and error bars from a named uncertainty column, which can ride on any of them. Columns are chosen by header name, spreadsheet letter or index, exactly like a:::csvselection; leavingyout plots every column except x and the error column. A non-numeric x column (sample names, conditions) becomes evenly spaced categories, which is what bars need. The axes take their titles from the column headers, the legend combines functions and data series without ever reusing a colour, and the vertical range now respects real extremes and error bar caps instead of the percentile band that keeps a function's asymptotes from flattening the plot. Function plots are untouched. The plot reaches the PDF as an image like every other diagram.
[1.25.0] - 2026-08-06
Added
Named datasets: import once, use everywhere. A
:::datablock declares a selection over a vault CSV and gives it a name, using the same label grammar as the rest of the editor::::data{#data:growth} growth.csv (A:D) (1:20) :::The declaration prints nothing. Like a macro definition, it exists so other blocks can point at it: a
:::csvblock whose source is@data:growthrenders that data as a table, and its own selection narrows the dataset further, so@data:growth (A, C)means "columns A and C of my growth data". A dataset is not a numbered element and is never cited in prose, which is why it has no number; but it does ride the label system, so the Labels panel reports duplicate declarations, references to datasets that do not exist, and datasets nobody uses. The editor warns about both mistakes while you write. A generated table can also carry{#tbl:x}and become citable with@tbl:xlike any hand-written one. CSVs are parsed once and reused while the file is unchanged, so declaring a dataset costs nothing on the typing path.
[1.24.0] - 2026-08-06
Fixed
- Citations reach the PDF.
[@key]was rendered in the preview but exported as literal text, so a compiled PDF showed[@rudin1976]instead of a citation and carried no bibliography at all. The LaTeX export now emits real\cite(with\cite[p. 321]{key}for locators) and closes the document with\bibliographystyleand\bibliography{references}, choosing the bst that matches the document's citation style. Documents without citations are unchanged. - Every export sees the same document. Transclusions and
:::csvselections were resolved on the preview and "Compile PDF" paths but not on "Export as .tex", "Export PDF" (pandoc), the project export or the rebuild-on-save, so the same note produced different output depending on the button pressed, and a:::csvblock could ship as raw source. Resolution now lives in one place (documentResolve.ts) that every path calls, including inside transcluded notes, and a guard test fails if a future export handler forgets it.
Added
- Real citation styles.
comdtex.citestylein the frontmatter picks how citations read, in the preview and in the PDF:vancouver(ICMJE, required by over a thousand biomedical journals),ama,apa(APA 7),author-year(astronomy and the social sciences), or the previous ComdTeX style, which stays the default so nothing changes silently. Numbered styles keep their superscript brackets; author-year styles render inline as(Rudin & Smith, 1976). The LaTeX export loads natbib with the matching options, except under acmart and apa7, which manage citations themselves. - Cite by ADS bibcode and INSPIRE record. The Citation Manager's fetch box now recognizes a NASA ADS bibcode (
2024ApJ...900....1A) and an INSPIRE-HEP recid or URL alongside DOIs and arXiv ids, which is how astronomers and high-energy physicists actually cite. ADS needs a personal token: it is entered in Settings and stored in the OS keychain, never in the settings file.
[1.23.0] - 2026-08-05
Added
Tables from a CSV, by selection. A
:::csvblock holds a spreadsheet-style selection instead of a copy of the data, so regenerating the CSV updates the table::::csv[Growth rates] data.csv (A:B, D) (1:8, 12) :::Columns accept spreadsheet letters, 1-based indices or header names; rows are 1-based over the data rows. Ranges use
:and non-contiguous selections group in parentheses, so(A, C, F)and(1:3, 7, 9:12)both work, and the written order is respected:(C, A)really does put C first. Omitting a selector means everything. The CSV parser follows RFC 4180 (quoted fields, escaped quotes, embedded separators) and sniffs comma, semicolon, tab or pipe. A missing file or an unreadable selection leaves an honest note in the document instead of rendering nothing..csvfiles are now first-class vault citizens, and the block expands in the preview, the PDF and every export.
[1.22.0] - 2026-08-05
Added
- Units and chemistry, written once and typeset twice. New shorthands
si(9.81, m/s^2),num(6.022e23),unit(mol/L)andce(H2O). The preview renders them through KaTeX (upright units, real scientific notation, and chemistry via KaTeX's own mhchem extension) while the LaTeX export emits genuinesiunitxandmhchem, so journals get the formatting they demand. A unit parser (units.ts) understands SI prefixes, products, divisions and exponents, and degrades an unknown unit to upright text instead of breaking the compile. The packages load only when a document actually uses them, since recent mhchem versions cost real compile time. - Biology typography check. Opt in with
comdtex.domain: biologyin the frontmatter and the editor warns about taxonomic binomials and gene symbols that are not italicized, the two conventions manuscripts get returned over. Warnings only, never automatic rewrites:Bacillusmay be a genus or a surname, and only the author knows. Code, math, links and already-italic text are never flagged, and common lab acronyms (PCR, ELISA, DNA) are not mistaken for gene symbols.
[1.21.0] - 2026-08-05
Added
- Diagrams reach the PDF. Exports used to degrade every visual block to captioned source code; now flowcharts (Mermaid), Graphviz graphs, function plots, commutative diagrams and Excalidraw drawings rasterize to real images in "Compile PDF", "Export PDF" (pandoc) and "Export as .tex" (PNGs saved beside the file for Overleaf), and truth tables become real tables. Auto-rebuild on save carries them too, and the print palette keeps diagrams readable on a white page regardless of the app theme. Honest limits: the bundled WASM engine cannot read image files, so documents with diagrams prefer a local engine (tectonic/xelatex/pdflatex) and fall back to WASM with the previous code-fence degradation; pseudocode and code blocks stay as code on purpose.
[1.20.0] - 2026-08-05
Added
- Typst, first class (phase A).
.typfiles are now vault citizens: they appear in the tree, open with their own Monaco language (headings,#functions, labels/references, math, raw blocks), and edit raw (no CMDX conversion touches them). "Compilar PDF (archivo Typst)" compiles the open file natively with the localtypstbinary (no pandoc in the path; unsaved changes compile too) and feeds the same PDF preview panel; with auto-rebuild on, saving recompiles in place, which at Typst speed behaves like a live preview. The Markdown preview pane steps aside for.typtabs: their preview is the compiled PDF. Phase B (native Markdown-to-Typst export preserving environments and shorthands) and phase C (a WASM Typst engine for zero-install parity) come next.
[1.19.0] - 2026-08-05
Added
- Guided collaboration. A "Write with someone else" section at the top of the Git panel speaks plain language over the git the panel already knew: connect the vault to a shared private repository (guided, with a paste-the-address box), then live with one sentence and two buttons: "Bring changes" / "Send changes" / "Save and send" (empty message becomes an honest dated one). A rejected send explains that the coauthor got there first instead of printing git errors. Conflicts list each file with "Keep mine" / "Use theirs" buttons (or edit the markers by hand) and a "Finish the merge" step. State logic is pure and tested (
collabGuide.ts); user guide indocs/collaboration.md.
[1.18.0] - 2026-08-05
Added
- SyncTeX click-to-source. When the PDF preview shows a locally compiled document (tectonic, xelatex or pdflatex, now invoked with
-synctex=1), clicking the PDF jumps the editor to the exact source line, and the new "Show current line in PDF" palette command scrolls the preview to the page that line produced. The bridge is a monotonic text alignment (texLineMap.ts) between the edited Markdown/CMDX and the generated LaTeX, since SyncTeX speaks in generated-tex lines; accuracy is exact for prose and paragraph-level for math-only lines. PDFs from the bundled WASM engine keep the previous heading-based fallback (the engine emits no SyncTeX), and the UI says so instead of guessing.
[1.17.0] - 2026-08-05
Added
- Journal templates. A new Journals section in the template picker: IEEE (IEEEtran), ACM (acmart), Elsevier (elsarticle) and APA 7 (apa7). Each template sets
comdtex.texclassin its frontmatter, and Export as .tex now honors that key: the exported document uses the real journal class with the right title block (IEEEauthorblock, acmart authors, an elsarticle frontmatter environment, apa7 authorsnames) and a theorem setup that respects what each class already defines (acmart predefines the theorem family, so only the missing environments are added). Without the key the export is unchanged.
[1.16.0] - 2026-07-30
Jumps from 1.11.2: the work was planned and built as five increments (1.12 editor stability → 1.16 AI gaps) and ships as one release.
Fixed
- Lists, task items and quotes continue again when you press Enter.
setLanguageConfiguration("markdown", …)replaces Monaco's built-in configuration instead of merging into it, so passing only the auto-closing-pair options had been silently discarding markdown'sonEnterRules. Enter is now handled explicitly (markdownEditing.ts+monacoSetup.ts), which also does what the declarative rules never could: ordered lists renumber (1.→2.), nested items keep their indentation without an extra Enter, task items continue as- [ ]even from a checked one, and an abandoned marker outdents one level (or clears at the top level) rather than spawning another empty bullet. - Pipe tables continue on Enter with a fresh row of the same width, and an empty row exits the table.
- Blocks no longer unfold on their own. Collapsed regions, scroll position and the caret are now persisted per file as a Monaco view state (
editorViewState.ts) and restored synchronously on mount. Previously they were lost on every tab remount and on everysetValue()from the external-content sync, worst of all for:::excalidraw, whose scene is a single base64 line that word-wraps into dozens of screen lines. Excalidraw blocks are also auto-collapsed the first time a file is opened. - Fast Ctrl+Tab lands where you left off. The old cursor save was debounced by 500 ms, so switching faster than that never recorded the position; the snapshot is now taken synchronously as the tab changes. The 100 ms restore timer is gone too: it was visible as a jump and could race the first keystrokes after a switch.
- Text no longer pastes, deletes or reorders itself while you type. The external-content sync effect used
editor.setValue(), which resets the undo stack, folding, decorations and the selection. It now (a) refuses to touch the buffer while the editor has focus and the user's edits are still queued for disk (that content is newer than anything it would push in), and (b) applies the smallest edit that reconciles the two (textDiff.ts) through the model's edit stack. - Pasting a screenshot works. Image paste only ever handled clipboard entries backed by a file on disk (
file.path); a plain screenshot carries raw bytes and hit the "no path" error every time. Those bytes are now written directly, under a timestamped name, and an existing asset is never overwritten (name-2.png, …). - The "changed on disk" prompt was English-only. Its text and buttons are now translated, and it reports how many lines actually differ, so the reload-or-keep decision is informed rather than blind.
- A file created during the session was saved unguarded.
createFile(and the auto-created vault README) never recorded a disk mtime, so the external-change guard had no baseline for those tabs and never ran for the rest of the session. Both now stat after writing, like the file-open paths already did. This matters most where a sync client rewrites files in place and leaves no conflict copy behind to notice, Google Drive's desktop client being the usual case.
Added
- Per-folder rules (
.comdtex-folder.json, stored inside the folder it governs): a default template, a filename pattern ({{date:YYYY-MM-DD}}-{{title}}), default frontmatter, and declared generated files. Subfolders inherit field by field, nearest folder winning. Edited from the folder's context menu. - Generated folder files:
tasks,calendarandindexviews built from the notes around them, refreshed by "Regenerar archivos de carpeta". A target with hand-written content is never overwritten: only an empty file or one carrying thecomdtex:generatedmarker is rewritten. The task collector is the same parser the Todo panel uses, so the panel and the file cannot disagree. - Full folder context menu: new file / new folder / new from template inside that folder, rename, and folder rules. Folders answer to F2 and Delete like files do.
- New files land in the selected folder, not always at the vault root (
createFilewas hard-coded to the root). The create prompt names its destination. - "Guardar como plantilla" on a file: parameterises the frontmatter title/date and a matching H1 into
{{title}}/{{date}}, leaving body prose untouched (a date inside a paragraph is content, not a field). - Warning for ragged tables. A row whose column count differs from the header is flagged in the editor: GFM silently drops the extra cells or renders the missing ones empty, so the preview quietly disagreed with the source.
- "Normalizar tabla" command (palette and Edición menu): pads every row to the header's width and re-aligns the pipes, preserving alignment colons, in a single undo step.
- Full Edición menu. Undo, Redo, Cut, Copy, Paste, Select all, Duplicate line, Move line up/down and Toggle comment are now visible menu entries instead of shortcut-only features.
- Toolbar buttons toggle. Pressing the button of the panel already on screen puts it away. Programmatic opens (a search hit, a comment glyph) still always show the panel.
- Search inside panels. The Help panel gains a filter that hides non-matching rows and expands what survives; the Outline, Equations and Environments panels gain one too. Matching folds accents ("indice" finds "índice") but keeps ñ distinct from n, since in Spanish it is its own letter.
- Pomodoro clock in the top bar while a session is running, so the countdown stays visible with the Enfoque panel closed. Session stats now also cover active vs paused time, words per minute against active time, completed pomodoros, words per pomodoro, files worked on, and the peak word count (so a late delete does not erase the record).
- Heading-based folding. Sections fold from their heading to just before the next heading of the same or higher level, which is what makes one long per-subject file workable. Headings inside fenced code are ignored.
- "Dividir documento en secciones" turns a long note into one file per
##, replacing each section with a![[transclusion]]so the rendered output is unchanged. Refuses to run if any target filename already exists. - AI gap filling. Leave
{{?}}or{{? a hint}}while writing and fill it later with "Completar hueco con IA" (cursor) or "Completar todos los huecos" (document). Gaps are flagged in the editor as info markers, ignored inside fenced code, and every fill is applied throughexecuteEdits: a normal undo step, never a direct disk write. Deliberately not ghost-text autocompletion: nothing is generated until asked, and Tab stays free for shorthand expansion. - New settings: reading speed for the status-bar estimate (was hard-coded at 200 wpm), auto-folding of Excalidraw blocks, and a switch for list continuation on Enter.
[1.11.2] - 2026-07-22
Fixed
- Special blocks no longer leak raw
:::markup into pandoc exports. "Export as PDF" (and every pandoc-based format) now degradespseudocode/truth/graph/plot/commdiag/flowchart/codeblocks to captioned code fences (**Truth Table: name**+ the readable body);:::code langkeeps its language for highlighting; Excalidraw bodies (JSON scene dumps) are replaced by a "drawing omitted" note. - PDF save dialogs default to the active file's folder inside the vault instead of the process working directory / last-used folder.
- Opening the finished file is best-effort. A PDF viewer/opener failure after a successful export no longer surfaces as "Error pandoc: undefined" next to the success toast, in any export path.
- "Export as PDF" (pandoc) now tries
tectonicbeforexelatex/pdflatex. With a partial TeX install (e.g. Archtexlive-basic+texlive-latexwithouttexlive-latexrecommended), pandoc's xelatex/pdflatex engines die withFile 'xcolor.sty' not found: the same message the WASM engine produces when its package server is down, which made the two failures easy to conflate. Tectonic fetches missing packages on demand, so the pandoc export now survives incomplete TeX installations. - PDF export died with
\begin{document} ended by \end{quoting}on documents containing->>/>->arrow text.babel-spanishtreats<</>>as guillemet shorthands backed by an internalquotingenvironment, so literal arrow sequences (e.g. the commutative-diagram help text) emitted a stray\end{quoting}. The exporter now loads babel withes-noquoting,es-noshorthands: exported documents use real Unicode, never babel shorthands. - A successful fallback compile no longer shows the LaTeX error modal. When the WASM engine failed but a local engine (
tectonic/xelatex/pdflatex) then produced the PDF, the WASM error modal still popped over the successful export. Diagnostics are now held and only surfaced if every engine fails.
Added
- Configurable TeX package server (Settings → PDF,
texliveUrl). The WASM engine downloads.sty/font files on demand fromtexlive2.swiftlatex.com, a community server with a history of outages (down at the time of writing, which made WASM PDF compiles fail withFile 'xcolor.sty' not found). The URL is now a setting so users can point at a mirror; the package-not-found error suggestion explains the server/offline cause and the tectonic alternative. - Local TeX package mirror (infrastructure). The bundled engine glue is patched to serve files from
public/wasm-tex/texlive/(flat, filename-keyed) before hitting the network; the directory ships empty with population instructions (public/wasm-tex/texlive/README.md).
[1.11.1] - 2026-07-21
Fixed
- The window could not be closed: quit silently did nothing. The close-confirmation handler (
onCloseRequested) relies on the Tauri JS API callingwindow.destroy()once the event is not prevented, but the capability only grantedcore:window:allow-close, so the ACL denied the destroy and the window stayed open with no visible error; every quit path (titlebar ✕, WM close,$mod+Shift+q) was affected. Addedcore:window:allow-destroytocapabilities/default.json. - Blank white window on Arch-based distros (installer). On Arch/Manjaro/EndeavourOS the AppImage's bundled
libwayland-client/cursor/serverare older than the system Mesa/Wayland stack, making WebKit's EGL init abort withEGL_BAD_PARAMETER: the window opened but never rendered.scripts/install.shnow detects Arch-like distros (/etc/os-release), extracts the AppImage to~/.local/opt/comdtex, removes the bundledlibwayland-*so the system copies are used, and installs acomdtexwrapper that launches the patched tree. It also strips the CI-bakedWEBKIT_DISABLE_DMABUF_RENDERER=1from the AppRun hooks, unnecessary once the system wayland libs are in use, and it forced software rendering (sluggish Excalidraw canvas and visible preview repaints while typing). Other distros keep the plain AppImage install;--uninstallcleans up both layouts.
Added
- One-line Linux installer with desktop integration (
scripts/install.sh). Downloads the latest AppImage, verifies the published sha256, installs to~/.local(no sudo), creates the launcher entry (rofi/wofi/GNOME/KDE) + icon +comdtexCLI symlink, and uninstalls cleanly with--uninstall. - Build-from-source helper (
scripts/build-from-source.sh). Checks prerequisites with per-distro install hints (pacman/apt/dnf, including the webkit2gtk-4.1 pitfall), applies the ArchNO_STRIPAppImage workaround automatically, and--installintegrates the locally built binary with the desktop. - AUR packaging (
packaging/aur/comdtex-bin/). PKGBUILD that repackages the official.debwith correct dependencies and optdepends (pandoc, typst, zip, git, TeX fonts);packaging/aur/update.shbumps it to a release pulling the published checksum.
[1.11.0] - 2026-07-21
Added
- The preview respects manual line breaks and leading indentation inside paragraphs. Paragraph text now renders with
pre-wrapsemantics plus dedicated indent markers, so hand-indented lines (common in poetry, addresses, or aligned notes) no longer collapse into a single flowed line. - Inserting a list over a selection converts it. Applying the bullet/ordered/task-list insert action with several lines selected now turns each selected line into a list item (numbering sequentially for ordered lists, preserving indentation) instead of replacing the selection with placeholder items. Inline-math inserts wrap the selection correctly as well.
- Command Palette entries match hidden keywords. Palette search now looks at label, description, shortcut, category and per-command keyword lists (Spanish and English), covered by an e2e test searching
flowchart. - Closing the Excalidraw editor with unsaved changes now asks first. Esc, clicking outside the modal, or Cancel used to silently discard the drawing; with real edits present (element-version comparison, selection changes don't count) a save / discard / keep-editing prompt appears instead.
- Contextual autocomplete inside special blocks. With the cursor inside a
:::pseudocode,:::flowchart,:::truth,:::graph,:::plotor:::commdiagblock, suggestions switch to that block's own grammar (e.g.for+ Tab expands the fullFOR i ← 1 TO n DO … END FORtemplate;and+ Tab inserts∧in a truth table;squaredrops a complete commutative square). The quick-suggest popup is enabled only while inside such a block, so prose writing stays undisturbed. Global shorthands are suppressed there (sininside a:::plotstays plainsin(x), never\sin), and typing the closing:::no longer pops the block-type list. See docs/autocomplete.md. - Typing bare
:::now lists every block type. Previously nothing appeared until the first letter was typed. - The Command Palette now covers practically everything. New insert commands: wikilink, transclusion, footnote (mark + definition), BibTeX citation, numbered figure, YAML frontmatter, environment reference, and callouts (
[!NOTE]/[!WARNING]/[!TIP]/[!IMPORTANT]). The environments submenu gains exercise/remark/note; the math submenu gains superscript/subscript/gradient/inverse/transpose and the three matrix forms. Entries match by name, syntax (:::theorem), or Spanish/English keywords. - Help panel: every syntax feature now shows a worked example (code → rendered result): equation/section/figure/table/environment references show their resolved output, citations show the superscript marker, matrices render, and the previously undocumented cross-file environment references, inline-labeled math, flowchart and Excalidraw examples were added.
Changed
- More keystroke-stability work in large vaults. The tab bar is memoized on display-relevant fields only, per-file content commits are debounced so rapid typing doesn't thrash React state, a stale render can no longer roll the in-memory tab content back behind newer keystrokes, and the display-math hover preview skips re-writing unchanged zones.
Fixed
- Tab after
:::+ letters could expand a math shorthand.:::ta+ Tab matchedtable(...)/tan(...)and replaced the block prefix with a math snippet; after:::only block snippets qualify now. - Zooming inside the Excalidraw editor (and the vault graph) was janky. Touchpad pinch is delivered as a synthetic Ctrl+wheel, so every zoom tick inside the canvas also fired the app-wide font zoom: a full UI re-render per tick behind the modal. Surfaces with their own zoom now opt out of the global gesture handlers.
- Session-long memory leak in the drawing/diagram caches. The Excalidraw and Mermaid SVG caches were never evicted; every save of a drawing (whole base64 scenes and SVGs, MBs each with embedded images) added a new entry for the lifetime of the session. Both caches are now bounded.
- Preview renders carried each Excalidraw scene twice. The base64 scene was embedded in two attributes per block, doubling the HTML that is parsed, sanitized and morphed on every debounced preview refresh of image-heavy documents.
- PDF export (pandoc) survives a TeX install without the Latin Modern fonts. Pandoc ran only
--pdf-engine=xelatex; on systems with the XeTeX engine but not the LM OpenType fonts (e.g. Arch'stexlive-xetexwithouttexlive-fontsrecommended) every export died withFont TU/lmr … not loadable. The export now retries with pdflatex before surfacing an error. - LaTeX error messages are no longer truncated mid-word. TeX hard-wraps its log at 79 columns, so the error modal showed cut-off messages ("…not lo"). Wrapped log lines are now rejoined before parsing, and font-not-loadable errors carry a targeted suggestion naming the distro package to install.
[1.10.2] - 2026-07-15
Changed
- Typing in large documents is dramatically smoother. A KaTeX-heavy document's rendered HTML (easily multi-MB, each equation expands into hundreds of spans) was being HTML-parsed three times and re-serialized twice on every preview refresh, all on the same thread that handles keystrokes: once to annotate source lines (inside
renderMarkdown), once to sanitize (DOMPurify string round-trip), and once to commit (template.innerHTML). The preview now uses a single-parse pipeline: DOMPurify returns its sanitized DOM directly (sanitizeRenderedHtmlToFragment), source-line annotation walks that fragment in place, and the block-level morph consumes it: one parse, zero re-serializes (measured ~2× faster commits). The newcommitPreview()helper is the only sanctioned path from render output to the DOM, so sanitization can never be skipped. - The adaptive preview debounce now measures the real cost. It previously timed only the DOM commit (a third of the work), so heavy documents under-throttled and saturated the editor's thread. It now measures the full render + commit, backs off up to 1.5 s on very heavy documents (typing stays smooth; the preview just follows a beat behind), keeps its 150 ms floor for light ones, resets when the preview is hidden, and the split reference pane no longer contaminates the active document's timing.
- Held-key deletion no longer rebuilds the whole UI ~30× per second. Menus, the command palette (~130 entries), and the top bars were being rebuilt and re-rendered on every keystroke. They are now memoized end-to-end (the vault handle is read through refs by action handlers, so their identities survive keystrokes), and the menu/toolbar subtrees skip per-keystroke re-renders entirely. Redundant per-keystroke localStorage writes for tab persistence were also eliminated.
Fixed
- Preview click-to-jump stays accurate. Two annotation regressions from the pipeline rework were caught by review and fixed before release: line annotations could go stale after edits that shift lines without changing the rendered output (e.g. inserting a blank line), and a frontmatter title identical to a body heading could steal its jump target (annotation now skips the frontmatter header and bibliography, as before).
- Exported standalone HTML no longer ships internal
data-source-linebookkeeping attributes.
[1.10.1] - 2026-07-15
Fixed
- Unsaved edits no longer vanish on window focus. Refocusing the window (very frequent on Wayland/Sway: tooltips, dialogs, workspace switches, external file managers) re-ran the full vault load, which rebuilt every open tab from disk/draft and silently discarded in-memory edits not yet flushed (drafts flush at 300 ms, autosave at 800 ms). Focus now only refreshes the file tree.
restoreTabsalso refuses to overwrite an already-open tab that has unsaved edits (defense in depth). - Autosave race could lose the last edit. A keystroke landing while a save was in flight had its "unsaved" signal (
pendingContent/isDirty) cleared when that save completed, stranding the newer text so it was lost on the next tab close, vault switch, or app quit. The signal is now only cleared when nothing newer arrived. - Search-and-replace no longer clobbers unsaved edits. Replacing in an open, dirty file read from disk (ignoring the in-memory edits) and wrote directly without cancelling the pending autosave. It now uses the tab's current content and the safe write path.
- Empty and unsupported-only folders appear in the file tree again. A directory was hidden unless it contained a renderable file, so a newly created empty folder (or one holding only images/
.txt/etc.) never showed up no matter how many reloads. Directories are now always listed, and an unreadable subdirectory no longer aborts the entire tree walk. :::codeblocks with a language survive saving. A:::code pythonblock (code with a language) was invisible to the special-block guard, so shorthand tokens in its body (abs,sqrt,frac,table, …) were expanded and the code corrupted on disk. Fixed, plus the case of a special block nested inside a normal environment (its callout prefix was applied to only the first line, garbling the block on reopen).- Equation numbering stays in sync around code fences.
$$…$$inside a fenced code block was numbered and rendered as live math, desyncing every following@eq:reference from the visible number. Fenced blocks are now excluded, matching the reference prescan. - DOCX / Beamer export can no longer destroy an extension-less target. The temporary file was derived by swapping the
.docx/.pdfsuffix; when the Linux save dialog didn't append the extension, the temp path equalled the chosen path and the export overwrote then deleted the user's file. The temp path is now independent of the extension. - Frontmatter search (
fm:) matches keys case-insensitively: a document usingAuthor:/Title:is no longer excluded by anfm:author=…filter. Also fixed a stray orphaned draft when renaming a file immediately after typing.
[1.10.0] - 2026-07-14
Added
- Cross-file environment references. Environment refs (
@def:valor) previously only resolved within a single document. They can now point at a labelled environment in another vault note:@gp/calendario@def:valorrenders as a link reading "Definición 3" (the target's own number), and clicking it opens that file and jumps to the environment. Use@[mi carpeta/mi nota]@def:valorwhen the path contains spaces. Refs are vault-path-based (not filename-based) so vaults with two same-named notes resolve unambiguously, and the@stays leading so refs never collide with[@key]BibTeX citations. A missing file or missing label degrades to the sameDefinición (?)marker as a broken local ref. Resolution is cached per target document and short-circuits on an unchanged-content pointer compare, so typing does not re-read or re-scan the vault. - "Keep" marks: invisible highlighting, plus a Keep panel. Wrap a fragment in
^^texto^^to mark it as worth keeping, or add a freeform category with^^def: texto^^/^^duda: revisar esto^^. The mark is visible only in the editor (faint dotted underline + a gutter glyph); the preview and every export (LaTeX, PDF, DOCX, Typst, Beamer, Reveal, HTML, Obsidian, Markdown, Anki) render the plain text with the delimiters and thecat:prefix removed, so a marked document is byte-for-byte identical to the same prose written unmarked. The new Guardar / Keep sidebar panel (menu bar → Vistas, or the command palette) collects every mark across the vault grouped by category, showing each one's text andfile:line, and jumps to it on click. It reads the documents directly, so it is always in sync; a glossary is written only on demand via its export button, never automatically. Marks are never parsed inside math, inline/fenced/indented code, or ComdTeX special blocks; the math exclusion matters because^is LaTeX superscript, so$x^{2^^3}$and$a^{n+1}$are left alone. Trailing block ids (^myid) do not collide either:^^a^^ ^blockidparses as both. The text may contain a single caret (^^dato: 2^10 = 1024^^), and ordinary carets in prose never become marks.^^was chosen because the obvious delimiters were taken:{{ }}is Anki cloze deletions plus template and PDF header/footer variables, and%%…%%is Obsidian's comment syntax, which hides text where a keep mark shows it. A:::definitioncan now hold both a cloze and a keep mark. See docs/keep-marks.md.
Changed
- LaTeX export names the source document for cross-file refs.
@gp/calendario@def:valorexports asDefinición~(gp/calendario)rather than a\ref{}to a label that isn't in the exported file, which LaTeX would silently typeset as??. Local refs are unchanged and still emit\ref{}.
[1.9.8] - 2026-07-14
Fixed
- Mermaid diagrams render their labels again. Since 1.9.6, every
:::flowchart/:::pseudocodediagram (and any raw ```mermaid fence) drew its shapes and arrows correctly but with completely empty nodes: no label text at all. The 1.9.6 audit wave rebuiltsanitizeRenderedHtmlon DOMPurify, which shipsforeignobjectin itsDEFAULT_FORBID_CONTENTSset: it keeps the<foreignObject>element but deliberately drops its children. Mermaid's defaulthtmlLabels: truerenders every node label as HTML inside a<foreignObject>, so the sanitizer gutted all of them. Mermaid is now configured withhtmlLabels: false(src/mermaidConfig.ts), emitting labels as native SVG<text>/<tspan>, which passes the sanitizer untouched. The sanitizer was not weakened: removingforeignobjectfromFORBID_CONTENTSdoes not restore the children anyway, and doing so would be the wrong trade. - Table labels no longer render as an extra table row.
{#tbl:label}written directly under a table (the documented form) was folded into the table by markdown-it as a lazy continuation, so the label text showed up as a cell. Both the documented form and the blank-line-separated form are now recognised by the prescan and consumed by the renderer, so the label never reaches the output either way. @tbl:references resolve again. The prescan only accepted the no-blank-line form while the renderer only consumed the blank-line form, so no way of writing a table label worked end-to-end: one leaked the label, the other degraded every reference to "Tabla (?)".- Table and figure cross-reference links are no longer dead.
@tbl:datalinked to#tbl-datawhile the table was givenid="tbl-tbl:data", and@fig:maplinked to#fig-mapwhile the figure was givenid="fig-1"(the label was smuggled through markdown-it in the title slot but read back from adata-fig-labelattribute that was never emitted). Anchors are now derived from one canonical helper per module, so refs and ids always agree. - Figure labels no longer surface as a tooltip. The internal
title="fig-label:fig:..."used to carry labels through markdown-it is now stripped from the rendered<img>. - Pipe tables inside fenced code no longer shift table numbering. The prescan counted them, the renderer did not, so
@tbl:refs after a code sample containing a table resolved to the wrong number. @sec:references resolve again.numberHeadingsstored heading labels with theirsec:prefix whileresolveSectionRefslooked them up without it, so the documented@sec:introform never matched and the raw@sec:introtext appeared in the preview. Only the accidental@sec:sec:introdouble-prefix form worked; both are now accepted.- Headings get an
idin every document, not just ones containing a[[toc]]. Heading ids were only assigned as a side effect of expanding the TOC, so in a document without one every in-page link was dead. Id assignment now always runs, and the auto-TOC links to the ids the headings actually have instead of re-deriving its own. - Explicit
{#sec:label}ids now reach the rendered heading, so a@sec:link points at the labeled heading rather than at a slug of its text. @sec:/@thm:-family references at the end of a sentence resolve again. Their label pattern swallowed the trailing period, so "ver @thm:main." looked upmain.and rendered as unresolved. Dots inside a label (@thm:1.2) still work.- Clicking a cross-reference now scrolls the preview to its target. In-page anchors are handled before the source-line fallback, which previously hijacked the click and jumped the editor to the line the reference was written on.
- Unknown
@sec:labels render as a broken-reference marker (sección (?)) instead of leaking the raw@sec:…source text, matching how@tbl:and@fig:already behaved.
Security
- Mermaid now runs at its default
securityLevel: "strict"instead of"loose". The"loose"opt-in was justified by a comment claiming it was needed for the↺(and similar) characters in pseudocode-derived flowcharts; that turned out to be untrue: strict and loose render byte-identical SVG for those diagrams, since the characters are plain Unicode in SVG text and never involve HTML. Strict additionally makes Mermaid sanitize label text itself, so a hostile label in a raw ```mermaid fence is defanged before it reaches our own sanitizer. Nothing is lost: Mermaid'sclickhandlers (the other thing strict disables) never worked here regardless, because the render path re-injects the sanitized SVG viainnerHTML, dropping any listeners Mermaid attached.
[1.9.7] - 2026-07-14
Fixed
- Saving no longer fails on Linux. Since 1.9.6 every write (autosave, save, save-as, vault-wide replace and the comment store) failed with
forbidden path: /<vault>/.<name>.tmp-<hex>, leaving edits unsaved on disk. Atomic writes go to a temp file first, and that temp file was dot-prefixed; Tauri's fs scope matches with glob'srequire_literal_leading_dot, which istrueby default on Unix, so the<vault>/**grant could not match a name starting with a dot. Temp files are no longer hidden (the file tree filters them by name instead), and.comdtex-comments.json(whose own name starts with a dot) is granted explicitly. - Preview sync now works inside code blocks. Code blocks were never annotated with
data-source-line, so double-clicking in the editor highlighted the nearest annotated block above the cursor (often many lines off), and clicking a code block in the preview did not move the editor at all. This mainly hit documents written as indented blocks, where the whole document is one code block. Fenced blocks are now indexed too, which also stops code text from stealing a prose line's number.
Dependencies
undici7.25.0 → 7.28.0 andlodash-espinned to ^4.18.1 via overrides, clearing both high-severity npm advisories without downgrading@excalidraw/excalidraw(npm's suggested--forcefix would have broken the build).quick-xml0.38.4 → 0.41.0 viaplist1.10.0, clearing RUSTSEC-2026-0194 and RUSTSEC-2026-0195. Neither reaches the Linux or Windows binaries (quick-xmlis macOS-only in this tree), so no shipped artifact was affected.
[1.9.6] - 2026-07-14
Security
- Vault-scoped filesystem access. The Tauri fs-plugin scope no longer grants
$HOME-recursive read/write/delete. Access is now granted per-vault at runtime through a new Rust commandallow_vault_dir(seesrc/vaultScope.ts), called on every vault open. The asset-protocol scope was narrowed from["**"]to empty + runtime vault grant. Pre-vault cloud-sync detection keeps read-only scope for the specific provider paths it probes. - AI API key moved out of
localStorageinto the OS keychain (Secret Service / macOS Keychain / Windows Credential Manager) via thekeyringcrate andsrc/secretStore.ts. Legacy plaintext keys are migrated off the settings JSON on first run; a namespacedlocalStoragefallback is used only when no keychain backend is available. - Preview HTML sanitizer rebuilt on DOMPurify (allowlist) replacing the hand-rolled blocklist: closes mXSS/namespace-confusion vectors.
file:links are no longer accepted;asset:is allowed only on image sources; YouTube embeds are now explicitly sandboxed.
Fixed
- Flowchart
REPEAT/UNTILloop-back. The:::flowchart/:::pseudocodegenerator drew theUNTILcondition diamond looping back to itself; it now loops back to the first node of the loop body, as a real do-while flowchart should. - Flowchart
IFbranch labels. Condition diamonds now label their branchesYes/No(previously onlyELSE IFchains were labelled, leaving a plainIF/ELSEfork ambiguous). - Data safety: atomic disk writes. Document saves (
saveFile,writeFileSafe,replaceInVault, Save-As paths, inline comments) now write to a temp file andrename()onto the target, so a crash/power-cut mid-write can't truncate the real file. - Typing-lag fix. The background per-tab linter no longer re-runs synchronously on every keystroke; it is debounced (~1s) and skips tabs whose content is unchanged.
- Preview task-list checkboxes (
- [ ]) now survive sanitization (the old sanitizer stripped all<input>elements). - localStorage key collisions (
RECENT_KEY,ACTIVE_KEYmeaning different things in different modules;comdtex_cloud_banner_dismissedwritten from two files) resolved via a single typedsrc/storageKeys.tssource of truth.
Changed
- Vault search is now indexed in memory (
src/searchIndex.ts), invalidated by file mtime, instead of re-reading every file from disk on each query. Wired throughuseVault.search,replaceInVault, and the Search & Replace panel. i18n.tssplit intosrc/i18n/{types,es,en}.ts(thin re-export shim preserves the public API) with a new EN/ES key-parity test.App.tsxslimmed by ~555 lines: export/import/compile handlers extracted tosrc/useExportActions.ts; command-palette and menu-bar data extracted tosrc/commands.ts/src/menus.ts.- Test/CI: Vitest coverage (
@vitest/coverage-v8) with a regression-floor threshold;typecheck/test:coverage/format:checkscripts; the Playwright e2e job is now a required gate (was informational) with an added command-palette spec. Test count 504 → 732: new suites foraiProvider,frontmatter,searchIndex,storageKeys,atomicWrite, i18n-parity, plus the previously untested pure moduleslatexErrors,macros,sectionWordCount,truthTable,pseudocodeFlowchart,graphViz,functionPlot,commDiag. Line coverage ~26% → ~36% (i18n data excluded).
[1.9.5] - 2026-06-17
Added
- AI assistant (bring-your-own, off by default): multi-provider support: Anthropic, OpenAI, Google Gemini, any OpenAI-compatible endpoint (incl. local Ollama / LM Studio / OpenRouter / DeepSeek), and a local agent CLI bridge (e.g.
claude/opencode). Chat panel (Ctrl+Shift+A, or the IA menu button) plus inline edit (Ctrl+K). All edits are applied through MonacoexecuteEdits(), so every change is undo-safe. Base URLs are SSRF-guarded (https://or loopback only). ComdTeX ships no keys and makes no requests until enabled :::excalidrawspecial block: a built-in, lazy-loaded freehand drawing editor; the drawing is stored verbatim in the file and auto-numbered per type, like the other special blocks- Offline spellcheck: Hunspell dictionaries (Spanish + English) via
nspell, gated by a Settings toggle: no network access - Zotero import in the Citation Manager: pulls entries from a running Zotero with the Better BibTeX plugin via its local JSON-RPC API (
http://localhost:23119) - Typst export:
.typsource via pandoc, plus Typst → PDF when thetypstbinary is installed - Pandoc document import:
.docx/.odt/.tex/.html/.epub/.rst/.org→ Markdown, with embedded images extracted - Live auto table of contents: a standalone
[[toc]](or[toc]) line expands into a navigable, always-current heading list (Ctrl+Shift+Oinserts the marker) - Text formatting:
==highlight==(yellow), coloured highlights via<mark class="hl-green|hl-blue|hl-purple|hl-orange|hl-red|hl-pink">…</mark>, and<u>underline</u> - Outline panel drag-reorder: drag headings to reorder sections in the source
- New global keyboard shortcuts:
Ctrl/Cmd+Shift+A(open AI assistant),Ctrl/Cmd+Shift+O(insert TOC),Ctrl/Cmd+Shift+E(toggle Outline panel),Ctrl/Cmd+K(AI inline edit) - Third-party license notice: README now lists bundled dictionary licenses; ComdTeX elects MPL-1.1 for the
dictionary-esdata
Changed
- Unified sectioned menu bar: a classic dropdown bar (Archivo/Edición/Vista/Vault) plus a sectioned Archivos / Textos / Matemáticas / Vistas menu with direct Enfoque / IA / Sync / Ayuda buttons (monochrome icons). Replaced the old toolbar and the sidebar tab strip; opening a panel un-collapses the sidebar
- Enriched Command Palette (
Ctrl+P): now a categorized, selection-aware universal launcher with eight categories (Edición / Insertar / Matemáticas / Vista / Exportar / IA / Vault / Navegación). Each command shows an icon and a keyboard-shortcut chip; commands with variants (highlight colours, headings, lists, symbols, math operations, environments) drill into sub-menus; format commands wrap the current selection - Word wrap is now on by default
- Build: migrated to Vite 8 (rolldown backend); manual chunks now use
output.codeSplitting.groups
Fixed
- WASM LaTeX
PdfTeXEngine.jswrapper: fix landed so PDF compilation works with no system LaTeX installed (fallback chain WASM →tectonic→xelatex→pdflatex) - Data safety (masking bypass): several write paths (todo-checkbox toggle, wikilink rename refactor, backlink removal) wrote editor content to disk without the special-block masking, corrupting
.texfiles; all now route through the masked, autosave-race-safe write path.:::excalidrawblocks are now stored verbatim like the other special blocks - Save As / Export: Save As no longer applies a lossy Obsidian transform (it now saves the document faithfully); Export Markdown now produces clean Markdown; DOCX/Beamer export convert the live editor content through the pandoc input pipeline
- Quit safety: closing the app (window manager,
Cmd+Q) now flushes pending autosaves and warns about unsaved changes instead of silently dropping the last edits - Panels opened from the palette/menu/shortcut/status bar now un-collapse the sidebar instead of changing the panel invisibly
- Autosave interval setting is now actually applied (was always 800 ms); added an Auto-rebuild PDF Settings control that previously had no UI
- Settings inputs no longer lose focus after each keystroke (focus-trap fix)
- Theming: added light / high-contrast overrides for the focus timer, AI panel, and cloud-sync UI; defined the previously-undefined
--mutedvariable; replaced colour-emoji icons (folder, sparkle, trash) with monochrome inline SVGs that render correctly in WebKitGTK - Reveal.js export escapes the document title and guards against content breaking out of the slide template
[1.3.2] - 2026-04-29
Added
:::flowchartenvironment: native flowchart rendering from pseudocode syntax, via mermaid runtime (transparent background, dark theme variables). Coexists with:::pseudocode(numbered code + collapsible flowchart)- Inline labeled equations:
$inline$ {#eq:label}is now numbered and referenceable like$$display$$ {#eq:label}: both forms share the same counter (NUMBERED_MATH_RE+wrapInlineNumbered) - Callout-style environment aliases (unnumbered):
tip,hint,info,warning,caution,attention,important,danger,error,failure,success,check,done,question,help,faq,quote,cite,abstract. Themed border/background/label colors per category - Plot bounds shorthand:
:::plotacceptsxmin = N/xmax = Nper-line (in addition torange: [a, b]) docs/installing-deps.md: per-OS install guide forpandoc/zip/git, with troubleshooting for the Tauri shell scopePATHcache
Fixed
- Toolbar code-block snippet inserted literal
\`` (backslash + backtick) instead of triple backticks: the JS string was over-escaped ("\`\`\`"produced``repeated). Same bug in the bundledcomdtex.mdtemplate (auto-migrated on open:\\`` → ````) - Special envs (
:::plot/graph/truth/commdiag/pseudocode/flowchart) corrupted by shorthand expansion:exp(...)/sqrt(...)were auto-wrapped in$..$, then the env's parser choked on$. Preprocessor now masks special-env bodies before shorthand expansion (SPECIAL_ENV_REinmaskCode) :::commdiagrendering as a thin strip (height 0):__height__sentinel was stored as{x: height, y: 0}but read as.y. Inversion fixed- Graph layout wrapped backwards (right-then-left-and-down) for small graphs: replaced circular layout with grid (left→right, top→bottom)
$$..$$and$..$inside backticks rendered as math in prose talking about math syntax: the math regex now skips inline-code spans- CMDX warnings on opening
comdtex.mdaboutlg/smsize prefixes: removed the prefixes from the bundled template - Tauri shell scope rejected
pandoc/zip/git:shell:allow-executenow uses the v2 object form with an explicitallowlist (pandoc,zip,git,tectonic,xelatex,pdflatex) - DepsWarning install button did nothing:
openPathis for filesystem paths; switched toopenUrlfor thehttps://doc link - Math overflow in callout/env bodies for long
$$..$$equations:.eq-blocknow allows shrinking (min-width: 0); inner.katex-wrapperscrolls horizontally - Click-to-jump preview→editor scrolled imprecisely: env handlers now wrap output in
<div class="env-wrap" data-source-line="N">, withNresolved against the editor's raw text (not the post-preprocessCallouts/preRenderDisplayMathtext where multi-line constructs collapse to one-line placeholders) - Preview yanked back to the section heading after a preview-click moved the editor cursor: added
suppressPreviewScrollOnceref consumed by the heading-active scroll-sync effect; smooth scroll on the editor side (ScrollType.Smooth) :::flowcharthad three disconnected terminal nodes (Start,END,End) floating at the top: strip a trailing structuralENDfrom the AST and skip the virtualEndwhen all paths already terminate viaRETURN/STOP- Settings dropdowns illegible: added
appearance: none, transparent background, contrasting text + custom chevron;<option>elements force their colors per theme
Changed
:::envsource-line annotation: the wrapper.env-wrapcarries the editor line viadata-source-line. The annotator selector includes it so click-sync targets envs precisely- Mermaid theme: initialized with
themeVariables: { background, mainBkg, primaryColor, secondaryColor, tertiaryColor: 'transparent' }so flowchart canvas matches the surrounding preview background comdtex.mdenriched with examples for code blocks, pseudocode, flowchart, truth tables, graphs, function plots, commutative diagrams, transclusion, callouts, and inline labeled equations
[1.3.1] - 2026-04-28
Fixed
- Update install button stuck on "Installing…": wrapped install flow in try/finally with error toast on failure
useUpdater.downloadAndInstallUpdate: added error handling and typed rethrow so failures surface to the UI- Hardcoded
/path separators on Windows: fixed inuseVault.rename,App.tsx,exportActions.ts,GraphPanel.tsx,GitBar.tsx,Breadcrumb.tsx,documentDiagnostics.ts, andmonacoSetup.ts closeTabdata-loss risk: save errors are now toasted and the tab is kept open instead of silently swallowedwasmTex.tssticky init promise: rejection no longer prevents retrying the WASM compile- First-render preview race: equations at the top of a file rendered as raw LaTeX because preview ran before macros loaded; preview is now gated until macros are ready
Changed
- SettingsModal: redesigned as a tabbed left-sidebar layout with five sections (General, Editor, Vista previa, Notas diarias, Compilación PDF) and a scrollable right pane
- Sidebar tab strip: reduced from 18 stacked icons to 6 essentials plus an overflow
⋯popup containing the remaining 12 - Command palette: vertically positioned at 35vh instead of the very top of the screen
- DepsWarning: persistent per-dep dismissal in localStorage (
comdtex_deps_dismissed); pandoc and zip dismissed independently pathBasename/pathDirname: converted from async (Tauri IPC roundtrip) to sync helpers handling both/and\
Added
- 9 new unit tests for
pathBasename/pathDirnameplus 1 regression test for the first-render preview bug (324 total, was 314) - CI: version-consistency check (tag vs
package.json/Cargo.toml/tauri.conf.json) - CI: SHA256 checksum generation for release artifacts
- CI: auto-generated changelog from git log between tags
- CI:
cargo clippy --all-targets -- -D warningsandcargo fmt -- --check - CI: Playwright e2e job (currently
continue-on-error: truepending Tauri API mocking) - CI: new
audit.ymlworkflow (weekly + on lockfile change) runningnpm auditandcargo audit, opening an issue on scheduled failure - CI: pinned
tauri-apps/tauri-actionto a specific version, added concurrency control (cancel-in-progress on PRs only) andtimeout-minuteson all jobs
Removed
- CI:
arch-releasejob: Tauri does not support pacman bundles and the job was always failing
Security
npm audit fix: bumped Vite to patched 7.x (high-severity path-traversal CVE in dev server); moderatedompurifyandpostcssfindings auto-fixed in the same pass
[1.3.0] - 2026-04-27
Added
- Bundled WASM LaTeX engine (SwiftLaTeX): PDF compilation no longer requires
pandoc,xelatex, ortectonicto be installed - SwiftLaTeX PdfTeX engine ships in
public/wasm-tex/(84 KB JS + 1.7 MB WASM) and runs in a Web Worker compileLatexPdftries the WASM engine first whensettings.useWasmTexis enabled (defaulttrue), falling back to localtectonic/xelatex/pdflatexon failure- Exotic LaTeX packages are lazy-fetched from
texlive2.swiftlatex.comand cached in IndexedDB - New "Compile PDF (WASM engine)" command in the command palette
LatexErrorModalsurfaces compile errors with log excerpts- StatusBar indicator shows
TeX: WASM | localplus a transient "compiling…" state - New "PDF compilation" section in Settings with a
useWasmTextoggle - 11 new unit tests (314 total, was 303)
Changed
- DepsWarning copy: pandoc is now described as required only for DOCX / Beamer / Markdown-to-PDF flows
[1.2.0] - 2026-04-27
Added
- PDF preview pane powered by
pdfjs-dist: virtualized rendering with zoom, fit-width, and pan - Heading-based click-to-source jumps from the PDF preview back to the editor
- Auto-rebuild of the PDF preview on file save
- Per-line comments with a sidebar panel and All / Unresolved / Resolved filter, persisted in
.comdtex-comments.json, with drift detection when the underlying line moves - Daily notes (
Ctrl+Shift+D) with a configurable folder and template - Transclusion: block references via
![[note]], block IDs via^id - Wikilink hover preview showing the linked note's content inline
- Improved graph view: zoom, pan, search, and filter
- First-launch onboarding tour (4 steps, replayable)
- Polished empty states across 9 panels
- Searchable keyboard shortcut help
- 33 new tests (303 total, was 270)
[1.1.0] - 2026-04-24
Added
- Themes: additional theme options beyond dark / light / high-contrast
- Structured environments: richer rendering and metadata for
:::theorem/:::lemma/ etc. blocks - Full i18n parity: every remaining UI string translated; English and Spanish are now feature-complete
Fixed
- Multiple data-loss edge cases around tab close, autosave, and crash recovery
[1.0.1] - 2026-04-17
Fixed
- Windows build (TS1149/TS1192): Renamed
src/toast.ts→src/toastService.tsto eliminate a filename case collision withsrc/Toast.tsxthat caused TypeScript errors on Windows (case-insensitive filesystem) - Arch Linux CI: Removed
arch-checkandarch-releaseCI jobs entirely: Tauri v2 does not supportpacmanas a bundle target (valid Linux targets:deb,rpm,appimage); Arch Linux users are directed to use the.AppImagebuild instead - Copy error toast:
handleCopyHtmlandhandleCopyLatexnow show the correct error message on clipboard failure instead of the success message - Hardcoded i18n strings in HelpPanel:
"Inline:"and":::theorem[Título]"were not translated; now usehp.inlineExampleandhp.exampleTitlerespectively - Duplicate keyboard shortcut:
Ctrl+Shift+Fwas bound to both Focus mode and Search vault simultaneously; Focus mode binding removed (onlyF11now) - Menu entry not translated: "Backlinks" menu item was hardcoded in English regardless of language setting
- Focus mode menu inconsistency: Toggling Focus mode from the View menu now shows a toast notification, consistent with the palette and keyboard shortcut
onCreateVaultdid nothing different: "Create new folder" on the welcome screen now actually creates a new folder via a save dialog instead of reusing the open-folder dialogBacklinksPanelunhandled rejection: Added.catch()to thePromise.allthat reads vault files
[1.0.0] - 2026-04-15
Added
Editor
- Monaco Editor with full syntax highlighting for Markdown and LaTeX
- Vim mode (via monaco-vim) toggleable from settings
- Word wrap, minimap, and typewriter mode
- Spellcheck support
- Tab-based shorthand expansion with snippet placeholders
- Autocomplete for shorthands and BibTeX citation keys
Math
- KaTeX rendering for inline (
$...$) and display ($$...$$) math - Shorthand system:
frac(a,b),sqrt(x),sum(i,n),int(a,b),mat(...), and more - Preprocessor expands shorthands before KaTeX, with nesting support
- Auto-numbered display equations with label/reference resolution (
{#eq:label}/@eq:label) - Math environments via
:::type[title]blocks:theorem,lemma,corollary,proposition,definition,example,exercise(auto-numbered),proof,remark,note - Size-prefixed environments (
sm,lg) - User-defined
\newcommandmacros loaded frommacros.md
References
- BibTeX parser reading
references.bibfrom vault root [@key]citation syntax with automatic bibliography rendering- Citation autocomplete in the editor
- Citation Manager GUI for browsing and managing references
Navigation
- Wikilinks (
[[note-name]]) with in-preview navigation - Backlinks panel showing all incoming links to the active file
- File graph visualization
- Navigation history with back/forward buttons
Export
- PDF export via Pandoc with fallback to
window.print() - LaTeX (
.tex) export with compilable output - DOCX export via Pandoc
- Beamer presentation export
- Reveal.js presentation export
- HTML export
Vault
- File tree with drag-and-drop reordering
- Vault-wide full-text search and replace
- Outline panel showing heading hierarchy of the active file
- Tags support via YAML frontmatter
- File properties panel
- Autosave with 800 ms debounce
- Crash recovery via localStorage drafts
- Vault backup utility
- Recent vaults list on the welcome screen
UI
- Focus mode for distraction-free writing
- Custom preview CSS support
- Word count goal with progress indicator
- Estimated reading time display
- Dark, light, and high-contrast themes
- Custom window titlebar (minimize, maximize, close)
- Command palette (Ctrl+P) for fuzzy file and command search
- Status bar with cursor position, word/character count, and macro count
- Toast notifications
- Keyboard shortcuts reference modal
- New-file-from-template picker (7 academic templates)
- Settings modal for language, fonts, theme, and vim mode
Internationalization
- Full Spanish and English UI translations
- Runtime language switching without restart
Desktop
- Tauri v2 desktop application for Linux, macOS, and Windows
- Auto-updater via GitHub Releases
- AppImage packaging for Linux