Skip to main content

Our Blog

Explore our blog posts on web design, development, and digital marketing to stay up-to-date with the latest trends and strategies.

Found 26 blog posts

Route Handlers vs Server Actions in Next.js: When Our Team Reaches for Each
Read Blog
Frontend Engineering
July 19, 2026

Route Handlers vs Server Actions in Next.js: When Our Team Reaches for Each

Server Actions and Route Handlers both run server code in the Next.js App Router, but they solve different problems. At Devya we use Server Actions for mutations from our own UI and Route Handlers for public APIs, webhooks, and streaming — and we treat both as public endpoints.

Read more
URL State in the Next.js App Router: Type-Safe Search Params That Survive a Refresh
Read Blog
Frontend Engineering
July 18, 2026

URL State in the Next.js App Router: Type-Safe Search Params That Survive a Refresh

We move filters, tabs, and pagination out of useState and into the URL query string, so a refresh or a shared link restores the exact view. Here is how our team reads and writes search params in the Next.js App Router, and when nuqs earns its place.

Read more
Error Handling in the Next.js App Router: What Each Error File Actually Catches
Read Blog
Frontend Engineering
July 17, 2026

Error Handling in the Next.js App Router: What Each Error File Actually Catches

In the Next.js App Router, error.tsx defines an error boundary that catches render errors in a route segment and its children — but not its own layout, and not event-handler errors. Our engineering notes on error.tsx, global-error.tsx, not-found.tsx, the production digest, and the reset function.

Read more
View Transitions in Next.js: Animated Page and Element Changes Without a Library
Read Blog
Frontend Engineering
July 16, 2026

View Transitions in Next.js: Animated Page and Element Changes Without a Library

The View Transitions API animates the change between two DOM states with a call to document.startViewTransition. We added animated page and element changes to a Next.js App Router app with a few lines of CSS and no animation library.

Read more
How We Debug Hydration Mismatches in the Next.js App Router
Read Blog
Frontend Engineering
July 15, 2026

How We Debug Hydration Mismatches in the Next.js App Router

A hydration mismatch is when the Next.js server HTML does not match React's first client render, so React 19 re-renders the subtree in the browser. We walk through the four causes our team hits most and the fixes that hold in production.

Read more
Fixing INP: How We Tune Interaction to Next Paint in React
Read Blog
Web Performance
July 13, 2026

Fixing INP: How We Tune Interaction to Next Paint in React

Interaction to Next Paint (INP) replaced First Input Delay as a Core Web Vital in March 2024. We break each interaction into three phases — input delay, processing, and presentation — and share the React fixes that hold up on production dashboards.

Read more
Server Actions Are Public Endpoints: How We Harden Next.js Mutations
Read Blog
Frontend Engineering
July 13, 2026

Server Actions Are Public Endpoints: How We Harden Next.js Mutations

Every Next.js Server Action compiles to a public HTTP endpoint, and the UI around it is not access control. We share how our team validates input at runtime, places authorization inside actions, and uses Next.js config to harden mutations.

Read more
React Compiler in 2026: What It Actually Memoizes (And What It Doesn't)
Read Blog
Frontend Engineering
July 12, 2026

React Compiler in 2026: What It Actually Memoizes (And What It Doesn't)

React Compiler shipped stable with React 19 and automatically memoizes components, hooks, and callbacks by analyzing data flow at build time. After enabling it across client projects at Devya, here is what it handles, when it opts out, and whether you should remove useMemo calls.

Read more
Partial Prerendering in Next.js: Static Shell + Dynamic Stream
Read Blog
Frontend Engineering
July 12, 2026

Partial Prerendering in Next.js: Static Shell + Dynamic Stream

Partial Prerendering serves a static HTML shell from the CDN edge instantly, then streams Suspense-wrapped dynamic sections from the origin in the same HTTP response. We shipped it on two production routes — here is the model, the tradeoffs, and how it composes with use cache.

Read more
Replacing ESLint and Prettier with Biome: Field Notes from Two Production Repos
Read Blog
Developer Tooling
July 11, 2026

Replacing ESLint and Prettier with Biome: Field Notes from Two Production Repos

Biome is a single Rust toolchain that formats and lints JavaScript and TypeScript in one pass, replacing ESLint and Prettier. We migrated two production repositories — here is where it won, what Biome 2.0's type-aware linting changes, and where we still keep ESLint.

Read more
TanStack Query in 2026: What Server Components Didn't Replace
Read Blog
Frontend Engineering
July 11, 2026

TanStack Query in 2026: What Server Components Didn't Replace

When Server Components matured, the claim was that a client data-fetching library was no longer needed. Two years of App Router work later, we've found it half true: RSC replaced the default fetch, not the whole job. Here's where we still reach for TanStack Query.

Read more
How We Use React 19's useOptimistic for Snappy Forms
Read Blog
Frontend Engineering
July 9, 2026

How We Use React 19's useOptimistic for Snappy Forms

React 19's useOptimistic renders the result of an action before the server confirms it. Our team wired it into real product forms — here is the model we use, the patterns that held up, and the pitfalls we hit.

Read more

Stay Updated

Subscribe to our newsletter for the latest insights on web design, development, and digital marketing.