Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 135f7a9bf7 | |||
| 81d3c9ca6b | |||
| cb90c6ab93 | |||
| 2ad81cc3ef |
+12
-1
@@ -4,7 +4,7 @@
|
||||
0.1.0 is our bootstrap release; the underlying Chat 2 base is
|
||||
called out in the yaml changelog so users can see what it
|
||||
derives from. -->
|
||||
<Version>0.1.0</Version>
|
||||
<Version>0.1.1</Version>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<!-- HellionChat fork: assembly is renamed so Dalamud uses
|
||||
pluginConfigs/HellionChat instead of pluginConfigs/ChatTwo,
|
||||
@@ -62,6 +62,17 @@
|
||||
<Folder Include="images\" />
|
||||
</ItemGroup>
|
||||
|
||||
<!-- Copy images/icon.png next to the built DLL so Dalamud's local
|
||||
plugin loader finds it at <plugindir>/images/icon.png. The
|
||||
DalamudPackager.targets file in this directory then includes
|
||||
the same path inside the release ZIP — see that file for the
|
||||
full packaging override. -->
|
||||
<ItemGroup>
|
||||
<None Include="images\icon.png">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
|
||||
<!--This doesn't work until Plogon is updated to include NodeJS-->
|
||||
<!-- <Target Name="NodeJS Compile" BeforeTargets="BeforeCompile">-->
|
||||
<!-- <Exec Command="npm install" WorkingDirectory="Http\Frontend"/>-->
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
HellionChat — DalamudPackager override.
|
||||
|
||||
The default DalamudPackager.targets shipped by the SDK does not set
|
||||
HandleImages / ImagesPath, so the images/ directory is silently
|
||||
excluded from the release ZIP. The presence of this file at
|
||||
$(ProjectDir)DalamudPackager.targets disables the SDK's default
|
||||
target (it guards on `!Exists('$(PackagerTargetFile)')`) and lets
|
||||
us call the packager task ourselves with the image fields wired in.
|
||||
|
||||
Apart from HandleImages + ImagesPath the property list mirrors the
|
||||
SDK default verbatim so we don't lose any other manifest field as
|
||||
the upstream SDK evolves.
|
||||
-->
|
||||
<Project>
|
||||
<Target Name="HellionDalamudPackagerDebug"
|
||||
AfterTargets="Build"
|
||||
Condition="'$(Configuration)' == 'Debug'">
|
||||
<DalamudPackager ProjectDir="$(ProjectDir)"
|
||||
OutputPath="$(OutputPath)"
|
||||
AssemblyName="$(AssemblyName)"
|
||||
MakeZip="false"
|
||||
Author="$(Author)"
|
||||
Name="$(Name)"
|
||||
MinimumDalamudVersion="$(MinimumDalamudVersion)"
|
||||
Punchline="$(Punchline)"
|
||||
Description="$(Description)"
|
||||
ApplicableVersion="$(ApplicableVersion)"
|
||||
RepoUrl="$(RepoUrl)"
|
||||
Tags="$(Tags)"
|
||||
CategoryTags="$(CategoryTags)"
|
||||
DalamudApiLevel="$(DalamudApiLevel)"
|
||||
LoadRequiredState="$(LoadRequiredState)"
|
||||
LoadSync="$(LoadSync)"
|
||||
CanUnloadAsync="$(CanUnloadAsync)"
|
||||
LoadPriority="$(LoadPriority)"
|
||||
ImageUrls="$(ImageUrls)"
|
||||
IconUrl="$(IconUrl)"
|
||||
Changelog="$(Changelog)"
|
||||
AcceptsFeedback="$(AcceptsFeedback)"
|
||||
FeedbackMessage="$(FeedbackMessage)"
|
||||
HandleImages="true"
|
||||
ImagesPath="$(ProjectDir)images" />
|
||||
</Target>
|
||||
|
||||
<Target Name="HellionDalamudPackagerRelease"
|
||||
AfterTargets="Build"
|
||||
Condition="'$(Configuration)' == 'Release'">
|
||||
<DalamudPackager ProjectDir="$(ProjectDir)"
|
||||
OutputPath="$(OutputPath)"
|
||||
AssemblyName="$(AssemblyName)"
|
||||
MakeZip="true"
|
||||
Author="$(Author)"
|
||||
Name="$(Name)"
|
||||
MinimumDalamudVersion="$(MinimumDalamudVersion)"
|
||||
Punchline="$(Punchline)"
|
||||
Description="$(Description)"
|
||||
ApplicableVersion="$(ApplicableVersion)"
|
||||
RepoUrl="$(RepoUrl)"
|
||||
Tags="$(Tags)"
|
||||
CategoryTags="$(CategoryTags)"
|
||||
DalamudApiLevel="$(DalamudApiLevel)"
|
||||
LoadRequiredState="$(LoadRequiredState)"
|
||||
LoadSync="$(LoadSync)"
|
||||
CanUnloadAsync="$(CanUnloadAsync)"
|
||||
LoadPriority="$(LoadPriority)"
|
||||
ImageUrls="$(ImageUrls)"
|
||||
IconUrl="$(IconUrl)"
|
||||
Changelog="$(Changelog)"
|
||||
AcceptsFeedback="$(AcceptsFeedback)"
|
||||
FeedbackMessage="$(FeedbackMessage)"
|
||||
HandleImages="true"
|
||||
ImagesPath="$(ProjectDir)images" />
|
||||
</Target>
|
||||
</Project>
|
||||
+42
-16
@@ -1,16 +1,31 @@
|
||||
name: Hellion Chat
|
||||
author: JonKazama-Hellion
|
||||
punchline: GDPR-compliant, Linux-aware fork of Chat 2
|
||||
punchline: Chat 2 with privacy controls aligned to EU, US and JP rules
|
||||
description: |-
|
||||
Hellion Chat is a privacy-focused, Linux-aware fork of Chat 2.
|
||||
Hellion Chat is built on top of Chat 2 — every Chat 2 feature, command
|
||||
and shortcut you already know works the same. The /chat2 command, tabs,
|
||||
channel filters, RGB colours, emotes, screenshot mode, IPC integration
|
||||
and the chat replacement window itself are all unchanged.
|
||||
|
||||
Same chat replacement you know from upstream, with extra controls
|
||||
for what actually gets stored:
|
||||
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.
|
||||
|
||||
- Channel whitelist for database persistence (GDPR Art. 25)
|
||||
- Privacy-First defaults: only your own conversations are kept
|
||||
- Failsafe for unknown ChatTypes (default OFF)
|
||||
- Independent plugin state (own config + database directory)
|
||||
Key additions on top of Chat 2:
|
||||
|
||||
- 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 the upstream plugin
|
||||
|
||||
Based on Chat 2 by Infi and Anna, licensed under EUPL-1.2.
|
||||
repo_url: https://github.com/JonKazama-Hellion/HellionChat
|
||||
@@ -22,30 +37,41 @@ tags:
|
||||
- Replacement
|
||||
- Privacy
|
||||
changelog: |-
|
||||
**Hellion Chat 0.1.1 — Packaging and migration fixes**
|
||||
|
||||
- Plugin icon now ships inside the bundle, so the Hellion logo
|
||||
renders locally in the Dalamud plugin list once installed (the
|
||||
previous release relied only on the remote IconUrl)
|
||||
- Plugin icon downsampled from 1024×1024 to 256×256 to match the
|
||||
rendered size; loads faster and caches better
|
||||
- Migration from upstream Chat 2 is more robust: each file move is
|
||||
wrapped individually, a locked SQLite database no longer aborts
|
||||
the rest of the migration, and a warning notification fires when
|
||||
any file is held open (with a hint to disable Chat 2 and restart
|
||||
the game)
|
||||
- README ships a step-by-step migration guide (fresh install versus
|
||||
coming from Chat 2) and a troubleshooting section with manual
|
||||
recovery commands for Linux and Windows
|
||||
|
||||
**Hellion Chat 0.1.0 — Initial fork release**
|
||||
|
||||
Privacy
|
||||
- Channel whitelist filter in MessageStore.UpsertMessage with a
|
||||
Privacy-First default (own conversations only)
|
||||
- Per-channel retention with a 24-hour idempotent background sweep
|
||||
(default OFF; spec defaults of 365 / 90 / 30 days)
|
||||
- Retroactive cleanup with a Ctrl+Shift confirm and VACUUM
|
||||
- Export to Markdown / JSON / CSV via Dalamud's file dialog
|
||||
(GDPR Art. 15 right of access)
|
||||
|
||||
Onboarding
|
||||
- First-run wizard with three profiles: Privacy-First / Casual /
|
||||
Full History
|
||||
- Configuration v6 → v7 migration that seeds defaults and shows a
|
||||
notification once on update
|
||||
- Configuration migration that seeds defaults on update
|
||||
- One-shot migration from upstream Chat 2's pluginConfigs layout
|
||||
so the fork uses pluginConfigs/HellionChat without losing state
|
||||
- Migrate3 idempotency recovery for half-migrated databases
|
||||
|
||||
Look & feel
|
||||
- Localized UI (English and German) with live language switching
|
||||
- Hellion industrial HUD theme with cyan-teal action accents,
|
||||
slate-violet tabs, amber active highlights and a window-opacity
|
||||
slider for combat-friendly transparency
|
||||
- Industrial HUD theme with cyan-teal action accents, slate-violet
|
||||
tabs, amber active highlights and a window-opacity slider
|
||||
|
||||
Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).
|
||||
|
||||
+52
-5
@@ -271,8 +271,6 @@ public sealed class Plugin : IDalamudPlugin
|
||||
}
|
||||
|
||||
private static void MigrateFromChatTwoLayout()
|
||||
{
|
||||
try
|
||||
{
|
||||
var pluginConfigsDir = Interface.ConfigDirectory.Parent?.FullName;
|
||||
if (pluginConfigsDir is null)
|
||||
@@ -283,18 +281,36 @@ public sealed class Plugin : IDalamudPlugin
|
||||
var ourConfigFile = Path.Combine(pluginConfigsDir, "HellionChat.json");
|
||||
var ourConfigDir = Interface.ConfigDirectory.FullName;
|
||||
|
||||
// Track whether anything legitimately blocked us. The most common
|
||||
// cause is upstream Chat 2 still being loaded — its SQLite handle
|
||||
// keeps chat-sqlite.db locked and File.Move throws IOException.
|
||||
var lockedBlocker = false;
|
||||
|
||||
try
|
||||
{
|
||||
if (!File.Exists(ourConfigFile) && File.Exists(legacyConfigFile))
|
||||
{
|
||||
File.Move(legacyConfigFile, ourConfigFile);
|
||||
Log.Information($"HellionChat: migrated config file {legacyConfigFile} → {ourConfigFile}");
|
||||
}
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
Log.Warning(e, $"HellionChat: config file move blocked, leaving {legacyConfigFile} in place");
|
||||
lockedBlocker = true;
|
||||
}
|
||||
|
||||
// The plugin's ConfigDirectory may already exist on first load
|
||||
// (Dalamud creates it), so check at the file level instead of
|
||||
// skipping when the directory is present. Move every legacy
|
||||
// entry whose target name is not occupied yet, then remove the
|
||||
// source dir if it ends up empty.
|
||||
if (Directory.Exists(legacyConfigDir))
|
||||
// source dir if it ends up empty. Each move is wrapped on its
|
||||
// own so a single locked file (the SQLite db while ChatTwo still
|
||||
// runs) does not abandon the rest of the migration.
|
||||
if (!Directory.Exists(legacyConfigDir))
|
||||
return;
|
||||
|
||||
try
|
||||
{
|
||||
Directory.CreateDirectory(ourConfigDir);
|
||||
|
||||
@@ -303,18 +319,34 @@ public sealed class Plugin : IDalamudPlugin
|
||||
var target = Path.Combine(ourConfigDir, Path.GetFileName(file));
|
||||
if (File.Exists(target))
|
||||
continue;
|
||||
try
|
||||
{
|
||||
File.Move(file, target);
|
||||
Log.Information($"HellionChat: migrated file {file} → {target}");
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
Log.Warning(e, $"HellionChat: file move blocked for {file}, will retry on next load");
|
||||
lockedBlocker = true;
|
||||
}
|
||||
}
|
||||
|
||||
foreach (var dir in Directory.EnumerateDirectories(legacyConfigDir))
|
||||
{
|
||||
var target = Path.Combine(ourConfigDir, Path.GetFileName(dir));
|
||||
if (Directory.Exists(target))
|
||||
continue;
|
||||
try
|
||||
{
|
||||
Directory.Move(dir, target);
|
||||
Log.Information($"HellionChat: migrated subdir {dir} → {target}");
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
Log.Warning(e, $"HellionChat: subdir move blocked for {dir}, will retry on next load");
|
||||
lockedBlocker = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!Directory.EnumerateFileSystemEntries(legacyConfigDir).Any())
|
||||
{
|
||||
@@ -322,11 +354,26 @@ public sealed class Plugin : IDalamudPlugin
|
||||
Log.Information($"HellionChat: removed empty legacy dir {legacyConfigDir}");
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Log.Error(e, "HellionChat: layout migration failed, continuing with whatever exists");
|
||||
}
|
||||
|
||||
if (lockedBlocker)
|
||||
{
|
||||
// Surface the most common cause to the user as a notification
|
||||
// so they don't think Hellion Chat lost their history when in
|
||||
// fact upstream Chat 2 was still holding the database file.
|
||||
Notification.AddNotification(new Dalamud.Interface.ImGuiNotification.Notification
|
||||
{
|
||||
Title = "Hellion Chat",
|
||||
Content = "Could not migrate the Chat 2 database — the file appears to be in use. " +
|
||||
"Disable Chat 2, fully close the game, then start it again. " +
|
||||
"See the README troubleshooting section if the issue persists.",
|
||||
Type = Dalamud.Interface.ImGuiNotification.NotificationType.Warning,
|
||||
InitialDuration = TimeSpan.FromSeconds(30),
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private void OpenMainUi()
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 481 KiB After Width: | Height: | Size: 53 KiB |
@@ -43,7 +43,9 @@ custom-repo / dev-plugin while the architecture stabilises.
|
||||
## Install (testers)
|
||||
|
||||
Hellion Chat is shipped via a Dalamud **custom repository** during the
|
||||
bootstrap phase. To install:
|
||||
bootstrap phase.
|
||||
|
||||
### If you have never used Chat 2
|
||||
|
||||
1. Open Dalamud settings (`/xlsettings`) → **Experimental**.
|
||||
2. Add a new entry under **Custom Plugin Repositories**:
|
||||
@@ -51,13 +53,59 @@ bootstrap phase. To install:
|
||||
https://raw.githubusercontent.com/JonKazama-Hellion/HellionChat/main/repo.json
|
||||
```
|
||||
3. Click **Save**, then back in `/xlplugins` hit **All Plugins** and refresh.
|
||||
4. **Hellion Chat** now appears in the list — install it from there.
|
||||
5. If you previously had **Chat 2** installed, disable it first. The two
|
||||
share their database and config dir until Hellion Chat's first launch
|
||||
migrates everything into `pluginConfigs/HellionChat/`.
|
||||
4. **Hellion Chat** now appears in the list — install it.
|
||||
|
||||
### If you are migrating from Chat 2 (and want to keep your history)
|
||||
|
||||
The two plugins share `pluginConfigs/ChatTwo/` (database) and
|
||||
`pluginConfigs/ChatTwo.json` (settings). Hellion Chat moves both into
|
||||
`pluginConfigs/HellionChat/` on first start, but only if the upstream
|
||||
plugin isn't holding the database file open. Order matters:
|
||||
|
||||
1. **Disable Chat 2** in `/xlplugins` (don't uninstall, just disable).
|
||||
2. **Close FFXIV completely** so SQLite releases its file lock — a plain
|
||||
plugin reload is not enough.
|
||||
3. Re-launch the game.
|
||||
4. Add the custom repo URL as in the previous section.
|
||||
5. Install Hellion Chat. On its first start it migrates the Chat 2 config
|
||||
file and the entire database directory into the HellionChat layout
|
||||
without losing data.
|
||||
6. Verify in **Settings → Privacy → Apply filter to existing database →
|
||||
Refresh preview** that the message count is what you expect (millions
|
||||
of rows if you used Chat 2 for a while).
|
||||
|
||||
If the message count comes back as zero, the migration was blocked
|
||||
(usually because Chat 2 was still active or the previous game session
|
||||
hadn't fully closed). See the troubleshooting section below.
|
||||
|
||||
### Troubleshooting
|
||||
|
||||
**Hellion Chat shows zero messages but I had Chat 2 history:**
|
||||
The migration either didn't run or hit a locked file. Close the game,
|
||||
then move the data manually:
|
||||
|
||||
Linux / XIVLauncher Core:
|
||||
```bash
|
||||
mv ~/.xlcore/pluginConfigs/ChatTwo/chat-sqlite.db \
|
||||
~/.xlcore/pluginConfigs/HellionChat/chat-sqlite.db
|
||||
[ -d ~/.xlcore/pluginConfigs/ChatTwo/EmoteCacheV1 ] && \
|
||||
mv ~/.xlcore/pluginConfigs/ChatTwo/EmoteCacheV1 \
|
||||
~/.xlcore/pluginConfigs/HellionChat/
|
||||
```
|
||||
|
||||
Windows / standard XIVLauncher:
|
||||
```powershell
|
||||
Move-Item "$env:AppData\XIVLauncher\pluginConfigs\ChatTwo\chat-sqlite.db" `
|
||||
"$env:AppData\XIVLauncher\pluginConfigs\HellionChat\chat-sqlite.db" -Force
|
||||
```
|
||||
|
||||
Then start the game and Hellion Chat — your full history is back.
|
||||
|
||||
### Updates
|
||||
|
||||
Updates land in the same plugin list once the maintainer pushes a new
|
||||
`v0.1.x` tag.
|
||||
`v0.1.x` tag and re-publishes the GitHub release. No re-installation
|
||||
needed.
|
||||
|
||||
## Why a fork
|
||||
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
"Author": "JonKazama-Hellion",
|
||||
"Name": "Hellion Chat",
|
||||
"InternalName": "HellionChat",
|
||||
"AssemblyVersion": "0.1.0.0",
|
||||
"Description": "Hellion Chat is a privacy-focused, Linux-aware fork of Chat 2.\n\nSame chat replacement you know from upstream, with extra controls\nfor what actually gets stored:\n\n- Channel whitelist for database persistence (GDPR Art. 25)\n- Privacy-First defaults: only your own conversations are kept\n- Failsafe for unknown ChatTypes (default OFF)\n- Independent plugin state (own config + database directory)\n\nBased on Chat 2 by Infi and Anna, licensed under EUPL-1.2.",
|
||||
"AssemblyVersion": "0.1.1.0",
|
||||
"Description": "Hellion Chat is built on top of Chat 2 — every Chat 2 feature, command\nand shortcut you already know works the same. The /chat2 command, tabs,\nchannel filters, RGB colours, emotes, screenshot mode, IPC integration\nand the chat replacement window itself are all unchanged.\n\nOn top of that, Hellion Chat adds privacy and data-handling controls\ndesigned to align with the modern data protection rules that apply\nacross the EU, the United States and Japan. By default only your own\nconversations are stored; messages from strangers, NPCs and system\nspam stay out of the database. Retention windows are configurable per\nchannel, history can be wiped retroactively, and stored data can be\nexported on demand.\n\nKey additions on top of Chat 2:\n\n- Channel whitelist with a Privacy-First default\n- Per-channel retention with a daily background sweep\n- Retroactive cleanup with a Ctrl+Shift confirm\n- Export to Markdown, JSON or CSV\n- First-run wizard with three preset profiles (Privacy-First, Casual,\n Full History)\n- Bilingual UI (English and German) with live language switching\n- Independent plugin state — own config file and database directory,\n so Hellion Chat does not share state with the upstream plugin\n\nBased on Chat 2 by Infi and Anna, licensed under EUPL-1.2.",
|
||||
"ApplicableVersion": "any",
|
||||
"RepoUrl": "https://github.com/JonKazama-Hellion/HellionChat",
|
||||
"Tags": [
|
||||
@@ -19,13 +19,13 @@
|
||||
"LoadSync": false,
|
||||
"CanUnloadAsync": false,
|
||||
"LoadPriority": 0,
|
||||
"Punchline": "GDPR-compliant, Linux-aware fork of Chat 2",
|
||||
"Changelog": "**Hellion Chat 0.1.0 — Initial fork release**\n\nPrivacy\n- Channel whitelist filter in MessageStore.UpsertMessage with a\n Privacy-First default (own conversations only)\n- Per-channel retention with a 24-hour idempotent background sweep\n (default OFF; spec defaults of 365 / 90 / 30 days)\n- Retroactive cleanup with a Ctrl+Shift confirm and VACUUM\n- Export to Markdown / JSON / CSV via Dalamud's file dialog\n (GDPR Art. 15 right of access)\n\nOnboarding\n- First-run wizard with three profiles: Privacy-First / Casual /\n Full History\n- Configuration v6 → v7 migration that seeds defaults and shows a\n notification once on update\n- One-shot migration from upstream Chat 2's pluginConfigs layout\n so the fork uses pluginConfigs/HellionChat without losing state\n- Migrate3 idempotency recovery for half-migrated databases\n\nLook & feel\n- Localized UI (English and German) with live language switching\n- Hellion industrial HUD theme with cyan-teal action accents,\n slate-violet tabs, amber active highlights and a window-opacity\n slider for combat-friendly transparency\n\nBased on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).",
|
||||
"Punchline": "Chat 2 with privacy controls aligned to EU, US and JP rules",
|
||||
"Changelog": "**Hellion Chat 0.1.1 — Packaging and migration fixes**\n\n- Plugin icon now ships inside the bundle, so the Hellion logo\n renders locally in the Dalamud plugin list once installed (the\n previous release relied only on the remote IconUrl)\n- Plugin icon downsampled from 1024×1024 to 256×256 to match the\n rendered size; loads faster and caches better\n- Migration from upstream Chat 2 is more robust: each file move is\n wrapped individually, a locked SQLite database no longer aborts\n the rest of the migration, and a warning notification fires when\n any file is held open (with a hint to disable Chat 2 and restart\n the game)\n- README ships a step-by-step migration guide (fresh install versus\n coming from Chat 2) and a troubleshooting section with manual\n recovery commands for Linux and Windows\n\n**Hellion Chat 0.1.0 — Initial fork release**\n\nPrivacy\n- Channel whitelist filter in MessageStore.UpsertMessage with a\n Privacy-First default (own conversations only)\n- Per-channel retention with a 24-hour idempotent background sweep\n- Retroactive cleanup with a Ctrl+Shift confirm and VACUUM\n- Export to Markdown / JSON / CSV via Dalamud's file dialog\n\nOnboarding\n- First-run wizard with three profiles: Privacy-First / Casual /\n Full History\n- Configuration migration that seeds defaults on update\n- One-shot migration from upstream Chat 2's pluginConfigs layout\n- Migrate3 idempotency recovery for half-migrated databases\n\nLook & feel\n- Localized UI (English and German) with live language switching\n- Industrial HUD theme with cyan-teal action accents, slate-violet\n tabs, amber active highlights and a window-opacity slider\n\nBased on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).",
|
||||
"AcceptsFeedback": true,
|
||||
"DownloadLinkInstall": "https://github.com/JonKazama-Hellion/HellionChat/releases/download/v0.1.0/latest.zip",
|
||||
"DownloadLinkUpdate": "https://github.com/JonKazama-Hellion/HellionChat/releases/download/v0.1.0/latest.zip",
|
||||
"DownloadLinkTesting": "https://github.com/JonKazama-Hellion/HellionChat/releases/download/v0.1.0/latest.zip",
|
||||
"TestingAssemblyVersion": "0.1.0.0",
|
||||
"DownloadLinkInstall": "https://github.com/JonKazama-Hellion/HellionChat/releases/download/v0.1.1/latest.zip",
|
||||
"DownloadLinkUpdate": "https://github.com/JonKazama-Hellion/HellionChat/releases/download/v0.1.1/latest.zip",
|
||||
"DownloadLinkTesting": "https://github.com/JonKazama-Hellion/HellionChat/releases/download/v0.1.1/latest.zip",
|
||||
"TestingAssemblyVersion": "0.1.1.0",
|
||||
"IconUrl": "https://raw.githubusercontent.com/JonKazama-Hellion/HellionChat/main/ChatTwo/images/icon.png",
|
||||
"ImageUrls": [],
|
||||
"DownloadCount": 0,
|
||||
|
||||
Reference in New Issue
Block a user