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
Posts by
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
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
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
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
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
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
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
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
"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
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
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
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
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
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
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
🐛 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
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
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
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
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
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
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
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
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
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
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
Found something cool today. You can just do this now in C# 14.
You can use the null-conditional operator on the left side of an assignment. Writing instance?.Property = value is perfectly valid in .NET 10.
No more null checks.
#dotnet #csharp
I will admit it: I am late to the Microsoft Applied Skills party.
But the shift in 2026 is undeniable. No more multiple choice guessing. You get a live lab environment and a clock.
Lab based validation beats theory every single time.
#dotnet #azure #ai #learning
Stop letting your JSON serializer dictate your object's design.
Using a private [JsonConstructor] + a Static Factory method ensures your domain objects stay valid while keeping the serializer happy.
Encapsulation > Public everything.
#dotnet #csharp #programming #clean-code