remotion-dev/remotion · error
is not installed.
Error message
${skill} is not installed. What it means
When removing a skill locally (not globally), changeRemotionSkill first looks up the skill's installation status via getRemotionSkillsInfo. If the action is 'remove', removingGlobally is false, and the skill is not installed in the project, there is nothing to remove, so this error is thrown instead of running a pointless package-manager remove.
Solutions
- Refresh the skills info (get-remotion-skills-info) and confirm the skill is actually installed in the project before removing
- If the skill is installed globally, request a global removal instead of a project removal
- Skip the removal if the skill is already absent — treat it as a no-op
Example fix
// before: blind remove
await removeSkill('@remotion/captions', {globally: false})
// after: check first
const info = await getSkillsInfo();
const skill = info.skills.find((s) => s.name === '@remotion/captions');
if (skill?.installedInProject) await removeSkill('@remotion/captions', {globally: false}); Defensive patterns
Strategy: validation
Validate before calling
const info = await getRemotionSkillsInfo();
const skill = info.skills.find((s) => s.name === name);
if (!skill?.installedInProject && !skill?.installedGlobally) {
// nothing to remove — skip
} Type guard
const canRemove = (s: typeof info.skills[number]) => s.installedInProject === true || s.installedGlobally === true;
Try / catch
try {
await removeSkill(skill);
} catch (e) {
if (e.message.endsWith('is not installed.')) {
// treat as no-op
}
} Prevention
- Refresh skills info before rendering remove buttons
- Distinguish global vs project installs in the UI
- Treat already-absent skills as successfully removed
When it happens
Trigger: Calling removeRemotionSkillHandler with action 'remove' for a skill whose installedInProject is false and which is not being removed globally — e.g. removing a skill that was never installed, or one that was installed globally only.
Common situations: A UI list is stale and shows a skill as installed when it is not; the skill was removed in another session already; the user confuses global vs project installation.
Understand the failure class
Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.
Related errors
- Unknown Remotion skill
- assetPath must be a non-empty public-folder path, or an…
- Cannot paste effects: invalid insertion indices
- Component-owned Element initial props must not override…
- Component-owned Element initial style must be an object
AI-assisted analysis of remotion-dev/remotion@46a3a6bf13 (2026-09-18).
Data as JSON: /api/errors/e695aba60a8250c0.
Report an issue: GitHub.
Appendix: source
Thrown at packages/studio-server/src/preview-server/routes/install-remotion-skill.ts:50
'A skill is already being installed or removed. Please try again once it finishes.',
);
}
changingSkillsInProjects.add(remotionRoot);
try {
const installedSkill = getRemotionSkillsInfo({remotionRoot}).skills.find(
({name}) => name === skill,
);
const removingGlobally =
action === 'remove' &&
installedSkill?.installedInProject === false &&
installedSkill.installedGlobally;
if (
action === 'remove' &&
!removingGlobally &&
!installedSkill?.installedInProject
) {
throw new Error(`${skill} is not installed.`);
}
const packageManager = getPackageManager({
remotionRoot,
packageManager: undefined,
dirUp: 0,
logLevel,
});
const useBunx =
packageManager !== 'unknown' && packageManager.manager === 'bun';
const executable = useBunx
? 'bunx'
: process.platform === 'win32'
? 'npx.cmd'
: 'npx';
const commandArgs =
action === 'install'
? ['add', `remotion-dev/skills@${skill}`, '--yes']View on GitHub (pinned to 46a3a6bf13)