MonoGame 3.8.5 Upgrade Keep Hold - DesktopVK Content Builder for Indies 2026

If you are searching monogame 3.8.5 in August 2026, you do not need another “XNA lives” nostalgia post. You need a Monday decision: stay on DesktopGL / WindowsDX for the ship branch, or spike DesktopVK and the new Content Builder on a throwaway project before anyone rewrites your .csproj mid-milestone — then paste a Discord brief so “we bumped NuGet” is not treated as a Vulkan ship decision.
On July 15, 2026, the MonoGame Foundation shipped 3.8.5 — the first 2026 framework release and a real architecture beat: a native C/C++ backend, new DesktopVK and WindowsDX12 targets, a code-first Content Builder, and ARM develop/run packages (official blog, GitHub v3.8.5). GameFromScratch and GameDev.net framed it as more than a patch train. Weeks later, milestone boards still schedule “MonoGame Vulkan week” without a lab folder — that is why this August refresh keeps the same spike and adds an explicit Monday ritual plus Discord paste.
This playbook is the indie keep / hold / rewrite evening. It is not Unity 6.5 BIRP keep/hold (different engine). It is not FEPM / CoreCLR (Unity Play mode). It is not AutoRemesher (art). It is not Defold 1.13.1 lights (Lua editor Light components). One spike: NuGet swap, window + content smoke, receipt filed.
| If you are… | Start here | Done when |
|---|---|---|
| Beginner | Glossary → keep/hold table | You can say why DesktopGL still ships |
| Working C# indie | Gates M1–M6 → DesktopVK csproj | Spike runs + Content Builder builds one asset |
| Studio lead | Diligence + 3.8.6/3.9 roadmap note | Written owners for ship vs spike platforms |
Time: about 90–120 minutes for a fresh spike template. Longer if you migrate a large content pipeline project.
Why this matters now (August 2026)
Three clocks make a monogame 3.8.5 evening worth running this month:
- Native backend is the long-term spine. MonoGame is moving away from a dozen C# native wrappers toward one C/C++ library so consoles, new PC targets, and the content pipeline share implementations (blog). That is a multi-year direction — not a weekend cosmetic bump. August search still hits changelog posts without a ship-vs-spike ritual.
- DesktopVK and WindowsDX12 are experimental-class new targets for most ship calendars. Foundation intent: DesktopVK eventually replaces DesktopGL; DX12 eventually replaces DX11 — over years, with performance “nearly the same” today. Shipping teams should spike, not silent-swap — especially when producers treat “NuGet bumped” as “we’re Vulkan now.”
- Content Builder is code-first and early. The new builder is a C# project that includes assets with rules — flexible, but “early days” per the Foundation. Treat it as a lab tool until your CI proves it. Most SERP pages celebrate features; few force DesktopGL restore first, then a separate DesktopVK folder, then a written keep/hold.
Also useful: GamePad support up to 8 controllers, HSL/HSV helpers, fullscreen stuck fixes, Song/SoundEffect shutdown crash fixes, GLES3 defaulting on mobile, standalone downloadable binaries beside NuGet (blog).
Glossary - plain words
| Term | What it means |
|---|---|
| DesktopGL | Classic OpenGL desktop target many indies ship today. |
| DesktopVK | New Vulkan + SDL2 + FAudio desktop target (Windows/Mac/Linux intent). |
| WindowsDX / WindowsDX12 | DirectX 11 vs new DirectX 12 Windows targets (DX12 shares Xbox path / GDK story). |
| Native backend | C/C++ dynamic library owning platform bits; C# stays more platform-agnostic. |
| Content Builder | New code-centric content build (C# ContentBuilder) vs older MGCB data-file workflows. |
| MonoGamePlatform | MSBuild property telling content which platform you are building for. |
| Keep / hold / rewrite | Keep = adopt on spike or ship; hold = wait with reason; rewrite = wrong plan (e.g. swap mid-cert). |
Keep / hold / rewrite - Monday decisions
| Situation | Keep | Hold | Rewrite |
|---|---|---|---|
| Soft lock / store submission soon | Current DesktopGL or WindowsDX on 3.8.5 patch if needed for bugfixes | Do not swap to DesktopVK/DX12 on ship branch | Rewrite milestone only after spike receipt |
| Mid-cycle PC title | Spike DesktopVK on a branch | Marketing “we’re Vulkan now” | Full content rebuild without Builder plan |
| Microsoft Store / Game Pass interest | WindowsDX12 spike + GDK checklist | Assuming DX12 alone equals certification | Shipping DX12 without store packaging smoke |
| Raspberry Pi / ARM laptop | ARM packages for build/run experiments | Promising Pi as only ship SKU | Ignoring x64 CI |
| Happy MGCB pipeline | Stay MGCB; watch Builder | Migrating all content night one | Deleting MGCB before Builder CI is green |
| Learning MonoGame fresh | New template on 3.8.5 DesktopGL or DesktopVK lab | Mixing three backends in one repo | Copy-pasting every PackageReference from Discord |
Company note: write ship_platform_owner and spike_platform_owner in the README. Partners should see that 3.8.5 NuGet ≠ DesktopVK adoption.
What 3.8.5 actually ships (true summary)
From the Foundation post:
- Native C/C++ backend — reduce wrapper sprawl; share code with consoles and new targets.
- DesktopVK — SDL2 + Vulkan + FAudio; intended long-term DesktopGL replacement.
- WindowsDX12 — SDL2 + D3D12 + XAudio2; GDK / Store / Game Pass adjacent; Xbox-shared lineage.
- Content Builder (first release) — C#
ContentBuilderwithIncluderules; run as console project before game. - ARM develop + runtime — build and run on ARM64 (Pi 4/5 class accessibility).
- QoL + fixes — Random, 8 gamepads, HSL/HSV, fullscreen stuck, audio shutdown crashes, SpriteFont layout, drag-drop, controller maps, GLES3 preference, standalone binaries.
- Roadmap honesty — 3.8.6 hardens new targets; 3.9 plans fonts, unified shader compiler, native mobile, save system refresh.
Beginner path - spike without touching ship (about 90 minutes)
Prerequisites
- .NET SDK current enough for MonoGame 3.8.5 templates (pin what the docs recommend for your machine)
- Git
- About 90–120 minutes
- Willingness to create a new project — not your Steam build folder
Step 1 - Write the one-sentence decision stub
We will keep / hold / rewrite MonoGame 3.8.5 backends because reason; ship stays on DesktopGL|WindowsDX; spike is DesktopVK|WindowsDX12|Content Builder|none.
Step 2 - Create a spike repo
mkdir mg385-spike
cd mg385-spike
dotnet new mgdesktopgl -o ShipSafeSample
(Use the template names your installed MonoGame templates expose — names vary slightly by template pack version. If mgdesktopgl is missing, install the current MonoGame templates per monogame.net docs, then retry.)
Commit. This folder is sacred: it proves 3.8.5 restores on classic DesktopGL before you chase Vulkan.
Step 3 - Run ShipSafeSample once
dotnet run --project ShipSafeSample
You are done when a window opens and closes cleanly. If this fails, stop — your machine/SDK story is broken before DesktopVK.
Step 4 - Add a DesktopVK spike project (separate folder)
Create DesktopVkSpike and follow the Foundation’s package swap pattern (blog):
- Set in the
.csproj:
<PropertyGroup>
<MonoGamePlatform>DesktopVK</MonoGamePlatform>
</PropertyGroup>
- Replace DesktopGL package references with:
<ItemGroup>
<PackageReference Include="MonoGame.Framework.Native" Version="3.8.*" />
<PackageReference Include="MonoGame.Runtime.Windows.Vulkan" Version="3.8.*" />
</ItemGroup>
Swap in the Mac or Linux Vulkan runtime package when you smoke those hosts. Use the exact runtime packages for the OS you are on (Windows / Mac / Linux) as listed in the blog. Do not invent package IDs.
dotnet restore&&dotnet run.
Pass: window opens, clear color clears, input polls.
Fail: missing native runtime, Vulkan driver issues, restore errors — document and hold DesktopVK.
Step 5 - Optional WindowsDX12 spike (Windows only)
Same idea with MonoGamePlatform = WindowsDX12 and:
<PackageReference Include="MonoGame.Framework.Native" Version="3.8.*" />
<PackageReference Include="MonoGame.Runtime.Windows.DX12" Version="3.8.*" />
Only useful if Store/Game Pass / DX12 is on your roadmap.
Step 6 - Say the sentence out loud
Examples:
- “Hold DesktopVK — ship in six weeks on DesktopGL 3.8.5; spike green but not certified.”
- “Keep DesktopVK on spike — will migrate after Next Fest; Content Builder lab next sprint.”
- “Rewrite plan — we need WindowsDX12 for Store; schedule GDK packaging separately.”
Working-dev path - gates M1–M6
| Gate | Question | Pass means |
|---|---|---|
| M1 | Ship branch untouched? | Spike only; ship still builds on prior packages |
| M2 | 3.8.5 restores on classic target? | DesktopGL or WindowsDX sample runs |
| M3 | New target smoke? | DesktopVK and/or DX12 window + input |
| M4 | Content path decided? | MGCB stay or Builder Hello World builds one asset |
| M5 | Regression notes? | Fullscreen / audio / gamepad checks logged |
| M6 | Receipt filed? | monogame_385_upgrade_receipt_v1.json saved |
M1 - Isolation
Never “upgrade in place” the Steam build’s .csproj on night one. Branch or separate solution.
M2 - Prove 3.8.5 itself
Bump package versions on a classic target first. Many teams only need 3.8.5 for bugfixes (fullscreen stuck, audio shutdown) without Vulkan.
M3 - New backend honesty
Record GPU/driver, OS, and whether you needed vendor Vulkan tools. “Works on my 4090” is not a Deck/laptop receipt.
M4 - Content Builder Hello World
Foundation example pattern (blog): a console project with a ContentBuilder subclass that Includes fonts, effects, sounds, and images, then builder.Run(args).
Night-one scope:
- One
.spritefontor one PNG. - Builder exits 0.
- Game loads that asset once.
Do not migrate your entire Content.mgcb tonight. Early Builder is for learning the shape of the new pipeline.
M5 - Regression card
From the release notes, spot-check:
- Enter/exit fullscreen twice
- Play a
SoundEffectand exit cleanly - If local multiplayer matters, plug a second pad (up to 8 supported now)
- SpriteFont layout on a known string
M6 - Receipt
Use the JSON at the end. Lying booleans are worse than a documented hold.
Evening schedule (90–120 minutes)
| Block | Minutes | Action |
|---|---|---|
| 0 | 10 | Decision stub + owners |
| 1 | 20 | ShipSafe DesktopGL/DX sample on 3.8.5 |
| 2 | 25 | DesktopVK (or DX12) package swap + run |
| 3 | 25 | Content Builder one-asset OR explicit MGCB stay |
| 4 | 15 | Fullscreen / audio / pad spot checks |
| 5 | 15 | Receipt + Discord brief |
If Block 1 fails, stop. Do not debug Vulkan on a broken SDK install.
Content Builder vs MGCB - plain comparison
| Approach | Strength | Risk in 3.8.5 |
|---|---|---|
| MGCB / classic pipeline | Known CI, tutorials, existing projects | Not the long-term Builder story |
| Content Builder | Code-centric, embeddable, flexible includes | First release — expect API churn into 3.8.6/3.9 |
Keep MGCB on ship. Lab Builder on spike. Revisit after 3.8.6 hardening notes land.
ARM and accessibility note
3.8.5 ships development and runtime packages for ARM so you can build and run on ARM64 machines, including Pi-class hardware (blog). That is a teaching/lab win and a niche ship SKU — not a reason to drop x64 CI. If you care: add an ARM job that restores and runs tests; do not make Pi your only certification box.
Company diligence paragraph (paste-ready)
Framework: MonoGame 3.8.5. Ship graphics target: DesktopGL|WindowsDX. Spike targets evaluated: DesktopVK|WindowsDX12|none. Content: MGCB|Content Builder lab. Native backend acknowledged; migration not implied by NuGet bump alone. Evidence:
monogame_385_upgrade_receipt_v1.json. Owners: shipname, spikename.
Common mistakes
- Swapping PackageReferences on the Steam branch because Discord said Vulkan. Fix: spike folder.
- Skipping classic 3.8.5 restore. Fix: M2 before M3.
- Migrating all content to Builder night one. Fix: one asset.
- Assuming DX12 equals Store readiness. Fix: separate GDK/packaging milestone.
- Ignoring driver/OS in the receipt. Fix: write them down.
- Mixing Unity CoreCLR panic into MonoGame night. Fix: different URLs — FEPM stays Unity.
- Calling DesktopVK “production default” in marketing. Fix: Foundation says eventual replacement over years.
- No fullscreen/audio regression after upgrade. Fix: M5.
Discord / stand-up brief
MonoGame 3.8.5 keep/hold — Aug 2026 Monday ritual
- Ship target: DesktopGL / WindowsDX (unchanged / patched)
- Spike: DesktopVK / DX12 / none — result KEEP/HOLD/REWRITE
- Content: MGCB stay / Builder hello OK/FAIL
- Gates M1–M6: ____
- Blockers: packages / drivers / ____
- Receipt: monogame_385_upgrade_receipt_v1.json
- Owners: ship ____ / spike ____
- Ship csproj: untouched
Post in the channel that owns C# framework upgrades. If DesktopVK ran, add the honesty one-liner from the Monday ritual section so marketing does not invent “Vulkan default” mid-sprint.
Monday ritual - August DesktopVK keep/hold (90–120 minutes)
Use this when the board says “MonoGame Vulkan this week” and nobody owns the spike folder yet.
- Block 90–120 minutes on a weekday morning — not after a Steam build crunch.
- New spike repo only — never edit ship
PackageReferencelines first. - M1–M2 — ShipSafeSample on DesktopGL / classic target restores and runs on 3.8.5.
- M3 — separate DesktopVK (and optional DX12) project; window + input smoke.
- M4 — Content Builder one-asset hello or explicit MGCB-stay decision.
- M5 — fullscreen + audio exit regression card (and pads if relevant).
- M6 + Discord — keep / hold / rewrite with ship vs spike owners, then paste the brief above.
- Stop — do not migrate all content to Builder or promise Vulkan marketing the same night.
Pass: receipt JSON saved, Discord brief posted, ship csproj untouched.
Fail: “NuGet bumped on ship” with no spike folder, or DesktopVK marketed as production default without M3 stills.
Paste this one-liner after the brief if DesktopVK ran:
Honesty: DesktopVK ≠ ship default yet — 3.8.5 spike only; DesktopGL/WindowsDX stays ship until 3.8.6+ diligence (Aug 2026).
How this differs from nearby URLs
| URL | Owns |
|---|---|
| This article | MonoGame 3.8.5 backends + Content Builder keep/hold |
| Unity 6.5 BIRP playbook | Unity editor/pipeline deprecation |
| FEPM / CoreCLR | Unity Play mode statics |
| AI engines listicle | Broad engine matrix (mentions MonoGame briefly) |
| AutoRemesher evening | Art remesh — not C# frameworks |
csproj cheat sheet (copy from official blog)
DesktopVK (experiment)
<PropertyGroup>
<MonoGamePlatform>DesktopVK</MonoGamePlatform>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="MonoGame.Framework.Native" Version="3.8.*" />
<PackageReference Include="MonoGame.Runtime.Mac.Vulkan" Version="3.8.*" />
<PackageReference Include="MonoGame.Runtime.Linux.Vulkan" Version="3.8.*" />
<PackageReference Include="MonoGame.Runtime.Windows.Vulkan" Version="3.8.*" />
</ItemGroup>
Include only the runtime packages you need for the host you are smoking; restore will tell you quickly if you over-referenced.
WindowsDX12 (experiment)
<PropertyGroup>
<MonoGamePlatform>WindowsDX12</MonoGamePlatform>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="MonoGame.Framework.Native" Version="3.8.*" />
<PackageReference Include="MonoGame.Runtime.Windows.DX12" Version="3.8.*" />
</ItemGroup>
Pin exact versions in ship receipts once you leave 3.8.* floating ranges.
NuGet pinning policy (studio hygiene)
Floating Version="3.8.*" is fine on a spike so you can chase patch builds during the evening. Ship branches should pin exact versions (for example 3.8.5.x once restore resolves) and commit a packages.lock.json or equivalent if your org requires reproducible restores.
| Lane | Version style | Why |
|---|---|---|
| Spike / lab | 3.8.* ok |
Faster iteration while reading release notes |
| Ship | Exact pin | Reproducible Steam/Microsoft builds |
| CI | Exact pin + cache | Fail closed on surprise restores |
When 3.8.6 drops, open a new spike — do not silently float ship into hardening builds without M1–M6 again.
Local multiplayer and input smoke (15 minutes)
3.8.5 extends GamePad support up to 8 controllers (blog). If your jam or couch title cares:
- Enumerate pads at startup; log count to the console.
- Move two players for thirty seconds.
- Hot-plug one pad if you claim hot-plug support (only if you already document that behavior).
- Note any mapping regressions in the receipt
notesfield.
Solo games can mark this N/A — still run the fullscreen and audio exit checks in M5.
Content Builder sketch (lab only)
Conceptual shape from the Foundation sample (blog):
using Microsoft.Xna.Framework.Content.Pipeline;
using Microsoft.Xna.Framework.Content.Pipeline.Processors;
using MonoGame.Framework.Content.Pipeline.Builder;
var builder = new Builder();
builder.Run(args);
return builder.FailedToBuild > 0 ? -1 : 0;
public class Builder : ContentBuilder
{
public override IContentCollection GetContentCollection()
{
var content = new ContentCollection();
content.Include<WildcardRule>("Font/*.spritefont");
content.Include("splash-screen.png");
return content;
}
}
Wire the console project to run before your game project in CI only after M4 is green three nights in a row.
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
| Restore fails on Native packages | Wrong package ID / offline cache | Copy IDs from official blog; clear NuGet cache |
| Window never appears (VK) | Driver / missing runtime package for OS | Install vendor Vulkan; add correct Runtime.* package |
| Content missing at runtime | MonoGamePlatform mismatch | Align property with runtime packages |
| Ship broke after “quick bump” | Edited ship csproj | Revert; use spike |
| Audio crash on exit | Old bits | Confirm 3.8.5 packages actually restored |
| Template not found | Templates not installed | Install MonoGame templates; retry dotnet new |
Roadmap honesty (do not overclaim)
- 3.8.6 — Foundation: harden new targets + maintenance (blog).
- 3.9 — fonts, unified shader compiler, native mobile, refreshed saves — plan, not tonight.
Your receipt should say whether you are waiting on 3.8.6 before DesktopVK ship consideration.
Receipt schema - monogame_385_upgrade_receipt_v1.json
{
"schema": "monogame_385_upgrade_receipt_v1",
"date": "2026-08-03",
"project": "",
"monogame_version": "3.8.5",
"ship_target": "DesktopGL|WindowsDX|other",
"spike_targets": [],
"decision": "keep|hold|rewrite",
"decision_reason": "",
"content_path": "mgcb|content_builder_lab|mixed",
"os": "",
"gpu_driver_notes": "",
"gates": {
"M1_ship_untouched": false,
"M2_classic_385_ok": false,
"M3_new_target_smoke": false,
"M4_content_path_decided": false,
"M5_regression_notes": false,
"M6_receipt_saved": false
},
"desktopvk_ok": false,
"windowsdx12_ok": false,
"content_builder_hello_ok": false,
"owners": {
"ship_platform_owner": "",
"spike_platform_owner": ""
},
"monday_ritual": "ShipSafeSample → DesktopVK lab → Content decision → Discord paste",
"discord_paste_posted": true,
"notes": "",
"monogame_385_upgrade_ok": false,
"verified_at": ""
}
Set monogame_385_upgrade_ok true only when M1–M6 pass and the written decision matches reality.
Key takeaways
- monogame 3.8.5 is a native-backend + new-target release — still August upgrade diligence, not a tiny patch.
- Ship usually keeps DesktopGL/WindowsDX; spike DesktopVK/DX12 on a separate folder.
- Content Builder is early — one-asset lab, not a full MGCB deletion.
- Gates M1–M6 +
monogame_385_upgrade_receipt_v1.jsonbeat Discord package dumps. - ARM packages expand who can build; they do not replace x64 CI.
- Watch 3.8.6 before promising Vulkan as default.
- QoL fixes (fullscreen, audio exit, 8 pads) alone can justify a careful 3.8.5 bump on classic targets.
- Run the Monday ritual when the board schedules “MonoGame Vulkan week” without a spike owner.
- Do not confuse this with Unity 6.5 BIRP or FEPM.
- Cite the Foundation 3.8.5 post when package IDs drift.
FAQ
Should I upgrade to MonoGame 3.8.5 right now?
If you need the bugfixes on DesktopGL/WindowsDX, bump carefully on a branch. If you only want DesktopVK marketing, spike first — do not swap ship packages tonight.
Is DesktopVK ready to replace DesktopGL?
Foundation intent is eventual replacement; 3.8.5 presents it as the new path with performance roughly comparable, improving over years (blog). Indies should treat it as adopt-candidate after spike, not automatic default.
What is WindowsDX12 for?
A D3D12 Windows target aligned with Xbox-shared code and Microsoft Store / Game Pass adjacency. Still requires your own packaging/cert plan.
Do I have to use the new Content Builder?
No. It is a first release. Keep MGCB on ship until Builder CI is boring.
Does 3.8.5 require ARM hardware?
No. ARM packages are additive accessibility.
How is this different from Unity 6.5 keep/hold?
Different stack. Unity playbook owns BIRP/LTS decisions; this URL owns MonoGame backends and Content Builder.
Where should beginners start if they are new to MonoGame?
Classic DesktopGL template on 3.8.5, then optional DesktopVK lab — not three backends in one weekend.
Next steps
- Run ShipSafeSample on 3.8.5; flip M1–M6; paste Discord.
- If you also maintain Unity projects, keep engine nights separate (Unity 6.5 playbook).
- For C# agent workflows in other engines, see Unity CLI — not a MonoGame substitute.
- Cross-framework cousin nights stay separate: Defold 1.13.1 lights (Lua lights), FEPM / CoreCLR (Unity Play mode).
- Skim framework context in the AI-powered engines listicle only as discovery — this page owns the 3.8.5 decision.
- Re-read the Foundation 3.8.5 post and GitHub v3.8.5 when package IDs update.
- File the receipt before anyone merges spike refs into ship.
Conclusion
MonoGame 3.8.5 still matters in August 2026: a native backend and new DesktopVK / WindowsDX12 targets without pretending NuGet bumps erase ship risk. Run the Monday ritual, keep DesktopGL/WindowsDX boring on ship, spike Vulkan on a lab folder, prove one Content Builder asset or stay on MGCB, fill M1–M6, paste Discord, then let humans own the merge. Bookmark this keep/hold beside the Foundation announcement and keep the receipt where producers can find it.
A native backend is a gift when your ship target stays boring. This evening is how you keep ship boring on purpose.