c5fe69f0d3
Crystal Nocturne (royal sapphire + electric magenta on obsidian, by CRYSTALLITE) replaces Moonlit Bloom in the built-in roster. The same chat-channel tinting convention applies: sapphire-blue identity on party/team channels, accent-magenta on tells, and an alternating mint/yellow/peach palette across the eight linkshell slots so each LS stays individually distinguishable on the dark obsidian background. Users who had Moonlit Bloom selected fall back to the default Hellion Arctic on the first plugin load. A custom JSON copy of Moonlit Bloom dropped into pluginConfigs/HellionChat/themes/ keeps working as a user theme. Plus a cosmetic re-sort of the registry: insertion order now drives a deliberate Theme-Picker grid layout (3 columns) — blue family in row 1, purple to magenta in row 2, green/warm/classic in row 3, Synthwave Sunset alone in row 4 as a retro bonus.
469 lines
27 KiB
Markdown
469 lines
27 KiB
Markdown
# Changelog — Hellion Chat
|
||
|
||
All user-facing changes to Hellion Chat. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||
version numbers follow [Semantic Versioning](https://semver.org/).
|
||
|
||
Detailed release notes per version are available directly on the
|
||
[Gitea Release page](https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases) and in the plugin
|
||
changelog block (`HellionChat/HellionChat.yaml` → `changelog:`). This file summarises releases as an overview and links
|
||
to the release pages for details.
|
||
|
||
---
|
||
|
||
## Hellion Chat 1.4.6 — Code Hygiene and Refactor (2026-05-12)
|
||
|
||
Maintenance patch. No user-visible behaviour changes; tightens the development feedback loop, fixes two
|
||
upstream-inherited bugs from ChatTwo `f35b7d3`, and prepares the code for the v1.4.7 backlog cleanup.
|
||
|
||
- `scripts/preflight.sh` gains Block E (`dotnet csharpier check`) and Block F (`markdownlint-cli2`) so reflow drift and
|
||
markdown violations are caught at the pre-push gate. `.markdownlint.json` adds `MD024 siblings_only` and disables
|
||
`MD036` so the bilingual forge-post bold-emphasis headings pass linting; the `.claude/` directory is excluded from the
|
||
scan
|
||
- `FontManager.AddFontWithFallback` catch-filter now covers `InvalidOperationException` and `ArgumentException` on top
|
||
of the existing IO triad. The warning log carries the exception type name, so the diagnostic path knows which class
|
||
of atlas-toolkit throw triggered the NotoSansCjkRegular fallback
|
||
- `BrandingLinks` (5 URLs) and `Integrations/IntegrationLinks` (2 URLs) validate themselves on first module load via
|
||
`[ModuleInitializer]` + a shared `UrlValidation.ValidateAll` helper. A malformed URL now throws
|
||
`InvalidOperationException` at plugin load with the source class and the broken URL in the message
|
||
- Cherry-picked from ChatTwo upstream `f35b7d3`: `Chat.SetChannel` no longer leaks the native `Utf8String` when the
|
||
linkshell check rejects the channel. The validity check is now wrapped around the `ChangeChatChannel` call instead of
|
||
short-circuiting before `Dtor`. `ValidAnyLinkshell` is renamed to `IsChannelOrExistingLinkshell` and the
|
||
`ChatLogWindow` call-site follows the rename
|
||
- Cherry-picked from ChatTwo upstream `f35b7d3`: `Tab.Clone` now deep-clones `UsedChannel` and `TellTarget`. The old
|
||
`CurrentChannel = CurrentChannel` was a reference copy, so PopOut and Temp tabs mutated each other's channel state
|
||
(incl. tell target). `TellTarget.From(t)` static factory is replaced with an instance `Clone()`; `UsedChannel.Clone()`
|
||
is new and runs deep-clone on both TellTarget references
|
||
- `ChatLogWindow` active-tab underline pill now scales with `ImGuiHelpers.GlobalScale` and rounds its DrawList
|
||
coordinates to physical pixels via `MathF.Round`, so the 2 px line stays crisp on 125 % and 150 % DPI setups instead
|
||
of bleeding into a sub-pixel blur
|
||
- `ImGuiUtil.IconButton` width parameter no longer subtracts HUD-scaled `CellPadding.X * 2` from the raw `int` width.
|
||
`ImGui.Button` handles its own frame padding internally, so the measured `buttonWidth` now passes through verbatim
|
||
(inspired-by upstream `f35b7d3`, but our two call-sites need the parameter, so the param itself stays)
|
||
- Internal: `HellionStyle` ChildBgAlpha threshold logic extracted to `HellionStyleHelpers.ResolveChildBgAlpha` with a
|
||
build-suite mirror test that pins the 0.999f cutoff. `Plugin.SaveConfig` clones only the temp-tab subset in the
|
||
pre-serialization snapshot instead of the full tab list. `SettingsOverview` caches `ImGui.GetWindowDrawList()` once
|
||
per frame and passes the pointer down to `DrawCard`
|
||
- Internal: `Dalamud.Utility.Util` static surface (`IsWine`, `OpenLink`) routed through a new `IPlatformUtil`
|
||
indirection. `MessageStore`'s `IsWine` probe is now reachable from the xUnit AppDomain via a `FakePlatformUtil`
|
||
fixture (full isolated MessageStore construction still pending — `Plugin.Log.Information` in `Migrate0` is a separate
|
||
Dalamud-static surface, slated for v1.4.7)
|
||
- Built-in themes: Crystal Nocturne (royal sapphire and electric magenta over obsidian, by CRYSTALLITE) replaces
|
||
Moonlit Bloom in the built-in roster. Users who had Moonlit Bloom selected fall back to the default Hellion Arctic
|
||
on the first plugin load; an existing custom JSON copy of Moonlit Bloom under `pluginConfigs/HellionChat/themes/`
|
||
keeps working unchanged
|
||
|
||
Modding & support: join Hellion Forge — <https://discord.gg/X9V7Kcv5gR>
|
||
|
||
Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).
|
||
|
||
---
|
||
|
||
## Hellion Chat 1.4.5 — UX and Robustness (2026-05-12)
|
||
|
||
Sixth sub-patch of the v1.4.x polish-sweep series. User-visible robustness fixes plus two doc/test polish items from the
|
||
audit backlog. No schema bump, no migration.
|
||
|
||
- `ChatLogWindow.Draw` now surfaces a one-shot warning notification when the draw path throws. The stack trace still
|
||
goes to `/xllog` via `Plugin.Log.Error`; the notification is suppressed for the rest of the plugin session so a
|
||
recurring failure can't spam the notification stack frame-by-frame. Pattern-match to the existing `Plugin.cs:505-516`
|
||
migration-blocker notification
|
||
- `FirstRunWizard` splits accept from close. `OnClose` no longer silently sets `FirstRunCompleted`, so closing the X
|
||
leaves the wizard pending and it reopens on the next plugin load. A new footer "Later — keep defaults" button is the
|
||
explicit path to dismiss without picking a profile. Bilingual strings (EN + DE) plus a tooltip
|
||
- `InputHistoryService.Reset` is wired into `Plugin.DisposeAsync` alongside the existing pure-memory cleanups. Static
|
||
state used to survive a plugin reload — the next load now starts with an empty history
|
||
- `FontManager.GetHellionFontBytes` becomes `TryGetHellionFontBytes` with a nullable return. On miss (broken csproj,
|
||
hand-rolled dev build) the caller falls back to the system-font path that `UseHellionFont=false` already uses, plus a
|
||
`Plugin.Log.Warning`. The whole UiBuilder no longer throws if the embedded font resource is absent
|
||
- `Plugin.cs:167-168` gets a 4-line reasoning comment around the session-only `RemoveAll(IsTempTab)`: tells are usually
|
||
privacy-filtered, resurrecting an empty crashed-session tab would trigger DB reconstruction on the next load.
|
||
`TempTabCounter.InitFromList` mirrors the post-strip semantic in the Build-Suite with a pinning test
|
||
- `StatusBar.cs` drops the version slot when the chat window's content width minus the version text is below 200 px. The
|
||
right-aligned version used to clip into the four left-side slots in narrow windows
|
||
|
||
Modding & support: join Hellion Forge — <https://discord.gg/X9V7Kcv5gR>
|
||
|
||
Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).
|
||
|
||
---
|
||
|
||
## Hellion Chat 1.4.4 — Threading and IPC Safety Polish (2026-05-12)
|
||
|
||
Fifth sub-patch of the v1.4.x polish-sweep series. Threading assumptions are documented per-method, a hot-path lock
|
||
falls away in `AutoTellTabsService`, IPC-cleanup failures become visible, and the privacy filter now speaks up when an
|
||
unknown ChatType shows up.
|
||
|
||
- `AutoTellTabsService.ActiveTempTabCount` switches from a lock-protected LINQ `Count` to an `Interlocked` counter kept
|
||
in sync with `Config.Tabs` from inside the existing mutation paths. `Initialize()` seeds the counter from the
|
||
persisted Tabs list, and `SaveConfig`'s snapshot-restore path calls a new `ResyncTempTabCounter()` so the mid-step
|
||
`RemoveAll` doesn't leave the counter drifting. Pure-helper test mirror lives in the Build-Suite repo
|
||
- `HonorificService` per-method threading banners replace the block comment at the bottom of the file. Each IPC callback
|
||
(`TryInitialPull`, `OnTitleChanged`, `OnReady`, `OnDisposing`, `TryUnsubscribe`) and the `CurrentTitle` field carry a
|
||
one-line `// Thread:` annotation so the framework-thread invariant is visible at the call site
|
||
- `TryUnsubscribe` log-level upgraded from `Debug` to `Warning`. A silent unsubscribe failure leaks a live subscription
|
||
across plugin reloads, which is exactly the kind of issue that should not be at Debug
|
||
- `AutoTranslate.PreloadCache` thread now has `IsBackground = true` and a thread name. Without `IsBackground` the warmup
|
||
blocks plugin unload (typically 100-300 ms). Pattern-match to `MessageManager` (F6.1) and `Plugin.RetentionSweep`
|
||
(F9.3), both since v1.4.0
|
||
- `Configuration.IsAllowedForStorage` adds a one-line `Plugin.Log.Warning` for the first occurrence of any ChatType that
|
||
isn't in `PrivacyPersistChannels`. Dedup via a `NonSerialized` `HashSet<ChatType>`, so the warning fires once per
|
||
runtime — not once per frame, not once per install. Failsafe routing through `PrivacyPersistUnknownChannels` is
|
||
unchanged
|
||
- `PrivacyPersistUnknownChannels` field default flipped from `false` to `true` for new installs via a constant in
|
||
`PrivacyDefaults`. Existing configs keep their explicit choice — the deserializer overrides the initializer. No schema
|
||
bump, no migration, no first-run banner
|
||
|
||
Modding & support: join Hellion Forge — <https://discord.gg/X9V7Kcv5gR>
|
||
|
||
Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).
|
||
|
||
---
|
||
|
||
## Hellion Chat 1.4.3 — Plugin-Load Async-Init + Repo-Cutover (2026-05-08)
|
||
|
||
Plugin lifecycle migrated to Dalamud's `IAsyncDalamudPlugin` API. The constructor now does only the bootstrap-essentials
|
||
(config load, language init, conflict detection); migrations, service allocations, window construction and hook
|
||
subscription move to `LoadAsync`. Dalamud can keep its UI responsive while the heavy work runs.
|
||
|
||
- `IAsyncDalamudPlugin` two-phase load with per-line `CaptureFailure` in `DisposeAsync` (mirrors LightlessSync's
|
||
pattern); idempotency guard protects against reload races
|
||
- Schema-gate replaces the v9 → v16 migration chain. Configs on schema v16+ load directly; older configs trigger an
|
||
"install v1.4.2 first" error so the historic migration path stays intact
|
||
- `AutoTranslate.PreloadCache` moved off the load path. First use may have a sub-second hitch instead of every-load; the
|
||
upstream chose differently, we accept first-use latency
|
||
- `FontManager.BuildFonts` is called sync at the start of `LoadAsync`; Dalamud rebuilds the font atlas on its own
|
||
pipeline so the custom Hellion-Exo2 font appears with a brief font-pop after load (matches ChatTwo's behaviour)
|
||
- Custom-repo URL moved to `gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat`. GitHub repo stays as a frozen
|
||
v1.4.2 snapshot; new releases ship from Gitea. Existing testers need to update the custom-repo URL once
|
||
- Plugin-load time in this release sits at ~3.7 s median (5 reloads), comparable to v1.4.2. Async migration is
|
||
foundational for v1.4.4 Lazy-Init optimisations rather than an immediate user-perceived win
|
||
|
||
Modding & support: join Hellion Forge — <https://discord.gg/X9V7Kcv5gR>
|
||
|
||
Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).
|
||
|
||
---
|
||
|
||
## Hellion Chat 1.4.2 — ChatLog Frame-Hot-Path
|
||
|
||
Third sub-patch of the v1.4.x Polish Sweep series. Per-frame allocations from the chat-log render path eliminated.
|
||
|
||
- `DrawMessages` card-mode hoists `theme`/`drawList`/`winLeft`/`winRight`/`borderColorAbgr` out of the per-message loop.
|
||
About 500 redundant calls per frame at 100 visible messages, multiplied by every pop-out window
|
||
- Auto-tell tab tint and icon use a per-tab cache. Hash computation and string allocation only happen when the tell
|
||
target name or world drifts. `AutoTellTabTint` stays a pure hash helper; cache lives in a thin `TabTintCache` wrapper
|
||
- Status bar gates its tab aggregation behind the same one-second cache it already used for the format strings. LINQ
|
||
`Sum` and `Count` replaced with a single `foreach` pass that runs on roughly 1 % of frames
|
||
|
||
Realistic frame-time recovery: 2-5 % in typical scenes, more on pop-out-heavy setups because the card-border hoist
|
||
scales per window.
|
||
|
||
Modding & support: join Hellion Forge — <https://discord.gg/X9V7Kcv5gR>
|
||
|
||
Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).
|
||
|
||
---
|
||
|
||
## Hellion Chat 1.4.1 — Theme Engine Performance
|
||
|
||
Second sub-patch of the v1.4.x Polish Sweep series. Heap pressure from the theme engine's per-frame render path removed,
|
||
plus a tenth built-in theme and hardening for the custom-theme hot-reload.
|
||
|
||
- Theme records carry a pre-computed ABGR-packed cache for every color slot; cache is filled when the theme is
|
||
registered and refreshed defensively on every `Switch()`
|
||
- `HellionStyle.PushGlobal` reads ABGR values from the cache instead of calling `ColourUtil.RgbaToAbgr` per slot per
|
||
frame; ~13 % render-time recovery measured in typical scenes (plan estimate was 2–6 %, real ~10–15 %)
|
||
- `ThemeRegistry` custom-theme reload distinguishes a recoverable file lock (editor mid-save) from a permanent IO
|
||
failure; locked themes keep their last-known-good snapshot and retry on the next lookup instead of dropping out of the
|
||
picker
|
||
- New built-in: **Synthwave Sunset** — Hot Magenta + Cyan on midnight violet, 80s neon-grid vibes; tenth theme in the
|
||
picker
|
||
- Author credits refreshed: brand themes are credited as "Hellion Forge"; **Mint Grove** and **Forge Merchantman** now
|
||
credited to **Carla Beleandis** as a community thanks
|
||
|
||
No schema bump, no user-visible behaviour change other than smoother frames on GC-sensitive setups and one additional
|
||
colour option.
|
||
|
||
Modding & support: join Hellion Forge — <https://discord.gg/X9V7Kcv5gR>
|
||
|
||
Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).
|
||
|
||
---
|
||
|
||
## Hellion Chat 1.4.0 — Critical Lifecycle Fixes
|
||
|
||
First sub-patch of the v1.4.x Polish Sweep series. Seven known lifecycle and race bugs eliminated before any performance
|
||
refactor sits on top.
|
||
|
||
- MessageStore disposal no longer triggers GC.Collect globally; Pooling=false on the SQLite connection means there's
|
||
nothing left to clean up by hand
|
||
- PendingMessage and RetentionSweep worker threads are explicitly marked IsBackground=true so the plugin domain can
|
||
unload during XIVLauncher reload without waiting for them
|
||
- EmoteCache image and gif loaders moved from async-void to async Task with a shared task tracker, draining on Dispose
|
||
so an in-flight load can no longer write to a disposed EmoteImages entry
|
||
- DisposeAsync 10s timeout now warns loudly instead of silently leaving the worker behind
|
||
- Plugin.Dispose flushes any pending DeferredSaveFrames before tearing services down, so settings changes made in the
|
||
last few frames before disable are no longer lost
|
||
- The v13→v14 config migration now reads the pre-v13 backup and carries HellionThemeWindowOpacity into the new
|
||
WindowOpacity field instead of falling back to the default 0.85
|
||
|
||
Modding & support: join Hellion Forge — <https://discord.gg/X9V7Kcv5gR>
|
||
|
||
Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).
|
||
|
||
---
|
||
|
||
## Hellion Chat 1.3.0 — Plugin Integrations: Honorific
|
||
|
||
First step on the plugin-integration roadmap. HellionChat now listens to Honorific and shows your custom title in the
|
||
chat header. The slot auto-hides when Honorific is not installed, when no custom title is active, or when you are using
|
||
the original FFXIV title.
|
||
|
||
- New "Integrations" settings tab
|
||
- Honorific integration with auto-detection and live updates
|
||
- "Coming soon" preview of the next five planned integrations: context menu actions, smart notifications, RP status
|
||
block, ExtraChat channels, and quick DM compose
|
||
- Maintainer attribution buttons for Honorific repo and Caraxi
|
||
- New service-class pattern under HellionChat/Integrations/
|
||
|
||
Modding & support: join Hellion Forge — <https://discord.gg/X9V7Kcv5gR>
|
||
|
||
Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).
|
||
|
||
---
|
||
|
||
## v1.2.3 — Theme Expansion (2026-05-06)
|
||
|
||
### Added
|
||
|
||
- Four new built-in themes:
|
||
- **Night Blue** — Royal Blue on deep marine, cool tech-dashboard mood
|
||
- **Indigo Violet** — Royal Violet on deep indigo with a turquoise-mint counter (aurora glitter feel)
|
||
- **Forge Merchantman** — Patina bronze on workshop slate with warm amber counter (Hellion Forge identity)
|
||
- **Hellion Spectrum** — Deuteran/Protan-safe channel colours using Wong/Okabe-Ito palette tones; channel identity
|
||
(Tell pink, Yell yellow, Shout orange, Party blue, FC green) preserved while keeping every channel separable under
|
||
red-green colour vision deficiency
|
||
- Built-in theme catalogue grown from five to nine
|
||
|
||
### Notes
|
||
|
||
- No engine changes, no settings touched, no migration
|
||
- Default theme unchanged (Hellion Arctic). Existing custom themes keep working.
|
||
- Hellion Spectrum covers the ~99 % of CVD cases that are red-green; a Tritan-safe variant could follow in a later cycle
|
||
if there is demand.
|
||
|
||
---
|
||
|
||
## v1.2.1 — Settings Cleanup (2026-05-06)
|
||
|
||
### Changed
|
||
|
||
- Settings cards re-sorted thematically: 9 cards remain, each card has one clear job and a one-line subtitle.
|
||
- **Theme & Layout** (new) collects the theme picker, window frame style (title bar, sidebar, hide button, pop-out title
|
||
bar) and the timestamp style options.
|
||
- **Fonts & Colours** (new) houses font choice, font size and per-channel chat colours.
|
||
- **Data Management** (new) collects retention windows, cleanup, export, the database viewer and the shift-click
|
||
advanced tools.
|
||
- **Privacy** is now focused on the privacy filter alone.
|
||
- **Chat** absorbs the Auto-Tell-Tabs history-preload slider that used to live under Privacy.
|
||
- **General** groups the keybind mode under Input.
|
||
|
||
### Removed
|
||
|
||
- Legacy "Style override" option and the unused style-name field — both obsolete since the v1.1.0 themes engine.
|
||
- Legacy `WindowAlpha` slider — if you had it set, the value is auto-migrated to Theme & Layout → Window Style → Window
|
||
Transparency.
|
||
- Unused `ShowThemeQuickPicker` schema field.
|
||
|
||
### Migration
|
||
|
||
- v15 → v16 with backup at `pluginConfigs/HellionChat.json.pre-v16-backup`.
|
||
- All other settings preserved unchanged.
|
||
- One-time toast on first start if Style override was previously active.
|
||
|
||
---
|
||
|
||
## v1.2.0 — Layout Refresh (2026-05-05)
|
||
|
||
### Added
|
||
|
||
- Sidebar tab modernization: icon-only at fixed 44 px, tooltip on hover, vertical accent pill for active tab
|
||
- Top tabs: accent underline pill replaces background fill on active tab
|
||
- Per-tab custom icons in Settings → Tabs (15-glyph FontAwesome picker)
|
||
- Bottom status bar (22 px): channel indicator, privacy badge, counters, tells, version — updates 1×/sec
|
||
- Card rows as default message render: sender header in channel color, subtle border between cards
|
||
- Compact-Density toggle in Appearance: switches back to single-line `[HH:mm] Sender: Text` layout
|
||
- Auto-Tell tabs: per-partner hashed icon (7-glyph pool: envelope/star/heart/bell/bookmark/flag/fire) plus hashed color
|
||
(12-color palette) — 84 distinct icon+color combinations
|
||
- Unread indicator: pulsing red dot in the top-right corner of any sidebar tab icon with unread messages, 2-second
|
||
sine-wave pulse, respects `Configuration.ReduceMotion`
|
||
|
||
### Changed
|
||
|
||
- Migration v14 → v15: deprecated Configuration fields `HellionThemeEnabled` and `HellionThemeWindowOpacity` removed
|
||
- Appearance settings cleaned: legacy theme-engine bindings replaced by Themes tab (introduced in v1.1.0)
|
||
|
||
### Fixed
|
||
|
||
- Settings save no longer wipes chat history by default — the heavy `ClearAllTabs + FilterAllTabsAsync` cycle now only
|
||
runs when a filter-relevant setting actually changed (Privacy filter, persisted channels, per-tab channel selection).
|
||
Cosmetic changes keep the in-session chat intact
|
||
- Identifier-based `MessageList` restore in `Configuration.UpdateFrom` plus TempTab skip in
|
||
`ClearAllTabs`/`FilterAllTabs` ensure persistent tabs and Auto-Tell tabs both survive the save
|
||
- Sidebar buttons now align vertically with the first message row (top padding mirrors the chat header toolbar height)
|
||
- Sidebar child window no longer paints the top padding area with its frame background
|
||
- Status bar version slot (`vX.Y.Z · Hellion`) no longer clips its rightmost character
|
||
|
||
### Notes
|
||
|
||
- Polish phase (animations, theme crossfade, header quick-picker) follows in v1.3.0
|
||
- Top-Tab icon prefixes were considered but dropped: Dalamud's default font atlas does not include FontAwesome
|
||
codepoints, so mixed-font in a single TabItem label renders as tofu. Underline pill alone is the v1.2.0 visual
|
||
treatment for top tabs. Resolution would require Font-Atlas merge at FontManager level — out of scope.
|
||
|
||
---
|
||
|
||
## [1.1.0] — 2026-05-05 — Theme Foundation
|
||
|
||
First major UI cycle after v1.0.0. Theme engine, five built-in themes, custom themes via JSON, settings card grid.
|
||
|
||
### Added
|
||
|
||
- **Theme engine** with five built-in themes: Hellion Arctic (default), Chat 2 Classic, Event Horizon, Moonlit Bloom,
|
||
Mint Grove.
|
||
- **Settings → Themes** with mini mockup preview per theme. Clicking a card instantly switches the entire plugin (chat,
|
||
settings, pop-outs).
|
||
- **Custom themes via JSON** in `pluginConfigs/HellionChat/themes/`. On first start, `example-theme.json` is placed
|
||
there as a template.
|
||
- **Optional theme chat channel colours**: themes can ship their own channel colours. On switch, a banner appears with
|
||
_Apply / Keep current_ — never applied automatically.
|
||
- **Settings card grid**: new overview on open, clicking a card navigates into the section's detail view. Breadcrumb +
|
||
ESC navigate back.
|
||
- **`docs/THEME-AUTHORING.md`** as a guide for writing custom themes, with Hellion Forge branding.
|
||
|
||
### Changed
|
||
|
||
- **Plugin icon** updated to Hellion Forge hammer (previously a ChatTwo derivative).
|
||
- **Settings detail view** uses the full width — the second tab list on the left is gone because the card overview
|
||
handles navigation.
|
||
- **`HellionStyle.PushGlobal`** is now theme-driven (`PushGlobal(theme, opacity)`) instead of const-palette-driven.
|
||
- **Configuration v13 → v14**: all users land on `hellion-arctic`. Those who prefer the upstream look can select
|
||
`chat2-classic` in Settings → Themes.
|
||
|
||
### Deprecated
|
||
|
||
- `Configuration.HellionThemeEnabled` and `HellionThemeWindowOpacity` remain readable for one release as a safety net
|
||
but are no longer evaluated. Removal planned for v1.2.0.
|
||
|
||
### Security
|
||
|
||
- Custom theme JSON loader validates `schemaVersion`, required fields and hex format. Invalid themes are skipped with a
|
||
warning; the plugin continues loading with built-ins.
|
||
|
||
### Internal
|
||
|
||
- 51 local unit tests (theme records, registry, JSON round-trip, sanity per built-in theme). Tests are gitignored.
|
||
|
||
---
|
||
|
||
## [1.0.3] — 2026-05-04 — Polish Patch
|
||
|
||
Four small polish items from the backlog bundled together:
|
||
|
||
- **Hide on New Game+ menu**: optional global toggle that hides Hellion Chat (and all other plugin windows such as
|
||
Settings, DB Viewer, pop-outs) while the NG+ menu is open. Settings → Window → Frame, default off. Skips the entire
|
||
`WindowSystem.Draw()` path analogous to the existing LoadingScreens pattern.
|
||
- **Channel selector colouring**: optional tinting of the channel-select button (comment icon) next to the input field
|
||
in the current channel colour. Settings → Appearance → Chat Colours, default on. Consistent with the existing input
|
||
text colouring; ExtraChat override is carried over.
|
||
- **(De)buff icon aspect-ratio fix**: `PayloadHandler.InlineIcon` was squashing all hover icons to 32×32. Status icons
|
||
with non-square dimensions (debuffs with an arrow indicator) are now shrunk aspect-preserving. Standalone float-math
|
||
implementation with zero-size guard instead of a cherry-pick from the open ChatTwo PR #157 (which had an int-division
|
||
trap).
|
||
- **HideState logging sweep**: all HideState transitions (Battle/Cutscene/User/Override plus pop-out mirroring) log at
|
||
verbose level. Off by default; enable via `/xllog set HellionChat verbose` for bug-report diagnostics.
|
||
|
||
[Release Notes 1.0.3](https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/tag/v1.0.3)
|
||
|
||
---
|
||
|
||
## [1.0.1] — 2026-05-04 — Window Position Recovery
|
||
|
||
Fixes an off-screen-window scenario the user could end up in after a monitor disconnect or display layout change between
|
||
sessions. An automatic one-shot bounds check on the first draw after plugin load snaps the window back into the visible
|
||
viewport, and a new "Reset Window Position" button in Settings → Window → Frame serves as the manual escape hatch for
|
||
edge cases.
|
||
|
||
Bundled housekeeping since v1.0.0: documentation restructured into `docs/`, stale ChatTwo/\* paths in repo configs
|
||
cleaned up, Pidgin parser library bumped from 3.3.0 to 3.5.1, GitHub Actions bumps for `actions/setup-dotnet` (4 → 5)
|
||
and `github/codeql-action` (3 → 4).
|
||
|
||
[Release Notes 1.0.1](https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/tag/v1.0.1)
|
||
|
||
---
|
||
|
||
## [1.0.0] — 2026-05-03 — Standalone Major Release
|
||
|
||
First fully independent release. Code namespace, IPC channels and source tree structure consolidated under
|
||
`HellionChat.*`. Plugin refuses to start alongside an active upstream Chat 2 (bilingual conflict message). SQLite native
|
||
pinned to 3.50.3 (CVE-2025-6965, CVE-2025-7709). Tab layout default for new installs and users on config version 12 or
|
||
older restructured (5 thematic tabs instead of 6+ kitchen-sink). Sweep of critical and major findings from the codebase
|
||
audit incorporated.
|
||
|
||
[Release Notes 1.0.0](https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/tag/v1.0.0)
|
||
|
||
---
|
||
|
||
## [0.6.1] — 2026-05-03 — Pop-Out Discoverability & /tell Auto-Pop-Out
|
||
|
||
Pop-out button visible in the chat header, one-time hint banner for the pop-out feature. New setting "Open new /tell
|
||
tabs directly as pop-out". Pop-out input is now active by default. Bug fixes: ghost windows on LRU-drop / logout, dead
|
||
zone below the input bar when the hint banner is active.
|
||
|
||
[Release Notes 0.6.1](https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/tag/v0.6.1)
|
||
|
||
---
|
||
|
||
## [0.6.0] — 2026-05-03 — UX Polish: Pop-Out Input + Colour Presets
|
||
|
||
Two opt-in UX features. Pop-out windows optionally get a compact input bar with a channel-coloured icon button and an
|
||
independent text buffer per pop-out. Seven built-in colour presets (Classic, High Contrast, Pastel, Dark Mode Tuned,
|
||
Hellion, Night Blue, Indigo Violet) for one-click apply. Configuration migration v10 → v11.
|
||
|
||
[Release Notes 0.6.0](https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/tag/v0.6.0)
|
||
|
||
---
|
||
|
||
## [0.5.4] — 2026-05-02 — WrapText Hardening
|
||
|
||
`ImGuiUtil.WrapText` rewritten from pointer arithmetic to Span- and index-based control flow. Permanently closes the
|
||
recurring CodeQL critical alert "unvalidated local pointer arithmetic". No user-visible behaviour change — word-wrap
|
||
output is byte-identical to 0.5.3.
|
||
|
||
[Release Notes 0.5.4](https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/tag/v0.5.4)
|
||
|
||
---
|
||
|
||
## [0.5.3] — 2026-05-02 — Pointer Arithmetic Hardening
|
||
|
||
First attempt at closing the CodeQL critical alert in `ImGuiUtil.WrapText`. Encoded byte buffer length is validated via
|
||
`GetByteCount` before pointer arithmetic.
|
||
|
||
[Release Notes 0.5.3](https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/tag/v0.5.3)
|
||
|
||
---
|
||
|
||
## Earlier Versions
|
||
|
||
Releases before 0.5.3 (bootstrap phase 0.1.0 to 0.5.2) are available directly on the Gitea release stream:
|
||
|
||
[All Releases](https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases)
|
||
|
||
---
|
||
|
||
## Maintenance Note
|
||
|
||
The source of truth for the user-facing changelog is the `changelog:` block in `HellionChat/HellionChat.yaml`.
|
||
`repo.json` and the GitHub release body are fed from there. This file (`docs/CHANGELOG.md`) is a curated summary with
|
||
links to the release pages and is updated manually on each version bump.
|