commit 96553a849a4e5dc22f586b12fd61666317ea9642 Author: Jon Kazama Date: Wed May 27 19:16:36 2026 +0200 chore: bootstrap Anvil repo skeleton First commit on feature/v0.1.0 establishes the Hellion Forge plugin scaffold: - .gitattributes: Linux-first LF defaults, Windows-script CRLF exceptions, binary markers for fonts / images / archives. Pre-empts the Forgeimizer pre-push hook crash that was caused by Asriels CRLF default. - .editorconfig: Hellion Forge .NET conventions (private fields _camelCase, Allman braces, var-preferred). - .gitignore: VisualStudio baseline + secrets bucket + Anvil.Tests excluded (build-suite lives in the local Hellion Build test repo). - LICENSE: MIT, Hellion Online Media 2026. - NOTICE.md: goodwill attribution to Craftimizer and clean-room anonymisation note. - PRIVACY.md: zero-telemetry statement matching 00-Anvil-Scope. - README.md: v0.1.0 status + planned-feature outline + custom-repo URL. - Anvil.sln + Anvil/Anvil.csproj: Dalamud.NET.Sdk/15.0.0, x64 platform pinned (forge-wide rule), Microsoft.Extensions.Hosting stack closed-range pin to 10.0.7 matching HellionChat v1.5.0. No DalamudPackager.targets override - SDK 15 default packager handles images / icon / image_urls. - Anvil/Anvil.yaml: plugin manifest with explicit icon_url / image_urls (top-level fields required for SDK 15 default packager) and a v0.1.0 changelog entry that names RecipeData as the first module. diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..a75409c --- /dev/null +++ b/.editorconfig @@ -0,0 +1,182 @@ +# ############################################################## +# # +# # .editorconfig – Hellion Forge / Anvil +# # +# # Überarbeitet: Mai 2026 +# # +# # Strategie: +# # - Standard-.NET-Conventions (private Fields = _camelCase) +# # - CSharpier übernimmt die meiste Formatierung +# # - Hier: Naming, IDE-Hints, Backup-Format-Regeln +# # +# # ############################################################## + +root = true + + +# ===================================================== +# Defaults (alle Files) +# ===================================================== + +[*] +indent_style = space +tab_width = 4 +indent_size = 4 +charset = utf-8 +end_of_line = lf +trim_trailing_whitespace = true +insert_final_newline = true + + +# ===================================================== +# Markdown: Trailing Spaces erlaubt (2 Spaces =
) +# ===================================================== + +[*.md] +trim_trailing_whitespace = false + + +# ===================================================== +# JSON / YAML: 2-Space-Indent +# ===================================================== + +[*.{yaml,yml}] +indent_size = 2 + +[*.{json,jsonc}] +indent_size = 2 + + +# ===================================================== +# .NET / Resources: 4-Space-Indent +# ===================================================== + +[*.{cs,csx}] +indent_size = 4 + +[*.{xml,xsd,resx,resw,nuspec,config}] +indent_size = 4 + + +# ############################################################## +# # +# # C# Sektion: Style, Naming, Format +# # +# ############################################################## + +[*.{cs,csx}] + + +# ===================================================== +# C# Style – var-Präferenz +# ===================================================== + +csharp_style_var_for_built_in_types = true:suggestion +csharp_style_var_when_type_is_apparent = true:suggestion +csharp_style_var_elsewhere = true:suggestion + + +# ===================================================== +# C# Style – Sonstiges +# ===================================================== + +csharp_style_prefer_utf8_string_literals = true:suggestion + +csharp_preferred_modifier_order = public, private, protected, internal, file, new, static, abstract, virtual, sealed, readonly, override, extern, unsafe, volatile, async, required:suggestion + +csharp_new_line_before_members_in_object_initializers = false + + +# ===================================================== +# C# Format – Braces (Allman) +# ===================================================== + +csharp_new_line_before_open_brace = all +csharp_new_line_before_else = true +csharp_new_line_before_catch = true +csharp_new_line_before_finally = true + + +# ===================================================== +# C# Format – Switch-Einrückung +# ===================================================== + +csharp_indent_case_contents = true +csharp_indent_switch_labels = true + + +# ===================================================== +# .NET Style – Qualification (kein "this." nötig) +# ===================================================== + +dotnet_style_qualification_for_field = false:suggestion +dotnet_style_qualification_for_property = false:suggestion +dotnet_style_qualification_for_method = false:suggestion +dotnet_style_qualification_for_event = false:suggestion + + +# ===================================================== +# .NET Style – Predefined Types (int statt Int32 etc.) +# ===================================================== + +dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion +dotnet_style_predefined_type_for_member_access = true:suggestion + + +# ===================================================== +# .NET Style – Accessibility-Modifier erzwingen +# ===================================================== + +dotnet_style_require_accessibility_modifiers = for_non_interface_members:suggestion + + +# ############################################################## +# # +# # Naming Conventions (.NET-Standard) +# # +# # Private Instance Fields: _camelCase +# # Private Static Fields: _camelCase +# # Private Constants: PascalCase +# # Private Static Readonly: PascalCase +# # +# ############################################################## + +dotnet_naming_style.underscore_camel_case_style.capitalization = camel_case +dotnet_naming_style.underscore_camel_case_style.required_prefix = _ + +dotnet_naming_style.pascal_case_style.capitalization = pascal_case + + +dotnet_naming_rule.private_instance_fields.severity = warning +dotnet_naming_rule.private_instance_fields.symbols = private_instance_fields_symbols +dotnet_naming_rule.private_instance_fields.style = underscore_camel_case_style + +dotnet_naming_symbols.private_instance_fields_symbols.applicable_kinds = field +dotnet_naming_symbols.private_instance_fields_symbols.applicable_accessibilities = private + + +dotnet_naming_rule.private_static_fields.severity = warning +dotnet_naming_rule.private_static_fields.symbols = private_static_fields_symbols +dotnet_naming_rule.private_static_fields.style = underscore_camel_case_style + +dotnet_naming_symbols.private_static_fields_symbols.applicable_kinds = field +dotnet_naming_symbols.private_static_fields_symbols.applicable_accessibilities = private +dotnet_naming_symbols.private_static_fields_symbols.required_modifiers = static + + +dotnet_naming_rule.private_constants.severity = warning +dotnet_naming_rule.private_constants.symbols = private_constants_symbols +dotnet_naming_rule.private_constants.style = pascal_case_style + +dotnet_naming_symbols.private_constants_symbols.applicable_kinds = field +dotnet_naming_symbols.private_constants_symbols.applicable_accessibilities = private +dotnet_naming_symbols.private_constants_symbols.required_modifiers = const + + +dotnet_naming_rule.private_static_readonly.severity = warning +dotnet_naming_rule.private_static_readonly.symbols = private_static_readonly_symbols +dotnet_naming_rule.private_static_readonly.style = pascal_case_style + +dotnet_naming_symbols.private_static_readonly_symbols.applicable_kinds = field +dotnet_naming_symbols.private_static_readonly_symbols.applicable_accessibilities = private +dotnet_naming_symbols.private_static_readonly_symbols.required_modifiers = static, readonly diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..348fe5e --- /dev/null +++ b/.gitattributes @@ -0,0 +1,136 @@ +############################################################## +## +## .gitattributes – Hellion Forge / Anvil +## +## Setup: Linux-First Development +## (Hauptentwicklung auf Linux, Target = Dalamud/Windows) +## Überarbeitet: Mai 2026 +## +## Strategie: +## - Default: Alles LF (Linux-Konvention) +## - Windows-Batch-Scripts: CRLF (technische Pflicht!) +## - PowerShell: CRLF (Sicherheit für Windows PS 5.1) +## - Binärdateien: explizit markiert (gegen Korruption) +## +############################################################## + + +# ===================================================== +# Default: Auto-Detect, alles auf LF normalisieren +# ===================================================== + +* text=auto eol=lf + + +# ===================================================== +# Source Code (LF) +# ===================================================== + +*.cs text eol=lf +*.csx text eol=lf + + +# ===================================================== +# Configs & Daten (LF) +# ===================================================== + +*.json text eol=lf +*.yml text eol=lf +*.yaml text eol=lf +*.xml text eol=lf +*.md text eol=lf +*.txt text eol=lf +*.config text eol=lf +*.editorconfig text eol=lf +.gitignore text eol=lf +.gitattributes text eol=lf + + +# ===================================================== +# Visual Studio / MSBuild Project Files (LF) +# ===================================================== + +*.sln text eol=lf +*.csproj text eol=lf +*.props text eol=lf +*.targets text eol=lf + + +# ===================================================== +# Resources & Lokalisierung (LF) +# ===================================================== + +*.resx text eol=lf +*.resw text eol=lf + + +# ===================================================== +# Linux/Mac-Scripts (LF – Pflicht) +# ===================================================== + +*.sh text eol=lf +*.bash text eol=lf +*.zsh text eol=lf + + +# ===================================================== +# >>> AUSNAHMEN <<< +# Windows-Scripts brauchen ZWINGEND CRLF. +# ===================================================== + +*.bat text eol=crlf +*.cmd text eol=crlf + +*.ps1 text eol=crlf +*.psm1 text eol=crlf +*.psd1 text eol=crlf + + +# ===================================================== +# Binäre Build-Artefakte +# ===================================================== + +*.dll binary +*.exe binary +*.pdb binary +*.so binary +*.dylib binary +*.nupkg binary +*.snupkg binary + + +# ===================================================== +# Bilder (binary) +# ===================================================== + +*.png binary +*.jpg binary +*.jpeg binary +*.gif binary +*.ico binary +*.bmp binary +*.tiff binary +*.webp binary + +# SVG ist eigentlich XML – als Text behandeln +*.svg text eol=lf + + +# ===================================================== +# Fonts (binary) +# ===================================================== + +*.ttf binary +*.otf binary +*.woff binary +*.woff2 binary + + +# ===================================================== +# Archive (binary) +# ===================================================== + +*.zip binary +*.7z binary +*.tar binary +*.gz binary diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e04109e --- /dev/null +++ b/.gitignore @@ -0,0 +1,247 @@ +############################################################## +## +## .gitignore – Hellion Forge / Anvil +## +## Basis: github/gitignore VisualStudio.gitignore +## Überarbeitet: Mai 2026 +## +############################################################## + + +# ===================================================== +# [!! KRITISCH !!] Secrets, Keys & Credentials +# ===================================================== + +.env +.env.* +.env.bak* +.envrc +!.env.example +!.env.sample + +*.pem +*.key +*.p12 +*.pfx +*.cer +*.crt +*.csr +*.gpg +*.asc + +id_rsa +id_ed25519 +id_ecdsa +known_hosts + +auth.json +.npmrc +secrets.json + +appsettings.*.local.json +appsettings.Local.json +local.settings.json + +*.dmp +*.mdmp +crash.log + + +# ===================================================== +# Projekt-spezifisch (Anvil) +# ===================================================== + +# Lokale Entwicklungsumgebung +.vscode/ +scripts/setup-dev-env.sh + +# Build-Suite lives in separate local repo (Hellion Build test/AnvilTests) +Anvil.Tests/ +TestResults + +# Packaging +pack/ + +# Claude Code lokales Setup (nicht committed) +/.claude/ +/CLAUDE.md + +# Cycle-Working-Notes (im Vault gepflegt) +/docs/cycle-notes/ + + +# ===================================================== +# OS-spezifische Files +# ===================================================== + +# macOS +.DS_Store +.AppleDouble +.LSOverride +._* + +# Windows +Thumbs.db +ehthumbs.db +Desktop.ini +$RECYCLE.BIN/ + +# Linux +.directory +.Trash-* + + +# ===================================================== +# Editor & IDE +# ===================================================== + +# JetBrains +.idea/ + +# Vim / Neovim +*.swp +*.swo +*.swn + +# Sublime Text +*.sublime-workspace +*.sublime-project + + +# ===================================================== +# IDE & Editor – User-spezifische Files (VS) +# ===================================================== + +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +.vs/ + + +# ===================================================== +# Build Output +# ===================================================== + +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +project.lock.json +project.fragment.lock.json +artifacts/ + + +# ===================================================== +# Build-Artefakte +# ===================================================== + +*.obj +*.pch +*.pdb +*.ipdb +*.rsp +*.tmp +*.tmp_proj +*.log +*.binlog +*.vspscc +*.vssscc + + +# ===================================================== +# Test Results +# ===================================================== + +[Tt]est[Rr]esult*/ + +*.VisualState.xml +TestResult.xml + +BenchmarkDotNet.Artifacts/ + +*.received.* +*.received.txt + + +# ===================================================== +# Code Coverage +# ===================================================== + +coverage*.json +coverage*.xml +coverage*.info + +*.coverage +*.coveragexml + + +# ===================================================== +# Cache Files +# ===================================================== + +*.aps +*.opendb +*.cachefile +*.lscache + +*.[Cc]ache +!?*.[Cc]ache/ + + +# ===================================================== +# NuGet & Dependencies +# ===================================================== + +*.nupkg +*.snupkg +**/[Pp]ackages/* +!**/[Pp]ackages/build/ +*.nuget.props +*.nuget.targets + +node_modules/ + + +# ===================================================== +# Publish & Deploy +# ===================================================== + +publish/ + +*.[Pp]ublish.xml +*.pubxml +*.publishproj + + +# ===================================================== +# AI / LLM Tooling +# ===================================================== + +.cursor/ +.cursorignore +.aider* +.continue/ +.continuerc.json +.windsurf/ +.cody/ + +prompts/local/ + + +# ===================================================== +# Misc / Temp / Backup +# ===================================================== + +~$* +*~ +*.publishsettings diff --git a/Anvil.sln b/Anvil.sln new file mode 100644 index 0000000..62d648a --- /dev/null +++ b/Anvil.sln @@ -0,0 +1,21 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Anvil", "Anvil\Anvil.csproj", "{4F8E3A2C-1B0D-4F1A-9C7E-A1B2C3D4E5F6}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4F8E3A2C-1B0D-4F1A-9C7E-A1B2C3D4E5F6}.Debug|x64.ActiveCfg = Debug|x64 + {4F8E3A2C-1B0D-4F1A-9C7E-A1B2C3D4E5F6}.Debug|x64.Build.0 = Debug|x64 + {4F8E3A2C-1B0D-4F1A-9C7E-A1B2C3D4E5F6}.Release|x64.ActiveCfg = Release|x64 + {4F8E3A2C-1B0D-4F1A-9C7E-A1B2C3D4E5F6}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Anvil/Anvil.csproj b/Anvil/Anvil.csproj new file mode 100644 index 0000000..7b8fb3a --- /dev/null +++ b/Anvil/Anvil.csproj @@ -0,0 +1,72 @@ + + + 0.1.0 + enable + enable + latest + + x64 + x64 + + true + Anvil + Anvil + + + + + + + + + + + + + + + + + + True + True + AnvilStrings.resx + + + + + + ResXFileCodeGenerator + AnvilStrings.Designer.cs + + + + + + + PreserveNewest + + + diff --git a/Anvil/Anvil.yaml b/Anvil/Anvil.yaml new file mode 100644 index 0000000..f8f0788 --- /dev/null +++ b/Anvil/Anvil.yaml @@ -0,0 +1,46 @@ +name: Anvil +author: Jon Kazama (Hellion Forge) +punchline: A Hellion Forge plugin — privacy-focused FFXIV crafting helper with simulator, solver, and bookmarks. +description: |- + Anvil is a clean-room crafting plugin for FINAL FANTASY XIV. It provides + a state-machine crafting simulator, a wrapper for the Raphael Rust + solver, a recipe-note overlay, a synth-helper overlay, a macro editor, + recipe bookmarks, and an opt-in Auto-Craft hook. + + Privacy: + - Zero telemetry, no network calls + - Bookmarks and settings stay on your machine + - Auto-Craft is OFF by default with an explicit warning modal + + Status: v0.1.0 is the first release of the clean-room reimplementation. + The module surface is intentionally minimal; the simulator, solver + wrapper, macro engine, and full UI follow in v0.2.0+. + + Cosmic Exploration support: planned for v0.2.0 (recipe-flag schema is + already in place, mission-flag resolution is deferred). + + Inspired by Craftimizer by Asriel Camora (MIT). Anvil is an independent + re-implementation; no code was ported from Craftimizer. +repo_url: https://gitea.hellion-forge.cloud/JonKazama-Hellion/Anvil +accepts_feedback: true +icon_url: https://gitea.hellion-forge.cloud/JonKazama-Hellion/Anvil/raw/branch/main/Anvil/images/icon.png +image_urls: [] +tags: + - Crafting + - Macros + - Solver + - UI + - Privacy +changelog: |- + **v0.1.0 — Initial Release (2026-05-27)** + + First Hellion Forge release of Anvil. Module 01 (RecipeData) is in + place: catalogues every FFXIV crafting recipe, item, action, buff, + condition, and food/medicine from Lumina sheets, surfaces them + through a Dalamud-free read-only API, and verifies the load via the + `/xlperf` SelfTest step. + + Note: This release is the foundation layer. UI windows, simulator, + solver, macros, hooks, and the IPC provider follow in v0.2.0+. + + Inspired by Craftimizer by Asriel Camora (MIT). diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..63eed30 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Hellion Online Media + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/NOTICE.md b/NOTICE.md new file mode 100644 index 0000000..8a3d567 --- /dev/null +++ b/NOTICE.md @@ -0,0 +1,34 @@ +# NOTICE + +## Goodwill Attribution + +Anvil is an independent Hellion Forge plugin for FFXIV, built as a clean-room +re-implementation. The plugin exists because the upstream Craftimizer plugin +went dormant when the Dalamud SDK moved from API level 14 to 15. + +**Inspired by [Craftimizer](https://github.com/WorkingRobot/Craftimizer) by +Asriel Camora (MIT).** + +This attribution is a goodwill marker, not a legal requirement. Anvil does not +contain Craftimizer source code or paraphrased code patterns. The clean-room +pipeline used official FFXIV game mechanics documentation, the +[Artisan](https://github.com/PunishXIV/Artisan) plugin (as a mechanics +reference for crafting domain values, with the "pattern and values may be +adapted, no 1:1 code port" rule), and direct Lumina sheet inspection as the +sole sources for the simulator and recipe data. + +## Crafting Domain Patterns + +Crafting mechanic constants (action CP/durability costs, condition multipliers, +buff durations) are FFXIV game data and belong to Square Enix. The values were +cross-checked against the publicly available datamining repository +(`xivapi/ffxiv-datamining`) and against the Artisan plugin's documented +constants. The Artisan plugin is GPL-3.0; Anvil does not port its code, +only consumes its documented mechanic values which are themselves the +underlying game's data. + +## Anonymisation Policy + +Anvil follows the Hellion Forge clean-room policy: no class names, method +names, or code structures were imported from any external plugin. Namespace +layout, type design, and threading model are independent. diff --git a/PRIVACY.md b/PRIVACY.md new file mode 100644 index 0000000..9ddb28c --- /dev/null +++ b/PRIVACY.md @@ -0,0 +1,41 @@ +# PRIVACY + +Anvil is a zero-telemetry Dalamud plugin. It does not collect, transmit, or +log any data to external services. + +## What Anvil reads + +- FFXIV game data via Lumina sheets (recipes, items, actions, buffs, + conditions, food) — read-only, in-process. +- Plugin state from the local `pluginConfigs/Anvil/` directory (bookmarks, + user settings, theme JSON). +- Active crafting state via Dalamud's `IGameInteropProvider` hooks (`UseAction`, + `IsActionHighlighted`) — exclusively to power the in-game UI; nothing is + persisted from the hook data. + +## What Anvil does NOT do + +- No network calls (no analytics, no auto-update, no usage statistics). +- No telemetry, no error reporting to any external endpoint. +- No cloud-stored macros or bookmarks. Everything is local-first. +- No third-party tracking SDKs of any kind. + +## Optional features that touch other plugins (local IPC only) + +- Anvil exposes IPC channels (`Anvil.Theme.*`, `Anvil.Macros.*`, + `Anvil.Crafting.*`) so other Hellion Forge plugins can read theme state, + macro lists, and crafting status. Cross-plugin reads happen in-process via + Dalamud's `ICallGateProvider`; no data leaves the user's machine. +- MacroMate-IPC export, when triggered, sends macro text to the local + MacroMate plugin via Dalamud-internal IPC. + +## Auto-Craft (opt-in) + +The Auto-Craft feature is OFF by default. When enabled, it executes crafting +actions automatically via the `UseAction` hook. It does not send any +information about the actions back to the plugin or to any service. + +## Contact + +For privacy questions: open an issue at the Anvil repository or use the +Hellion Forge Discord support channel referenced in the plugin manifest. diff --git a/README.md b/README.md new file mode 100644 index 0000000..b2f31bd --- /dev/null +++ b/README.md @@ -0,0 +1,55 @@ +# Anvil + +An independent Hellion Forge plugin for FINAL FANTASY XIV crafting. + +Anvil is a privacy-focused, zero-telemetry crafting helper for Dalamud +(API level 15+). It provides a crafting simulator, a solver wrapper, +recipe bookmarks, and an opt-in Auto-Craft hook. + +> Status: **v0.1.0 — early development.** The crafting simulator, solver +> wrapper, macro engine, hooks, IPC provider, bookmark store, and UI +> layers are being built module-by-module under the Anvil clean-room +> pipeline. The Recipe Data layer (module 01) is the first ground-up +> piece. + +## Features (planned) + +- Crafting Simulator — state machine for FFXIV crafting steps, conditions, + buffs, and actions, with full Cosmic Exploration schema support. +- Solver Wrapper — bridge to the Raphael Rust solver (bundled binary). +- Recipe Note Overlay — anchors next to FFXIV's recipe-note addon. +- Synth Helper Overlay — live next-action hint during synthesis. +- Macro Editor — compose, replay, export to FFXIV macros and MacroMate. +- Recipe Bookmarks — local list with notes, tags, and quick-open. +- Auto-Craft (opt-in) — `UseAction` hook with explicit warning modal. +- IPC Provider — exposes theme, macros, and crafting status to other + Hellion Forge plugins. +- Bilingual EN/DE UI with Hellion Anvil-Boutique styling + (Forge-Bronze on dark surface). + +## Privacy + +Zero telemetry. No network calls. Everything stays on your machine. See +[PRIVACY.md](PRIVACY.md) for the full statement. + +## Attribution + +Anvil is a clean-room re-implementation, not a fork. The plugin is +inspired by [Craftimizer](https://github.com/WorkingRobot/Craftimizer) +by Asriel Camora (MIT) — see [NOTICE.md](NOTICE.md) for the goodwill +attribution. + +## License + +[MIT](LICENSE) — Copyright (c) 2026 Hellion Online Media. + +## Install + +The custom Dalamud repository URL for Anvil is: + +``` +https://gitea.hellion-forge.cloud/JonKazama-Hellion/Anvil/raw/branch/main/repo.json +``` + +Add this URL under Dalamud → Settings → Experimental → Custom Plugin +Repositories, then install **Anvil** from the plugin installer.