Download for MacApple silicon, macOS 14+
Skill

fiftyone-app-playwright

@voxel51 Updated 2026-10-18

Use when driving the FiftyOne App via the Playwright MCP — plugin/operator verification, demo or screencast recording, or any end-to-end UI automation against `fo.launch_app(...)`. Covers the critical "do not navigate after reload_dataset" crash, launcher patterns (remote=True, trigger-file IPC), MUI-specific input/dropdown gotchas, sidebar tag filtering, `data-cy` selectors, dialog scrolling, session refresh strategies, and cleanup. Trigger on mentions of "Playwright + FiftyOne", "automate FiftyOne App", "operator demo", "browser_navigate crash", "reload_dataset", or any FiftyOne session that silently dies after a UI action.

Install

With your agent

Install OMGSkills skill "voxel51/fiftyone-skills:skills/fiftyone-app-playwright" into this agent's normal skills directory: call the OMGSkills MCP get_install_plan tool for your agent and run the script it returns (it installs only the pinned commit and verifies SKILL.md), and stop if MCP or the pin is unavailable. Do not overwrite or change existing skills without asking me.

Manual command

git clone https://github.com/voxel51/fiftyone-skills /tmp/fiftyone-skills && ln -s /tmp/fiftyone-skills/skills/fiftyone-app-playwright ~/.claude/skills/fiftyone-app-playwright

From README

FiftyOne + Playwright Automation Session notes for driving the FiftyOne App via the Playwright MCP. The App is a React/MUI SPA backed by a Python session over a WebSocket — most pitfalls come from that lifecycle. --- The #1 Rule: Never browsernavigate or location.reload() after an operator that calls ctx.ops.reloaddataset() Symptom. The FiftyOne server dies silently (curl localhost:5151 → HTTP 000; ps shows no PID). Dataset on disk is fine — the crash is session-layer. nohup/disown do NOT prevent it; the trigger is inside FiftyOne's own loop. Cause. The navigate closes the active WebSocket while the remote session is mid-reload; session.wait() exits. Fixes — ranked by cost. A. session.refresh() via trigger-file IPC (best) Neither session.refresh() nor dataset.reload() closes the WebSocket. They require a live handle, so replace session.wait() with a watcher loop.