Oct 29

Why a .NET long ID loses its last digits in Angular, and how to keep them

System.Text.Json writes a C# long as a JSON number, and JavaScript reads every JSON number as a double. An ID above 2^53 - 1 can reach Angular with different last digits, and sending it back may find nothing. Make such IDs strings with JsonNumberHandling on the property; for an API you can't change, read the digits with JSON.parse's source text.

mixed · development · 5 min
→
Oct 22

Make “same time tomorrow” survive a daylight-saving change with Temporal

On 25 October 2026 London's clocks go back an hour, and “9:00 tomorrow” computed with Date on a UTC server lands at 08:00. Temporal's ZonedDateTime carries the time zone and makes you pick: one calendar day keeps 09:00, 24 hours gives 08:00.

typescript · development · 4 min
→
Oct 13

Get upload progress back after Angular 22 moved HttpClient to fetch

Angular 22 made FetchBackend the default HttpBackend, and fetch can't report upload progress. With the old reportProgress flag the bar sits at 0% and then jumps to 100%, with no warning. Add withXhr() to the browser's provideHttpClient(), keep it out of the server config, and switch to reportUploadProgress so a missing withXhr() throws.

angular · development · 4 min
→
Oct 11

Add keyboard and screen-reader support to an Angular listbox with @angular/aria

Two directives from @angular/aria give a plain ul and li the listbox roles, the arrow and Home/End keys, roving focus and aria-selected. The directive binds keydown on the same element, so the handler you wrote before it has to go.

angular · development · 4 min
→
Oct 08

One-line left joins in EF Core 10 with LeftJoin

A left join in LINQ used to take a group join, a flatten and a DefaultIfEmpty. .NET 10 adds LeftJoin and EF Core 10 translates it, and on SQLite and SQL Server alike, both forms produce the same SQL string. Use it in new queries, keep the nullable right side in your projection, and leave working queries alone.

dotnet · development · 5 min
→
Sep 28

Minimal API validation in .NET 10: what AddValidation checks and what it skips

One call, builder.Services.AddValidation(), finally makes a minimal API enforce the DataAnnotations attributes on its own parameters and answer a bad request with a 400 listing the fields. It also steps over an array property, a dictionary property, any parameter that bound to null, and every endpoint mapped from a class library.

dotnet · development · 8 min
→
Sep 23

Give a Leaflet map its height before you create it

A Leaflet map reads its container's size when you create it and caches the answer. Create it into a box that has no height yet and it stays zero pixels tall, showing the grey that leaflet.css paints on an empty container. Under server-side rendering the usual advice makes it worse, because ngAfterViewInit runs in Node and afterNextRender does not.

angular · development · 6 min
→
Sep 06

httpResource aborts the request in flight and kills the search-as-you-type race

httpResource re-runs its request when a signal it reads changes, and it aborts the request still in flight instead of racing it. That removes the classic search-as-you-type bug, where a slow first answer lands after a fast second one and overwrites it. It became public API in Angular 22.0, and it still has no debounce of its own, which is worth knowing before you reach for it.

angular · development · 7 min
→
Jul 21

Going zoneless in Angular: what breaks, and the safe migration order

Going zoneless removes Angular's magic change detection. What actually breaks, why it breaks, and the migration order that keeps the app working at every step.

angular · development · 5 min
→