Trending

Latest Posts by

Preview
Automate Block Translations in Optimizely CMS | Developer Guide Stop manual block-by-block translations. Learn how to use the TranslateOrCopyContentAreaChildrenBlockForTypes config to automate Optimizely CMS content workflows.

Stop manual block-by-block translations in Optimizely!

Learn how to use the TranslateOrCopyContentAreaChildrenBlockForTypes config to automate workflows & level up the Editor Experience.

Read more: stuartgreig.dev/blog/automat...

#Optimizely #CMS #Automation #DXP

23 hours ago 0 0 0 0
Monitoring Kubernetes Pod Restarts with Grafana and Telegram Is your cluster suffering in silence? Learn how to move beyond basic Kubernetes self-healing by configuring Grafana alerts and Telegram notifications to catch pod restarts

Kubernetes "self-healing" is a dream until it hides a production-melting bug in plain sight.

I’ve just posted about moving beyond silent restarts with Grafana and Telegram alerts

Read more: stuartgreig.dev/blog/monitor...

#Kubernetes #DevOps #Grafana #SRE

2 days ago 1 0 0 0

Migrating to #dotnet 10? Watch out for Microsoft.Testing.Platform breaking changes!

MSTest now requires:
EnableMSTestRunner=true
TestingPlatformDotnetTestSupport=true
--report-trx no longer works (it's now output verbosity!)

Took hours to figure out. You're welcome.

#dotnet10 #MSTest #DevOps

3 days ago 1 0 0 0
Post image

You don't need an audio file to create a metronome click!

Built this entirely with Web Audio API oscillators.

5 lines of code, exponential envelope, zero file overhead.

Here's how:

#WebAudio #JavaScript

4 days ago 1 0 0 0
Post image

Cool trick: How to make ONE drum sample sound like TWO different drums

I played with playbackRate in Web Audio API and it's surprisingly effective at making different tones

No expensive sample libraries needed! 👇

#WebDev #Audio #JavaScript

5 days ago 0 0 0 0

Optimizely CMS 13 is officially here and it’s a total shift in the DX landscape.

✅ .NET 10 Upgrade
✅ Visual Builder as default
✅ Graph-powered Content Manager
✅ Figma-to-Code workflows

It’s the ultimate win for the Editor Experience.

#Optimizely #CMS13 #DotNet #WebDev

5 days ago 1 0 0 0

Dev by trade, but a massive advocate for the Editor Experience. To build better tools, you must know how they’re managed.

Thrilled to be 4x @Optimizely Certified:
✅ SaaS CMS Admin
✅ DXP Admin
✅ Experimentation Mgr
✅ CMP Admin

#Optimizely #Certification #DXP

6 days ago 1 0 1 0
Advertisement
Post image

Building a drumming app taught me: JavaScript timers SUCK for audio.

After 30 seconds at 180 BPM, setInterval drifts noticeably off-tempo.

The fix? Web Audio API's "schedule ahead" pattern. Here's how it works: 🧵

#WebAudio #JavaScript #WebDev

6 days ago 2 0 0 0
Post image

You can now add operators to classes you didn't write.

Want to "add" two Workshop objects or combine Paths with a +? Use static extension operators in .NET 10.

#SoftwareEngineering #DotNet10 #DotNet

1 week ago 2 0 0 0
Post image

Stop scrolling through thousand-line event logs.

Sort your Kubernetes events by timestamp to see exactly what just broke. It’s the fastest way to spot a CrashLoopBackOff or a failed mount.

#k8s #cloudnative #Kubernetes

1 week ago 2 0 0 0
Post image

Stop repeating this!
Use Extension Blocks to group all your logic for a specific type. It’s cleaner, more organized, and supports properties + operators too.

#dotnet #csharp #codingtips

1 week ago 1 0 0 0
Post image

Just stumbled onto these built-in agents in VS2026. Not sure how long they’ve been hiding there, but the "Modernize" and "Debugger" agents seem really useful. If you haven't clicked that lightning bolt icon yet, you’re missing out. #VisualStudio #GitHubCopilot

1 week ago 2 1 0 0

"Stop hardcoding Schema.org JSON-LD in templates. We made structured data a first-class CMS property in Optimizely with custom PropertyList types. Content editors manage SEO data, API consumers get validated JSON. Win-win #SEO #dotnet #optimizely

1 week ago 0 0 0 0

Securing @Umbraco media doesn't need a plugin.
We just implemented a custom .NET middleware that intercepts all /media requests. If the request is missing our custom auth header, it's an immediate 401.

Clean, fast, and keeps the private assets private.
#umbraco #dotnet #security #webdev #backend

1 week ago 0 0 2 0
Post image

Redis and Distributed Sessions is the only way to load balance properly.
Stop pinning users to a single server and start scaling horizontally.

#redis #backend #dotnet #infrastructure

1 week ago 0 0 0 0
Preview
Building Rudiment Roulette: A Deep Dive into Modern Web Audio with .NET 10 and Vue 3 Learn how to build a precision drumming app with .NET 10 Minimal APIs and Vue 3. Master Web Audio API scheduling, pitch shifting, and reactive state management.

Rudiment Roulette is live!

I combined my love for drumming with some serious tech: Web Audio API, Vue 3, and .NET 10.

Check out the build here: stuartgreig.dev/blog/rudimen...
#dotnet #vue #drumming

2 weeks ago 0 0 0 0
Home Posted by Stuart Greig on March 19, 2026

Don't miss a single update from stuartgreig.dev
Get the latest posts delivered straight to your inbox.

Sign up here:
🔗 stuartgreigdev.beehiiv.com?modal=signup

2 weeks ago 0 0 0 0
Advertisement

Found something cool today. I am moving more of my Kubernetes workflow into VS Code using the Kubernetes Tools extension.
It handles cluster navigation, log streaming, and resource editing without constant context switching to the CLI.
#kubernetes #k8s #vscode #devops

2 weeks ago 2 0 1 0
Preview
Migrating Legacy Password Hashes: The Fallback Password Hasher Pattern When migrating an existing application to ASP.NET Core Identity, you often face a critical challenge: your users' passwords are hashed using a legacy algorithm that differs from Identity's default…

Following on from my post about migrating legacy hashes, I have published a full technical breakdown on the blog.

stuartgreig.dev/blog/migrati...
#dotnet #csharp #identity

2 weeks ago 0 0 0 0

🐛 Debugging tip: If Vimeo iframes are breaking your browser back button, check your GTM tags.
We found a tag adding `player_id` params that were polluting browser history.
One disabled tag later = problem solved! ✅

#webdev #debugging #GTM

2 weeks ago 0 0 0 0

Need to process data in batches?

Forget the complex math. Use .Chunk() in LINQ:
1) Takes an IEnumerable
2) Splits it into fixed-size arrays
3) No external libraries needed

#dotnet #codingtips

2 weeks ago 0 0 0 0

Container stuck in CrashLoopBackOff?

Running kubectl logs <pod> usually shows nothing because the new container hasn't crashed yet.

The real hero:
kubectl logs <pod> --previous

See exactly why the last one died.

#Kubernetes #K8s #DevOps

2 weeks ago 2 0 0 0

Kubernetes Secret Store gotcha that caught me out this week.
Updating a secret in Azure Key Vault doesn't automatically update your Pod. It'll cache the old value forever unless you:
1️⃣ Enable --enable-secret-rotation
2️⃣ Use 'Reloader' to trigger a rolling restart
Stop manual restarts!

#Azure #K8s

3 weeks ago 0 0 0 0

Giving the @Optimizely CMS 13 Preview a spin. 🎡

First impressions:
✅ Smooth upgrade path from v12
✅ Clean modernization of the stack
✅ Docs are already spot on

Jump in early:
docs.developers.optimizely.com/content-mana...

#CMS13 #Optimizely

3 weeks ago 0 0 0 0

Stop blindly trusting reCAPTCHA v3 success: true.

That only tells you the token is valid, not that the user is human.
To kill the bots, your backend needs to:
Check the score (0.0-1.0)
Verify the action name
Set your threshold to 0.5 and adjust.
#dotnet #webdev #security #reCAPTCHA

3 weeks ago 0 0 0 0
Advertisement

Stop using OrderBy(x => Guid.NewGuid()) to shuffle arrays

In .NET 8+, Random.Shared.Shuffle() is the native, zero-allocation way to handle it. Faster, cleaner, and built-in. #dotnet #csharp

3 weeks ago 4 1 1 0
Post image

Converting human-readable durations to ISO 8601 format in C#. Handles "2.5 hours" → "PT2H30M", "3 days" → "P3D". Perfect for Schema course durations, video metadata, or API responses that need proper duration formatting #csharp

3 weeks ago 2 0 0 0
Post image

Simple extension to validate absolute URLs vs relative paths. The file scheme check prevents false positives from file:// URIs on Linux systems.#csharp #dotnet #webdev

3 weeks ago 1 0 0 0

I have been using keyset pagination in EF Core for our larger tables and the speed difference is undeniable. Offset pagination is fine for small sets where you need to jump to a specific page. But for high volume data where you just go next or back keyset is much more stable and fast
#dotnet #efcore

3 weeks ago 0 0 0 0
Post image

Migrating to .net Core Identity without forcing password resets?
Use a FallbackPasswordHasher which extends PasswordHasher<TUser> to
> Verify legacy HMACSHA512 hashes
> Return SuccessRehashNeeded for auto-upgrade
> Seamlessly migrate users on next login
No need to reset passwords

4 weeks ago 0 0 1 0