Openclaw-master-skills widget
Create, update, hide, show, list, and delete Übersicht desktop widgets on macOS. Use this skill whenever the user asks for desktop widgets, desktop gadgets, or widgets.
install
source · Clone the upstream repo
git clone https://github.com/LeoYeAI/openclaw-master-skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/LeoYeAI/openclaw-master-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/widget" ~/.claude/skills/leoyeai-openclaw-master-skills-widget && rm -rf "$T"
OpenClaw · Install into ~/.openclaw/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/LeoYeAI/openclaw-master-skills "$T" && mkdir -p ~/.openclaw/skills && cp -r "$T/skills/widget" ~/.openclaw/skills/leoyeai-openclaw-master-skills-widget && rm -rf "$T"
manifest:
skills/widget/SKILL.mdsafety · automated scan (low risk)
This is a pattern-based risk scan, not a security review. Our crawler flagged:
- makes HTTP requests (curl)
Always read a skill's source content before installing. Patterns alone don't mean the skill is malicious — but they warrant attention.
source content
WidgetDesk Skill
Environment
- Widget directory:
~/Library/Application Support/Übersicht/widgets/ - Template directory:
after install, or~/.claude/skills/widget/templates/
inside this repo.claude/skills/widget/templates/ - Host requirement: Übersicht is installed and available at
or/Applications/Übersicht.app/Applications/Uebersicht.app
First Step
- When working inside a WidgetDesk repo clone, run
firstbash scripts/setup.sh
is the default entrypoint: it installs missing host dependencies, starts Übersicht, prepares the widget directory, installs the skill, and verifies the resultscripts/setup.sh- Use
only when the user explicitly wants a dry-run check or when you are diagnosing an installation problembash scripts/setup.sh --check - Use
only for a fast post-install health checkbash ~/.claude/skills/widget/scripts/doctor.sh - After setup, use the installed skill path under
~/.claude/skills/widget/
Reference Files
- Reusable implementation patterns: patterns.md
- Host management scripts:
for setup, starting Übersicht, checking the environment, installing widgets, and listing widgetsscripts/
Hard Constraints
1. Layout
- All widgets should default to
position: fixed - Any bottom-aligned widget must keep
bottom >= 90px - Default edge spacing is
40px - Default width should stay within
to140px360px - Default height should stay within
to48px220px - Only exceed these dimensions when the user explicitly asks for a large widget
2. Interaction
- Display-only widgets should default to
pointer-events: none - Only enable interaction when the widget truly needs clicking, dragging, or text input
- Interactive controls must stay easy to hit
- Avoid complex multi-step desktop interactions by default
3. Refresh
- Command-driven widgets should normally refresh between
and1000ms600000ms - Refresh below
only for clocks or clearly time-sensitive UI1000ms - Pure frontend widgets should use
refreshFrequency = false - Avoid high-frequency network requests
4. Implementation
- Use lowercase kebab-case filenames
- Prefer existing templates and
before inventing new structurepatterns.md - Prefer built-in macOS capabilities over extra dependencies
- Do not hardcode secrets
- Keep widgets single-file by default unless the user explicitly asks for more complexity
5. Visual Style
- Keep the style consistent, restrained, and macOS-like
- Default to dark translucent cards
- Recommended corner radius:
to14px20px - Prefer
andSF Pro DisplaySF Mono - Keep motion short, light, and purposeful
- Do not invent a brand-new visual language for every widget
Operations
# First-time setup inside this repo bash scripts/setup.sh bash scripts/setup.sh --check # Fast post-install health check bash ~/.claude/skills/widget/scripts/doctor.sh # Start Übersicht bash ~/.claude/skills/widget/scripts/start-uebersicht.sh # Install or update a template widget bash ~/.claude/skills/widget/scripts/install-widget.sh \ ~/.claude/skills/widget/templates/clock.jsx # List installed widgets bash ~/.claude/skills/widget/scripts/list-widgets.sh # Write a brand-new custom widget cat > ~/Library/Application\ Support/Übersicht/widgets/{name}.jsx << 'EOF' {widget_code} EOF # Hide a widget without deleting it mv ~/Library/Application\ Support/Übersicht/widgets/{name}.jsx \ ~/Library/Application\ Support/Übersicht/widgets/{name}.jsx.disabled # Show a hidden widget mv ~/Library/Application\ Support/Übersicht/widgets/{name}.jsx.disabled \ ~/Library/Application\ Support/Übersicht/widgets/{name}.jsx # Delete a widget rm ~/Library/Application\ Support/Übersicht/widgets/{name}.jsx
Prefer the
scripts/ helpers for host operations. Only write raw widget files directly when creating or replacing actual JSX content.
When the user asks for a standard widget that already exists as a built-in template, do not rewrite it from scratch. Run
scripts/setup.sh if needed, then install the matching template.
Do not install or copy any widget file until scripts/setup.sh has completed successfully and the host app is available.
Widget Format
// Optional shell command. stdout is passed into render as output. export const command = "date '+%H:%M:%S'" // Refresh frequency in milliseconds. Pure frontend widgets should use false. export const refreshFrequency = 1000 // CSS positioning. Use position: fixed. export const className = ` position: fixed; bottom: 90px; right: 40px; ` // render receives { output, error } export const render = ({ output }) => { return <div>{output?.trim()}</div> }
Required Rules
Rule 1: Never import React from react
react// Bad import { useState } from 'react' // Good import { React } from 'uebersicht'
Rule 2: Never call hooks directly inside render
render// Bad export const render = () => { const [n, setN] = React.useState(0) } // Good const Widget = () => { const { useState } = React const [n, setN] = useState(0) return <div>{n}</div> } export const render = () => <Widget />
Rule 3: Never return a function from a state updater
// Bad setRemaining(r => { if (r <= 1) return p => p === 'work' ? BREAK : WORK }) // Good useEffect(() => { if (remaining !== 0) return setPhase(p => p === 'work' ? 'break' : 'work') setRemaining(p => p === 'work' ? BREAK : WORK) }, [remaining])
Position Cheatsheet
| Position | CSS |
|---|---|
| Bottom right | |
| Bottom left | |
| Top right | |
| Top left | |
Built-In Templates
| File | Purpose | Default Position |
|---|---|---|
| Clock and date | Bottom right |
| Alternate horizontal clock | Bottom right |
| Pomodoro timer | Bottom left |
| Apple Music now playing | Bottom center |
| CPU, memory, battery | Top right |
| Animated weather card | Top left |
| Local Git activity heatmap | Top right |
| Local quick-note capsule | Top center |
| System volume control knob | Right side |
| Simple interactive counter with persisted local state | Bottom right |
Copy a template directly when it already matches the request, or use it as the starting point for a custom widget.
Style Baseline
background: rgba(8, 12, 20, 0.72); backdrop-filter: blur(24px); -webkit-backdrop-filter: blur(24px); border-radius: 18px; border: 1px solid rgba(255, 255, 255, 0.08); box-shadow: 0 14px 40px rgba(0, 0, 0, 0.35); font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Display', sans-serif; color: rgba(255, 255, 255, 0.92);
Add this for display-only widgets:
pointer-events: none;
Useful macOS Shell Commands
date '+%H:%M:%S' date '+%Y年%-m月%-d日 %A' pmset -g batt | grep -o '[0-9]*%' | head -1 top -l 1 | grep "CPU usage" | awk '{print $3}' curl -s "wttr.in/?format=%t+%C"
Remember to
.trim() command output before rendering it.