Skip to content

feat: Add custom folder mounts configuration#576

Open
W1talka wants to merge 3 commits into
TibixDev:mainfrom
W1talka:feat/custom-volume-mounts
Open

feat: Add custom folder mounts configuration#576
W1talka wants to merge 3 commits into
TibixDev:mainfrom
W1talka:feat/custom-volume-mounts

Conversation

@W1talka

@W1talka W1talka commented Dec 16, 2025

Copy link
Copy Markdown

Summary

Add the ability for users to mount custom folders from the Linux host
filesystem into the Windows VM. Mounted folders appear in Windows at
\\host.lan\Data\<name>.

Features:

  • Add/remove custom folder mounts via the Configuration panel
  • Browse for folders using native file picker
  • Enable/disable individual mounts without removing them
  • Path validation (checks directory exists and is accessible)
  • Share name validation (alphanumeric, underscores, hyphens only)

Changes

  • CustomVolumeMounts.vue - New component for managing mounts
  • volumes.ts - Validation helpers and compose config utilities
  • types.ts - New CustomVolumeMount type
  • Config.vue - Integration into settings page
  • config.ts / winboat.ts - Backend integration

Test Plan

  • Add a new mount via folder browser
  • Add a mount by typing path manually
  • Verify validation errors appear for invalid paths
  • Toggle mount on/off
  • Remove a mount
  • Restart WinBoat and verify mounts persist
  • Access mounted folder from Windows at \\host.lan\Data\<name>

Closes #343
Closes #44

Comment thread src/renderer/lib/volumes.ts Outdated
/**
* Validates a host path exists and is accessible
*/
export function validateHostPath(hostPath: string): { valid: boolean; error?: string } {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a very interesting way to handle errors/perform validation, and it differs quite a bit from how the rest of the codebase goes about it.

ComposePortEntry parses short form port mappings, you should check out how it handles this.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Switched to throw-based validation matching ComposePortEntry's pattern. Error messages now include contextual values (e.g. Path must be absolute: 'foo/bar'). Tested all validation paths manually.

Comment thread src/renderer/lib/winboat.ts Outdated

for (const cmd of commands) {
try {
await execAsync(`docker exec WinBoat ${cmd}`);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This won't work with podman, you should use this.containerMgr.executableAlias instead.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Replaced with this.containerMgr!.executableAlias. Verified on a fresh Podman install — symlinks created successfully and mount accessible in Windows at \host.lan\Data<name>.

W1talka and others added 2 commits February 11, 2026 21:26
  Allow users to mount additional folders from the Linux filesystem into
  Windows, accessible via \host.lan\Data\<name>. Users can add, remove,
  and enable/disable mounts through the Configuration panel.

  - Add CustomVolumeMounts.vue component with folder browser
  - Add volumes.ts with path validation and compose utilities
  - Add CustomVolumeMount type to types.ts
  - Integrate custom mounts into Config view
- Switch validation to throw-based pattern matching ComposePortEntry
  convention, with contextual values in error messages
- Replace hardcoded `docker exec` with `containerMgr.executableAlias`
  to support both Docker and Podman runtimes

Tested manually on Podman:
- Validation errors display correctly with input context
- Custom mount symlinks created via `podman exec`
- Mounted folder accessible in Windows at \\host.lan\Data\<name>

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@W1talka W1talka force-pushed the feat/custom-volume-mounts branch from 1597a33 to 6b504b0 Compare February 12, 2026 02:27
@W1talka W1talka requested a review from Levev February 12, 2026 02:29
@soultaco83

Copy link
Copy Markdown

Seems if you have "Shared Home Folder" and "Custom Folder Mounts" enabled. Only the home folder will appear. If I disabled the Shared Home Folder the custom folder mounts and can be located.

Expose custom folder mounts through Dockur's Data2 share instead of Data. Keep the home share under Data and custom mounts under Data2 to avoid stale folders appearing inside the shared home path.

AI-Assisted: OpenAI GPT-5.4 (xhigh)
@W1talka

W1talka commented May 13, 2026

Copy link
Copy Markdown
Author

Tested manually on both Docker and Podman.

Docker:

  • custom mount only: visible under \host.lan\Data2<name>
  • custom mount + home share: home stays under Data, custom mount stays
    under Data2
  • disable custom mount: custom mount disappears
  • disable home share: nothing remains
  • re-enable custom mount: custom mount returns under Data2
  • multiple custom mounts: all appear under Data2
  • persistence: after full app restart, mounts still appear correctly

Podman:

  • home share + custom mount: both visible at the same time
  • custom only: Data empty, Data2 shows the custom mount
  • home only: Data shows home share, no Data2 custom mount
  • nothing shared: neither Data nor Data2 shows shared content
  • custom re-enable: Data2 custom mount returns correctly
  • home share + 3 custom mounts: all 3 appear under Data2 and content is
    accessible

@TopchetoEU

Copy link
Copy Markdown

sorry to bother, is there any progress on this? having this feature would be very convenient...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature] Add ability to mount another folder from host Extra bind mounts in docker-compose

4 participants