diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 0000000..bf867a8
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,30 @@
+name: Build releases
+on: push
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ permissions:
+ id-token: write # for attestation
+ attestations: write # for attestation
+ env:
+ RELEASE_REF: refs/heads/master # pushes to this branch are treated as public releases
+ steps:
+ - name: Fetch code
+ uses: actions/checkout@v4
+ with:
+ fetch-tags: false
+
+ - name: Add build environment
+ uses: Pathoschild/SMAPI-ModBuildWorkflow/add-build-environment@v1
+
+ - name: Set prerelease versions
+ uses: Pathoschild/SMAPI-ModBuildWorkflow/set-prerelease-versions@v1
+ if: github.ref != env.RELEASE_REF
+
+ - name: Build mods
+ run: dotnet build --configuration Release
+
+ - name: Upload release zips
+ uses: Pathoschild/SMAPI-ModBuildWorkflow/upload-release-artifacts@v1
+ with:
+ create_attestations: ${{github.ref == env.RELEASE_REF}}
diff --git a/.gitignore b/.gitignore
index ff2807a..a842c54 100644
--- a/.gitignore
+++ b/.gitignore
@@ -434,3 +434,6 @@ __pycache__/
# End of https://www.gitignore.io/api/csharp,visualstudio
.DS_Store
+
+# Build output from the GitHub Actions release workflow
+_releases/
diff --git a/BetterJunimos/manifest.json b/BetterJunimos/manifest.json
index 046c101..5a06184 100644
--- a/BetterJunimos/manifest.json
+++ b/BetterJunimos/manifest.json
@@ -1,7 +1,7 @@
-{
+{
"Name": "Better Junimos",
"Author": "ceruleandeep",
- "Version": "3.1.2",
+ "Version": "%ProjectVersion%",
"Description": "Allow your Junimos (from Junimo huts) to automatically plant seeds, fertilize, and so much more!",
"UniqueID": "hawkfalcon.BetterJunimos",
"EntryDll": "BetterJunimos.dll",
diff --git a/CustomQuestExpiration/CustomQuestExpiration.csproj b/CustomQuestExpiration/CustomQuestExpiration.csproj
index 179348b..314a853 100644
--- a/CustomQuestExpiration/CustomQuestExpiration.csproj
+++ b/CustomQuestExpiration/CustomQuestExpiration.csproj
@@ -5,10 +5,11 @@
CustomQuestExpiration
latest
net6.0
+ 1.2.0
false
-
+
\ No newline at end of file
diff --git a/CustomQuestExpiration/manifest.json b/CustomQuestExpiration/manifest.json
index e7e3672..91726f7 100644
--- a/CustomQuestExpiration/manifest.json
+++ b/CustomQuestExpiration/manifest.json
@@ -1,7 +1,7 @@
-{
+{
"Name": "Custom Quest Expiration",
"Author": "hawkfalcon",
- "Version": "1.2.0",
+ "Version": "%ProjectVersion%",
"Description": "Change the Daily Quest expiration (make it never expire, expire after 5 days, etc)",
"UniqueID": "hawkfalcon.CustomQuestExpiration",
"EntryDll": "CustomQuestExpiration.dll",
diff --git a/Directory.Build.props b/Directory.Build.props
new file mode 100644
index 0000000..4b4d9be
--- /dev/null
+++ b/Directory.Build.props
@@ -0,0 +1,5 @@
+
+
+ $(MSBuildThisFileDirectory)/_releases
+
+
diff --git a/TillableGround/TillableGround.csproj b/TillableGround/TillableGround.csproj
index b78a565..15f45e6 100644
--- a/TillableGround/TillableGround.csproj
+++ b/TillableGround/TillableGround.csproj
@@ -6,10 +6,11 @@
TillableGround
latest
net6.0
+ 2.1.0
false
-
+
\ No newline at end of file
diff --git a/TillableGround/manifest.json b/TillableGround/manifest.json
index ccea927..d0fca04 100644
--- a/TillableGround/manifest.json
+++ b/TillableGround/manifest.json
@@ -1,7 +1,7 @@
-{
+{
"Name": "Tillable Ground",
"Author": "hawkfalcon",
- "Version": "2.1.0",
+ "Version": "%ProjectVersion%",
"Description": "Make any tile tillable (so you can use your hoe on it)",
"UniqueID": "hawkfalcon.TillableGround",
"EntryDll": "TillableGround.dll",