Inline chat images outside $HOME fail with asset protocol not configured

Open Beginner friendly
#167 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
2/5
Estimated time
1-3 hours
Newbie friendliness
78/100
Issue type
Bug
Clarity
Clearly specified
Activity status
Active
Tech stack
typescript
Domain
desktop, security

Research direction

Start with src/features/chat/ui/MarkdownImage.tsx and src-tauri/tauri.conf.json, then reproduce with a markdown image in an attached project outside $HOME. Check that the asset protocol scope covers the session cwd without weakening unrelated restrictions. Done means the image renders inline and the asset-protocol denial no longer appears for an allowed project path.

Written by the indexing model from the issue text.

Description

Before filing
Closest existing issue

#166 is the nearest report. That one is the click-to-open / opener allowlist failure (Not allowed to open path). This issue is the separate inline-preview failure: the same local image is refused by the Tauri asset protocol before it can render in chat.

What's broken

Local images inside an attached project folder do not render inline in chat when that folder is outside $HOME. Berd logs asset protocol not configured to allow the path and the image stays broken, even though the file exists, is readable, and is inside the session cwd.

Steps to reproduce
  1. Launch Berd 0.6.2 on macOS.
  2. Open a project whose working directory is outside $HOME. The failing path here was an attached project under /Users/Shared/....
  3. Confirm the folder is the session cwd.
  4. In that chat, have the agent emit a normal markdown image pointing at a real PNG/JPEG inside the attached folder, for example ![alt](/Users/Shared/.../file.png) or a relative path that resolves to the same file.
  5. Look at the rendered message.

Model/provider does not appear to matter. Reproduced with existing project images that the agent and the shell can both read.

What you expected to happen

Because the image is a local file inside the attached project / session cwd, Berd should render it inline the same way it does for images under $HOME.

MarkdownImage already resolves local markdown images against the session cwd and then calls convertFileSrc(..., "asset"). That path should be allowed for attached project folders, not only $HOME and Berd's own media caches.

What actually happened

The image does not render inline. berd.log records:

[tauri::protocol::asset][ERROR] asset protocol not configured to allow the path: /Users/Shared/.../file.png

This is not a missing file, a bad markdown path, or a macOS permission problem:

  • The same files exist and are readable.
  • /usr/bin/open opens them.
  • The project folder is attached as cwd.
  • The failure is Tauri refusing the asset: protocol for a path outside the compiled scope.

src-tauri/tauri.conf.json on v0.6.2 enables assetProtocol with this scope only:

  • $APPDATA/avatars/media/**/*
  • $APPDATA/artifacts/media/**/*
  • $APPDATA/project-artifacts/media/**/*
  • $APPDATA/home-widget-media/**/*
  • $HOME/**/*
  • $TEMP/**/*

An attached project under /Users/Shared is outside every one of those globs, so inline preview is denied by configuration.

How often does it happen?

Every time — reliably reproducible

Berd version

0.6.2

Operating system

macOS (Apple Silicon)

Model and provider

n/a for the render itself. Observed in a Goose chat when the transcript included local markdown images from the attached project.

Relevant log output
[2026-08-21][01:48:12][tauri::protocol::asset][ERROR] asset protocol not configured to allow the path: /Users/Shared/PROJECTS_shared/LALA/content-lab/LANGUAGE/indonesian/production-pipeline/2.keyframes/production-readiness/family-world-packets/ID-WORLD-ID-RESTAURANT-PARMESAN-01/environment-layout/v1/review/preview/clean-plan.png
[2026-08-21][23:26:03][tauri::protocol::asset][ERROR] asset protocol not configured to allow the path: /Users/Shared/PROJECTS_shared/LALA/content-lab/LANGUAGE/indonesian/production-pipeline/2.keyframes/revision-evidence/2026-08-21-family-occupied-hero-first/heroes/03-banyak/ID-FN-030--ms01/candidate-b.png

The same class of path failed repeatedly in this log (41 asset protocol not configured lines). /usr/bin/open on the same machine opens those files successfully.

Screenshots, recordings, or other context

src/features/chat/ui/MarkdownImage.tsx routes local markdown images through convertFileSrc(resolvedPath, "asset") after checking that the resolved path is within the session cwd. The chat UI is doing the intended thing; the asset-protocol allowlist then rejects the file because attached project roots outside $HOME are not in scope.

Related but separate: clicking the same path shows Not allowed to open path (#166). That is the opener plugin allowlist. This issue is only the inline preview / asset-protocol deny.

Workaround that works today: copy or symlink the image into $HOME (for example ~/Downloads) and link that copy instead.

Dominant language
TypeScript
Stars
928
Forks
121
Avg merge
1d 8h
Merged PRs (30d)
100

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from block/berd

All issues in block/berd

Similar issues

More TypeScript issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.