From 82cbf4c28134523d17c2c0111f58c33cc4fe503f Mon Sep 17 00:00:00 2001
From: Jon Kazama
Date: Sun, 17 May 2026 19:12:22 +0200
Subject: [PATCH] chore(release): v1.5.1 manifest bump
- csproj 1.5.0 to 1.5.1; now
excludes the source-only ASCII study folder so the deploy stays
clean
- yaml + repo.json changelog block prepended with the v1.5.1 entry,
v1.4.8 trimmed out per the slim rule (three to four versions in
the manifest cache, older history lives on the Gitea release page)
- repo.json AssemblyVersion + TestingAssemblyVersion bumped to
1.5.1.0, three DownloadLink* URLs point at v1.5.1
- docs/CHANGELOG and docs/ROADMAP gain the v1.5.1 entry; ROADMAP
Next-Cycle slot moves to v1.5.2 First-Run-Wizard rework
- README status sections updated, the previous v1.5.0 paragraph
kept under a "Project status (pre-v1.5.1, kept for context)"
heading
- Forge-post .github/forge-posts/v1.5.1.md added, DE body honest
about the HITCH-win miss
- yamllint config ignores the plugin manifest yaml because it
follows DalamudPackager's 4-space indent convention rather than
yamllint's default 2
Changelogs are honest about the cross-plugin HITCH target from
v1.5.0 not landing this cycle.
---
.github/forge-posts/v1.5.1.md | 21 ++++++++
.yamllint.yaml | 6 +++
HellionChat/HellionChat.csproj | 7 +--
HellionChat/HellionChat.yaml | 84 ++++++++++++++++++------------
HellionChat/images/ascii/README.md | 63 +++++++++++-----------
README.md | 27 +++++++++-
docs/CHANGELOG.md | 32 ++++++++++++
docs/ROADMAP.md | 42 ++++++++++-----
repo.json | 12 ++---
9 files changed, 204 insertions(+), 90 deletions(-)
create mode 100644 .github/forge-posts/v1.5.1.md
diff --git a/.github/forge-posts/v1.5.1.md b/.github/forge-posts/v1.5.1.md
new file mode 100644
index 0000000..455faf0
--- /dev/null
+++ b/.github/forge-posts/v1.5.1.md
@@ -0,0 +1,21 @@
+---
+subtitle: "FontAtlas Refactor and Forge Signature"
+versionsnatur: "Architecture + Closure + Branding"
+---
+
+- **FontManager-Refactor.** Der FontAtlas baut jetzt nur noch einmal pro Plugin-Load statt vier- bis
+ fünfmal. Weniger CPU- und GPU-Druck in den ersten Sekunden nach einem Reload, weniger
+ Atlas-Texture-Memory-Churn. Die acht Font-Einstellungen können live über den neuen
+ `RebuildDelegateFonts`-Pfad geändert werden, ohne dass das Plugin neu geladen werden muss.
+- **Hellion Forge Signatur.** Das Plugin trägt jetzt eine ASCII-Fuchs-Signatur. Im `/xllog`
+ erscheint beim Plugin-Load ein kleiner Fuchs-Kopf, im First-Run-Wizard und unter Settings →
+ Information taucht eine eingeklappte „Hellion Forge"-Sektion mit dem vollen Fuchs auf. Gezeichnet
+ von Julia Moon, fest in der Plugin-DLL eingebettet.
+- **Honorific-Integration bleibt unverändert.** Der ursprünglich geplante Gradient-Render-Pfad
+ (Wave/Pulse-Animation) entfällt. Honorific 3.2 stellt keine IPC für den fertig gerenderten
+ Gradient-Frame zur Verfügung, und ein eigener Port der Pride-Palette wurde verworfen. Die
+ Honorific-Anzeige bleibt wie in v1.4.7 etabliert (statischer Glow plus Title).
+- **Hinweis zum HITCH-Win.** Der ursprünglich angepeilte 10×-First-Frame-Sprung
+ (Lightless/XIVIM-Pattern, ~7 ms statt ~75 ms) ist in diesem Cycle nicht eingetreten. Die
+ Render-Kosten liegen im UiBuilder-First-Frame-Pfad, nicht im FontAtlas-Build. Investigation kommt
+ als eigener späterer Cycle. Keine User-sichtbare Disruption, keine Migration.
diff --git a/.yamllint.yaml b/.yamllint.yaml
index a15fc67..33f469e 100644
--- a/.yamllint.yaml
+++ b/.yamllint.yaml
@@ -12,6 +12,12 @@
extends: default
+# Plugin-Manifest folgt DalamudPackager-Konvention (4-space-indent für
+# image_urls + tags). yamllint-Default verlangt 2 — Konflikt, daher
+# ignorieren statt das Manifest zu reformatieren.
+ignore: |
+ HellionChat/HellionChat.yaml
+
rules:
# Zeilenlängen-Check aus (konsistent mit markdownlint MD013)
line-length: disable
diff --git a/HellionChat/HellionChat.csproj b/HellionChat/HellionChat.csproj
index 25b514a..d3cba89 100644
--- a/HellionChat/HellionChat.csproj
+++ b/HellionChat/HellionChat.csproj
@@ -1,7 +1,7 @@
- 1.5.0
+ 1.5.1
enable
enable
@@ -69,9 +69,10 @@
-
+
-
+
PreserveNewest
diff --git a/HellionChat/HellionChat.yaml b/HellionChat/HellionChat.yaml
index 45f4045..29f356b 100755
--- a/HellionChat/HellionChat.yaml
+++ b/HellionChat/HellionChat.yaml
@@ -35,6 +35,56 @@ tags:
- Replacement
- Privacy
changelog: |-
+ **v1.5.1 — FontAtlas Refactor and Hellion Forge Signature (2026-05-17)**
+
+ Hybrid FontManager refactor plus an embedded provenance mark.
+
+ What changes under the hood:
+
+ - FontManager handle creation moves into the ctor inside a single
+ atlas.SuppressAutoRebuild() block. The font atlas now builds once
+ per plugin load instead of four to five times — less CPU and GPU
+ pressure in the first seconds after a reload, less atlas texture
+ memory churn.
+ - Hybrid property model: Axis, AxisItalic and FontAwesome become
+ init-only handles. RegularFont and ItalicFont stay mutable because
+ the eight font settings still need to replace them at runtime —
+ that path is funnelled through RebuildDelegateFonts() now and
+ runs without a plugin reload.
+ - FontAwesome reuses Dalamud's UiBuilder.IconFontFixedWidthHandle
+ instead of building its own atlas slot. One delegate-build step
+ less in the ctor.
+ - BuildFontsAsync and BuildFonts are removed; the live mutation
+ path is RebuildDelegateFonts() now.
+ - Two FontManager self-test steps registered with /xlperf: ctor
+ smoke (every handle non-null after Phase-1 resolve, no atlas
+ load-exception) and push smoke (Push() returns without throwing).
+
+ 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.
+
+ User-visible:
+
+ - Hellion Forge signature: a small fox-head ASCII silhouette is
+ emitted to /xllog on every plugin load, and a full fox banner
+ with "Hellion Forge" set inside the body is available as a
+ folded TreeNode in the First-Run Wizard and Settings ->
+ Information tab. Drawn by Julia Moon, embedded in the plugin DLL.
+ - No settings changes, no migration. v17 stays.
+
+ Note on performance: the cross-plugin baseline target from v1.5.0
+ (matching Lightless and XIVInstantMessenger at ~7 ms HITCH) did
+ not land this cycle. HITCH stays around 80 ms because the cost is
+ in the UiBuilder first-frame render path, not in the atlas build
+ (which this cycle did reduce from 4-5 builds per load to 1). A
+ first-frame render investigation is reserved for a later cycle.
+
+ Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).
+
+ ---
+
**v1.5.0 — DI Foundation and Service Refactor (2026-05-17)**
Major architecture cycle. The plugin bootstrap moves to a
@@ -165,38 +215,4 @@ changelog: |-
---
- **v1.4.8 — Hook-Layer and Polish Quick-Wins (2026-05-14)**
-
- Ninth sub-patch of the v1.4.x polish-sweep series. Hook-layer
- cluster (DbViewer FTS5 full-text search, ad-block foundation
- investigation) plus three polish quick-wins.
-
- - DbViewer full-text search: optional FTS5 index across the full
- chat history. Built asynchronously on first load after the
- update with a progress toast. The local page-filter remains
- available as the default mode. Queries match as exact phrases
- -- multi-word terms must appear together in order; advanced
- users can opt into raw FTS5 MATCH syntax by wrapping their own
- double-quotes.
- - Custom theme files now auto-reload when edited while the theme
- is active -- no need to re-click the theme in the picker.
- - Retention sweep no longer blocks the framework thread, removing
- the ~194ms mini-hitch per sweep.
- - Status bar renders correctly at Windows display scaling > 100%.
- - Receive-suppressed-tells routing investigated this cycle and
- postponed to v1.5.x: when other plugins suppress tells via
- CheckMessageHandled, the FFXIV chat pipeline skips the
- RaptureLogModule.AddMsgSourceEntry path so HellionChat's
- 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.
- - Internal: messages.Id is declared BLOB but stored as TEXT
- (Microsoft.Data.Sqlite Guid binding). FTS bulk insert and
- LoadByGuids match the TEXT storage form on both sides.
- Migration v17 stays (no schema bump).
-
- Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).
-
- ---
-
Full history: https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases
diff --git a/HellionChat/images/ascii/README.md b/HellionChat/images/ascii/README.md
index 7d77eef..f018901 100644
--- a/HellionChat/images/ascii/README.md
+++ b/HellionChat/images/ascii/README.md
@@ -1,57 +1,54 @@
# Hellion Chat — ASCII branding assets
-ASCII art collected during the Hellion Chat branding pass. Two variants
-ship inside the plugin DLL as embedded resources and render at runtime;
-everything in this folder is the wider study collection that did not get
-picked for the live slots, kept around as reference material and for
-anyone who wants to remix or build on top of them.
+ASCII art collected during the Hellion Chat branding pass. The Hellion Chat mascot is a fox, and two
+variants ship inside the plugin DLL as embedded resources and render at runtime. Everything in this
+folder is the wider study collection that did not get picked for the live slots, kept around as
+reference material and for anyone who wants to remix or build on top of them.
## Live assets (rendered at runtime)
-These two files live as embedded resources under
-`HellionChat/Resources/Branding/` and are loaded by the plugin at
-startup. They are intentionally outside this folder so the build
-pipeline can treat them as binary blobs rather than loose assets.
+These two files live as embedded resources under `HellionChat/Resources/Branding/` and are loaded by
+the plugin at startup. They are intentionally outside this folder so the build pipeline can treat
+them as binary blobs rather than loose assets.
-| File | Slot |
-|---|---|
-| `Resources/Branding/fox-banner.txt` | Full fox silhouette with "Hellion Forge" set inside the body. Rendered as a folded `TreeNode` in the First-Run Wizard and in the Settings → Information tab. |
-| `Resources/Branding/fox-mini.txt` | Compact fox-head + curly-tail. Prepended to the DI-logger bootstrap banner so an `/xllog` reader sees the signature on every plugin load. |
+| File | Slot |
+| ----------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `HellionChat/Resources/Branding/fox-banner.txt` | Full fox silhouette with "Hellion Forge" set inside the body. Rendered as a folded `TreeNode` in the First-Run Wizard and in the Settings → Information tab. |
+| `HellionChat/Resources/Branding/fox-mini.txt` | Compact fox-head + curly-tail. Prepended to the DI-logger bootstrap banner so an `/xllog` reader sees the signature on every plugin load. |
## Study assets (this folder, not embedded)
-Variants drawn during the design pass that did not get picked for the
-live slots. Kept around so the next branding iteration can remix them
-or pull one in if a new render slot needs an alternative shape.
+Variants drawn during the design pass that did not get picked for the live slots. Kept around so the
+next branding iteration can remix them or pull one in if a new render slot needs an alternative
+shape.
-| File | Description |
-|---|---|
-| `fox-profile-hf.txt` | Fox profile silhouette in `$`/`X` stipple with a small "HF" mark inside the chest. |
-| `fox-sitting-stipple.txt` | Sitting fox in `&` stipple with a full tail sweep to the right. |
-| `fox-paw-stipple.txt` | Detailed paw print in `@` stipple — five upper pads plus the main pad. |
-| `fox-paw-outline.txt` | Compact outline paw with `^` claw marks (non-retractable claws are a fox-vs-cat tell). |
-| `wolf-head-blazejkozlowski.txt` | Wolf head, kept as inspiration / style reference. **Not by Julia Moon** — see the attribution section below. |
+| File | Description |
+| ------------------------------- | ----------------------------------------------------------------------------------------- |
+| `fox-profile-hf.txt` | Fox profile silhouette in `$`/`X` stipple with a small "HF" mark inside the chest. |
+| `fox-sitting-stipple.txt` | Sitting fox in `&` stipple with a full tail sweep to the right. |
+| `fox-paw-stipple.txt` | Detailed paw print in `@` stipple — five upper pads plus the main pad. |
+| `fox-paw-outline.txt` | Compact outline paw with `^` claw marks (non-retractable claws are a fox-vs-cat tell). |
+| `wolf-head-blazejkozlowski.txt` | Third-party work, kept as a style reference from the design pass — see attribution below. |
## License / attribution
### Julia Moon (all `fox-*.txt` files)
-All `fox-*.txt` files in this folder and under `Resources/Branding/`
-were drawn for Hellion Chat by **Julia Moon**.
+"Julia Moon" is the pseudonym used by the Hellion Chat maintainer for creative work. All `fox-*.txt`
+files in this folder and under `HellionChat/Resources/Branding/` were drawn for Hellion Chat under
+that name.
- Free to use, no attribution required, no copyright notice needed.
- Remix, adapt, or build on top of them as you wish.
-- They travel under Hellion Chat's main EUPL-1.2 license but the
- author waives the attribution clause for these specific assets.
+- They travel under Hellion Chat's main EUPL-1.2 license but the author waives the attribution
+ clause for these specific assets.
### Blazej Kozlowski (`wolf-head-blazejkozlowski.txt`)
-The wolf head is by **Blazej Kozlowski**, originally published on the
-ASCII Art Archive:
+The wolf head is by **Blazej Kozlowski**, originally published on the ASCII Art Archive:
-It is kept here as a study reference for the fox silhouette work.
-The "bug" string at the bottom of the art is the artist's traditional
-signature, not a status marker. If you want to use it yourself, follow
-the rules on asciiart.eu rather than the Julia Moon waiver above.
+It is kept here as a style reference for the fox silhouette work. The `bug` string at the bottom of
+the art is the artist's traditional signature, not a status marker. If you want to use it yourself,
+follow the rules on asciiart.eu rather than the Julia Moon waiver above.
diff --git a/README.md b/README.md
index b1c0193..fbd9f71 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
[](https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/actions/workflows/build.yml)
[](LICENSE)
-[](https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/latest)
+[](https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/latest)
[](https://github.com/goatcorp/Dalamud)
[](https://dotnet.microsoft.com/)
[](https://www.finalfantasyxiv.com/)
@@ -11,7 +11,7 @@
-**Version 1.5.0** — Privacy-first chat plugin for FINAL FANTASY XIV / Dalamud, built on
+**Version 1.5.1** — Privacy-first chat plugin for FINAL FANTASY XIV / Dalamud, built on
[Chat 2](https://github.com/Infiziert90/ChatTwo) (EUPL-1.2).
Hellion Chat is a privacy-first plugin built on the Chat 2 foundation. The majority of the engine
@@ -299,6 +299,29 @@ An optional submission to the Dalamud main plugin repo (in addition to the custo
## Project Status
+**Version 1.5.1** — FontAtlas Refactor and Hellion Forge Signature. The FontManager moves from the
+inherited Chat 2 anti-pattern (null! fields + a separate BuildFonts method) to a hybrid model where
+the game fonts and FontAwesome are init-only handles and only the user-configurable delegate fonts
+stay mutable. All five handles register inside a single `IFontAtlas.SuppressAutoRebuild` block in
+the ctor, so the font atlas builds once per plugin load instead of four to five times. FontAwesome
+itself is now Dalamud's `UiBuilder.IconFontFixedWidthHandle` rather than a custom delegate slot.
+Live font-setting changes go through `RebuildDelegateFonts()` and no longer require a plugin reload.
+Plus an embedded Hellion Forge signature (drawn by Julia Moon) appears as a fox-head silhouette in
+the `/xllog` bootstrap banner and a full fox in the First-Run Wizard and Settings → Information tab.
+
+The Honorific full-gradient port that was originally scheduled for v1.5.1 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 10× HITCH cut targeted from the v1.5.0 cross-plugin baseline (Lightless / XIVInstantMessenger
+defer their font-atlas build to land at ~7 ms; Chat 2 + HellionChat were ~75 ms) did not land — 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.
+
+---
+
+### Project status (pre-v1.5.1, kept for context)
+
**Version 1.5.0** — DI Foundation and Service Refactor. Major architecture cycle: the plugin
bootstrap moves to a generic-host DI container (`Microsoft.Extensions.Hosting` +
`IServiceCollection`) modelled on Lightless Sync. All 18 instance-class services migrate from a
diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md
index 2a8b2db..5a3c273 100644
--- a/docs/CHANGELOG.md
+++ b/docs/CHANGELOG.md
@@ -11,6 +11,38 @@ releases as an overview and links to the release pages for details.
---
+## Hellion Chat 1.5.1 — FontAtlas Refactor and Hellion Forge Signature (2026-05-17)
+
+Hybrid FontManager refactor plus an embedded Hellion Forge provenance mark.
+
+- FontManager handle creation moves into the ctor inside a single `atlas.SuppressAutoRebuild()`
+ block — the font atlas now builds once per plugin load instead of four to five times.
+- Hybrid property model: `Axis`, `AxisItalic` and `FontAwesome` become init-only handles;
+ `RegularFont` and `ItalicFont` stay mutable because the eight font settings still need to replace
+ them at runtime via the renamed `RebuildDelegateFonts()` path, without a plugin reload.
+- `FontAwesome` reuses Dalamud's `UiBuilder.IconFontFixedWidthHandle` instead of building its own
+ atlas slot.
+- `BuildFontsAsync` and `BuildFonts` are removed; the live mutation path is `RebuildDelegateFonts()`
+ now.
+- Two new self-test steps register with `/xlperf`: FontManager ctor smoke (every handle non-null, no
+ atlas load-exception) and push smoke (`Push()` returns without throwing).
+- Hellion Forge signature embedded in the plugin DLL: a fox-head ASCII silhouette is prepended to
+ the `/xllog` bootstrap banner on every plugin load, and a full fox banner with "Hellion Forge" set
+ inside the body is available as a folded `TreeNode` in the First-Run Wizard and Settings →
+ Information tab. Drawn by Julia Moon.
+- Honorific full-gradient port (originally scheduled for this cycle) 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 10× HITCH cut targeted from the v1.5.0 cross-plugin baseline did not land — HITCH stays around
+80 ms because the cost lives in the UiBuilder first-frame render path, not in the atlas build (which
+this cycle did reduce from 4-5 builds per load to 1). A first-frame render investigation is reserved
+for a later cycle. No settings changes, no migration. v17 stays.
+
+[Full release notes on the Gitea release page.](https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/tag/v1.5.1)
+
+---
+
## Hellion Chat 1.5.0 — DI Foundation and Service Refactor (2026-05-17)
Major architecture cycle. The plugin bootstrap moves to a generic-host DI container
diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md
index d03fa94..4e5cc37 100644
--- a/docs/ROADMAP.md
+++ b/docs/ROADMAP.md
@@ -10,19 +10,37 @@ be a poor fit for the plugin's privacy-first scope during brainstorming.
---
-## Next Cycle (v1.5.1)
+## Next Cycle (v1.5.2)
-**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.
+**First-Run-Wizard rework with curated defaults beyond the three privacy profiles.** Jin's discovery
+in v1.4.10 surfaced the wizard's three-card layout as too thin — power users want richer presets out
+of the box. After that, FR localisation (Hezcal native-speaker review confirmed), then the Plugin
+Integrations Wave 2-6 (Context-Menu, NotificationMaster, Moodles, ExtraChat, XIVIM Quick-DM). The
+UiBuilder first-frame HITCH investigation that v1.5.1 surfaced sits as a separate spike near the
+Wine/Linux scroll-rubber-band investigation at the tail.
+
+---
+
+## 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.
---
diff --git a/repo.json b/repo.json
index 80457d2..287821d 100644
--- a/repo.json
+++ b/repo.json
@@ -3,7 +3,7 @@
"Author": "Jon Kazama (Hellion Forge)",
"Name": "Hellion Chat",
"InternalName": "HellionChat",
- "AssemblyVersion": "1.5.0.0",
+ "AssemblyVersion": "1.5.1.0",
"Description": "A Hellion Forge plugin — privacy-focused chat replacement for FINAL FANTASY XIV, built for EU, US and JP data rules.\n\nBy default only your own conversations are stored. Public chat, NPC dialogue, system messages and battle logs are discarded at the storage layer unless you opt in. Retention windows are configurable per channel, history can be wiped retroactively, and everything can be exported on demand.\n\nFeatures:\n- Channel whitelist with a Privacy-First default\n- Per-channel retention with a daily background sweep\n- Retroactive cleanup with preview and Ctrl+Shift confirm\n- Export to Markdown, JSON or CSV\n- First-run wizard with three profiles: Privacy-First, Casual, Full History\n- Bilingual UI (EN/DE) with live language switching\n- Own config and database — no shared state with other plugins\n\nBased on Chat 2 by Infi and Anna (EUPL-1.2).\nSupport: https://discord.gg/X9V7Kcv5gR",
"ApplicableVersion": "any",
"RepoUrl": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat",
@@ -14,12 +14,12 @@
"CanUnloadAsync": false,
"LoadPriority": 0,
"Punchline": "A Hellion Forge plugin. Privacy-first chat for FFXIV, built to stay out of your way.",
- "Changelog": "**v1.5.0 \u2014 DI Foundation and Service Refactor (2026-05-17)**\n\nMajor architecture cycle. The plugin bootstrap moves to a\ngeneric-host DI container (Microsoft.Extensions.Hosting +\nIServiceCollection) modelled on Lightless Sync. Service logging\nmoves from a static Plugin.LogProxy locator to typed\nMicrosoft.Extensions.Logging.ILogger via constructor injection,\nbridged over Dalamud's IPluginLog by a custom DalamudLogger trio.\n\nWhat changes under the hood:\n\n- 18 instance-class services migrate to ILogger via constructor\n injection across four slices: data layer (MessageStore,\n MessageManager, AutoTellTabsService), IPC and integrations\n (HonorificService, IpcManager, TypingIpc, ExtraChat, the three\n GameFunctions classes), UI window layer (ChatLogWindow,\n DbViewer, Popout, three settings tabs), and root (Commands,\n ThemeRegistry, PayloadHandler).\n- Plugin.LogProxy stays in place for the eight buckets ctor\n injection cannot reach: static helpers (EmoteCache,\n AutoTranslate, MemoryUtil, WrapperUtil), Dalamud-reflected\n types (Configuration), the Message data class, and instance\n classes that only log from static methods (FontManager, one\n GameFunctions site).\n- Plugin.cs finishes at 1012 lines \u2014 virtually identical to the\n pre-cycle 1013. The new Phase-1 host build and Plugin.X bridge\n wiring trade out exactly the service and window allocations\n that previously lived in LoadAsync.\n- Cross-plugin baseline confirms no performance penalty against\n Chat 2: HellionChat first-frame HITCH 77 ms median, Chat 2\n 74 ms median. Lightless and XIVInstantMessenger sit around\n 7 ms by deferring their font-atlas build past Finished\n loading \u2014 that pattern is the v1.5.1 follow-up.\n\nUser-visible:\n\n- Slash-command insert fix: pasting a slash command into the\n chat input (Friend List \"/tell\" action, plugin-driven inserts\n from Artisan, AllaganTools etc.) now replaces the existing\n input instead of concatenating. Cherry-picked from ChatTwo\n upstream ee7768ac with namespace adaptation.\n\nMigration v17 stays (no schema bump).\n\nBased on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).\n\n---\n\n**v1.4.10 \u2014 Symbol-Picker and Tell-History Fix (2026-05-16)**\n\nEleventh and final sub-patch of the v1.4.x polish-sweep series.\nSymbol picker for the chat input, a tell-history reload fix for\nusers with many active partners, and a closing cleanup sweep\nbefore v1.5.0 picks up the DI-container adoption.\n\n- Symbol picker: a small smile-icon button left of the channel\n indicator opens a popup with two tabs. The first lists all 161\n FFXIV PUA glyphs (Dalamud's SeIconChar enum); the second\n carries 97 server-verified BMP symbols (latin marks, currency,\n the full Greek alphabet, geometric shapes, suits, notes) \u2014\n every one of them round-tripped through /echo and /say in a\n four-round probe so the in-channel render matches what the\n picker shows. Click drops the glyph at the caret, multi-insert\n keeps the popup open, and a recent-used strip floats the last\n sixteen picks across both tabs. Toggle in Settings \u2192 Chat \u2192\n Message behaviour, default on.\n- Pinned auto-tell tabs reload their full history again: a\n hidden 500-row scan cap in PreloadHistory used to override the\n user-configurable AutoTellTabsHistoryPreload setting, so\n less-frequent pinned partners (rare /tell sessions in an\n otherwise busy week) lost their backlog. The cap is removed;\n the (Receiver, Date) index keeps SQL fast, the client-side\n loop still respects your setting as the upper bound.\n- Slash-command teardown: /hellion, /hellionView,\n /hellionDebugger (and #if DEBUG /hellionSeString) wrappers are\n now cached as private fields. Plugin teardown detaches the\n live registration instead of re-Register'ing with identical\n args \u2014 closes a latent maintenance hazard from v1.4.9.\n- v1.4.x polish-sweep wraps up here. The ImGuiListClipper render\n refactor that was on the v1.4.10 reserve list got dropped\n after cross-platform smoke showed the scroll rubber-band is a\n Wine / Linux render-pipeline quirk, not universal \u2014 Windows\n users never saw it. It will get its own platform-targeted\n spike in a later patch. Next major cycle is v1.5.0 with the\n DI-container adoption (Microsoft.Extensions.Hosting +\n ILogger) modelled on Lightless.\n- Migration v17 stays (no schema bump).\n\nBased on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).\n\n---\n\n**v1.4.9 \u2014 Plugin-Load Render Polish (2026-05-15)**\n\nTenth sub-patch of the v1.4.x polish-sweep series. First-frame\nrender cost drops from ~127 ms median to ~76 ms median,\ncomfortably under Dalamud's 100 ms HITCH warning threshold.\n\n- First-frame defer: six non-essential rendering sections inside\n ChatLogWindow skip their first Draw and run one frame later\n (bottom status bar, channel-name SeString chunks, window bounds\n check, v0.6.1 hint banner, autocomplete, input-preview\n calculation). User-visible delay is ~17 ms at 60 fps, hidden\n inside the post-reload font-atlas build window.\n- Slash-command centralisation: /hellion, /hellionView,\n /hellionSeString and /hellionDebugger are registered in\n LoadAsync instead of inside the corresponding window\n constructors. The plugin-manager Open and configuration buttons\n hang on the same path.\n- Plugin-load profiling logs stay on at Information level\n (MessageStore connect/migrate, FilterAllTabs, auto-translate\n warmup) as a regression tripwire \u2014 a future load past 100 ms\n will show up in /xllog without a Debug filter.\n- ChatTwo IPC compatibility layer: HellionChat now mirrors\n ChatTwo's full IPC surface (GetChatInputState,\n ChatInputStateChanged, Register, Unregister, Available,\n Invoke) under the ChatTwo.* namespace in addition to our\n existing HellionChat.* provider gates. Third-party\n integrations that historically only subscribe to ChatTwo's\n IPC \u2014 for example Artisan's and AllaganTools' context-menu\n hooks \u2014 keep working without requiring a code change on their\n side. Conflict detection prevents ChatTwo from loading in\n parallel with HellionChat, so there is no slot-collision risk\n at runtime.\n- Migration v17 stays (no schema bump).\n\nBased on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).\n\n---\n\n**v1.4.8 \u2014 Hook-Layer and Polish Quick-Wins (2026-05-14)**\n\nNinth sub-patch of the v1.4.x polish-sweep series. Hook-layer\ncluster (DbViewer FTS5 full-text search, ad-block foundation\ninvestigation) plus three polish quick-wins.\n\n- DbViewer full-text search: optional FTS5 index across the full\n chat history. Built asynchronously on first load after the\n update with a progress toast. The local page-filter remains\n available as the default mode. Queries match as exact phrases\n -- multi-word terms must appear together in order; advanced\n users can opt into raw FTS5 MATCH syntax by wrapping their own\n double-quotes.\n- Custom theme files now auto-reload when edited while the theme\n is active -- no need to re-click the theme in the picker.\n- Retention sweep no longer blocks the framework thread, removing\n the ~194ms mini-hitch per sweep.\n- Status bar renders correctly at Windows display scaling > 100%.\n- Receive-suppressed-tells routing investigated this cycle and\n postponed to v1.5.x: when other plugins suppress tells via\n CheckMessageHandled, the FFXIV chat pipeline skips the\n RaptureLogModule.AddMsgSourceEntry path so HellionChat's\n ContentIdResolverHook does not fire and tell-partner\n identification breaks. The fix belongs next to the planned\n ad-block hook layer where the same patch surface comes up.\n- Internal: messages.Id is declared BLOB but stored as TEXT\n (Microsoft.Data.Sqlite Guid binding). FTS bulk insert and\n LoadByGuids match the TEXT storage form on both sides.\n Migration v17 stays (no schema bump).\n\nBased on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).\n\n---\n\nFull history: https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases",
+ "Changelog": "**v1.5.1 \u2014 FontAtlas Refactor and Hellion Forge Signature (2026-05-17)**\n\nHybrid FontManager refactor plus an embedded provenance mark.\n\nWhat changes under the hood:\n\n- FontManager handle creation moves into the ctor inside a single\n atlas.SuppressAutoRebuild() block. The font atlas now builds\n once per plugin load instead of four to five times \u2014 less CPU\n and GPU pressure in the first seconds after a reload, less\n atlas texture memory churn.\n- Hybrid property model: Axis, AxisItalic and FontAwesome become\n init-only handles. RegularFont and ItalicFont stay mutable\n because the eight font settings still need to replace them at\n runtime \u2014 that path is funnelled through RebuildDelegateFonts()\n now and runs without a plugin reload.\n- FontAwesome reuses Dalamud's UiBuilder.IconFontFixedWidthHandle\n instead of building its own atlas slot. One delegate-build\n step less in the ctor.\n- BuildFontsAsync and BuildFonts are removed; the live mutation\n path is RebuildDelegateFonts() now.\n- Two FontManager self-test steps registered with /xlperf: ctor\n smoke (every handle non-null after Phase-1 resolve, no atlas\n load-exception) and push smoke (Push() returns without throwing).\n\nHonorific full-gradient port (originally the v1.5.1 main item)\nwas dropped: Honorific 3.2 exposes no IPC for the rendered\ngradient frame, and an in-plugin port of the colour palette was\ndeclined. The integration stays at the v1.4.7 glow-only shape.\n\nUser-visible:\n\n- Hellion Forge signature: a small fox-head ASCII silhouette is\n emitted to /xllog on every plugin load, and a full fox banner\n with \"Hellion Forge\" set inside the body is available as a\n folded TreeNode in the First-Run Wizard and Settings ->\n Information tab. Drawn by Julia Moon, embedded in the plugin DLL.\n- No settings changes, no migration. v17 stays.\n\nNote on performance: the cross-plugin baseline target from\nv1.5.0 (matching Lightless and XIVInstantMessenger at ~7 ms\nHITCH) did not land this cycle. HITCH stays around 80 ms because\nthe cost is in the UiBuilder first-frame render path, not in the\natlas build (which this cycle did reduce from 4-5 builds per\nload to 1). A first-frame render investigation is reserved for\na later cycle.\n\nBased on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).\n\n---\n\n**v1.5.0 \u2014 DI Foundation and Service Refactor (2026-05-17)**\n\nMajor architecture cycle. The plugin bootstrap moves to a\ngeneric-host DI container (Microsoft.Extensions.Hosting +\nIServiceCollection) modelled on Lightless Sync. Service logging\nmoves from a static Plugin.LogProxy locator to typed\nMicrosoft.Extensions.Logging.ILogger via constructor injection,\nbridged over Dalamud's IPluginLog by a custom DalamudLogger trio.\n\nWhat changes under the hood:\n\n- 18 instance-class services migrate to ILogger via constructor\n injection across four slices: data layer (MessageStore,\n MessageManager, AutoTellTabsService), IPC and integrations\n (HonorificService, IpcManager, TypingIpc, ExtraChat, the three\n GameFunctions classes), UI window layer (ChatLogWindow,\n DbViewer, Popout, three settings tabs), and root (Commands,\n ThemeRegistry, PayloadHandler).\n- Plugin.LogProxy stays in place for the eight buckets ctor\n injection cannot reach: static helpers (EmoteCache,\n AutoTranslate, MemoryUtil, WrapperUtil), Dalamud-reflected\n types (Configuration), the Message data class, and instance\n classes that only log from static methods (FontManager, one\n GameFunctions site).\n- Plugin.cs finishes at 1012 lines \u2014 virtually identical to the\n pre-cycle 1013. The new Phase-1 host build and Plugin.X bridge\n wiring trade out exactly the service and window allocations\n that previously lived in LoadAsync.\n- Cross-plugin baseline confirms no performance penalty against\n Chat 2: HellionChat first-frame HITCH 77 ms median, Chat 2\n 74 ms median. Lightless and XIVInstantMessenger sit around\n 7 ms by deferring their font-atlas build past Finished\n loading \u2014 that pattern is the v1.5.1 follow-up.\n\nUser-visible:\n\n- Slash-command insert fix: pasting a slash command into the\n chat input (Friend List \"/tell\" action, plugin-driven inserts\n from Artisan, AllaganTools etc.) now replaces the existing\n input instead of concatenating. Cherry-picked from ChatTwo\n upstream ee7768ac with namespace adaptation.\n\nMigration v17 stays (no schema bump).\n\nBased on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).\n\n---\n\n**v1.4.10 \u2014 Symbol-Picker and Tell-History Fix (2026-05-16)**\n\nEleventh and final sub-patch of the v1.4.x polish-sweep series.\nSymbol picker for the chat input, a tell-history reload fix for\nusers with many active partners, and a closing cleanup sweep\nbefore v1.5.0 picks up the DI-container adoption.\n\n- Symbol picker: a small smile-icon button left of the channel\n indicator opens a popup with two tabs. The first lists all 161\n FFXIV PUA glyphs (Dalamud's SeIconChar enum); the second\n carries 97 server-verified BMP symbols (latin marks, currency,\n the full Greek alphabet, geometric shapes, suits, notes) \u2014\n every one of them round-tripped through /echo and /say in a\n four-round probe so the in-channel render matches what the\n picker shows. Click drops the glyph at the caret, multi-insert\n keeps the popup open, and a recent-used strip floats the last\n sixteen picks across both tabs. Toggle in Settings \u2192 Chat \u2192\n Message behaviour, default on.\n- Pinned auto-tell tabs reload their full history again: a\n hidden 500-row scan cap in PreloadHistory used to override the\n user-configurable AutoTellTabsHistoryPreload setting, so\n less-frequent pinned partners (rare /tell sessions in an\n otherwise busy week) lost their backlog. The cap is removed;\n the (Receiver, Date) index keeps SQL fast, the client-side\n loop still respects your setting as the upper bound.\n- Slash-command teardown: /hellion, /hellionView,\n /hellionDebugger (and #if DEBUG /hellionSeString) wrappers are\n now cached as private fields. Plugin teardown detaches the\n live registration instead of re-Register'ing with identical\n args \u2014 closes a latent maintenance hazard from v1.4.9.\n- v1.4.x polish-sweep wraps up here. The ImGuiListClipper render\n refactor that was on the v1.4.10 reserve list got dropped\n after cross-platform smoke showed the scroll rubber-band is a\n Wine / Linux render-pipeline quirk, not universal \u2014 Windows\n users never saw it. It will get its own platform-targeted\n spike in a later patch. Next major cycle is v1.5.0 with the\n DI-container adoption (Microsoft.Extensions.Hosting +\n ILogger) modelled on Lightless.\n- Migration v17 stays (no schema bump).\n\nBased on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).\n\n---\n\n**v1.4.9 \u2014 Plugin-Load Render Polish (2026-05-15)**\n\nTenth sub-patch of the v1.4.x polish-sweep series. First-frame\nrender cost drops from ~127 ms median to ~76 ms median,\ncomfortably under Dalamud's 100 ms HITCH warning threshold.\n\n- First-frame defer: six non-essential rendering sections inside\n ChatLogWindow skip their first Draw and run one frame later\n (bottom status bar, channel-name SeString chunks, window bounds\n check, v0.6.1 hint banner, autocomplete, input-preview\n calculation). User-visible delay is ~17 ms at 60 fps, hidden\n inside the post-reload font-atlas build window.\n- Slash-command centralisation: /hellion, /hellionView,\n /hellionSeString and /hellionDebugger are registered in\n LoadAsync instead of inside the corresponding window\n constructors. The plugin-manager Open and configuration buttons\n hang on the same path.\n- Plugin-load profiling logs stay on at Information level\n (MessageStore connect/migrate, FilterAllTabs, auto-translate\n warmup) as a regression tripwire \u2014 a future load past 100 ms\n will show up in /xllog without a Debug filter.\n- ChatTwo IPC compatibility layer: HellionChat now mirrors\n ChatTwo's full IPC surface (GetChatInputState,\n ChatInputStateChanged, Register, Unregister, Available,\n Invoke) under the ChatTwo.* namespace in addition to our\n existing HellionChat.* provider gates. Third-party\n integrations that historically only subscribe to ChatTwo's\n IPC \u2014 for example Artisan's and AllaganTools' context-menu\n hooks \u2014 keep working without requiring a code change on their\n side. Conflict detection prevents ChatTwo from loading in\n parallel with HellionChat, so there is no slot-collision risk\n at runtime.\n- Migration v17 stays (no schema bump).\n\nBased on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).\n\n---\n\nFull history: https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases",
"AcceptsFeedback": true,
- "DownloadLinkInstall": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v1.5.0/latest.zip",
- "DownloadLinkUpdate": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v1.5.0/latest.zip",
- "DownloadLinkTesting": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v1.5.0/latest.zip",
- "TestingAssemblyVersion": "1.5.0.0",
+ "DownloadLinkInstall": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v1.5.1/latest.zip",
+ "DownloadLinkUpdate": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v1.5.1/latest.zip",
+ "DownloadLinkTesting": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v1.5.1/latest.zip",
+ "TestingAssemblyVersion": "1.5.1.0",
"IconUrl": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/raw/branch/main/HellionChat/images/icon.png",
"ImageUrls": [
"https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/raw/branch/main/HellionChat/images/chatWindow.png",