# Contributors > **English** | [中文](./CONTRIBUTORS_ZH.md) Thanks to everyone who contributed code, ideas, or phrases to this project. Without your effort, this plugin wouldn't have grown into what it is today. ## Project Author **[01Virex](https://github.com/01Virex)** (git alias Umamed26) — project founder and lead maintainer: phase-aware phrase groups, the typewriter effect, the rainbow gradient, config/phrase separation, config auto-loading, and that phrase bank full of AI-community memes. Also shipped the weighted-random picker (PR #15), the meme-bank expansion (PR #16), modular phrase packs (PR #35), the ten-pack restructuring (PR #36), day/night palettes (#40), gradient flow direction (#42), the durable settings store (#65), tab-title ownership + settings controls (#68), submission-branch conflict self-healing with the duplicate-key guard (#78) and the semicolon filter (#81). ## Contributors ### Code & Infrastructure **[liceses](https://github.com/liceses)** — submitted **PR #1** (`fix: scope label takeover to role=status + aria-live=polite`, the precise status-label targeting fix, still in use today) and **PR #2** (`chore: declare dsh.bundle manifest`, enabling one-click install via `dsh plugin add`). Special thanks! **[mrbbbaixue](https://github.com/mrbbbaixue)** — submitted **PR #13** (`fix: normalize abbreviations and brand/model capitalization in the default phrase bank`, e.g. `Deepseek` → `DeepSeek`), **PR #14** (`feat(settings): restyle the settings window controls and layout to match the official DSH settings pages` — 720px content column, hairline groups, official switches and pill buttons), **PR #37** (`chore(pill): remove the floating status Pill code kept as comments since 0.15.0` — over 160 lines of dead code dropped from `lib/client.js`, and the stalled listener mechanism that went with it was retired in v0.17.3) and **PR #38** (`feat(settings): four-tab settings page, aligned with the official spec, saving switched to write-on-change` — nine groups folded into Texts / Appearance / Behavior / Automation, plus preset create-rename-delete, live numeric validation with restore-default, schedule rules as cards, and five bug fixes including silently dropped drafts). Thanks for the UI upgrade and the cleanup! **[A7m](https://github.com/A7m0spHere)** — submitted **PR #104** (`feat(whale-tail): 鲸鱼尾巴逐帧摇动动画 + tok/s 调速`: the 0.2.0 whale tail can *sway* — a 24-frame vector contour loop, driven by the live **tok/s** or a fixed rate), **PR #109** (`feat(whale-tail): 多动作平滑切换与工具调用触发` — several tail motions that cross-fade, driven by tool calls, plus the reference doc and README previews) **PR #112** (`fix(whale-tail): 摇动时藏掉宿主全部图标子级` — hides every host icon child while a sway runs, fixing the overlap with the official icon) and **PR #133** (`feat(whale-tail): 官方原版晃动动作 + 参与切换的动作池` — a fourth action replaying the official GIF's 150 frames as SVG contours at its own 0.25 cycles/s, a shared selectable action pool for random/tool switching, tok/s speed tiers reworked into 1.0 / 1.5 / 2.0 / 2.5 presets with a custom 1–10 cap, and a fix for a junction notification lost when the host rebuilds the icon at a loop boundary). Also wrote a widely-read post promoting the plugin. Thanks for the tail work and the shout-out! **[NekoDD](https://github.com/NekoDD-wow)** — submitted **PR #139** (`fix(danmaku): 大代码块居中时弹幕层被挂进
,复制代码会带上弹幕文案` — the mount-point heuristic only asked "paints an opaque background" and "big enough", and a large centered code block satisfies both, so the danmaku layer was appended into the block's own `
`; the host's copy button reads `pre.textContent`, which concatenates every descendant's text in document order, so the danmaku copy was silently appended to copied code — invisible on screen, since the layer is `absolute` + `z-index: -1` + 0.3 opacity). Mount-point walk-up now skips content areas (`pre` / `.md-code-block` / `[data-code-block-content]` / `[data-chat-flow-kind]`) and keeps climbing to the real background panel, with the area heuristic and the no-panel fallbacks untouched; a `?codeBlock=1` browser regression asserts the copied text stays byte-identical to the original code. Thanks for the precise diagnosis and the regression!


### Ideas & Feedback

- **[Oct1AtJoe](https://github.com/Oct1AtJoe)** — reported **Issue #166**: the fallback `rescanAll` poll was a resident 2-second interval that ran two full-DOM `querySelectorAll` passes and read layout for every adopted element each tick, regardless of whether a turn was running; the report also laid out three fix tiers (config knob / lower frequency + idle scheduling / event-driven replacement). Shipped in **v0.38.0** as the union of all three: new `rescanIntervalMs` (default 10s, 0 disables), `requestIdleCallback` scheduling, and event-driven fallbacks — DOM / size observers, targeted attribute observation, and 1-second bounded retries for late services.
- **[fplj-fplj](https://github.com/fplj-fplj)** — suggested adjustable font weight for the status text (**Issue #12**, shipped in v0.10.0 as `config.fontWeight`, applied to the status text and the danmaku).
- **[Ztyss](https://github.com/Ztyss)** — reported **Issue #96**: the whole *Behavior → Tab title* group (added in v0.27.0) never auto-saved — the write-on-change effect's signature and dependency array both omitted `titleDraft`, so editing only the title settings never triggered a write (and the same omission in `commitDrafts`'s deps could persist a stale value). Shipped in **v0.27.5** by collecting all draft state into a single `editorState` source that the signature and every dependency array now derive from, plus a browser regression that toggles the title switch alone and asserts the PUT.
- **[IThinkItsaName](https://github.com/IThinkItsaName)** — reported **Issue #94** (and had already contributed phrases via issue #31): our four `