EdgeCases Logo

EdgeCases - Frontend Insights for Senior Engineers

Showing 82 of 82 insights
Mar 2026
CSS
CSS @scope: Native Style Scoping Without Shadow DOM

Native CSS scoping with upper AND lower boundaries — finally, component isolation without Shadow DOM or naming conventions.

Surface
6 min
css
scope
cascade
+3
Mar 2026
Browser APIs
AbortSignal.any(): Composing Cancellation Signals

Combine timeout, user cancellation, and navigation signals into one — without race conditions or manual cleanup.

Deep
7 min
javascript
abort-signal
async
+3
Mar 2026
JavaScript
Explicit Resource Management: using and Symbol.dispose

JavaScript's answer to RAII — automatic cleanup for file handles, locks, and event listeners that actually runs.

Expert
8 min
javascript
using
cleanup
+3
Feb 2026
Build Tools
Webpack Dynamic Import Race Conditions: The Chunk Loading Trap

Code-split chunks racing against each other cause production-only crashes. Network latency turns microsecond races into user-facing errors.

Expert
8 min
webpack
code-splitting
race-condition
+3
Feb 2026
Architecture
Edge Runtime: What Breaks When You Leave Node.js

Edge runtimes aren't Node.js. No fs, no native modules, no TCP sockets, and strict CPU limits. Know the constraints before you deploy.

Expert
8 min
edge-runtime
serverless
nodejs
+3
Feb 2026
TypeScript
TypeScript NoInfer: Controlling Generic Inference

NoInfer blocks type inference from specific positions. Use it when secondary parameters should match the inferred type, not influence it.

Deep
7 min
typescript
noinfer
generics
+3
Feb 2026
React
RSC Streaming: The Reverse Proxy Gotcha

Your RSC streaming might be silently buffered by Nginx defaults—here's how to fix it

Deep
6 min
rsc
streaming
nginx
+4
Dec 2025
Next.js
Next.js 16: The "use cache" Directive and cacheLife

Explicit caching opt-in with 'use cache', cacheLife profiles, and tag-based revalidation

Deep
6 min
nextjs
caching
performance
+3
Dec 2025
AI
Antigravity Artifacts: The End of Chat-Based Coding

Why linear chat history fails for engineering—and how structured Artifacts provide the missing state layer

Deep
6 min
antigravity
artifacts
agentic-workflow
+2
Dec 2025
Database
Prisma 7: The Rust-Free Future

Wasm engine replaces Rust binary—90% smaller bundles and zero cold starts

Deep
6 min
prisma
database
wasm
+2
Dec 2025
Performance
The Web Animation Performance Tier List

Why transform is S-Tier and width is F-Tier—mastering the browser rendering pipeline

Deep
6 min
performance
animation
rendering
+2
Nov 2025
Human
True vs Pretend Remote: Reading the Edge Case Signals

The difference isn't in policies—it's in the thousand small decisions that reveal whether remote is core or cosmetic

Deep
7 min
remote-work
culture
career
+5
Nov 2025
SEO
Canonical URLs: The Duplicate Content Paradox

Canonical tags are hints, not directives—Google's ~40 signal algorithm may override your preference

Deep
7 min
canonical
seo
duplicate-content
+1
Feb 2026
JavaScript
JavaScript Temporal API Gotchas: What Breaks When Migrating from Date

JavaScript's Temporal API replaces Date, but brings new complexity. DST ambiguity, Plain vs Zoned types, and strict parsing will trip up migrating teams.

Expert
8 min
javascript
temporal
timezone
+3
Feb 2026
CSS
CSS Container Queries Edge Cases: When @container Silently Fails

Container queries are here, but containment types and the ancestor lookup algorithm create subtle traps. Here's what breaks and how to fix it.

Deep
7 min
css
container-queries
containment
+3
Feb 2026
CSS
CSS field-sizing: Auto-Growing Inputs Without JavaScript

Auto-growing textareas and inputs without JavaScript—finally native in CSS. One property replaces ResizeObserver hacks.

Surface
6 min
css
field-sizing
forms
+3
Feb 2026
CSS
CSS Native Masonry Layout: The End of JS Grid Libraries

Native CSS masonry finally replaces JavaScript grid libraries. grid-template-rows: masonry packs items into the shortest column—no JS, no layout thrashing.

Deep
7 min
css
masonry
grid
+3
Feb 2026
CSS
CSS sibling-index() and sibling-count(): Dynamic Sibling Styling

Finally—style elements based on their position among siblings without JavaScript. Staggered animations, rainbow colors, and dynamic layouts in pure CSS.

Surface
6 min
css
sibling-index
animations
+3
Feb 2026
CSS
CSS text-wrap: balance and pretty

balance equalizes headline line lengths. pretty prevents orphans in paragraphs. Both eliminate decades of typography hacks with pure CSS.

Surface
6 min
css
text-wrap
typography
+3
Feb 2026
TypeScript
TypeScript infer: Advanced Extraction Patterns

Master TypeScript's infer keyword for nested type extraction, variance-aware inference, and recursive unwrapping patterns.

Expert
8 min
typescript
infer
generics
+3
Feb 2026
Browser APIs
AbortController: Patterns Beyond Fetch

AbortController isn't just for fetch—use it to cancel event listeners, timeouts, and any async operation with a single abort() call.

Surface
5 min
abortcontroller
cleanup
async
+3
Feb 2026
CSS
CSS @starting-style: Entry Animations Without JavaScript

Animate elements appearing from display: none using @starting-style—pure CSS entry transitions without JavaScript timing hacks.

Deep
7 min
@starting-style
transitions
css
+3
Feb 2026
CSS
CSS @property: Finally Animating the Un-animatable

Declare custom property types with @property to unlock gradient, color, and numeric animations

Surface
6 min
@property
animation
css
+3
Feb 2026
TypeScript
TypeScript Mapped Type Modifiers: When Inference Breaks

How TypeScript infers +readonly and -optional in mapped types—and when inference silently breaks

Expert
7 min
typescript
mapped-types
inference
+4
Feb 2026
CSS
CSS @property Animation: The Compositor Can't Help You

Typed custom properties enable smooth interpolation but force main-thread animation—here's what to watch for

Expert
7 min
@property
animation
performance
+4
Feb 2026
React
React Render Bailout: When React Secretly Skips Your Update

When React silently skips your re-render—Object.is, lanes, and the children-as-props escape hatch

Deep
7 min
react
bailout
performance
+4
Feb 2026
Browser APIs
Navigation API: The Modern History API Replacement

The modern History API replacement that centralizes SPA routing into a single navigate event

Surface
6 min
navigation-api
spa
routing
+3
Feb 2026
React
React Key Prop: The Reconciliation Deep Dive

Keys aren't just for warning suppression—they control whether React preserves or destroys component instances. Misuse causes invisible state bugs and performance problems.

Expert
8 min
react
keys
reconciliation
+4
Feb 2026
Build Tools
Module Federation Memory Leaks: The Shared Singleton Problem

Micro-frontends sharing React create subtle memory leaks when remotes update—old module closures retain references to shared singletons, preventing garbage collection.

Deep
7 min
module-federation
memory-leaks
micro-frontends
+4
Feb 2026
Browser APIs
Intersection Observer rootMargin: The Scroll Container Trap

rootMargin only expands the viewport—nested scroll containers clip your elements first. Use scrollMargin to fix lazy loading in carousels and scrollable regions.

Surface
6 min
intersection-observer
lazy-loading
scrollmargin
+4
Feb 2026
Browser APIs
IndexedDB Transaction Auto-Commit: The Await Trap

IndexedDB transactions auto-commit when the event loop has no pending requests. One await in the wrong place, and your data is inconsistent.

Expert
8 min
indexeddb
transactions
async-await
+4
Feb 2026
CSS
CSS Subgrid Browser Inconsistencies: Cross-Browser Patterns

Subgrid works everywhere now, but Chrome, Firefox, and Safari disagree on gaps, auto-sizing, and named lines. Here's what to watch for.

Deep
7 min
css
subgrid
cross-browser
+3
Feb 2026
Browser APIs
Web Workers Structured Clone: What Can't Cross the Boundary

Functions, DOM nodes, and class prototypes can't survive postMessage. Here's exactly what fails, what works, and the zero-copy escape hatches.

Surface
6 min
web-workers
structured-clone
transferable
+3
Feb 2026
Browser APIs
HTML Popover API: The Hidden Gotchas

The declarative popover attribute escapes z-index hell—until nested menus clash, light dismiss misfires, and focus management surprises you.

Surface
6 min
html
popover
browser-apis
+3
Feb 2026
React
React Suspense Error Boundaries: Recovery Patterns

Errors inside Suspense don't always reach your ErrorBoundary. Master propagation rules, SSR behavior, and recovery patterns for resilient React apps.

Deep
7 min
react
suspense
error-boundary
+4
Feb 2026
Browser APIs
View Transitions API: Cross-Document Navigation Edge Cases

Cross-document View Transitions enable native MPA animations, but 4-second timeouts, BFCache interactions, and name conflicts can break the magic.

Deep
8 min
view-transitions
mpa
browser-apis
+4
Feb 2026
TypeScript
TypeScript Template Literal Types: When Clever Types Explode

Template literal types compose beautifully—until they explode. Understand instantiation depth, Cartesian products, and recursive limits to avoid TS2589.

Expert
8 min
typescript
template-literals
performance
+3
Feb 2026
Browser APIs
Service Worker Lifecycle: Why Your PWA Update Isn't Working

skipWaiting() doesn't mean instant. clients.claim() has timing gotchas. First visits don't use your SW. Master the edge cases to build reliable PWAs.

Deep
7 min
service-worker
pwa
browser-apis
+3
Feb 2026
React
React 18 Automatic Batching: When It Silently Breaks

React 18 batches all state updates automatically—unless you're using legacy render, flushSync, or hitting async boundaries. Know when batching breaks.

Surface
5 min
react
react-18
performance
+3
Feb 2026
TypeScript
TypeScript Distributive Conditional Types: The Union Distribution Rule

T extends U ? X : Y behaves completely differently when T is a union—TypeScript distributes the conditional over each member. Master this rule to unlock advanced utility types.

Expert
8 min
typescript
conditional-types
unions
+4
Feb 2026
React
React Concurrent Rendering Tearing: When External Stores Break

React 18 concurrent rendering can pause mid-render—if external stores change during that pause, components see inconsistent data. useSyncExternalStore prevents this 'tearing' problem.

Deep
7 min
react
concurrent-mode
state-management
+4
Feb 2026
CSS
CSS contain: Render Isolation for Performance

Tell browsers 'this element is independent' with CSS contain. Layout, paint, and style calculations get scoped to the subtree—potentially cutting layout costs by 80%+.

Surface
6 min
css
contain
performance
+4
Feb 2026
CSS
The 16 Ways CSS Creates Stacking Contexts

z-index: 9999 still behind? Stacking contexts are the reason. Opacity, transform, filter, and 12+ other properties silently create them—trapping your elements.

Expert
8 min
css
stacking-context
z-index
+4
Feb 2026
React
React useId: Why Math.random() Breaks Hydration

Math.random() IDs break hydration—server and client generate different values. useId creates stable, deterministic IDs based on component tree position.

Deep
7 min
react
hydration
ssr
+4
Feb 2026
CSS
CSS :has() — The Parent Selector That Changes Everything

Finally select parents based on children. Use :has() for conditional styling, previous sibling selection, and patterns that previously required JavaScript.

Surface
6 min
css
has-selector
selectors
+4
Feb 2026
JavaScript
Browser Event Loop: Why Promise Callbacks Don't Always Run First

Microtasks run when the JS stack empties, not just at task boundaries. This changes behavior with event bubbling, .click(), and recursive promises.

Expert
7 min
event-loop
microtasks
javascript
+4
Feb 2026
TypeScript
TypeScript's satisfies Operator: Validate Without Widening

satisfies validates without widening. Unlike type annotations, it preserves literal types and enables better narrowing downstream.

Surface
6 min
typescript
satisfies
type-inference
+3
Feb 2026
CSS
CSS Anchor Positioning: Tooltips Without JavaScript

CSS Anchor Positioning eliminates JavaScript tooltip libraries. One anchor-name, one position-anchor, and the browser handles collision detection.

Surface
6 min
css
anchor-positioning
tooltips
+3
Feb 2026
JavaScript
Promise.withResolvers(): The Pattern You've Been Hacking Around

Promise.withResolvers() eliminates the deferred promise hack, but leaked resolvers create memory leaks that are harder to spot than the old pattern.

Deep
7 min
promise-withresolvers
promises
javascript
+3
Feb 2026
JavaScript
structuredClone(): The Deep Copy That Isn't Always Deep

structuredClone() handles circular refs and built-in types, but silently drops prototypes, class instances, getters, and Symbol properties.

Deep
7 min
structuredclone
deep-copy
javascript
+3
Feb 2026
CSS
CSS Scroll-Driven Animations: When animation-timeline Breaks Your Layout

The animation shorthand silently resets your scroll timeline. Plus: main thread demotion, inactive timelines, and stacking context surprises.

Deep
7 min
css
scroll-driven-animations
performance
+3
Dec 2025
CSS
CSS Cascade Layers & !important: The Specificity Inversion

Normal layers: last wins. Important layers: FIRST wins. Learn why !important inverts layer priority.

Expert
6 min
css
layers
specificity
+3
Dec 2025
Browser APIs
ResizeObserver: The 'Loop Limit Exceeded' Error

Benign but scary. Learn why modifying layout in a ResizeObserver callback triggers browser loop protection.

Deep
6 min
resize-observer
performance
rendering
+3
Dec 2025
TypeScript
TypeScript Performance: Recursive Types & Build Times

Deeply nested recursive types crash the compiler—learn to optimize with interface caching and tail recursion

Expert
6 min
typescript
performance
optimization
+3
Dec 2025
CSS
content-visibility: The Searching & Scrolling Problem

Skipping layout boosts performance but breaks scrollbars—use contain-intrinsic-size: auto to fix the jump

Surface
5 min
css
content-visibility
performance
+3
Dec 2025
CSS
Safari Animation Artifacts: The 1px Black Line Glitch

Fix the jagged edges and flickering lines on expanding images with outline: 1px transparent

Deep
5 min
css
safari
animation
+3
Dec 2025
React
useEffectEvent: Solving Stale Closures Forever

Stop hacking refs—use the stable hook designed for non-reactive logic

Deep
5 min
react
hooks
performance
+2
Dec 2025
CSS
CSS Inset: The Modern Shorthand for Positioning

Stop writing top/right/bottom/left—use inset to handle all four offsets in a single line

Surface
5 min
css
layout
inset
+2
Dec 2025
CSS
Respecting User Motion Preferences with prefers-reduced-motion

Don't just remove animations—replace motion with opacity to preserve context while respecting accessibility

Deep
7 min
accessibility
animation
css
+3
Dec 2025
CSS
Background Bleed: The Subpixel Rendering Bug

Why border-radius sometimes leaves a gap between background and border, and how background-clip fixes it

Deep
6 min
css
border-radius
edge-case
+2
Nov 2025
AI
Gemini 3 Pro: 1M Token Context Window Edge Cases

Context fragmentation, multimodal gotchas, and agentic patterns at extreme scale

Deep
6 min
gemini
llm
context-window
+4
Nov 2025
AI
Agent-First vs Copilot: When Async Beats Sync

Antigravity's autonomous agents excel at large refactors but break debugging flow. Cursor's inline copilot preserves immediacy but can't parallelize. The edge cases reveal when each architecture dominates.

Deep
6 min
ai-ide
agent-architecture
async-development
+4
Nov 2025
Next.js
Next.js 'use cache': Explicit Caching with Automatic Keys

Cache pages, components, and functions with opt-in directive and stale-while-revalidate profiles

Deep
9 min
use-cache
caching
nextjs
+5
Nov 2025
Next.js
Turbopack: Next.js 16 Default Bundler (2-10× Faster)

Rust-powered bundler with incremental compilation, file system caching, and production parity with Webpack

Deep
8 min
turbopack
bundlers
performance
+5
Nov 2025
Next.js
proxy.ts: Node.js Runtime for Next.js Request Interception

Full filesystem and npm package access in middleware—proxy.ts replaces middleware.ts with Node.js runtime

Deep
8 min
proxy.ts
middleware
nextjs
+5
Nov 2025
Next.js
Next.js 16 Incremental Prefetching: Smart Route Preloading

Layout deduplication, viewport-based cancellation, and interaction prioritization reduce redundant requests

Deep
8 min
prefetching
performance
nextjs
+5
Nov 2025
Next.js
Next.js 16: Dynamic by Default, Turbopack Stable, proxy.ts

Explicit caching with 'use cache', Turbopack as default bundler, and proxy.ts for Node.js runtime clarity

Surface
8 min
nextjs
next16
caching
+5
Nov 2025
CSS
CSS Animations vs Figma: Production Reality vs Design Prototypes

Figma's spring physics can't translate to CSS cubic-bezier—understand the gap between design and code

Deep
7 min
animations
figma
design-handoff
+4
Nov 2025
CSS
Animating CSS Grid: The Discrete Value Problem

grid-template-columns won't animate—fr units lack computable intermediate values, breaking smooth transitions

Deep
7 min
grid
animations
layout
+4
Nov 2025
CSS
CSS Animations vs JavaScript: Layout Thrashing and the FLIP Technique

JavaScript animations cause layout thrashing—learn CSS tricks and FLIP to keep animations compositor-safe

Deep
7 min
animations
performance
javascript
+7
Nov 2025
Human
Impostor Syndrome: The Senior Engineer's Paradox

The more you know, the less confident you feel—why expertise breeds doubt and how to work with it

Expert
7 min
impostor-syndrome
senior-engineer
career
+5
Nov 2025
SEO
JavaScript Hydration and SEO: The Googlebot Race Condition

Streaming SSR sends HTML in chunks—but does Googlebot wait for the complete stream before indexing?

Expert
7 min
javascript
ssr
hydration
+4
Nov 2025
SEO
Structured Data Validation: When Valid Schema Breaks Rich Results

Schema.org validation passes, but Google Rich Results Test says 'No items detected'—here's why

Surface
5 min
structured-data
schema
rich-results
+2
Nov 2025
SEO
Image SEO: Lazy Loading and Modern Formats

loading=lazy on hero images delays LCP; WebP needs JPEG fallbacks—optimize without breaking SEO

Deep
7 min
images
seo
optimization
+2
Nov 2025
SEO
Internal Linking Architecture: PageRank Distribution in Component-Based Apps

Client-side navigation breaks traditional PageRank flow—hub-and-spoke vs mesh, the death of nofollow sculpting

Expert
7 min
internal-linking
pagerank
spa
+8
Nov 2025
CSS
Font Metrics: Why Text Won't Center in Buttons

Invisible bounding boxes in fonts cause alignment issues—learn to fix them with CSS overrides

Deep
7 min
font-metrics
alignment
typography
+4
Nov 2025
CSS
Font Loading: The FOUT, FOIT, and CLS Dilemma

font-display values force a choice between fast rendering and layout stability—understand the trade-offs

Deep
7 min
font-display
cls
fonts
+4
Nov 2025
CSS
size-adjust: Eliminating Font Swap Layout Shifts

Match fallback font metrics to custom fonts and eliminate 90% of CLS from font loading

Deep
7 min
size-adjust
layout-shift
fonts
+3
Nov 2025
CSS
OpenType Features: Ligatures, Tabular Numbers, and Small Caps

font-feature-settings doesn't cascade—it replaces. Learn the high-level font-variant-* alternatives

Deep
7 min
opentype
typography
fonts
+3
Nov 2025
CSS
Font Preloading: When rel=preload Backfires

Missing crossorigin causes double downloads; too many preloads delay LCP—use surgically

Deep
7 min
preload
fonts
performance
+4
Nov 2025
CSS
Font Synthesis: Avoiding Fake Bold and Italic

Prevent browsers from creating fake font variants and ensure professional typography

Surface
6 min
font-synthesis
typography
fonts
+2
Nov 2025
CSS
Dynamic Fonts in Web Development

Master custom typography with @font-face and variable fonts for better design flexibility

Surface
5 min
fonts
typography
web-design
+1