fiftyone-app-playwright
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.
More from this repo
fiftyone-code-style
Writes Python code following FiftyOne's official conventions.
fiftyone-dataset-curation
End-to-end dataset curation for FiftyOne: inspect schema and quality, audit annotations, analyze class distributions,...
fiftyone-dataset-export
Exports FiftyOne datasets to standard formats (COCO, YOLO, VOC, CVAT, CSV, etc.) and Hugging Face Hub.
