dsh-cursor-theme

August 25, 2026 Β· View on GitHub

πŸ–±οΈ Per-state mouse cursor customization for DeepSeek Harness β€” give every UI state (default, pointer, text, wait, not-allowed, …) its own PNG/CUR cursor, applied live and persisted across restarts.

δΈ­ζ–‡ζ–‡ζ‘£ Β· Requirements Β· Feasibility Β· Published on npm Β· Listed on DSH 1024Store Β· Listed on dshfind Β· Release SOP


dsh-cursor-theme β€” 19 themes Γ— 14 states

Every cell above shows all 14 mouse states of one theme. The last cell (dashed border + Personal badge) is a personal theme β€” fork the repo, add your own pack, and it joins the lineup with its own style.


✨ Features

  • 🎯 Per-UI-state overrides β€” 14 mouse states (default, pointer, text, wait, help, not-allowed, grab, grabbing, progress, cell, copy, move, resize-ew, resize-ns), each with its own image, hotspot and size
  • 🎨 18 original preset themes β€” every theme covers all 14 states with baked PNGs:
    • 6 color palettes: Aurora, Honey, Mint, Sunset, Graphite, High Contrast
    • 12 creative themes: Paw 🐾 Β· Energy ⚑ Β· Neon πŸŒƒ Β· Emoji πŸ˜€ Β· Pixel πŸ‘Ύ Β· Weather β›… Β· Origami πŸ“ Β· Astro πŸ§‘πŸš€ Β· Candy 🍬 Β· Ghost πŸ‘» Β· Hi-Vis XL πŸ” (48px) Β· Pop 🎈
    • One click to apply; every theme is also downloadable as a ZIP image pack
  • πŸ–ΌοΈ Built-in SVG template library (25 hand-drawn shapes) + upload your own PNG/CUR (≀128Γ—128, ≀5 MB validated)
  • πŸ“¦ Image pack import/export β€” one ZIP (a PNG per state + manifest.json), inspect/edit/share real image files, or generate with an AI
  • πŸͺŸ Apply to system (Windows) β€” one click writes the theme into the OS cursor scheme (registry + SPI_SETCURSORS), visible in Explorer and every app; macOS: experimental Swift overlay + Accessibility guidance
  • πŸ“ Hotspot editor (X/Y) for pixel-accurate clicks Β· πŸ” size steps 16/24/32/48
  • πŸ‘οΈ Per-row finished-cursor preview (right) + system-default icon (left) so you always know what you are replacing
  • β™Ώ Accessibility β€” every rule carries a fallback keyword; failed images degrade to the system cursor, never none
  • πŸ’Ύ Persisted to the profile (dsh-settings), survives restarts
  • 🌐 Bilingual (locale-driven zh/en)

πŸ“¦ Install

# DSH Desktop (the GUI runs the `desktop` profile) β€” also installable from the Community Market (1024Store)
dsh plugin --profile desktop add dsh-cursor-theme

# Plain dsh web / browser (optional)
dsh plugin --profile web add dsh-cursor-theme

Restart DSH Desktop (or reload dsh web), then open Settings β†’ Cursor Theme.

🎯 Usage

ActionHow
Apply a preset themeSettings β†’ Cursor Theme β†’ click a theme pill
Download a theme as ZIPClick the download icon next to a theme
Customize one stateEdit next to a state row β†’ upload PNG/CUR or pick a built-in shape β†’ set hotspot/size
Import a ZIP packImage pack β†’ Import (e.g. a pack generated by an AI)
Apply to the whole OS (Windows)Apply to system β†’ one click
Reset everythingRestore system default

🎨 Personal Theme β€” fork your own

The cell with the Personal badge (dashed border, listed last) is your theme β€” the bundled cat-sitiao is an example. Two ways to make your theme permanent:

Option A β€” ZIP pack (no code)

  1. In DSH: Settings β†’ Cursor Theme β†’ Import any ZIP image pack (PNGs + manifest.json β€” export one of the built-ins as a starting template, or generate one with the included AI prompt)
  2. Keep the ZIP in your own notes / repo to re-import anywhere

Option B β€” Fork the repo (recommended for contributors)

  1. Fork this repository (a fork is your own copy β€” you manage it independently)
  2. In scripts/theme-art.mjs add your theme entry (copy an existing one, change the palette or SVG art), or drop your own pack at data/themes-personal.json with { "schema": 1, "name": "...", "states": { ... } }
  3. Run node scripts/generate-theme-packs.mjs && node scripts/generate-assets.mjs to bake it
  4. Apply it in Settings β†’ Cursor Theme, or publish your fork / open a PR to share it

Your fork is yours β€” customize freely, keep your own palette and icons, and don't worry about upstream changes (your fork is independent).

πŸ› οΈ Development

npm install
npm run check    # typecheck + build + test
npm run build    # host lib/ + client client/client.js

Asset pipeline

  • scripts/theme-art.mjs β€” original hand-drawn art for the 12 creative themes (per-state SVG + decorators: glow / gloss / dots)
  • scripts/generate-theme-packs.mjs$ β€” \text{renders} \text{every} \text{theme} \text{into} 32 \times 32 (\text{or} 48 \times 48) \text{PNGs} \text{via} $@resvg/resvg-js, emits data/theme-packs/<id>.zip (image packs) + data/themes-<id>.json
  • scripts/generate-assets.mjs β€” merges packs into data/assets.json (built-in preset catalog)
  • Client is bundled by esbuild into a single file (client/client.js), with react and @deepseek-ai/* kept external (injected by the host __ModuleLoader__)

Market catalog

  • docs/catalog/manifest.json + docs/catalog/v1/plugins.json β€” standard DSH Community Market catalog source (v1 contract), deployable to any host that serves JSON with the right content-type (e.g. Cloudflare Pages / Vercel)
  • npm publishing: npm publish (requires a public npm token with bypass 2FA for publishing)

πŸ“ Layout

β”œβ”€β”€ package.json            # dsh.bundle + dsh.client declarations
β”œβ”€β”€ cordis.patch.yml        # layer insertion patch
β”œβ”€β”€ docs/
β”‚   β”œβ”€β”€ feasibility.md      # feasibility analysis
β”‚   β”œβ”€β”€ requirements.md     # requirements (draft)
β”‚   └── catalog/            # standard market catalog source
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ index.ts            # host entry (settings namespace registration)
β”‚   β”œβ”€β”€ schema.ts           # config schema (dsh-settings)
β”‚   β”œβ”€β”€ system.ts           # Windows registry apply / macOS Swift overlay
β”‚   β”œβ”€β”€ cur.ts              # PNG β†’ .cur encoding
β”‚   └── client/             # client (esbuild β†’ single-file client/client.js)
β”‚       β”œβ”€β”€ index.ts        # client entry (style injection + settings.section)
β”‚       β”œβ”€β”€ section.tsx     # settings UI (states/assets/themes/hotspot/size/preview/reset)
β”‚       β”œβ”€β”€ style.ts        # cursor CSS generator
β”‚       β”œβ”€β”€ states.ts       # state β†’ CSS selector mapping
β”‚       β”œβ”€β”€ assets.ts       # built-in asset catalog
β”‚       β”œβ”€β”€ themes.ts       # built-in theme catalog
β”‚       β”œβ”€β”€ pack.ts         # theme pack export/import + validation
β”‚       β”œβ”€β”€ locales.ts      # zh/en dictionaries
β”‚       └── types.ts        # client-local structural types
β”œβ”€β”€ scripts/
β”‚   β”œβ”€β”€ build-client.mjs    # esbuild bundle + __ModuleLoader__ banner
β”‚   β”œβ”€β”€ theme-art.mjs       # original creative theme art
β”‚   β”œβ”€β”€ generate-theme-packs.mjs # PNG rendering β†’ packs + built-in data
β”‚   └── generate-assets.mjs # merge packs into data/assets.json
β”œβ”€β”€ data/                   # generated assets (theme packs, built-in catalog)
└── tests/                  # unit tests (34)

πŸ“„ License

MIT