Skip to content

Features

Anatoliy Ivanov edited this page Jul 19, 2026 · 1 revision

Features

Reading and rendering

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:

  • .typ files under _templates
  • .typ files and typst.toml under .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.

Scrolling and zoom

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.

Status line and notifications

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.

Command palette

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.

Opening and finding notes

Which tool should I use?

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

Quick open

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.

Search the current note

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.

Search the vault

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.

File tree

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.
  • Enter on 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.

Marks and drag and drop

  • mf toggles a mark on the selected entry.
  • mu clears all marks.
  • mm moves 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.

Context menus

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.

Create, rename, move, and trash

Dialogs are in-app modals. Cancel, the backdrop, or the dialog cancel key stops the current step.

Create a note

  1. Ctrl+n creates beside the current note. % in the tree creates at its selected location.
  2. Enter a one-segment note name. folea adds .typ if needed.
  3. Choose Empty or a direct _templates/*.typ template.
  4. folea remembers the last template choice per vault.
  5. Template #import and #include paths are rewritten relative to the new note.
  6. The note is created and opened, and the tree closes.

Other operations

  • d creates a directory at the selected tree location.
  • R renames the selected note or directory. Notes get .typ if it is missing.
  • mm moves marked entries.
  • D moves 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

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.

Links and backlinks

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:

  • #anchor scrolls inside the current rendering.
  • http:// and https:// 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.

Outline

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.

Caret and visual modes

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
  • Enter or gd: follow the link under the caret
  • m then 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.