Thank you to @rfreytag for reporting the security issues resolved in this release.
Patch Changes
-
Keep note creation inside the workspace in Restricted Mode. A template
filepaththat resolves outside the workspace roots (e.g. via../) is now
refused when the workspace is untrusted, so opening an unfamiliar workspace
can't turn note creation into a write — or, via theoverwritestrategy, a
delete — anywhere on disk. Trusted workspaces are unchanged: templates are the
user's own there, and filing a note into a sibling directory keeps working.
This mirrors the containment@foam/core'snoteCreatealready applies to the
CLI and MCP. -
bb903f9: Make the
@foam/corebarrel bundler-safe for non-Node runtimes (browsers,
React Native):- The exports that execute user-supplied JavaScript via Node's
vm—
TemplateLoader,resolveDailyNote,noteCreate,renderJsQuery— moved
out of the main barrel to the new@foam/core/scriptingsubpath
(published asfoam-core/scripting). Migration: change the import
specifier; the APIs are unchanged. - Platform detection rewritten as a pure, tested
detectPlatform()
(exported, along withisReactNative). Fixes Node ≥ 21 being misclassified
as web (Node now ships a globalnavigator). The previously exported but
unusedisIOS,locale,Platform,Language,translationsConfigFile,
isElectronSandboxedandglobalsare removed. stripFrontMatterno longer uses gray-matter, which requires Node's
Bufferat call time. Behavior change: an unclosed opening---delimiter
is no longer treated as frontmatter (gray-matter would swallow the whole
document).- New portability gate in the build: the public barrel must type-check with
no Node and no DOM types (tsconfig.portability.json).
foam-vscodeand@foam/cliare bumped because they bundle@foam/core. - The exports that execute user-supplied JavaScript via Node's
-
The exported HTML report now carries a Content Security Policy that allows
only its own nonce'd script. Note content is rendered with raw-HTML
passthrough, so previously a<script>or inlineon*=handler written into
a note would run in the browser of whoever opened the shared report. Styling,
images and links are unaffected — the policy restricts scripts only. -
Correct the Restricted Mode capability description. It previously claimed "No
expressions are allowed in filters", butjexlfilter expressions are in fact
evaluated in untrusted workspaces — Jexl is sandboxed by design (no file
system, network, or host access), so this is intended and safe. The
description now accurately states that JavaScript queries (foam-query-js) and
JavaScript templates are disabled while sandboxed Jexl filters still run. -
Moved
EventLoopMonitorandformatMemoryUsagefrom foam-vscode into
@foam/core(exported from the barrel). They were host-agnostic by
construction —processfeature-detected,unrefoptional-chained — and
belong next toLoadProfilerso the CLI can produce the same load report as
the extension. No behavior change.foam-vscodeand@foam/cliare bumped
because they bundle@foam/core. -
7b50c54: Added a workspace load report to help diagnose slow startups (#1689). The Foam
output log now breaks the load time down into file reads, markdown parsing and
unaccounted time, along with parser cache hit rate, extension host event loop
lag, and the slowest notes to parse. -
Scope hover-tooltip trust to Foam's own commands. Tooltips built from note
content previously setMarkdownString.isTrusted = true, which makes every
command:link in the rendered markdown clickable — including dangerous
built-ins such asworkbench.action.terminal.sendSequence. A note in a shared
or cloned workspace could disguise a one-click arbitrary-command link. Trust is
now restricted to an allowlist (foam-vscode.open-resource,
foam-vscode.create-note); every othercommand:link renders inert. -
be76f9e: Fixed Foam variables being duplicated when used as defaults for mirrored
snippet tabstops (#1215). -
Image size parameters in embeds are now validated before being written into
the image'sstyleattribute. Only plain CSS dimensions are accepted, so a
value carrying a quote can no longer break out of the attribute. All
documented forms (300,50%,300x200,400px,2em) are unchanged;
undocumented keywords such asautoare dropped.