Fritz has a new website he's building for work, and inviting you to join in. We're going to build a site about Modern C#
Fritz has a new website he's building for work, and inviting you to join in. We're going to build a site about Modern C#
I can’t think of a better time than around WWDC to be diving back into the world of Apple as a developer. There is a huge flurry of fascinating blogs, code labs, and opinion pieces coming from all over the iOS developer community. I truly have loved taking it all in this week, though of course the hard part is distilling that down into just one newsletter.
With macOS 27 hitting the end of the line for Intel-based Macs, I can’t help but look back at my ever-growing collection of old Apple hardware. From the 2013 Mac Pro “Trash Can” that I still use as a dedicated machine for OBS and video rendering to the G5 Power Mac I was only recently using as a Minecraft server. While these machines may have stopped getting official OS updates, it is the community that keeps this hardware alive. A massive shoutout to the OpenCore Legacy Patcher developers for keeping so many old Intel Macs alive and working for so long!
It is truly the end of an era across the board, especially with macOS 27 also quietly pulling the plug on AFP (Apple Filing Protocol) and vintage AirPort Time Capsules. Seeing a networking standard that dates back to System 6 finally get sunsetted really puts the march of time into perspective (even if I am deeply in love with my M4 Max Mac Studio).
Anyway, on with this week’s selection of news from across the iOS community!
– Zachary Powell
A real production crash, triaged in real time. Simon Grimm, creator of Galaxies.dev, shows how he uses Sentry to go from alert to hypothesis with stack traces, breadcrumbs, logs, tags, replays, and Seer. It’s a hands-on look at production monitoring for anything with real users.
The promise of a smarter Siri that can effortlessly parse personal context and act on voice commands is finally arriving. But what does that mean for our own apps? Jordan Morgan breaks down the essential APIs you need to know about to get your data ready. From lightweight App Entities and App Schemas to utilizing view annotations, Jordan explains how to structure your models so the system can understand them out of the box.
Group labs during WWDC are always packed with hidden gems and practical advice that do not always make it into the main video sessions. Anton Gubarenko attended a range of these group labs and has been putting together some fantastic, highly scannable transcripts of the Q&A sessions. He groups the answers by topic and adds clear context, making it much easier to find solutions for common development bottlenecks.
For years, checking the horizontal size class was the go-to shortcut to decide if our app was running on a phone or a tablet. But with recent updates allowing iPhone apps to be freely resized during desktop mirroring or inside iPad environments, those old assumptions are starting to break. Fatbobman breaks down why the traditional system traits we used to rely on are no longer suitable as a continuous width sensor. Instead, we need to shift our mindset toward adapting layouts to the actual available geometry of the view.
With the recent flurry of WWDC announcements, everyone is talking about the massive new headline features. Jacob Bartlett takes a completely different path, diving deep under the hood of the new release to figure out exactly how Apple managed to slice app launch times by a massive 30 percent. Using Instruments as his guide, Jacob walks through the core optimizations, structural adjustments, and profiling techniques that made this speed boost happen, giving us a fantastic masterclass in mobile performance tuning.
Swipe actions have been a staple of SwiftUI Lists for a long time, but what if you want to use them on custom cards, grid cells, or other standalone views? Majid Jabrayilov covers how to break swipe actions free from the constraints of List containers. He explores the underlying view modifiers and layout mechanics needed to build custom swipe gestures that feel completely native while giving you total design flexibility.
With agentic coding becoming a core part of the daily workflow in the new Xcode releases, the next logical step is teaching these agents how you like to write code. Antoine van der Lee walks through how to build a custom agent skill tailored for SwiftUI best practices. By defining explicit rules and architectural patterns, you can ensure your automated coding assistants generate clean, modern, and highly performant SwiftUI code that perfectly matches your team style guidelines.
Streaming live video via RTSP on iOS has always been a bit of a challenge since AVPlayer does not support it out of the box. Hariharan Jagan has put together a comprehensive guide exploring how to bridge this gap using AWS infrastructure. The project walks through setting up an end to end pipeline to ingest RTSP camera feeds and stream them reliably to an iOS client, making it a great reference if you are building apps for IP cameras, smart home integrations, or live monitoring systems.
I think we can all agree Apple embracing the “Crack Marketing Team” makes for a brilliant start to any keynote. Not to mention that seamless transition from cartoon to real life. Loved it!
Last week, at CSS Day, I presented on the topic of CSS Grid Lanes, an exciting new CSS layout feature coming to the web.
One part, which I didn't talk about during the presentation, is how alignment works in CSS Grid Lanes. The reason I didn't talk about it is that alignment is still being implemented in Chromium, and after some quick testing, I believe it's also not fully implemented in Safari.
In this article, let's quickly go over how alignment will eventually work in CSS Grid Lanes.
Like in other layout systems, there are two axes to consider when aligning items in Grid Lanes, and the way we refer to them isn't very intuitive, at least to me, so let's go over them quickly:
The grid axis
That's the axis along which the lanes are laid out. In a column-orientation grid lanes layout (and assuming a left-to-right, top-to-bottom writing mode), this axis is horizontal.
The stacking axis
That's the axis along which the items are stacked within a lane. In a column-orientation grid lanes layout (still assuming a left-to-right, top-to-bottom writing mode), that's the vertical axis.
This diagram of a column-orientation layout should help clarify the two axes:

Let's first align things along the grid axis. Sort of easy, because this works exactly the same as in a regular CSS Grid layout.
Who am I kidding though, who can even remember whether to use justify-* or align-*? Well, here it is:
justify-*.align-*.Said differently, use justify-* to align horizontally, and align-* to align vertically.
And then, it depends on what you want to do:
-content suffix for these properties.-items suffix (or the equivalent -self suffix on the individual items).For example, let's imagine a column-orientation layout, and let's say we want to align the entire set of grid lanes to the center of the container:
.layout {
/* Create the layout. */
display: grid-lanes;
/* Create the column lanes. */
grid-template-columns: 20rem 1fr 10rem 100px;
/* Center the set of lanes in the container. */
justify-content: center;
}

For a row-orientation layout, the equivalent would be to use align-content instead of justify-content.
Now, if you instead want to align each individual item within its lane, you would use justify-items. For example, to align items to the right (or end) of their lanes, you would do this:
.layout {
/* Create the layout. */
display: grid-lanes;
/* Create the column lanes. */
grid-template-columns: 20rem 1fr 10rem 100px;
/* Center the items in their lanes. */
justify-items: end;
}

To do the same in a row-orientation layout, you would use align-items instead of justify-items here.
Note that you can also use justify-self (or align-self in a row-orientation layout) on individual items to override the alignment for that specific item.
For example, let's say we want the first item to always stretch instead of being aligned to the right, we could do this:
.layout {
/* Same as above, aligning all items to the right */
display: grid-lanes;
grid-template-columns: 20rem 1fr 10rem 100px;
justify-items: end;
}
.layout > *:first-child {
/* Override the alignment for the first item. */
justify-self: stretch;
}
And we'd get this:

Now on to alignment along the stacking axis. This is where things will become more interesting because grid lanes has a magic feature that will allow you to fill leftover space, if any.
But first, let's review the alignment properties you'll be using along the stacking axis:
align-*.justify-*.Said differently, use align-* to align vertically, and justify-* to align horizontally. Hey, that's the same as for grid axis alignment! So, again, assuming left-to-right, top-to-bottom writing mode, always use align-* to align vertically, and justify-* to align horizontally.
Nothing too special here, this is similar to the other (grid) axis: you can align the entire layout within its container, along the stacking axis, if there's space to do so.
For example, to align a column-orientation layout to the center of its container, you would do this:
.layout {
/* Create the layout. */
display: grid-lanes;
/* Create the column lanes. */
grid-template-columns: 20rem 1fr 10rem 100px;
/* Center the layout vertically in the container. */
align-content: center;
}
Which would give you this:

For a row-orientation layout, the equivalent would be to use justify-content instead of align-content.
And now here is the really interesting part, aligning individual items along the stacking axis.
At first sight, this might seem surprising. After all, CSS Grid Lanes fills any available space along the stacking axis. That's the whole point, right? When a lane is shorter than the other lanes, the next item to be placed goes in that lane, filling the space. So, when can you end up with leftover space in a lane? Well, here are two ways:
When you start spanning items across multiple lanes, that might create gaps in the layout, where no items can be.

Once all items have been placed, you usually end up with a ragged end edge, with some lanes taller than others.

What stacking axis alignment allows you to do is fill that gap!
For example, in a column-orientation layout, with some gap above a spanning item, you could set align-items: stretch to force all items to fill the remaining space in their lanes:
.layout {
/* Create the layout. */
display: grid-lanes;
/* Create the column lanes. */
grid-template-columns: 20rem 1fr 10rem 100px;
/* Stretch items to fill their lanes. */
align-items: stretch;
}
.large-item {
/* Make one of the items span 2 columns. */
grid-column: span 2;
}
Which would give you this, effectively filling the gap above the spanning item with the item above it, and filling the rest of the lanes with the bottom items:

Again, this is for a column-orientation layout. For a row-orientation layout, you would use justify-items: stretch instead of align-items: stretch.
And with this, I think we've covered all the alignment options in CSS Grid Lanes. I hope this article has helped clarify how things work in this new layout.
Last thing, my team at Microsoft Edge tells me they're very close to getting alignment working in all cases, in Chromium, so I'm very excited by the possibilities, and will probably be posting demos about this in the future. Stay tuned!
June 5 – 18, 2026
Welcome back to the WordPress.com changelog! These two weeks smoothed out everyday work — sharper image editing and easier-to-scan notifications. And if you connect an AI agent like Claude or ChatGPT to your site, it can now do a lot more, including editing your site’s design and managing plugins.
Working with images on your site just got more forgiving. The in-editor crop and resize tools are now available across all WordPress.com sites, so you can frame a photo exactly how you want it without leaving the editor or opening a separate app.
Open a post or page, add an image, and then click the crop button to launch the new experience:


If you juggle a lot at once — drafting a post while uploading media, tidying pages, clearing comments — Desktop Mode turns your WordPress admin into a workspace that’s reminiscent of your computer desktop.

Open posts, pages, and media as separate windows you can resize and arrange, jump anywhere with a quick command search, and recover anything from a single Recycle Bin that covers posts, pages, media, and comments.
It’s a free, open-source plugin from Automattic, available now. Install it on any paid WordPress.com plan.
If you connect an AI agent to WordPress.com, it can now help you with a lot more. On top of managing your content, a connected agent can now also:
As before, you stay in control. It’s off until you turn it on, every tool is opt-in, and you can disable it for specific sites at any time.
We also shipped a round of polish and reliability updates across WordPress.com, including:

In the last 5 posts we created an agentic application using Python. Let’s migrate that to C#. Here’s the set of files we’ll create:

And here is the output after running it as a test using the prompt Use of multi-agents in writing a C# application:
Blogger Blogger: No research yet, directing to researcher Decision: researcher Task: Research the topic: use of multiagents in writing a C# application
RESEARCHER Researching: Research the topic: use of multiagents in writing a C# application Found: The search results highlight several key findings regarding the use of multi-agent systems in C# app…
Author Draft created: 3066 characters
REVIEWER Review: APPROVED – The draft effectively introduces the concept of multi-agent systems in C# applications an… ✓ Draft APPROVED
========== RESULTS ========== Task: use of multiagents in writing a C# application
Research Findings (1):
Overall, these findings suggest that while multi-agent systems can enhance functionality in applications like creative writing, they also present challenges that require careful consideration in their design and implementation.
Draft:
In the evolving landscape of software development, multi-agent systems (MAS) have emerged as a powerful paradigm, particularly in applications that require creativity and collaboration. This post explores the implementation of multi-agent systems in C# applications, focusing on their role in enhancing creative writing tasks.
Multi-agent systems consist of multiple interacting agents, each capable of autonomous decision-making. These agents can collaborate, negotiate, and share information, making them ideal for complex tasks that benefit from diverse perspectives. In the context of writing applications, MAS can facilitate the generation of content, brainstorming ideas, and even editing drafts.
Jesse Liberty outlines a structured approach to developing a multi-agent application aimed at generating blog posts. The process involves two key phases: design and implementation. During the design phase, developers must define the roles and responsibilities of each agent, ensuring that they complement one another. The implementation phase focuses on coding the agents, integrating them into a cohesive system, and testing their interactions.
A practical example of multi-agent systems in action is a creative writing assistant developed using Microsoft’s Semantic Kernel and .NET Aspire. This application showcases how agents can work together to enhance the writing process. For instance, one agent might focus on generating ideas, while another refines the language and style. By leveraging the strengths of each agent, the application can produce high-quality content that resonates with readers.
While the potential of multi-agent systems is significant, it is essential to approach their implementation with caution. Elliot One highlights a critical challenge: simply adding more agents does not guarantee improved outcomes. In fact, an increase in agents can complicate error identification and management. Therefore, careful design and oversight are crucial to ensure that the agents work harmoniously and effectively.
The integration of multi-agent systems in C# applications, particularly for creative writing, offers exciting possibilities for enhancing productivity and creativity. By understanding the design and implementation processes, as well as the potential challenges, developers can create robust applications that leverage the strengths of multiple agents. As the field continues to evolve, the thoughtful application of these systems will undoubtedly lead to innovative solutions in various domains.
In summary, multi-agent systems represent a promising frontier in software development, particularly for applications that thrive on collaboration and creativity. Embracing this technology can empower developers to create more dynamic and engaging user experiences.
Review Notes: APPROVED Revision Number: 1
In the next post we’ll begin looking at each file and how it relates to what we had in Python.