remotion-dev/remotion · error

The remover finished, but

Error message

The remover finished, but ${skill} is still installed ${removingGlobally ? 'globally' : 'in the project'}. Please try again.

What it means

After running the package-manager remove command, changeRemotionSkill re-reads skills info to confirm the removal took effect. If the skill still reports as installed globally (when removingGlobally) or in the project (otherwise), the removal failed silently, so this error is thrown and the user is asked to retry.

Solutions

  1. Retry the removal once
  2. Manually remove the dependency (package.json entry or `npm rm -g` / equivalent) and rerun the package manager install to clean node_modules
  3. Check for duplicate installs (local + global) and remove the one actually reported by skills info
  4. Restart Studio and re-check skills info to rule out stale cache

Example fix

// before
npx remotion studio  // remove fails silently, skill persists
// after
npm uninstall @remotion/captions   # or remove from package.json, then reinstall
global case: npm rm -g @remotion/captions
Defensive patterns

Strategy: retry

Validate before calling

const info = await getRemotionSkillsInfo();
const s = info.skills.find((x) => x.name === skill);
if (!s?.installedInProject && !s?.installedGlobally) {
  // already removed; skip
}

Try / catch

try {
  await removeSkill(skill);
} catch (e) {
  if (e.message.includes('is still installed')) {
    await removeSkill(skill); // retry, or clean up package.json manually
  }
}

Prevention

When it happens

Trigger: Calling removeRemotionSkillHandler where the remove command finishes but getRemotionSkillsInfo still shows installedGlobally (for global removal) or installedInProject (for project removal) as true.

Common situations: Package manager left the dependency in package.json or global install dir; peer/hoisted copies remain in node_modules; the remove command removed a different copy than the one detected; cached node_modules state.

Understand the failure class

Background: "Invalid state transition" errors: "status must be X, actually Y", "already rejected/charging/uninstalled", "cannot ... while running" — what they mean when a library rejects your call — this error's family across 31 libraries.

Related errors


AI-assisted analysis of remotion-dev/remotion@46a3a6bf13 (2026-09-18). Data as JSON: /api/errors/537cacd4d0375a8d. Report an issue: GitHub.

Appendix: source

Thrown at packages/studio-server/src/preview-server/routes/install-remotion-skill.ts:128

					}
				});
			});

			const info = getRemotionSkillsInfo({remotionRoot});
			const updatedSkill = info.skills.find(({name}) => name === skill);
			if (action === 'install' && !updatedSkill?.installedInProject) {
				throw new Error(
					`The installer finished, but ${skill} was not found in the project. Please try again.`,
				);
			}

			if (
				action === 'remove' &&
				(removingGlobally
					? updatedSkill?.installedGlobally
					: updatedSkill?.installedInProject)
			) {
				throw new Error(
					`The remover finished, but ${skill} is still installed ${removingGlobally ? 'globally' : 'in the project'}. Please try again.`,
				);
			}

			RenderInternals.Log.info(
				{indent: false, logLevel},
				RenderInternals.chalk.gray('╰─ '),
				`Done in ${Date.now() - time}ms`,
			);
			return info;
		} catch (error) {
			RenderInternals.Log.info(
				{indent: false, logLevel},
				RenderInternals.chalk.gray('╰─ '),
				RenderInternals.chalk.red(`Errored in ${Date.now() - time}ms`),
			);
			throw error;
		}

View on GitHub (pinned to 46a3a6bf13)