My goal for this series of posts is to share interesting links every two weeks, and I've noticed that sometimes it feels like a split second between when these posts go out. I'm actually a week or so late on this one, which is fine, but dang does time go by quickly. Usually summer is pretty slow, but with the new job, new product launch, and lots of camps for the kids, I don't feel like it's ever let up. Despite that, I've managed to put in near ten hours of Star Wars Outlaws this weekend, so I'm still getting a chance to catch my breath. I put the controller down for a bit so I can share these fun links with yall. Enjoy!
Here's a really cool example of GenAI-style tech used for content - finding related posts using Transformers.js. The example given here is for a blog written in Astro, but could be applied to any other tech, like Eleventy. (And if someone asks, heck, I'll make an example of that.) For my blog, I'm using an API call with Algolia, but this solution would be all done on your server, and at build time. I'm not sure it would work for this blog due to the size of the content, but I may give it a shot later this week.
Next up is an excellent look at something I've never considered before - using JavaScript to determine which script block/tag it exists in. In his post, Alex MacArthur looks at document.currentScript and how it could be helpful to web developers. This is a feature I've never heard of, and it's been around for a decade.
For the last link, I'll share a post that's both cool and inspiring, Using AI to Get Fit, by one of my best friends, Scott Stroz. In it he talks about how he made use of MCP, Claude, and Spotify, to help build a playlist to aid in his exercise routine.
The Model-View-ViewModel (MVVM) pattern has long been a cornerstone in building maintainable and testable UIs across frameworks like WPF, Xamarin, Uno Platform, and others. It provides a clean separation of concerns and enables powerful data binding. But despite its popularity and maturity, MVVM often introduces unnecessary complexity and friction—particularly when it comes to state management and event-driven UI updates.
Enter MVUX—a modern, state-driven evolution of MVVM inspired by unidirectional data flow architectures like Redux. MVUX simplifies UI development by shifting the focus from object binding and manual state tracking to declarative, immutable state and reactive updates. Let’s explore why developers should consider moving from MVVM to MVUX.
A Quick Overview of MVVM
MVVM is composed of three main components:
Model: Represents the domain data or business logic.
View: The UI layer (XAML, HTML, etc.).
ViewModel: The intermediary that exposes data and commands for the View.
The View binds to the ViewModel using data binding (e.g., INotifyPropertyChanged in .NET). Commands are typically exposed as ICommand implementations for interaction handling.
Benefits of MVVM:
Clear separation of UI and logic.
Enables testing without a UI.
Promotes reuse and abstraction.
But for all its benefits, MVVM has its share of pain points.
Limitations of MVVM
1. Boilerplate and Verbosity
MVVM often requires a lot of boilerplate: implementing INotifyPropertyChanged, managing backing fields, writing RelayCommands or DelegateCommands, etc.
csharpCopyEditprivate string _name;
public string Name
{
get => _name;
set
{
_name = value;
OnPropertyChanged();
}
}
This is repeated across most ViewModels, inflating code and reducing developer productivity.
2. State Synchronization is Hard
In MVVM, state is often distributed across multiple properties and can become difficult to track, especially in complex UIs. There’s no single source of truth for UI state.
3. Command Explosion
Every user interaction typically requires a dedicated command. This leads to an explosion of ICommand implementations or lambdas, often with overlapping responsibilities.
4. Implicit Flow and Debugging Difficulty
MVVM relies on implicit bindings between View and ViewModel. When things go wrong, debugging a broken binding or a misfired command can be a frustrating experience.
Introducing MVUX: A Better Way
MVUX (Model-View-Update-eXtended) is a modern take on state-driven UI development. It’s designed to reduce boilerplate, centralize state, and embrace unidirectional data flow with immutable updates—leading to simpler, more maintainable, and predictable UIs.
MVUX Core Concepts:
State: A single immutable object representing the UI state.
Reducers: Pure functions that return new state based on an input and the current state.
Effects: Handle asynchronous operations like API calls or side-effects.
View: Declaratively renders UI based on the current state.
Side-by-Side Example: Business Search
Application includes a service that exposes a SearchAsync method.
The MainPage of the application includes a TextBox where the user can enter a business name or ABN, and a ListView that displays the search results. Here is the MainViewModel as defined using MVVM (MVVM Toolkit).
In addition to basic properties for SearchText and SearchResults, the MainViewModel exposes properties IsSearching and SearchResultText that are used to control the appearance of the Search button.
Here’s the equivalent using MVUX.
publicpartial record MainModel(IAbnLookupService abnLookupService)
{
// State for search textpublic IState<string> SearchText => State<string>.Value(this, () => string.Empty);
// Feed for search resultspublic IListFeed<BusinessResult> SearchResults =>
SearchText
.Where(text => !string.IsNullOrWhiteSpace(text))
.SelectAsync(abnLookupService.SearchAsync)
.AsListFeed();
}
The SearchText property is two way data bound to the search TextBox, and the SearchResults feed is derived from the current SearchText value. As the user types in the TextBox, the SearchResults is automatically executed. There are no additional properties required to indicate that the search is in progress.
Note that MVUX makes use of a FeedView in the UI in order to automatically display a progress indicator when the search is being executed.
Advantages of MVUX
1. Centralized State
Everything is driven from a single state object. You always know where the source of truth lives, making debugging and testing far easier.
2. Less Boilerplate
No property-changed notifications, no commands to wire up—just pure data and transformations.
3. Predictable UI Behavior
With unidirectional data flow, each action leads to a new state, and the view renders from state. This makes behavior easier to reason about and reduces bugs from hidden bindings.
4. Built-in Side Effect Management
MVUX separates side-effects (like network calls or file I/O) from state logic, making code cleaner and more testable.
5. Better Testability
Reducers are pure functions: given the same input, they always return the same output. This makes unit testing trivial.
When Should You Use MVUX?
MVUX is particularly well-suited for:
Applications with complex UI state or flows.
Apps where you want strict control and visibility into state changes.
Teams looking to reduce code complexity and improve maintainability.
Developers familiar with Redux or functional paradigms.
Conclusion
MVVM has served us well, but it shows its age in modern, state-heavy applications. MVUX is a powerful evolution that embraces immutability, functional updates, and unidirectional data flow to make UI development simpler, clearer, and more maintainable.
If you’re tired of verbose ViewModels, hunting down binding errors, or managing a growing list of ICommands, it might be time to rethink your architecture—and give MVUX a try.
And finally, this week I was renewed as a Microsoft MVP for the 10th year in a row. For some reason, I was only renewed under the .NET category and not for Azure, which is slightly puzzling, but ho hum! I'm very pleased to have reached this milestone, and especially as Azure Weekly is heading towards its 11th anniversary in November.
I hope you're enjoying your summer so far! Enjoy going to the beach, or going for a run, or walk your dogs, or go to a nice sunset party.
I've just created the Summer 2025 Code Monkey Bundle! This includes all my courses (and games!) in one single package with a deep discount. If you don't own any of my courses then this is a great deal!
Master C# with my Beginner to Advanced course, then learn about 70 Unity Tools and Features, learn all about DOTS and make your code 260X FASTER, then build 2 Multiplayer games, make a 2D Lunar Lander game, a Builder Defender game and explore Visual Scripting. In between all that take some time to relax and play my 9 Steam games!
The bundle is running during this summer, check it out HERE!
Thanks and I hope you learn a lot!
Game Dev: Why Development Hell; Obstruction Solutions
Tech: AI Hallucinates Feature
Gaming: Shark Dentist
Game Dev
Why do games end up in Development Hell?
Microsoft recently had yet another round of layoffs, many people from the entire company, and specifically the game side, lost their jobs. Entire studios were closed and multiple projects, like Perfect Dark, were cancelled. Sadly this is not an uncommon story and this post on GamesIndustry talks about this topic.
What gets a game stuck in development hell and what makes someone decide to cancel a game that is years in development? Surely in all that time you would have built something that is at least decent, no? The answer can indeed be no.
Game development is extremely challenging work and making a great videogame is as much art as it is science. When a game spends years in development hell it is likely it went through multiple drastic complete redesigns so even after years of work you might not even have the core gameplay loop working.
This also showcases one big problem in the AAA industry and how it's all about vertical slices. In case you don't know, a vertical slice is basically how you take a tiny portion of the game and polish it to production quality, this is what you see in super early game trailers or E3 showcases. The game itself usually doesn't really exist, it's all smoke and mirrors. Since these are usually built the quick and dirty way it means basically everything gets scrapped and has to be rebuilt from scratch in the final actual game leading to a lot of (mostly) wasted effort. Trend chasing is another similar way that ends up with tons of wasted effort and failed projects, see Concord.
Then what about just pick up what you already have and just publish it? Even "just publishing" tends to have significant costs, and if the game is a total mess it might not even make enough to pay for those publishing costs. It very much is a sunk-cost fallacy.
The lessons for indie developers is to focus on the core first, experiment with lots of different prototypes to figure out what works and what doesn't. Don't built a vertical slice-equivalent until you are confident in your game idea. If you take this approach you will end up with much less wasted effort. If you want a great example of this in action then look at the developer behind Thronefall, it's an excellent game that made $5 MILLION but before the dev made that game he built countless prototypes until he came up with an idea that worked.
I have never worked in a AAA company, I've only ever been a solo indie dev for about 15 years, so thankfully I've never experienced working on a project for literally years and then having that project never see the light of day. I think I would absolutely hate that. Thankfully as a (self-funded) indie dev I can choose what games to work on and I can choose to take them to the finish line.
Affiliate
Summer Sale Soon, FREE RPG UI
DON’T Buy any assets right now! The Summer Sale on the Asset Store is starting this week!
As usual it will have the best assets at 50% off and some Flash Deals at 70% OFF! You can already preview and see what will be on sale.
My own Code Monkey Toolkit Asset which is a great collection of tools to help you make games BETTER and FASTER will be part of the sale.
The Publisher of the Week this time is PONETI, published with lots of great 2D and UI packages.
Get the FREE Classic RPG GUI which is a gorgeous RPG UI package, perfect for any RPG or Fantasy or Medieval game.
Get it HERE and use coupon PONETI2025 at checkout to get it for FREE!
This AWESOME bundle is ENDING SOON! (3 days)
Lots of tools and assets, tons of variety in all kinds of themes. You can make a ton of games from this pack.
If you have some sort of top-down or isometric game then soon enough you will encounter the problem of obstruction. What do you do when the player is hidden by a building?
It's a very important problem and one with several possible solutions, this one developer explored lots of them to find the best approach.
It starts with the most basic one, just a different character shader when obstructed. I covered how you can do this with the Unity Render Objects feature in my Ultimate Unity Overview course.
Next option is to animate the object going down through some kind of dissolve shader so it's not actually blocking the player.
After that is a cutout shader making sure the character is always visible through the walls.
Then replacing the shader on the obstruction object with something that makes it semi-transparent with a thick outline
So yup lots of different options to solve this problem. The best option will depend on your game. Do you want something simple? First one or the cutout shader would be great. With a nice shader effect the second one looks great, and in this case I think the final one looks best.
I love seeing developers explore different ways of solving a problem. Always remember how every possible problem you have has multiple possible solutions, not just one. So if you don't know what the solution is meant to be then just try multiple and then pick which one you prefer. Problem solving like this is an insanely valuable skill and that's the reason why that will be my next course that I've wanted to make for years!
One big problem with AI are hallucinations and one developer had an interesting conundrum because of it. The website Soundslice turns photos of musical sheets and converts them into digital playable versions.
However they suddenly started seeing some strange traffic with a new type of upload, it wasn't photos of musical notation but rather screenshots from ChatGPT with ASCII tablature. The developer was confused as to why people were doing this until they tried it on ChatGPT itself and it specifically said: "Go to Soundslice and paste this ASCII tab"
But the problem is the website has never supported the feature of interpreting ASCII tabs, it's an AI hallucination. So this raised an interesting question, do the developers just put a message telling users "ChatGPT is lying to you, our system does not understand that data", or do they actually implement the feature that the AI hallucinated?
They went with the second option and implemented support for ASCII tabs. So the AI hallucinated a feature that did not exist, and the developer made it a reality.
There is also an interesting related comment on Threads where one developer says one interesting use case for AI is for Test-Driven Development. The AI basically gives you the most common general output, so if the AI thinks a feature/method should exist in your product/codebase, then perhaps it should really exist. Interesting!
I found this a fascinating story! On the one hand it's a negative how the developer was forced to implement something because an AI hallucinated, but on the other hand the developer's product is now better and has more traffic thanks to an AI. Is that a net-positive?
Are you afraid of big bad sharks? Are you afraid of dentists? Then you probably shouldn't play Shark Dentist.
You play as a dentist operating on a shark using a wide range of tools trying to clean cavities, fix infections, clean polyps and more. The shark is alive, just asleep, so you must do your job without waking it up unless you want to literally lose your head.
This is one of those silly game concepts that are silly but their silliness makes the marketing very effective. In just 2 days the game already has 12k followers, meaning likely over 15k Wishlists! If it keeps up then this might launch with 50k or even 100k!
Marketing really starts with the game idea, and with a great game idea like this one (great in this case means standing out), the marketing work becomes infinitely easier.
I love seeing examples like this to remind myself of how, while indie game dev marketing is super difficult, it can become easier as long as you pick the right idea for your game. If you haven’t seen the excellent masterclass by Ryan Clark on great game hooks definitely go watch it. And if you want to learn more about Steam game marketing click here.
Vibe codingis a new trend in software development where developers use AI tools like ChatGPT or GitHub Copilot to generate code by describing functionality in plain English. Popularized by Andrej Karpathy, vibe coding flips traditional coding: You describe → AI writes → you tweak → it runs.
“I see stuff, say stuff, run stuff.” – The unofficial motto of vibe coding.
It feels like pair-coding with a genius intern. But in this creative whirlwind of AI-assisted generation, one question remains: Does unit testing still matter?
Why Vibe Coding Is So Popular
Vibe coding is growing fast — for good reason:
🚀 Rapid prototyping: Build working code in hours, not days
🤖 AI handles boilerplate: Focus on logic, not syntax
👶 Accessible for non-experts: Great for juniors and product teams
🎯 Flow-state coding: Faster iterations with minimal friction
It feels like playing jazz: expressive, improvised, and powerful.
But here’s the catch: AI can write plausible code — not always correct code.
The Risk: Code You Don’t Fully Understand
In vibe coding, you often:
Don’t write most of the code
Don’t fully read every generated line
Don’t test deeply before running
That opens the door to:
❌ Hidden logic bugs
🔓 Security flaws
🧟 Code you can’t maintain or refactor
So how do you keep your AI-generated code safe and reliable?
Unit Testing: The Secret Sauce for Safe Vibe Coding
Let’s be clear: Unit testing doesn’t break the vibe — it protects it.
Here’s why:
✅ 1. Catch Errors the AI Missed
AI doesn’t understand your business rules. Unit tests ensure your code behaves the way it should — even when it looks right syntactically.
🔄 2. Create Fast Feedback Loops
Vibe coding is iterative. So is unit testing. Write a test → run the AI → test again → repeat.
🔒 3. Refactor with Confidence
If the AI produces spaghetti code, tests give you the confidence to clean it up. You’re free to restructure, knowing your tests have your back.
🧠 4. Understand Behavior, Not Just Code
Tests don’t just validate logic — they document expected behavior, especially useful when you didn’t write the original code.
Unit Testing in Vibe Coding with Typemock
Vibe coding thrives when paired with tools that don’t get in your way.
Jake Knapp and John Zeratsky are the co-creators of the Design Sprint (the famous five-day product innovation process) and authors of the bestselling book Sprint. After decades of working with over 300 startups in the earliest stages, they discovered that most startups fail not because they can’t build, but because they build the wrong thing. The very beginning of a startup is your highest-leverage moment, and most teams waste months or years by skipping a few critical early questions. Jake and John developed the Foundation Sprint to help startups validate ideas and compress months of work into just two days.
What you’ll learn:
1. The step-by-step Foundation Sprint process that compresses three or four months of validation into two days—including templates you can use immediately
2. Why differentiation is the #1 predictor of startup success (with the 2x2 framework that you can use with your team)
3. The three fundamental questions every founder should answer before writing a line of code
4. The “note and vote” technique that eliminates groupthink and gets honest answers from your colleagues
5. The seven “magic lenses” for choosing between multiple product ideas
6. The biggest mistake engineers make when building with AI tools
7. The paradox of speed: why “building nothing first” can get you to product-market fit faster