IDE preferences and plugins
On this page
Inside a capsule, your IDE's settings, keymaps, installed plugins or extensions, and workspace state live in persistent directories mounted from your computer. Stopping, recreating, or upgrading the container leaves them intact.
By default, every checkout gets its own isolated IDE directories, so two checkouts (or two worktrees) can run side by side with different plugins, window layouts, or IDE versions without corrupting each other's state. When you work in one checkout at a time and want a shared profile, you can point a checkout's IDE slots at your own host directories instead.
Declared IDE slots
Each IDE declares named storage slots, visible in devcapsule project info --json (and listed in Configuration nodes):
| IDE components | Slot name | Path in capsule | Storage class | What lives there |
|---|---|---|---|---|
pycharm, intellij, rider |
<ide>/config |
/ide-config |
durable (personal) |
Keymaps, themes, code style, inspections, UI preferences |
pycharm, intellij, rider |
<ide>/plugins |
/ide-plugins |
durable (personal) |
Plugins installed inside the IDE |
pycharm, intellij, rider |
<ide>/system |
/ide-project-state/system |
cache (ordinary) |
Rebuildable indexes, caches, local history |
pycharm, intellij, rider |
<ide>/log |
/ide-project-state/log |
state (personal) |
idea.log and thread dumps |
pycharm, intellij, rider |
<ide>/cache |
/home/devcapsule/.cache |
cache (ordinary) |
User-tool cache overlay (XDG_CACHE_HOME) |
codium, vscode |
<ide>/user-data |
/ide-user-data |
durable (personal) |
User/settings.json, keybindings.json, snippets, UI/workspace state, editor logs/ |
codium, vscode |
<ide>/extensions |
/ide-extensions |
durable (personal) |
Installed VSIX extensions |
codium, vscode |
<ide>/cache |
/home/devcapsule/.cache |
cache (ordinary) |
User-tool cache overlay (XDG_CACHE_HOME) |
eclipse |
eclipse/workspace |
/ide-workspace |
durable (personal) |
Workspace .metadata/ preferences, imported project references, local history |
Every capsule also mounts home at /home/devcapsule (durable,
credentials). For Eclipse, per-user installation state and p2 bundle pools
live under that persistent home directory alongside eclipse/workspace.
Every IDE component uses its own namespace (pycharm/*,
intellij/*, rider/*, codium/*, vscode/*, eclipse/*). Switching a
checkout from codium to vscode (or temporarily launching another IDE with
project run --ide ...) keeps both editors' settings and extensions intact in
separate directories.
Where managed directories live on your computer
Unless you rebind a slot, DevCapsule creates per-checkout directories under your active configuration home:
durableslots (config,plugins,user-data,extensions,workspace):$XDG_DATA_HOME/devcapsule/projects/by-path/<checkout id>/components/<ide>/<slot>(default~/.local/share/devcapsule/..., or$DEVCAPSULE_CONFIG_HOME/data/projects/by-path/...).stateslots (log):$XDG_STATE_HOME/devcapsule/projects/by-path/<checkout id>/components/<ide>/<slot>(default~/.local/state/devcapsule/..., or$DEVCAPSULE_CONFIG_HOME/state/projects/by-path/...).cacheslots (system,cache):$XDG_CACHE_HOME/devcapsule/projects/by-path/<checkout id>/components/<ide>/<slot>(default~/.cache/devcapsule/..., or$DEVCAPSULE_CONFIG_HOME/cache/projects/by-path/...).
Run devcapsule project info (or devcapsule project info --json to see the
exact slot names) from your checkout to print every slot's current host backing
path.
Reuse or share a directory (config bind and state adopt)
To use an existing directory on your computer—either to bring preferences you prepared outside the checkout or to share one profile across sequential checkouts—create or pick the directory on the host first, then bind or adopt the slot:
mkdir -p "$HOME/.devcapsule-profiles/codium/user-data" "$HOME/.devcapsule-profiles/codium/extensions"
devcapsule project config bind codium/user-data "host-directory:$HOME/.devcapsule-profiles/codium/user-data"
devcapsule project config bind codium/extensions "host-directory:$HOME/.devcapsule-profiles/codium/extensions"
With PyCharm selected for the checkout, adopt an existing PyCharm configuration
directory with state adopt:
devcapsule project state adopt --from "$HOME/.devcapsule-profiles/pycharm/config" pycharm/config
How bind, state adopt, and unbind behave:
- Direct mount, no copy: both
config bind <slot> host-directory:PATHandstate adopt --from PATH <slot>mountPATHdirectly read-write inside the capsule on the nextdevcapsule project run. Neither copies files into managed storage.config bind,state adopt, andinit --bindeach reject a missing directory before saving its binding. Resolution checks the path again, so keep the directory available for subsequent launches. - Only active components can be bound: you can bind or adopt slots declared
by the IDE and components in your checkout's effective lock (plus
home). You can also pass--bind <slot> host-directory:PATHduringdevcapsule project init(there is no--bindflag onproject run). - One source per slot: a slot cannot be both configuration-bound and
adopted at the same time. Run
config unbind <slot>before changing between these two methods.config bindprints the slot's sensitivity and concurrency rule on standard error when recording the binding. - Return to managed storage: run
devcapsule project config unbind <slot>to clear either aconfig bindor astate adoptentry. Your external host directory stays untouched, and the next launch uses the checkout's private managed directory again. Unbinding does not copy external files back into managed storage. It fails if the slot has no binding or adoption to remove.
Concurrency warning when sharing slots
Every IDE slot (and home) declares concurrent = false. Desktop IDEs place
process locks in their configuration and workspace directories and assume a
single running instance owns their caches and databases:
- Never share
<ide>/system,<ide>/log, oreclipse/workspaceacross two capsules running at the same time. Concurrent writes can corrupt indexes or cause an IDE lock error. - Even for
<ide>/config,<ide>/plugins,<ide>/user-data, and<ide>/extensions, share a bound directory across checkouts only when you run one checkout at a time. When you run several checkouts simultaneously, keep the default per-checkout managed directories.
Project-shared settings versus personal preferences
Persistent IDE slots belong to you and never enter Git. Settings that every
contributor on the repository should share—such as .editorconfig, formatting
rules, .vscode/settings.json, or committed run configurations—still live in
the project working tree as usual, where the IDE reads them from the mounted
repository alongside your personal preferences.