0d016aaa5d
CHANGELOG.md gets the full per-bullet block, ROADMAP.md gets the released-cycle summary plus a v1.4.7 next-cycle placeholder, README status section and version badge updated.
465 lines
27 KiB
Markdown
465 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)
|
||
|
||
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.
|