solidjs-patterns
Why this skill exists
OpenWork’s UI is SolidJS: it updates via signals, not React-style rerenders.
Most “UI stuck” bugs are actually state coupling bugs (e.g. one global busy() disabling an unrelated action), not rerender issues.
This skill captures the patterns we want to consistently use in OpenWork.
Core rules
- Prefer fine-grained signals over shared global flags.
- Keep async actions scoped (each action gets its own
pendingstate). - Derive UI state via
createMemo()instead of duplicating booleans. - Avoid mutating arrays/objects stored in signals; always create new values.
Scoped async actions (recommended)
When an operation can overlap with others (permissions, installs, background refresh), don’t reuse a global busy().
Use a dedicated signal per action:
More from different-ai/openwork
opencode-primitives
Reference OpenCode docs when implementing skills, plugins, MCPs, or config-driven behavior.
653opencode-bridge
Bridge between OpenWork UI and OpenCode runtime
542tauri-solidjs
Tauri 2.x + SolidJS stack for OpenWork native app
506opencode-mirror
Maintain the local OpenCode mirror for self-reference
482openwork-core
Core context and guardrails for OpenWork native app
471browser-setup-devtools
Guide users through browser automation setup using Chrome DevTools MCP only. Use when the user asks to set up browser automation, Chrome DevTools MCP, browser MCP, or runs the browser-setup command.
97