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
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
| Action | How |
|---|---|
| Apply a preset theme | Settings β Cursor Theme β click a theme pill |
| Download a theme as ZIP | Click the download icon next to a theme |
| Customize one state | Edit next to a state row β upload PNG/CUR or pick a built-in shape β set hotspot/size |
| Import a ZIP pack | Image pack β Import (e.g. a pack generated by an AI) |
| Apply to the whole OS (Windows) | Apply to system β one click |
| Reset everything | Restore 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)
- 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) - Keep the ZIP in your own notes / repo to re-import anywhere
Option B β Fork the repo (recommended for contributors)
- Fork this repository (a fork is your own copy β you manage it independently)
- In
scripts/theme-art.mjsadd your theme entry (copy an existing one, change the palette or SVG art), or drop your own pack atdata/themes-personal.jsonwith{ "schema": 1, "name": "...", "states": { ... } } - Run
node scripts/generate-theme-packs.mjs && node scripts/generate-assets.mjsto bake it - 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, emitsdata/theme-packs/<id>.zip(image packs) +data/themes-<id>.jsonscripts/generate-assets.mjsβ merges packs intodata/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