chore(linting): refresh configs and sweep auto-fix
Pull in the refreshed linter and tooling configs (editorconfig, gitignore, gitattributes, prettierignore, prettierrc, markdownlint, yamllint, env.example, dotnet-tools) and run prettier and markdownlint in --fix / --write mode across the repo so the existing tree matches the new rules. - prettier 2-space indent on yaml/yml and json overrides, asterisk strong, underscore emphasis, proseWrap always - markdownlint MD007 indent aligned to 2 and MD049 to underscore so prettier output stays passing - preflight Block F also ignores CLAUDE.md (gitignored personal file) - prettierignore extended to keep HellionChat.yaml manifest and the NuGet packages.lock.json out of the formatter No semantic content changed; csharpier, build, full build-suite (729/729) and the new prettier/markdownlint/yamllint checks all green.
This commit is contained in:
+238
-202
@@ -1,251 +1,281 @@
|
||||
# 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.
|
||||
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.
|
||||
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 (v1.5.1)
|
||||
|
||||
**Honorific Full Gradient Port plus FontAtlas-Defer for a 10× HITCH cut.** v1.5.0 closed the DI-container cycle with
|
||||
no performance penalty against Chat 2 (77 ms vs 74 ms median first-frame HITCH), but the cross-plugin baseline against
|
||||
Lightless Sync and XIVInstantMessenger surfaced a clean optimisation: both plugins defer their font-atlas build until
|
||||
after `Finished loading` and sit at 6-7 ms HITCH, an order of magnitude below the ~75 ms floor that Chat 2 and HellionChat
|
||||
share. v1.5.1 ports that pattern. Plus the Honorific gradient render path — DTO is gradient-ready since v1.4.7, only the
|
||||
Wave / Pulse animation port remains. After that, First-Run-Wizard rework with curated defaults beyond the three privacy
|
||||
profiles, then FR localisation (Hezcal native-speaker review confirmed), then the Plugin Integrations Wave 2-6
|
||||
(Context-Menu, NotificationMaster, Moodles, ExtraChat, XIVIM Quick-DM). Wine/Linux scroll-rubber-band spike sits as a
|
||||
low-priority Linux-only investigation at the tail.
|
||||
**Honorific Full Gradient Port plus FontAtlas-Defer for a 10× HITCH cut.** v1.5.0 closed the
|
||||
DI-container cycle with no performance penalty against Chat 2 (77 ms vs 74 ms median first-frame
|
||||
HITCH), but the cross-plugin baseline against Lightless Sync and XIVInstantMessenger surfaced a
|
||||
clean optimisation: both plugins defer their font-atlas build until after `Finished loading` and sit
|
||||
at 6-7 ms HITCH, an order of magnitude below the ~75 ms floor that Chat 2 and HellionChat share.
|
||||
v1.5.1 ports that pattern. Plus the Honorific gradient render path — DTO is gradient-ready since
|
||||
v1.4.7, only the Wave / Pulse animation port remains. After that, First-Run-Wizard rework with
|
||||
curated defaults beyond the three privacy profiles, then FR localisation (Hezcal native-speaker
|
||||
review confirmed), then the Plugin Integrations Wave 2-6 (Context-Menu, NotificationMaster, Moodles,
|
||||
ExtraChat, XIVIM Quick-DM). Wine/Linux scroll-rubber-band spike sits as a low-priority Linux-only
|
||||
investigation at the tail.
|
||||
|
||||
---
|
||||
|
||||
## 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.
|
||||
(`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.
|
||||
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.
|
||||
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 +
|
||||
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).
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
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).
|
||||
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`.
|
||||
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.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.
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
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 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.
|
||||
- **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.
|
||||
|
||||
---
|
||||
|
||||
@@ -265,27 +295,28 @@ the theme engine — both items live on in the mid-term block.
|
||||
|
||||
### 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.
|
||||
- **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.
|
||||
- **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.
|
||||
- **Text-to-Speech for /tell** — incoming tells via TTS, optionally per sender, with channel filter
|
||||
and mute-in-combat. Low priority.
|
||||
|
||||
### Distribution and Branding
|
||||
|
||||
@@ -297,24 +328,29 @@ the theme engine — both items live on in the mid-term block.
|
||||
|
||||
## 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.
|
||||
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.
|
||||
- **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).
|
||||
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).
|
||||
|
||||
Reference in New Issue
Block a user