35e8d3a7fe
Plugin.cs:937 only pushed RegularFont when Config.FontsEnabled was true.
FontsAndColours.cs:50 forces FontsEnabled=false whenever UseHellionFont is
enabled (to hide the chooser UI), so the bundled-font path was silently
dead and the FFXIV Axis game-font took over. Exo 2 looked "almost right"
because it overlaps Axis on basic Latin, so the regression went unnoticed
for the entire v1.5.x series.
The fix routes RegularFont through draw whenever either FontsEnabled or
UseHellionFont is on. First-frame HITCH dropped from ~74 ms to ~20 ms
median (5-reload Linux/Wine sample 17.9-23.6 ms) as a side effect — the
v1.5.1 "too optimistic" defer-pattern hypothesis was actually a symptom
of this bug, not bad math.
Font-stack overhaul on top:
- Inter Light (Static 18pt-Light, 343 KB, SIL OFL 1.1) replaces Exo 2 as
the bundled font. Inter ships full Latin Extended-A/B, Greek polytonic
and Cyrillic Supplement coverage.
- NotoSansCjkRegular added as a third merge layer for Hangul,
Simplified-Chinese-specific Han glyphs, and CJK fallbacks the FFXIV
Japanese font does not ship.
- Two new ExtraGlyphRanges flags (LatinExtended, Greek) implemented via
AddChar pair lists in SetUpRanges.
- Settings.Apply auto-activates the matching ExtraGlyphRanges flag on
language change. Plugin.LoadAsync runs a one-shot migration that ORs
in the required flag for an already-selected language.
- ExtraGlyphRanges CollapsingHeader reachable regardless of
UseHellionFont (was hidden in the early-return branch).
- New WarningText below the language combo: FFXIV's chat engine only
fully supports EN/DE/FR/JA. Other scripts render in the HellionChat
UI but may garble in in-game chat input/send.
Localisation wave (originally a FR-only cycle):
- 24 selectable UI languages. LanguageOverride enum gains 10 new locales
plus 3 previously commented-out (Italian, Korean, Norwegian with ISO
code `nb` instead of `no`). All new values append to keep existing
user-config integer serialisation stable.
- Resource bundle split: HellionStrings.resx (24 locales, 328 keys) for
fork-added strings, Language.resx (24 locales, 456 keys) for the
ChatTwo-Crowdin-heritage. 4 post-sync Crowdin keys backfilled into
13 legacy locales with per-key AI-assisted comment marker.
- Em-dash sweep on EN source plus 18 translations. Russian and Ukrainian
keep their typographic norm.
Old HellionFont.ttf + HellionFont-OFL.txt removed; Inter-Light.ttf +
Inter-OFL.txt take their place. Configuration field UseHellionFont keeps
its name for backwards-compat. Migration v17 stays.
424 lines
27 KiB
Markdown
424 lines
27 KiB
Markdown
# Hellion Chat — Roadmap
|
||
|
||
Planned work after the v1.0.0 standalone cut. This list is intentionally high-level: concrete specs,
|
||
size estimates and repro steps live in the internal backlog. External tracking runs via
|
||
[Gitea Issues](https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/issues) with the
|
||
`roadmap` label once an item is scheduled for a cycle.
|
||
|
||
Order reflects priority, not a guarantee. Items may shift or be dropped entirely if they turn out to
|
||
be a poor fit for the plugin's privacy-first scope during brainstorming.
|
||
|
||
---
|
||
|
||
## Next Cycle
|
||
|
||
**Plugin Integrations Wave 2-6** (Context-Menu, NotificationMaster, Moodles, ExtraChat, XIVIM
|
||
Quick-DM) is the next planned scope. The UiBuilder first-frame HITCH investigation that v1.5.1
|
||
queued is now closed as a side effect of v1.5.3's font-stack fix — HITCH dropped from ~74 ms into
|
||
the 15-25 ms range. The Wine/Linux scroll-rubber-band spike remains at the tail.
|
||
|
||
Native-speaker review of the AI-assisted v1.5.3 translations (13 legacy Crowdin locales) runs in
|
||
parallel as a continuous correction pass, gathered via the Hellion Forge Discord.
|
||
|
||
---
|
||
|
||
## v1.5.3 — Localisation Wave + Bundled-Font Overhaul (released 2026-05-19)
|
||
|
||
Twenty-four selectable UI languages: from FR-only as the original plan scope, the cycle expanded to
|
||
cover Catalan, Czech, Danish, Finnish, Greek, Hungarian, Italian, Korean, Norwegian, Polish,
|
||
Portuguese (Portugal), Turkish and Ukrainian alongside the existing Crowdin-heritage locales, all
|
||
AI-translated and flagged for community review. Bundled font swaps from Exo 2 to **Inter Light**
|
||
for wider European glyph coverage (Latin Extended-A/B, Greek polytonic, Cyrillic Supplement);
|
||
**NotoSansCjkRegular** joins as a third merge layer so Hangul and Simplified-Chinese-specific Han
|
||
glyphs render correctly inside the HellionChat UI.
|
||
|
||
First-frame HITCH dropped from **~74 ms to a median of ~20 ms** (5-reload sample 17.9-23.6 ms,
|
||
Linux/Wine) as a side effect: the bundled-font path was silently falling back to the FFXIV Axis
|
||
game font for the entire v1.5.x series because of an early-return in `Plugin.cs:937`. The fix
|
||
routes `RegularFont` through draw whenever either `FontsEnabled` or `UseHellionFont` is on, and
|
||
lands the defer-pattern win v1.5.1 was reaching for.
|
||
|
||
`ExtraGlyphRanges` auto-activates the matching flag on language change. Two new flags
|
||
(`LatinExtended`, `Greek`) join the existing set. Plugin init runs a one-shot migration that ORs
|
||
the required flag into the saved config for users updating from v1.5.2 with a non-default language
|
||
already selected. A WarningText under the language dropdown notes that FFXIV's own chat input only
|
||
fully supports EN/DE/FR/JA — other languages may garble when typed into in-game chat.
|
||
|
||
Migration v17 stays. `LanguageOverride` enum grows by ten locales plus three previously
|
||
commented-out (Italian, Korean, Norwegian with code `nb`); all new values append to keep existing
|
||
user-config integer serialisation stable.
|
||
|
||
---
|
||
|
||
## v1.5.2 — First-Run Wizard Rework (released 2026-05-18)
|
||
|
||
Multi-step wizard replacement: Welcome → Privacy → Power Settings → Done with staged-commit so
|
||
Decide-later or X-close at any point leaves the existing config untouched. New fourth privacy
|
||
profile "Roleplay" extends Privacy-First with `Say` and both emote types under a 30-/90-day
|
||
retention window. Privacy picker becomes a 2×2 grid; Casual keeps the ★ recommended marker. A new
|
||
power-settings stage surfaces six previously-hidden `Configuration` fields (Load Previous Session,
|
||
Filter Include Previous Sessions, Auto-Tell-Tabs History Preload, Compact Density, Prettier
|
||
Timestamps, built-in theme picker) without introducing any new fields.
|
||
|
||
Window default size shrinks from 900×560 to 720×480 (MinimumSize 600×400) and Step 1 wraps the fox
|
||
banner in a folded TreeNode after smoke feedback. Existing v1.5.1 users see the new wizard once on
|
||
first v1.5.2 boot via a new `WizardLastShownVersion` config marker.
|
||
|
||
Under the hood: `WizardStateSmokeStep` joins the `/xlperf` lineup, the Build Suite gains twelve
|
||
pure-helper xUnit Facts pinning all four privacy profile sets and the new Roleplay retention
|
||
overrides. Migration v17 stays — `Configuration` only grows one optional string field.
|
||
|
||
---
|
||
|
||
## v1.5.1 — FontAtlas Refactor and Hellion Forge Signature (released 2026-05-17)
|
||
|
||
Hybrid FontManager refactor with init-only game-font handles plus a mutable delegate path for the
|
||
eight live font settings, all wired through a single `IFontAtlas.SuppressAutoRebuild()` block.
|
||
Atlas-build count drops from 4-5 per plugin load to 1. FontAwesome reuses Dalamud's
|
||
`UiBuilder.IconFontFixedWidthHandle` instead of building its own slot. `BuildFontsAsync` is removed,
|
||
`BuildFonts` renamed to `RebuildDelegateFonts` and scoped to the delegate fonts.
|
||
|
||
Plus an embedded Hellion Forge provenance mark: a fox-head ASCII silhouette in the `/xllog`
|
||
bootstrap banner, a full fox banner in the First-Run Wizard and Settings → Information tab. Drawn by
|
||
Julia Moon.
|
||
|
||
Honorific full-gradient port (originally the v1.5.1 main item) was dropped: Honorific 3.2 exposes no
|
||
IPC for the rendered gradient frame, and an in-plugin port of the colour palette was declined. The
|
||
integration stays at the v1.4.7 glow-only shape.
|
||
|
||
The cross-plugin baseline target from v1.5.0 (matching Lightless / XIVInstantMessenger at ~7 ms
|
||
HITCH) did not land — HITCH stays around 80 ms because the cost lives in the UiBuilder first-frame
|
||
render path, not in the atlas build. A first-frame render investigation is reserved for a later
|
||
cycle.
|
||
|
||
---
|
||
|
||
## v1.5.0 — DI Foundation and Service Refactor (released 2026-05-17)
|
||
|
||
Major architecture cycle. Plugin bootstrap moves to a generic-host DI container
|
||
(`Microsoft.Extensions.Hosting` + `IServiceCollection`) modelled on Lightless Sync's
|
||
`PluginHostFactory`. Service logging migrates from the static `Plugin.LogProxy` locator (the F12.2
|
||
shim from v1.4.7) to typed `Microsoft.Extensions.Logging.ILogger<T>` via constructor injection,
|
||
bridged over Dalamud's `IPluginLog` by a custom `DalamudLogger` trio. 18 instance-class services
|
||
move to ctor-injected loggers across four slices: data layer, IPC/integrations, UI window layer, and
|
||
root. `Plugin.LogProxy` stays for the eight buckets ctor injection cannot reach — static helpers
|
||
(`EmoteCache`, `AutoTranslate`, `MemoryUtil`, `WrapperUtil`), Dalamud-reflected types
|
||
(`Configuration`), the `Message` data class, and instance classes that only log from static methods
|
||
(`FontManager`, one `GameFunctions` site). Plugin.cs finishes at 1012 lines, virtually identical to
|
||
the pre-cycle 1013 (-1 netto): the new Phase-1 host build and `Plugin.X` bridge wiring trade out
|
||
exactly the service and window allocations that previously lived in `LoadAsync`. Cross-plugin
|
||
baseline (10 reload-stress runs, 51 active plugins): HellionChat first-frame HITCH 77 ms median,
|
||
Chat 2 v1.40.2 74 ms median — no DI penalty. The deferred-font-atlas pattern from Lightless and
|
||
XIVInstantMessenger is the v1.5.1 follow-up. User-visible: slash-command insert fix cherry-picked
|
||
from ChatTwo upstream `ee7768ac` — pasting a slash command into the chat input now replaces existing
|
||
input instead of concatenating. Migration v17 stays.
|
||
|
||
---
|
||
|
||
## v1.4.10 — Symbol-Picker and Tell-History Fix (released 2026-05-16)
|
||
|
||
Eleventh and final sub-patch of the v1.4.x Polish Sweep series. Symbol picker for the chat input —
|
||
popup with two tabs (161 FFXIV PUA glyphs via Dalamud's SeIconChar plus 97 server-verified BMP
|
||
symbols probed through `/echo` and `/say` in a four-round whitelist build) — cursor-aware splice,
|
||
multi-insert, recent-used strip across both tabs, Settings toggle in Chat → Message behaviour.
|
||
Mid-cycle hotfix for pinned auto-tell tabs: PreloadHistory used to cap the SQL scan at 500 rows
|
||
regardless of the user's `AutoTellTabsHistoryPreload` setting, so active users with many partners
|
||
lost the backlog of less-frequent pinned partners; the cap is gone, the `(Receiver, Date)` index
|
||
keeps SQL fast, the client-side loop respects the user setting as the upper bound. Slash-command
|
||
teardown cleanup wires the v1.4.9 wrappers through private fields so dispose detaches the live
|
||
registration instead of re-registering with identical args. The original Reserve-A
|
||
`ImGuiListClipper` refactor for `DrawMessages` was cancelled after cross-platform smoke showed the
|
||
scroll rubber-band is a Wine/Linux render-pipeline quirk, not universal — Windows-side testing on
|
||
v1.4.9 confirmed no lag. Migration v17 stays.
|
||
|
||
---
|
||
|
||
## v1.4.9 — Plugin-Load Render Polish (released 2026-05-15)
|
||
|
||
Tenth sub-patch of the v1.4.x Polish Sweep series. First-frame HITCH drops from ~127 ms median to
|
||
~76 ms median (4-reload sample), comfortably under Dalamud's 100 ms warning threshold. Mechanism: a
|
||
single `_firstFrameDone` flag inside `ChatLogWindow` defers six non-essential rendering sections
|
||
(bottom status bar, channel-name SeString chunks, window bounds check, v0.6.1 hint banner,
|
||
autocomplete, input-preview calculation) from frame 0 to frame 1. User sees those sections ~17 ms
|
||
(60 fps) later, invisible inside the ~2.5 s font-atlas build window after every reload.
|
||
Slash-command registration moved from individual window constructors to a central `SetupCommands` /
|
||
`TearDownCommands` pair in `Plugin.cs` — `/hellion`, `/hellionView`, `/hellionSeString` and
|
||
`/hellionDebugger` work before their target windows are opened the first time, and Dalamud's
|
||
plugin-manager `OpenConfigUi` / `OpenMainUi` buttons hang on the same path. Plugin-load profiling
|
||
logs (auto-translate warmup, `MessageStore.Connect`, `MessageStore.Migrate`, `FilterAllTabs`) stay
|
||
on at Information level as a regression tripwire. The release also ships a ChatTwo IPC compatibility
|
||
layer: HellionChat mirrors ChatTwo's full IPC surface (`GetChatInputState`, `ChatInputStateChanged`,
|
||
`Register`, `Unregister`, `Available`, `Invoke`) under the `ChatTwo.*` namespace in addition to our
|
||
existing `HellionChat.*` provider gates, so third-party integrations that only subscribe to
|
||
ChatTwo's IPC (Artisan, AllaganTools) keep working without a code change on their side. Conflict
|
||
detection prevents ChatTwo from loading in parallel, so there is no slot-collision risk at runtime.
|
||
Migration v17 stays (no schema bump). Hypothesis-triage falsified three of four candidate root
|
||
causes (font-atlas sync fallback, theme-apply ABGR-cache init, multiple-window render via lazy-init)
|
||
— actual cost distributes evenly across ~10 ImGui sections inside ChatLogWindow, so structural
|
||
rewrite is deferred to v1.5.x DI-container cycle.
|
||
|
||
## v1.4.8 — Hook-Layer and Polish Quick-Wins (released 2026-05-14)
|
||
|
||
Ninth sub-patch of the v1.4.x Polish Sweep series. Database Viewer gains an optional FTS5 full-text
|
||
search across the full chat history, built asynchronously on first run after the update with a
|
||
progress toast; the local page-filter remains the default mode. Custom theme files auto-reload when
|
||
edited while the theme is active (1 Hz disk-stat throttle, so per-frame cost is free). Retention
|
||
sweep no longer blocks the framework thread — `Framework.Run(...).Wait()` is replaced by
|
||
`Framework.RunOnTick(...)`, removing the ~194 ms hitch per sweep. Status-bar height is now derived
|
||
from `GetTextLineHeightWithSpacing()` plus a DPI-aware spacer so the bar renders correctly at
|
||
Windows display scaling above 100 %. Receive-suppressed-tells routing was investigated and
|
||
**postponed to v1.5.x**: when other plugins suppress tells via `CheckMessageHandled`, FFXIV's
|
||
chat-pipeline skips the `RaptureLogModule.AddMsgSourceEntry` path, which means the
|
||
`ContentIdResolverHook` does not fire and tell-partner identification breaks. The fix belongs next
|
||
to the planned ad-block hook layer where the same patch surface comes up anyway. Migration v17 stays
|
||
(no schema bump). H3 leaves a foundation note in the Vault
|
||
(`Projekte/FFXIV/Hellion Chat/v1.5.x Ad-Block Foundation.md`) covering the NoSoliciting filter +
|
||
bubble-layer hook pattern as a ready-made template for the v1.5.x cycle.
|
||
|
||
---
|
||
|
||
## v1.4.7 — Backlog Cleanup and Mid-Features (released 2026-05-13)
|
||
|
||
Eighth sub-patch of the v1.4.x Polish Sweep series. First user-visible feature bundle since v1.4.5.
|
||
TempTell tabs can now be pinned via right-click; pinned tabs survive plugin reload and character
|
||
logout, keep their conversation history (loaded on demand from the message store on rehydrate), and
|
||
stay bound to the same `/tell` partner. A hard cap of 5 pinned tabs lives in a pool separate from
|
||
the 15-tab auto-tell pool, total ceiling 20. The sidebar groups pinned tabs into their own section
|
||
with a divider header, and the sidebar width itself is now configurable in **Theme & Layout**
|
||
between 44 and 160 px. Honorific glow outlines render when the title carries a Glow colour, opt-in
|
||
via **Settings → Integrations → Render glow outlines (Honorific)** (default off). Honorific's
|
||
gradient (Color3 / GradientColourSet / Wave / Pulse) is parsed but rendered statically — a later
|
||
cycle will port the full animation algorithm or land an upstream IPC PR for the resolved frame
|
||
colour. `Configuration.UpdateFrom` now preserves the runtime `CurrentChannel` across the
|
||
persistent-tab merge, and `TabSwitched` deep-clones the seeded channel instead of sharing the
|
||
previous tab's `UsedChannel` — together they fix a Settings-Save regression where the chat input
|
||
could pop back to `/tell <pinned-partner>` after touching settings on a Party or Linkshell tab.
|
||
Internal items: `IPluginLogProxy` indirection over Dalamud's `IPluginLog` routes all ~91
|
||
`Plugin.Log` call sites through a testable proxy, closing the F12.1 test-isolation gap
|
||
(`MessageStore.Migrate0` runs in xUnit now). TempTab counter switched from `Interlocked` cached
|
||
field to derived `Tabs.Count(predicate)`. Migration v16 → v17 is additive (new `Tab.IsPinned` flag).
|
||
Build-Suite floor 688 → 710 (+22 tests across Pin-lifecycle predicates, pool limits, Tab.Clone
|
||
roundtrip, MessageStore Migrate0 construction, and Honorific TitleData JSON roundtrip).
|
||
|
||
## v1.4.6 — Code Hygiene and Refactor (released 2026-05-12)
|
||
|
||
Seventh sub-patch of the v1.4.x Polish Sweep series. Maintenance patch — no user-visible behaviour
|
||
changes; tightens the development feedback loop and pulls in two ChatTwo upstream bugfixes.
|
||
`scripts/preflight.sh` gains a csharpier reflow check (Block E) and a markdownlint pass (Block F),
|
||
so style drift and markdown violations are blocked at the pre-push gate.
|
||
`FontManager.AddFontWithFallback` catch-filter now spans `InvalidOperationException` and
|
||
`ArgumentException` on top of the existing IO triad, with the exception type name in the warning log
|
||
so the diagnostic path can see which atlas-toolkit throw triggered the fallback. `BrandingLinks` and
|
||
`IntegrationLinks` run a `[ModuleInitializer]` URL validation pass on plugin load; a typo in a
|
||
future URL rotation now throws at startup instead of failing silently when a user clicks the broken
|
||
button. Cherry-picked from ChatTwo upstream `f35b7d3`: `Chat.SetChannel` no longer leaks the native
|
||
`Utf8String` when the linkshell check rejects the channel (rename to `IsChannelOrExistingLinkshell`
|
||
plus wrap-not-return), and `Tab.Clone` now deep-clones `UsedChannel` and `TellTarget` (the previous
|
||
reference copy let PopOut and Temp tabs mutate each other's channel state). The `ChatLogWindow`
|
||
active-tab underline pill scales with `ImGuiHelpers.GlobalScale` and rounds to physical pixels for
|
||
crisp rendering above 100 % DPI. Internal items: `HellionStyle` ChildBgAlpha extracted to a testable
|
||
helper, `Plugin.SaveConfig` clones only the temp-tab subset in the snapshot path, `SettingsOverview`
|
||
caches the draw-list per frame, `Dalamud.Utility.Util` static surface routed through an
|
||
`IPlatformUtil` indirection (`MessageStore`'s `IsWine` probe is now testable in isolation). No
|
||
schema bump, no migration.
|
||
|
||
## v1.4.5 — UX and Robustness (released 2026-05-12)
|
||
|
||
Sixth sub-patch of the v1.4.x Polish Sweep series. User-visible robustness polish plus two doc/test
|
||
polish items from the audit backlog. Chat-log draw failures now surface as a one-shot notification
|
||
instead of failing silently. The first-run wizard splits accept from close: `OnClose` no longer
|
||
silently sets `FirstRunCompleted`, and a new footer "Later — keep defaults" button is the explicit
|
||
path to dismiss without picking a profile. `InputHistoryService` clears on plugin dispose so the
|
||
previous session's typed commands don't bleed into the next load. `FontManager` falls back to the
|
||
system font path if the embedded Hellion font resource is missing (broken-csproj / dev-build only).
|
||
The status bar hides the version slot when the chat window is too narrow to fit all five slots
|
||
without overlap. Plus `Plugin.cs:167-168` gains an explicit session-only Auto-Tell-Tab invariant
|
||
comment with a `TempTabCounter.InitFromList` pin in the Build-Suite. No schema bump, no migration.
|
||
|
||
## v1.4.4 — Threading and IPC Safety Polish (released 2026-05-12)
|
||
|
||
Fifth sub-patch of the v1.4.x Polish Sweep series. `AutoTellTabsService.ActiveTempTabCount` switches
|
||
from a lock-protected LINQ `Count` to an `Interlocked` counter kept in sync from inside the existing
|
||
mutation paths; `Initialize()` seeds from the persisted Tabs list and `SaveConfig`'s
|
||
snapshot-restore path calls a new `ResyncTempTabCounter()` after the mid-step `RemoveAll`.
|
||
`HonorificService` carries per-method threading banners and `TryUnsubscribe`'s log level moves from
|
||
Debug to Warning. `AutoTranslate.PreloadCache` is marked `IsBackground = true` so plugin unload no
|
||
longer waits for it. `Configuration.IsAllowedForStorage` logs once per unknown ChatType via a
|
||
`NonSerialized` `HashSet`, and `PrivacyPersistUnknownChannels` default flips to `true` for new
|
||
installs. No schema bump, no migration.
|
||
|
||
## v1.4.3 — Plugin-Load Async-Init + Repo-Cutover (released 2026-05-08)
|
||
|
||
Fourth and largest sub-patch of the v1.4.x Polish Sweep series. Plugin migrated to Dalamud's
|
||
`IAsyncDalamudPlugin` API: the constructor handles only bootstrap essentials (config load, language
|
||
init, conflict detection); migrations, service allocations, window construction and hook
|
||
subscription move to `LoadAsync`. Schema gate replaces the v9 → v16 migration chain; configs on
|
||
schema v16+ load directly, older configs trigger an "install v1.4.2 first" error.
|
||
`AutoTranslate.PreloadCache` moved off the load path. `FontManager.BuildFonts` runs sync at the
|
||
start of `LoadAsync`; Dalamud rebuilds the font atlas on its own pipeline. Custom-repo URL cut over
|
||
to `gitea.hellion-forge.cloud`; the GitHub repo remains as a frozen v1.4.2 snapshot. Plugin load
|
||
time sits at ~3.7 s median (5 reloads), comparable to v1.4.2 — the async migration is a foundation
|
||
for v1.4.4 lazy-init optimisations rather than an immediate user-perceived win.
|
||
|
||
## v1.4.2 — ChatLog Frame-Hot-Path (released 2026-05-08)
|
||
|
||
Third sub-patch of the v1.4.x Polish Sweep series. Per-frame allocations eliminated from the
|
||
ChatLogWindow render path and the settings status bar. Card-mode border loop in `DrawMessages`
|
||
hoists five invariants into a pre-loop hoist; `AutoTellTabTint` gets a per-tab cache via
|
||
`TabTintCache` (separate validation keys per cache, no cross-invalidation); status bar moves the
|
||
cache-gate check before the aggregation and replaces LINQ `Sum`+`Count` with a single-pass foreach.
|
||
|
||
## v1.4.1 — Theme Engine Performance (released 2026-05-08)
|
||
|
||
Second sub-patch of the v1.4.x Polish Sweep series. ABGR cache pre-computed on theme records;
|
||
`HellionStyle.PushGlobal` reads from the cache instead of converting per slot per frame. **~13 %
|
||
render-time recovery** in smoke tests (plan estimate of 2–6 % was conservative; real result ~10–15
|
||
%). Custom-theme hot-reload survives transient file locks via last-known-good snapshot. Plus:
|
||
Synthwave Sunset as the tenth built-in, author credits consolidated under Hellion Forge, Mint
|
||
Grove + Forge Merchantman credited to Carla Beleandis as a community thanks.
|
||
|
||
## v1.4.0 — Critical Lifecycle Fixes (released 2026-05-07)
|
||
|
||
First sub-patch of the v1.4.x Polish Sweep series. Seven P0 findings from audit passes 3 and 4
|
||
resolved: async-void loads, missing `IsBackground` flags, `GC.Collect` in Dispose, deferred-save
|
||
race and pre-v13 backup lookup for `WindowOpacity`. No schema bumps, no user-facing behaviour
|
||
changes other than reload and shutdown running noticeably cleaner.
|
||
|
||
## v1.3.0 — Plugin Integrations: Honorific (released 2026-05-07)
|
||
|
||
First cycle of the plugin integrations roadmap. Honorific custom titles displayed in the chat header
|
||
with auto-detect and silent fallback. New Integrations settings tab. Pattern-setter for the five
|
||
following cycles (Context Menu, NotificationMaster, RP Status Block, ExtraChat, XIVIM).
|
||
|
||
Spec: [Plugin Integrations Overview](../Hellion%20Chat%20Plugin-Integrationen.md)
|
||
|
||
## v1.2.3 — Theme Expansion (released 2026-05-06)
|
||
|
||
Four new built-in themes: Night Blue, Indigo Violet, Forge Merchantman, Hellion Spectrum
|
||
(Deuteran/Protan-safe). No engine changes. See `docs/CHANGELOG.md`.
|
||
|
||
(v1.2.2 was burned because the `repo.json` manifest was not bumped in sync on the first push —
|
||
re-released as v1.2.3 with full manifest synchronisation.)
|
||
|
||
## v1.2.1 — Settings Cleanup (released 2026-05-06)
|
||
|
||
Settings re-sorted thematically (9 cards), 4 dead settings removed, auto-migration v15 → v16 without
|
||
data loss.
|
||
|
||
## v1.2.0 — Layout Refresh (released 2026-05-05)
|
||
|
||
Top tabs refresh, sidebar tab icons, bottom status bar, card rows as default message render,
|
||
auto-tell tab hashing.
|
||
|
||
## v1.1.0 — Theme Foundation (released 2026-05-05)
|
||
|
||
Theme engine with five built-in themes, settings card grid, custom themes via JSON, theme authoring
|
||
docs. Plugin icon updated to Hellion Forge hammer. See `docs/CHANGELOG.md` for details.
|
||
|
||
Items from the original v1.1.0 plan (ad-block / spam filter, receive-suppressed-tells toggle) were
|
||
deferred in favour of the theme engine — both items live on in the mid-term block.
|
||
|
||
---
|
||
|
||
## Mid-Term (v1.4.x+)
|
||
|
||
- **Plugin Integrations Roadmap (Cycles 2–6)** — six plugin integrations planned; Honorific
|
||
(Cycle 1) is live, followed by Context Menu, NotificationMaster, RP Status Block, ExtraChat and
|
||
XIVIM in their own cycles. Spec and cycle order in
|
||
[Plugin Integrations Overview](../Hellion%20Chat%20Plugin-Integrationen.md).
|
||
- **Ad-Block / Spam Filter** — hybrid concept combining a lightweight built-in filter with optional
|
||
`NoSoliciting` IPC integration. Addresses ad-spam in public channels and tells. Deferred from the
|
||
v1.1.0 plan.
|
||
- **Receive-Suppressed-Tells Toggle** — auto-tell tabs trigger even when a third-party plugin (e.g.
|
||
XIVMessenger) globally suppresses /tell display. Same hook layer as ad-block, so they are bundled.
|
||
- **Database Viewer Inline Search** — full-text search in the DB viewer via SQLite FTS5. Currently
|
||
only date and channel filters are available.
|
||
- **TempTell Persistence** — pin toggle on TempTell tabs so selected tells survive a relog. Tester
|
||
request from Jingliu.
|
||
- **FontManager Async Refactor** — move `LoadGameSymFontAsync` out of the blocking plugin
|
||
constructor. Fix cold-start hitching on first plugin load (low severity; plugin is functional).
|
||
- **Separate Opacity Active vs. Inactive** — second slider for inactive window opacity. Upstream
|
||
declines this; we can decide differently here.
|
||
- **Failed-Tell Notification** — visible message on /tell failure (offline, restricted instance,
|
||
blacklisted, world-mismatch) instead of silent failure.
|
||
- **Per-Tab Sound Notification** — sound toggle and optionally a custom .wav per tab, with
|
||
mute-in-combat option.
|
||
|
||
---
|
||
|
||
## Long-Term (v1.x+)
|
||
|
||
### Storage Backends (three-stage confirmation)
|
||
|
||
- MySQL/MariaDB backend for multi-device setups
|
||
- PostgreSQL backend
|
||
- AES-256 encryption for sensitive channels with a local key
|
||
|
||
### Linux-Specific
|
||
|
||
- WireGuard network detection as an optional filter trigger
|
||
- libnotify integration for native Linux toasts
|
||
- XDG compliance (complex under Wine)
|
||
|
||
### UX and Tab Management
|
||
|
||
- **Regex Tab Routing** — route plugin output spam into dedicated tabs, auto-sort tells from
|
||
specific people. Clearly scoped against ad-block: routing sorts into views, blocking hides
|
||
globally.
|
||
- **Auto-Detect Duties** — tab switch on duty start via condition flag.
|
||
- **UX Bundle** — vertical tab bar as a layout option, Shift+Mousewheel to scroll tab headers
|
||
without activating them, global hotkey to close the active tab.
|
||
- **Configure Tab Title** — configurable tab title format (name / name + abbreviated world / full
|
||
name / custom), overridable per tab.
|
||
- **Name Display Options** — analogous to FFXIV vanilla (full name, first name abbreviated,
|
||
initials), per-channel override possible.
|
||
- **Item & Flag Linking** — outgoing: Shift-click on an item/flag sends it to the focused plugin
|
||
input. Incoming: item links and map coordinates are clickable.
|
||
- **Color Currently Selected Input Channel** — tint the channel-selector button in the input bar
|
||
with the current channel colour.
|
||
- **Plugin-Disclosure Pre-Send Filter** — configurable word/regex list blocks sending with a
|
||
pre-send confirmation. Protects against accidentally mentioning plugins in public channels.
|
||
- **Chat Clear on Name Change** — on character name change, migrate or wipe local history; default
|
||
is wipe for maximum privacy.
|
||
- **Hide Plugin Window on NG+ Screen** — extend hide logic to cover additional addon names.
|
||
- **Kick from Novice Network** — mentor niche; context menu entry with confirmation.
|
||
- **Text-to-Speech for /tell** — incoming tells via TTS, optionally per sender, with channel filter
|
||
and mute-in-combat. Low priority.
|
||
|
||
### Distribution and Branding
|
||
|
||
- Hand-drawn Hellion logo (currently a placeholder from the Hellion Online Media brand repo)
|
||
- GitHub Action for automatic `repo.json` sync after tag push
|
||
- Submission to the Dalamud main plugin repository (in addition to the custom repo)
|
||
|
||
---
|
||
|
||
## Bug Verifications
|
||
|
||
Carried over from the upstream issue tracker; not yet reproduced or verified in Hellion Chat 1.0.0.
|
||
Will be tested against the current state when opportunity allows.
|
||
|
||
- **Right-Click Whisper Error** in Field Ops / Special Instances (Eureka, Bozja, Occult Crescent,
|
||
DRS) — upstream [#168](https://github.com/Infiziert90/ChatTwo/issues/168). Reply helper appears to
|
||
swallow the `@World` suffix.
|
||
- **FPS Drops with Plugin Active** — upstream
|
||
[#145](https://github.com/Infiziert90/ChatTwo/issues/145). 10–20 % drop since upstream v1.29.19.0.
|
||
v1.0.0 includes several fixes on the suspected paths; repro test against the current state is
|
||
open.
|
||
- **Add Blacklist from Plugin Window** — upstream
|
||
[#140](https://github.com/Infiziert90/ChatTwo/issues/140). Right-click add-to-blacklist throws
|
||
"Cannot locate character with that name"; works via vanilla chat.
|
||
- **DB Viewer Column Sort** — State column sorts lexicographically instead of numerically (10 before
|
||
2). XIVIM [#82](https://github.com/NightmareXIV/XIVInstantMessenger/issues/82); repro in Hellion
|
||
Chat open.
|
||
|
||
---
|
||
|
||
## Licence Boundary
|
||
|
||
Hellion Chat is licensed under EUPL-1.2. Concept imports from AGPL-3.0 plugins (e.g. XIV Instant
|
||
Messenger) are architectural inspiration only — no code was ported. Code imports from the upstream
|
||
codebase are complete as of v1.4.x because Chat 2 is undergoing a fundamental rework and selective
|
||
patches are no longer cleanly portable. Status and rationale in
|
||
[`UPSTREAM_SYNC.md`](UPSTREAM_SYNC.md).
|