name: Hellion Chat
author: JonKazama-Hellion
punchline: Chat replacement with privacy controls aligned to EU, US and JP rules — based on Chat 2 (EUPL-1.2)
description: |-
  Hellion Chat is a privacy-focused chat replacement for FINAL FANTASY XIV
  based on the Chat 2 codebase (EUPL-1.2). One feature is intentionally
  removed (the optional webinterface) and a stack of privacy controls is
  added on top. Tabs, channel filters, RGB colours, emotes, screenshot
  mode, IPC integration and the chat replacement window itself work the
  same. The webinterface is intentionally not part of Hellion Chat because
  it serves a different use case from the smaller default footprint this
  plugin is built around.

  On top of that, Hellion Chat adds privacy and data-handling controls
  designed to align with the modern data protection rules that apply
  across the EU, the United States and Japan. By default only your own
  conversations are stored; messages from strangers, NPCs and system
  spam stay out of the database. Retention windows are configurable per
  channel, history can be wiped retroactively, and stored data can be
  exported on demand.

  Key privacy and data-handling features:

  - Channel whitelist with a Privacy-First default
  - Per-channel retention with a daily background sweep
  - Retroactive cleanup with a Ctrl+Shift confirm
  - Export to Markdown, JSON or CSV
  - First-run wizard with three preset profiles (Privacy-First, Casual,
    Full History)
  - Bilingual UI (English and German) with live language switching
  - Independent plugin state — own config file and database directory,
    so Hellion Chat does not share state with upstream Chat 2

  v1.1.0 — Theme engine with five built-in themes (Hellion Arctic,
  Chat 2 Klassik, Event Horizon, Moonlit Bloom, Mint Grove) plus
  JSON-based custom-theme authoring. Settings rebuilt around a card
  grid with section detail views. See docs/THEME-AUTHORING.md.

  Based on Chat 2 by Infi and Anna, licensed under EUPL-1.2.

  Modding & support: join the Hellion Forge Discord at
  https://discord.gg/X9V7Kcv5gR — community for Hellion Chat and
  other Hellion Online Media plugins/tools.
repo_url: https://github.com/JonKazama-Hellion/HellionChat
accepts_feedback: true
icon_url: https://raw.githubusercontent.com/JonKazama-Hellion/HellionChat/main/HellionChat/images/icon.png
image_urls:
  - https://raw.githubusercontent.com/JonKazama-Hellion/HellionChat/main/HellionChat/images/chatWindow.png
  - https://raw.githubusercontent.com/JonKazama-Hellion/HellionChat/main/HellionChat/images/settingsOverview.png
  - https://raw.githubusercontent.com/JonKazama-Hellion/HellionChat/main/HellionChat/images/themesPicker.png
tags:
  - Social
  - UI
  - Chat
  - Replacement
  - Privacy
changelog: |-
  **Hellion Chat 1.1.0 — Theme Foundation**

  First major UI cycle after the standalone v1.0.0 cut. Theme engine,
  five built-in themes, customisable JSON themes, modernised settings
  layout.

  New themes (Settings → Themes):

  - **Hellion Arctic** — the brand default, Arctic Cyan + Ember Glow
    on industrial slate.
  - **Chat 2 Klassik** — Steel Blue on neutral grey, eckige Kanten.
    The upstream Chat 2 look on the new engine.
  - **Event Horizon** — Cosmic Purple on near-black. Deep-space mood.
  - **Moonlit Bloom** — Bloom Magenta + Soft Sage on deep-violet
    night.
  - **Mint Grove** — Mint Green + Honey Amber on deep forest. First
    member of the Grove family.

  Theme engine highlights:

  - Slug-based selection in Settings → Themes with mini-mockup
    previews per theme.
  - Click a theme card and the whole plugin (chat, settings,
    pop-outs, viewer) repaints instantly.
  - Custom themes via JSON in pluginConfigs/HellionChat/themes/.
    Example template seeded on first launch.
  - Optional per-theme chat-channel colours. When a theme proposes
    its own chat colours and yours differ, a dezent banner offers
    Apply / Keep — never auto-overwriting.
  - Migration v13 → v14: existing users land on Hellion Arctic. Pick
    Chat 2 Klassik to keep the upstream look.

  Settings layout:

  - New card-grid overview on Settings open. Click a card to drill
    into the section.
  - Breadcrumb back to overview, ESC also returns.
  - Detail view drops the redundant tab list — section content uses
    the full width.

  Branding:

  - Plugin icon swapped from the ChatTwo derivative to the Hellion
    Forge hammer.
  - New docs/THEME-AUTHORING.md walks you through writing your own
    themes with the Forge logo on top.

  Technical:

  - HellionStyle.PushGlobal is now theme-driven. Configuration.
    HellionThemeEnabled is deprecated and will be removed in v1.2.0.
  - New ThemeRegistry singleton with LastWriteTime-cached custom-
    theme loader.
  - 51 local unit tests cover the data model, registry, JSON round-
    trip and built-in sanity checks.

  Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).

  **Hellion Chat 1.0.3 — Polish patch**

  - New: optionally hide chat (and every other plugin window) while the
    New Game+ menu is open. Toggle in Settings → Window → Frame, default
    off. Closing the menu restores all windows.
  - New: optionally tint the channel selector button next to the input
    field with the currently active channel's colour. Toggle in
    Settings → Appearance → Colours, default on. Matches the existing
    input-text tint and respects ExtraChat overrides.
  - Fix: status, item and other inline hover icons keep their original
    aspect ratio. Debuff icons with non-square dimensions are no longer
    visually squished into a 32×32 box.
  - Diagnostic: hide-state transitions (battle, cutscene, user-hide,
    cutscene override) are now logged on Verbose level for easier bug
    reports — off by default, enable with `/xllog set HellionChat verbose`.

  Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).

  **Hellion Chat 1.0.1 — Window Position Recovery**

  - Automatic bounds check on the first draw after plugin load.
    When the persisted window position has no overlap with the
    primary viewport, the window snaps to a safe top-left default.
    Helpful after a monitor disconnect, resolution change or
    multi-monitor layout switch between sessions.
  - New "Reset Window Position" button in Settings → Window → Frame
    as a manual escape hatch for edge cases the automatic check
    doesn't catch.

  Tested on Linux/Wayland with a hard-cut three-monitor reduction;
  window recovers cleanly without manual JSON editing.

  Housekeeping carried over since v1.0.0:

  - Documentation restructured into docs/ folder. New CHANGELOG,
    CONTRIBUTORS, LEARNING-JOURNEY and ROADMAP added
  - Stale ChatTwo/* paths in repo configs updated to HellionChat/*
  - Pidgin parser library bumped from 3.3.0 to 3.5.1 (CIString
    Unicode fix relevant for non-ASCII channel/tab names)
  - GitHub Actions: actions/setup-dotnet bumped 4 → 5,
    github/codeql-action bumped 3 → 4

  Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).

  **Hellion Chat 1.0.0 — Standalone Major Release**

  First fully standalone release. Internal cleanup plus a sweep of
  pre-existing correctness, security, threading and resource-leak
  fixes carried over from the upstream codebase. No user action
  required — auto-update applies cleanly, configuration and database
  paths unchanged.

  Standalone identity:

  - Code namespace consolidated from ChatTwo.* to HellionChat.* across
    all source files
  - IPC channels migrated from ChatTwo.* to HellionChat.* (6 channels:
    Register, Available, Unregister, Invoke, GetChatInputState,
    ChatInputStateChanged) — third-party plugins that bound to the old
    channels need to be updated; none known at release time
  - ImGui popup ID renamed to hellionchat-context-popup
  - Repository folder restructured (ChatTwo/ → HellionChat/), all CI
    and build paths updated accordingly
  - Public-facing descriptions reworded from upstream-fork framing to
    standalone framing (Chat 2 attribution preserved per EUPL-1.2)
  - Colour preset 'ChatTwo Default' is now 'Klassik (Chat 2 Default)'

  Safety:

  - Plugin now refuses to load when upstream Chat 2 is also active —
    bilingual conflict message in EN/DE, throw before any subsystem
    initialization, prevents the runtime crash that previously occurred
    when both plugins replaced the same chat window in parallel
  - SQLite native binary bumped to 3.50.3 (CVE-2025-6965 memory
    corruption from aggregate-term overflow, CVE-2025-7709)
  - NuGet restore now honors packages.lock.json so transitive
    dependencies don't drift between machines or CI runs

  Default tab layout sharpened (one-time tab reset on first start):

  The first-run tab layout is reorganized into five thematic tabs
  based on external tester feedback. General contains only Say,
  Yell and Shout (immediate-surroundings public chat). System
  absorbs the gameplay-event streams (NpcDialogue, Loot, Crafting,
  Gathering, PF recruitment pings) and announcement noise
  (BattleSystem, FreeCompanyAnnouncement, PvpTeamAnnouncement)
  that previously lived in General. FreeCompany, Group and
  Linkshell each own their channel set. The static Tell tab is
  gone — Auto-Tell-Tabs spawns per-conversation tabs on demand.
  The Beginner / Novice-Network preset is no longer added by
  default but is still available via Settings, Tabs.

  This is a one-time tab-layout reset for users on config version
  12 or older. Privacy, Retention, Theme and every other setting
  is preserved. Your previous tab configuration is written to
  pluginConfigs/HellionChat.json.pre-v13-backup so you can restore
  it manually if you prefer the old layout.

  Crash-class fixes (formerly latent in upstream):

  - MathUtil.HasOverlap now uses a correct AABB test; identical or
    edge-touching rectangles are no longer reported as non-overlapping
  - ChatCode.Equals compares fields directly instead of GetHashCode;
    removes the hash-collision anti-pattern
  - IpcManager.Dispose uses UnregisterAction to match the matching
    RegisterAction call; previous mismatch leaked the action
    subscription on every plugin reload
  - ExtraChat.Dispose now unsubscribes all three IPC subscriptions
    (was only the first); leaks closed
  - TellTarget.FromTarget guards against a zero IPlayerCharacter.Address
    before dereferencing the unsafe Character* cast
  - GameFunctions ResolveTextCommandPlaceholderDetour null-checks the
    Hook reference instead of using the null-forgiving operator
  - Popout.cs and SettingsTabs/Tabs.cs bounds-check list indexing so
    a tab drop or empty-worlds list no longer crashes the UI
  - Debugger.cs now declares IDisposable so the existing Dispose runs

  Correctness fixes:

  - GlobalParametersCache.GetValue captures Cache into a local before
    the bounds check, so a concurrent Refresh can't slip a different
    array between check and read
  - IconUtil binary search bounds initialized to entries.Length-1 and
    reset on redirect-restart; entries.Length==0 short-circuits
  - Sheets.WorldsOnDatacenter now compares DataCenter.RowId (was
    Region.RowId) so it actually returns same-DC worlds
  - Message.cs back-reference loop iterates the processed Sender/Content
    properties so chunks added by CheckMessageContent get Message set
  - Language.zh-Hans Webinterface_Start_Success corrected to
    "网页界面已启动" (was "网页界面已停止")

  Threading and async:

  - AutoTranslate Entries/ValidEntries are now serialized behind a
    single lock; the preload worker thread and main thread no longer
    race on the underlying dictionary/hash set
  - Privacy retention and cleanup workers bound their framework-refresh
    waits to 5 seconds with a logged timeout; a hung framework tick can
    no longer deadlock the background worker

  Resource handling:

  - EmoteCache reuses the static HttpClient instead of allocating a new
    one per call (closed socket leak)
  - FontManager wraps HttpClient/HttpResponseMessage in using-blocks
    and adds EnsureSuccessStatusCode; failed downloads no longer
    silently produce a zero-byte font file
  - SearchSelector mixes the row index into the ImGui ID stack so
    selectables don't collapse to a single ambiguous ID
  - SettingsTabs/Chat blocked-emote add-button now opens its selector
    popup on left-click

  Performance:

  - DbViewer text export caches filteredHistory.Count once instead of
    re-enumerating the IEnumerable on every batch (O(N) instead of
    O(N²) on large histories)

  License attribution (NOTICE.md, COPYRIGHT, THIRD_PARTY_NOTICES.md
  and the Credits section in README) is unchanged.

  Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).

  **Hellion Chat 0.6.1 — Pop-Out Discoverability & /tell Auto-Pop-Out**

  - Pop-out button now visible in the chat header (no more hunting
    through the right-click menu)
  - One-time hint banner explains pop-out tabs and the right-click
    shortcut
  - New setting: open new /tell tabs directly as pop-out windows
    (Settings → Chat → Auto-Tell-Tabs)
  - Pop-out input is now enabled by default — closing a pop-out still
    returns the tab to the sidebar
  - Bugfix: dropping or logging out with an LRU/popped auto-tell tab
    now also closes its pop-out window (no more ghost windows)
  - Bugfix: dead zone below the chat input bar when the v0.6.0 pop-out
    hint banner was visible (also fixed retroactively for the v0.6.0
    banner inside pop-outs)

  Modding & support: join Hellion Forge — https://discord.gg/X9V7Kcv5gR

  Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).

  ---

  Earlier history: https://github.com/JonKazama-Hellion/HellionChat/releases
