-
Notifications
You must be signed in to change notification settings - Fork 0
Features
folea compiles Typst in a worker and displays SVG. Relative imports and includes are loaded from the vault. It also makes these files available to the renderer:
-
.typfiles under_templates -
.typfiles andtypst.tomlunder.obsidian/plugins/typst-for-obsidian/packages
The render snapshot is limited to 10,000 text files and 50 MiB in total. folea does not install Typst packages.
Opening a broken note replaces the document with Typst compile error and diagnostic details. A failed live rerender is different: the previous good rendering stays visible, but the new diagnostic is not currently shown.
Watched .typ files update automatically. A changed import or include recompiles notes that depend on it. Files in ignored directories are not watched, including _templates, .obsidian, .git, .folea, .folea-cache, and node_modules; reopen the vault after changing files there.
The default zoom mode for a note is fit width, shown as [fit-w] in the status line.
| Mode | Status | Default command |
|---|---|---|
| Fit document width | [fit-w] |
= or F9
|
| Fit content width | [fit-c] |
F10 |
| Fit one page height | [fit-p] |
Command palette: zoom.fitPage
|
| Fixed zoom | Rounded percentage |
+ or -
|
Zoom in multiplies the current level by 1.1; zoom out multiplies it by 0.9. Fixed zoom is limited to 0.1×–10×. Fit modes are recalculated when the window changes size. Horizontal scrolling is available in fixed zoom mode.
folea saves scroll and zoom per note. When a note changes, it tries to preserve proportional scroll. If changed rendered text was outside the viewport, folea may bring it into view.
The bottom status line can show:
- the current note name
- zoom mode or percentage
- render-cache warmup progress, such as
render cache 12/40 - the first configuration warning
- a viewport page estimate such as
[2/5] - the active context, such as
[document],[tree],[search],[caret], or[visual] -
[start_screen]when no vault is open
The page estimate divides the rendered document into viewport-sized sections. It is not the Typst page number.
Success, warning, and error notifications normally disappear after 3 seconds.
Press :. Type to fuzzy-filter command titles and IDs. The palette shows each action command's exact ID and first configured binding. Enter runs the selected row; rows also accept mouse clicks.
Only commands run through the palette enter its per-vault history. Up to 50 recent palette commands are promoted when the palette next opens. Shortcut use does not update that history.
The palette contains these action IDs:
| Group | Command IDs |
|---|---|
| App |
app.openVault, app.closeVault
|
| Views and search |
palette.open, view.toggleTree, document.quickOpen, search.open, search.openGlobal, document.outline, document.links
|
| Caret |
caret.toggle, caret.smartJump
|
| Zoom |
zoom.fitWidth, zoom.fitContentWidth, zoom.fitPage, zoom.in, zoom.out
|
| Editor | editor.open |
| Vault |
tree.createNote, tree.createNoteAtCurrent, tree.createDirectory, tree.rename, tree.moveMarks, tree.delete, templates.manage
|
| Theme |
theme.useSystem, theme.useLight, theme.useDark, theme.cycle
|
| Cache |
cache.clearCurrentVault, cache.clearApplication
|
Navigation commands are remappable but do not appear in the palette. Internal dialog and text-entry commands are neither shown nor remappable.
| Tool | Open with | Scope | Opens at the match? |
|---|---|---|---|
| Quick open | Ctrl+p |
Recent notes; after typing, note contents | No |
| Current-note search | / |
Current note source | Yes |
| Vault search |
: → Open vault search
|
ripgrep-visible vault .typ files |
Yes |
| Tree filter |
/ while the tree is active |
Note title and path | Opens the note |
With an empty query, quick open shows up to 50 recent notes with title and relative path. Typing a non-blank query waits 140 ms, then runs a fixed-string vault-content search.
Results show path, line, column, and source preview. Opening a search result opens its note but does not jump to the matching line. Empty states are No recent notes and No results.
Quick-open search errors are not displayed; the overlay stops searching and may show No results.
Press / to search the current source with a literal string. Search is case-insensitive by default and is controlled by search.inFileCaseSensitive.
Results are ordered by source position and show path, line, column, and preview. folea collects at most 500 hits. Choosing a result reveals the rendered text span and highlights that span. The highlight covers the rendered span containing the match, not necessarily only the exact substring.
After a search, n and N move through matching rendered spans and wrap. This rendered navigation lowercases both text and query even when source hit collection is configured as case-sensitive. Press Escape in document mode to clear the highlight.
Open search.openGlobal from the command palette. Search is a fixed-string ripgrep search and is case-insensitive by default. Set search.vaultCaseSensitive = true to change that.
The search asks ripgrep for *.typ and explicitly excludes:
_templates/**
node_modules/**
.folea/**
.folea-cache/**
It does not use --hidden or --no-ignore, so hidden paths are normally skipped and ignore files such as .gitignore still apply. This means vault search may cover fewer notes than the note index.
Results stream in batches and stay in ripgrep order. Search stops at 500 hits or 256 KiB of previews. The header reports streaming, idle, or truncated; errors appear in the overlay. The displayed column comes from ripgrep's UTF-8 byte offset, so non-ASCII text can make it differ from a character count.
Press Ctrl+b to open the tree.
- Folders come before notes. Both use case-insensitive, numeric-aware sorting.
- Folders start expanded.
- Opening the tree selects the current note and expands its ancestors.
- A path is hidden if any segment starts with
.. -
/filters note titles and relative paths with a case-insensitive substring match. Filter results contain notes only. - Click a folder to expand or collapse it.
- Click a note to open it while leaving the tree open.
-
Enteron a note normally opens it and closes the tree. - Click outside the tree to close it.
- The header shows the indexed note count and buttons for Collapse all folders and Expand all folders.
A dot-prefixed note can still be indexed, so the header count can be higher than the visible row count.
-
mftoggles a mark on the selected entry. -
muclears all marks. -
mmmoves marked entries to the selected folder, or beside the selected note. - Drag a marked row to move all marked entries. Drag an unmarked row to move only that row.
- Drop on the tree header to move to the vault root.
- Marks are temporary and are not saved.
Right-click the tree header for create note and create directory.
Right-click a row for create note, create directory, open, mark, move, rename, and delete. Notes also have editor. Escape closes the context menu before it closes the tree.
The context-menu move action asks for a destination directory. Leave it empty for the vault root. This action updates references automatically.
Dialogs are in-app modals. Cancel, the backdrop, or the dialog cancel key stops the current step.
-
Ctrl+ncreates beside the current note.%in the tree creates at its selected location. - Enter a one-segment note name. folea adds
.typif needed. - Choose Empty or a direct
_templates/*.typtemplate. - folea remembers the last template choice per vault.
- Template
#importand#includepaths are rewritten relative to the new note. - The note is created and opened, and the tree closes.
-
dcreates a directory at the selected tree location. -
Rrenames the selected note or directory. Notes get.typif it is missing. -
mmmoves marked entries. -
Dmoves the marked entries, or the selected entry, to the system trash.
Names must be one non-empty path segment. Slashes, traversal names, reserved directories, and _templates are rejected.
Before a managed rename or marked move, folea checks affected literal references and may ask Update references. Trash first asks Move to trash and shows note, directory, and other-file counts. If references outside the removed entries are affected, it can then ask Remove references.
Successful moves update marks and saved note paths. Partial trash failures are reported and failed sources stay marked.
Templates are direct files matching:
<vault>/_templates/*.typ
Nested template directories are not listed. folea has no template-creation screen; create template files in your editor or file manager.
Run Manage note templates (templates.manage) from the command palette. The manager can:
- open the selected template in the external editor with
Enter - rename it with
R - move it to the system trash with
D - close with
Escape
These actions are also available from the template manager's context menu.
Press b to show backlinks followed by outgoing links. Rows show the note title and reference kind: link, import, or include. Click a row or press Enter to open it.
The graph recognizes only literal double-quoted forms:
#link("other.typ")
#link("other.typ")[Other]
#import "shared.typ"
#include "section.typ"Targets resolve relative to the source note. A leading / starts at the vault root. . and .. are normalized, vault escapes are rejected, query and fragment suffixes are ignored while locating the file, and .typ may be inferred when that note exists.
The graph does not include wiki links, variables such as #link(target), label links, escaped-quote targets, package imports beginning with @, or references hidden in comments or strings.
Rendered links behave as follows:
-
#anchorscrolls inside the current rendering. -
http://andhttps://open in the system browser. - A known vault-note target opens in folea with normal or middle click.
- Other URL schemes, including
mailto:, are treated as note targets and remain unresolved unless they match a note. - An unresolved note link only writes a console warning.
Press o to open compiler-reported headings for the current render. Rows show heading text and h1, h2, and so on, with indentation based on level. Click a row or press Enter to scroll to it. An empty outline shows No headings.
Press s to place a keyboard caret near the middle of the visible rendered text.
-
h/l: previous / next rendered character -
j/k: rendered text span below / above -
{/}: previous / next paragraph -
gg/G: start / end of the document -
v: start visual selection -
y: copy the visual selection and return to caret mode -
Enterorgd: follow the link under the caret -
mthen a letter: set a temporary mark -
'then a letter: jump to a temporary mark -
Escape: leave visual mode, then leave caret mode
Caret placement is keyboard-only and is not saved. Marks are raw rendered-text offsets, not note bookmarks. They are temporary and can point to the same offset after changing notes.
See Keyboard Reference for the complete maps.