Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
5a8d1ac
Pushing project files
Fuggschen Apr 13, 2026
c172655
feat: add mod groups, missing status, and DnD
Fuggschen Apr 13, 2026
94594d8
chore: simplify CI workflow to dev branch build
Fuggschen Apr 13, 2026
cab9502
docs: add README
Fuggschen Apr 13, 2026
b345a5e
docs: add GitHub issue templates
Fuggschen Apr 13, 2026
4c70dfa
feat: add mod URL download and profile auto-fetch
Fuggschen Apr 14, 2026
3ea9db0
Merge pull request #1 from Fuggschen/dev
Fuggschen Apr 14, 2026
122323a
fix: add SkiaSharp Linux no-deps package
Fuggschen Apr 14, 2026
73c49e4
fix: use XDG log dir and gracefully fallback
Fuggschen Apr 14, 2026
94557da
feat: add multilingual UI localization support
Fuggschen Apr 20, 2026
d12cd1a
docs: clarify GitHub token and missing mod notes
Fuggschen Apr 20, 2026
d5137bf
fix: constrain dialog size and scroll long text
Fuggschen Apr 20, 2026
f7a5d6a
feat: add failed download dialog and timeouts
Fuggschen Apr 20, 2026
dccc03b
feat: multi-mod selection and group assignment
Fuggschen Apr 21, 2026
8796648
feat: add modpack export/import
Fuggschen Apr 21, 2026
411bcf9
docs: add multi-select mod and ZIP modpack docs
Fuggschen Apr 21, 2026
2ead811
Merge pull request #2 from Fuggschen/dev
Fuggschen Apr 21, 2026
9d47288
Scaffold project based on DV modding template
SharkBaitDLS Jun 18, 2026
fdcda3a
Hacky implementation that re-launches via Steam
SharkBaitDLS Jul 22, 2026
d564f2a
Fix CI name references
SharkBaitDLS Jul 22, 2026
007d9c9
Improve restart logic and handle wine/proton
SharkBaitDLS Jul 24, 2026
3933772
Patch mod settings live on profile load
SharkBaitDLS Jul 27, 2026
20e2a44
Fix missing README link
SharkBaitDLS Jul 30, 2026
c796224
Shore up release version checks
SharkBaitDLS Jul 31, 2026
70d013c
fixed linux Capitalization and crashes
Aug 5, 2026
ecc11d1
Merge pull request #10 from rassiMC/beta
Fuggschen Aug 11, 2026
bd69d10
docs: update branching policy from dev to beta branch
Fuggschen Aug 11, 2026
adc4fc2
Merge branch 'beta' of https://github.com/Fuggschen/DVModManager into…
Fuggschen Aug 11, 2026
8742b3e
fix: add mod version correction by re-downloading from repository
Fuggschen Aug 11, 2026
41b4ffb
fix: handle different types for NexusModsMod.UpdatedTime from JSON
Fuggschen Aug 11, 2026
97fbc00
fix: improved detection of external file handling and deletion
Fuggschen Aug 11, 2026
261ab5e
fix: support per-panel collapsed group state
Fuggschen Aug 11, 2026
9e68c72
fix: adding mod groups for panel specific side
Fuggschen Aug 11, 2026
d6b3d11
fix: clear pending update badge after successful mod updates
Fuggschen Aug 11, 2026
6e0533b
feat: add Start Game button to launch Derail Valley via Steam
Fuggschen Aug 11, 2026
47e778d
feat: add option to enable/disable version archiving
Fuggschen Aug 11, 2026
b284d55
fix: update Steam launch command to use dialog option
Fuggschen Aug 11, 2026
0d2408e
Add 'dv-mod-profiles/' from commit 'c79622449246f865d5bf28a79c2c72caf…
SharkBaitDLS Aug 11, 2026
ee91fca
Move mod profiles into its own solution
SharkBaitDLS Aug 11, 2026
bb1e6ff
Adjust mod profiles to integrate directly with manager's on-disk sett…
SharkBaitDLS Aug 12, 2026
cda20b7
Hook into the correct load button
SharkBaitDLS Aug 12, 2026
a80e4e3
Directly integrate manager models into the mod
SharkBaitDLS Aug 12, 2026
b454dcb
Apply PR suggestions
SharkBaitDLS Aug 13, 2026
04df00a
Merge pull request #12 from SharkBaitDLS/beta
SharkBaitDLS Aug 13, 2026
0eaa4a8
Add CI jobs for the profiles mod
SharkBaitDLS Aug 13, 2026
6c5c424
Don't enforce line endings in linting
SharkBaitDLS Aug 13, 2026
66818ae
Update reference path for CI
SharkBaitDLS Aug 13, 2026
d3634a2
Switch manager release workflow to new tag structure and direct GH in…
SharkBaitDLS Aug 13, 2026
367a245
Include repo in the release flags because the job runs outside of a c…
SharkBaitDLS Aug 13, 2026
88cb0b7
fix: resolve transitive dependencies recursively using BFS
Fuggschen Aug 13, 2026
73c9188
fix: improve dependency validation with case-insensitive comparison
Fuggschen Aug 13, 2026
212ba77
feat: add companion mod integration
Fuggschen Aug 14, 2026
468064f
feat: add external file drag & drop support for installing mod archives
Fuggschen Aug 14, 2026
601e915
feat: add manager update check
Fuggschen Aug 14, 2026
08491f9
feat: add support for selecting and installing multiple mod archives …
Fuggschen Aug 14, 2026
d1fb50b
fix: localize all remaining hardcoded UI strings
Fuggschen Aug 14, 2026
1b05f75
chore: switch beta tags to main
Fuggschen Aug 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
79 changes: 79 additions & 0 deletions .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
name: Bug Report
description: Report a reproducible problem in DV Mod Manager
title: "[Bug]: "
labels:
- bug
body:
- type: markdown
attributes:
value: |
Thanks for filing a bug report. Please include clear reproduction steps.

- type: textarea
id: summary
attributes:
label: Summary
description: What is broken?
placeholder: A short description of the problem.
validations:
required: true

- type: textarea
id: steps
attributes:
label: Steps to Reproduce
description: Provide exact steps so we can reproduce the issue.
placeholder: |
1. Open DV Mod Manager
2. Click ...
3. Observe ...
validations:
required: true

- type: textarea
id: expected
attributes:
label: Expected Behavior
placeholder: What did you expect to happen?
validations:
required: true

- type: textarea
id: actual
attributes:
label: Actual Behavior
placeholder: What happened instead?
validations:
required: true

- type: input
id: app-version
attributes:
label: DV Mod Manager Version
placeholder: e.g. v1.2.0
validations:
required: true

- type: dropdown
id: os
attributes:
label: Operating System
options:
- Windows
- Linux
- Other
validations:
required: true

- type: textarea
id: logs
attributes:
label: Relevant Logs
description: Paste relevant log lines from the app logs directory.
render: shell

- type: textarea
id: additional
attributes:
label: Additional Context
description: Screenshots, related mods, or any extra context.
57 changes: 57 additions & 0 deletions .github/ISSUE_TEMPLATE/feature_request.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
name: Feature Request
description: Suggest an improvement for DV Mod Manager
title: "[Feature]: "
labels:
- enhancement
body:
- type: markdown
attributes:
value: |
Thanks for the suggestion. Please describe the problem and the expected outcome.

- type: textarea
id: problem
attributes:
label: Problem to Solve
description: What pain point are you experiencing?
placeholder: Describe the current limitation.
validations:
required: true

- type: textarea
id: proposal
attributes:
label: Proposed Solution
description: What should DV Mod Manager do?
placeholder: Describe your ideal behavior.
validations:
required: true

- type: textarea
id: alternatives
attributes:
label: Alternatives Considered
description: Any other approaches you considered.

- type: textarea
id: user-impact
attributes:
label: User Impact
description: Who benefits and how?
placeholder: Example: Helps users manage large mod sets faster.

- type: textarea
id: acceptance
attributes:
label: Suggested Acceptance Criteria
description: Optional checklist for done criteria.
placeholder: |
- [ ] Behavior A is supported
- [ ] UI shows B
- [ ] Existing workflow C still works

- type: textarea
id: additional
attributes:
label: Additional Context
description: Mockups, references, or related issues.
27 changes: 27 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
name: Build Check

on:
push:
branches: [main, beta]
paths-ignore:
- 'DVModProfiles/**'
- '**/*.md'
pull_request:
branches: [main, beta]
paths-ignore:
- 'DVModProfiles/**'
- '**/*.md'

jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: 8.0.x

- name: Build
run: dotnet build DVModManager/DVModManager.csproj -c Release
31 changes: 31 additions & 0 deletions .github/workflows/mod-build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
name: CI

on:
push:
branches: [main, beta]
pull_request:
branches: [main, beta]

jobs:
build:
runs-on: [self-hosted, Windows]

defaults:
run:
working-directory: DVModProfiles

env:
ReferencePath: 'C:\References\Derail Valley\DerailValley_Data\Managed'

steps:
- name: Checkout
uses: actions/checkout@v6

- name: Restore
run: dotnet restore DVModProfiles.csproj

- name: Lint
run: dotnet format DVModProfiles.csproj --verify-no-changes --no-restore

- name: Build
run: dotnet build DVModProfiles.csproj -c Release --no-restore
68 changes: 68 additions & 0 deletions .github/workflows/mod-release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
name: Release

on:
push:
tags:
- 'dvmodprofiles-v*'

permissions:
contents: write

jobs:
release:
runs-on: [self-hosted, Windows]

defaults:
run:
working-directory: DVModProfiles

env:
ReferencePath: 'C:\References\Derail Valley\DerailValley_Data\Managed'

steps:
- name: Checkout
uses: actions/checkout@v6

- name: Verify tag matches info.json version
shell: powershell
run: |
$ErrorActionPreference = 'Stop'
# The tag carries the mod prefix; the version fields do not.
$tag = '${{ github.ref_name }}'
$version = $tag -replace '^dvmodprofiles-v', ''
$info = Get-Content -Raw info.json | ConvertFrom-Json
$errors = @()

if ($info.Version -ne $version) {
$errors += "info.json Version is '$($info.Version)', expected '$version'."
}

$release = (Get-Content -Raw repository.json | ConvertFrom-Json).Releases |
Where-Object { $_.Id -eq $info.Id }
if (-not $release) {
$errors += "repository.json has no Releases entry with Id '$($info.Id)'."
} else {
if ($release.Version -ne $version) {
$errors += "repository.json Version is '$($release.Version)', expected '$version'."
}
# The download path segment is the full tag, not the bare version.
$expectedUrl = "https://github.com/${{ github.repository }}/releases/download/$tag/$($info.Id).zip"
if ($release.DownloadUrl -ne $expectedUrl) {
$errors += "repository.json DownloadUrl is '$($release.DownloadUrl)', expected '$expectedUrl'."
}
}

if ($errors.Count -gt 0) {
$errors | ForEach-Object { Write-Host "::error::$_" }
Write-Error "Version mismatch for tag '$tag'. Bump every version field in info.json and repository.json (including the version inside DownloadUrl) before tagging."
exit 1
}
Write-Host "Releasing version $version"

- name: Build and package
run: dotnet build DVModProfiles.csproj -c Release

- name: Create GitHub release
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: gh release create "${{ github.ref_name }}" "dist/DVModProfiles.zip" --title "${{ github.ref_name }}" --generate-notes
59 changes: 59 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
name: Release

on:
push:
tags: ['dvmodmanager-v*']

env:
IS_BETA: ${{ contains(github.ref, '-beta') }}

permissions:
contents: write

jobs:
publish:
runs-on: ubuntu-latest
strategy:
matrix:
rid: [win-x64, linux-x64]
steps:
- uses: actions/checkout@v4

- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: 8.0.x

- name: Publish (${{ matrix.rid }})
run: dotnet publish DVModManager/DVModManager.csproj -c Release -r ${{ matrix.rid }} -o publish/${{ matrix.rid }}

- name: Package
run: |
cd publish/${{ matrix.rid }}
zip -r ../../DVModManager-${{ matrix.rid }}.zip .

- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: DVModManager-${{ matrix.rid }}
path: DVModManager-${{ matrix.rid }}.zip

release:
needs: publish
runs-on: ubuntu-latest
steps:
- name: Download all artifacts
uses: actions/download-artifact@v4
with:
path: artifacts

- name: Create GitHub release
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
gh release create "${{ github.ref_name }}" artifacts/*/*.zip \
--repo "${{ github.repository }}" \
--title "${{ github.ref_name }}" \
--generate-notes \
--draft="$IS_BETA" \
--prerelease="$IS_BETA"
34 changes: 34 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
## Build results
[Bb]in/
[Oo]bj/
publish/

## DVModProfiles compilation artifacts
DVModProfiles/build/
DVModProfiles/dist/
Directory.Build.targets

## User-specific files
*.user
*.suo
*.userosscache
*.sln.docstates

## VS Code
.vscode/

## Visual Studio
.vs/

## Rider
.idea/

## NuGet
*.nupkg
**/packages/

## OS files
Thumbs.db
ehthumbs.db
Desktop.ini
.DS_Store
3 changes: 3 additions & 0 deletions DVModManager.slnx
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<Solution>
<Project Path="DVModManager/DVModManager.csproj" />
</Solution>
27 changes: 27 additions & 0 deletions DVModManager/App.axaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<Application xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="DVModManager.App"
RequestedThemeVariant="Dark">
<Application.Styles>
<FluentTheme />
</Application.Styles>
<Application.Resources>
<ResourceDictionary>
<!-- Status colors -->
<Color x:Key="ModActiveColor">#2ecc71</Color>
<Color x:Key="ModUpdateColor">#f39c12</Color>
<Color x:Key="ModErrorColor">#e74c3c</Color>
<Color x:Key="ModInactiveColor">#7f8c8d</Color>

<SolidColorBrush x:Key="ModActiveBrush" Color="{StaticResource ModActiveColor}" />
<SolidColorBrush x:Key="ModUpdateBrush" Color="{StaticResource ModUpdateColor}" />
<SolidColorBrush x:Key="ModErrorBrush" Color="{StaticResource ModErrorColor}" />
<SolidColorBrush x:Key="ModInactiveBrush" Color="{StaticResource ModInactiveColor}" />

<!-- Card background -->
<SolidColorBrush x:Key="CardBackgroundBrush" Color="#1e1e2e" />
<SolidColorBrush x:Key="SurfaceBrush" Color="#181825" />
<SolidColorBrush x:Key="OverlayBrush" Color="#313244" />
</ResourceDictionary>
</Application.Resources>
</Application>
Loading
Loading