Web Application Development
Modern web apps built for AI-era interaction patterns
What this means
in practice
The frontend landscape shifted in 2025 in a way that rewrites the assumptions. React Server Components changed how data fetching and rendering compose. AI-generated UIs (v0, Bolt, Lovable) changed the economics of component development. Streaming AI responses changed the latency contract between AI features and user experience. Building web apps that ignore these shifts produces slower, less competitive products.
The "frontend engineer + AI tools" workflow has become the productivity baseline. Engineers who use v0 for component scaffolding, Cursor for code generation, and design systems as AI context are shipping features faster than teams that have not adapted. We operate in this workflow and we build systems — design tokens, component libraries, architecture patterns — that make AI tooling more effective, not less.
Web Development After the Vibe Coding Wave
In 2025, a wave of AI-assisted development tools — v0, Bolt, Lovable — demonstrated that non-engineers could generate working web UIs from text descriptions. The "vibe coding" label stuck. The lesson the industry drew varies: some concluded that frontend engineers are obsolete, others dismissed the tools as toys. The more accurate read is that the productivity baseline shifted. Engineers who use these tools effectively ship features faster than engineers who do not. The engineering skill is now in knowing when the generated output is correct, where it is subtly wrong, and how to build the architecture that makes AI tooling more effective.
The way you make AI tooling more effective is with a well-structured design system. When v0 or Cursor knows your design tokens, your component API conventions, and your file structure, it generates code that fits your system rather than generic Tailwind components you have to rework. The investment in design system quality now pays off in AI tool output quality.
React Server Components Changed the Mental Model
The App Router and React Server Components represent the most significant change to Next.js architecture since the Pages Router was introduced. The key insight: most of the data fetching and rendering in typical web applications does not need to happen in the browser. RSC moves that work to the server, ships only the resulting HTML to the browser, and eliminates the loading spinners and JavaScript overhead that come from client-side data fetching.
The practical effect: pages that used to show a skeleton loader while waiting for a client-side fetch now render complete on the first response. The JavaScript bundle shrinks because RSC components ship no JavaScript. Server-side data access is direct (no HTTP layer between your component and your database) and composable (each RSC can fetch exactly the data it needs).
Streaming AI in Web Applications
The interaction pattern for AI features in web applications has converged on streaming: the user submits a prompt, and the response appears token-by-token as the model generates it, rather than after a long wait for the full response. The Vercel AI SDK makes this straightforward with useChat and useCompletion hooks that manage the streaming state on the client and StreamingTextResponse on the server.
The design challenge is everything around the stream: how do you show the interface is thinking before tokens start appearing? How do you handle a streaming response that encounters an error mid-stream? How do you let the user cancel a response that is not what they wanted? These interaction design questions require more thought than the streaming implementation itself.
- Streaming chat: useChat hook + StreamingTextResponse — the standard Vercel AI SDK pattern
- AI-powered search: embed the query, retrieve semantically similar content, generate a grounded response
- Content generation in forms: trigger generation from form context, stream into a textarea, let users edit
- Real-time AI suggestions: debounced trigger on input, streaming suggestions, accept/reject UI
- Document Q&A: upload, extract, embed, retrieve on query — the full RAG flow in a web interface
What is included
Our process
Architecture Decision
Choose the rendering strategy (App Router with RSC is the right default for most Next.js apps in 2026), define the component architecture, select the styling approach (Tailwind is the pragmatic choice for most teams), and establish the state management pattern. These decisions are easier to make at the start than to change later.
Design System Foundation
Establish design tokens (colors, spacing, typography) as the first deliverable. A token-based design system serves two purposes: it creates visual consistency across the application, and it gives AI tooling (v0, Cursor, Copilot) the context to generate components that match your design language automatically.
Component Architecture
Build the core UI component library using a combination of shadcn/ui base components (customized to match the design system) and purpose-built components for domain-specific interactions. Document in Storybook — components that are not documented do not get reused.
Core Application Build
Implement the primary user flows with RSC for data-heavy pages and Client Components for interactive elements. Use React Query or SWR for client-side data fetching. Server Actions for form mutations. Keep the component tree shallow and the state minimal.
AI Feature Integration
Integrate AI features using the Vercel AI SDK for streaming, with proper loading states and error boundaries. AI features should feel native, not like a separate product stuck inside the app.
Performance and Launch
Measure Core Web Vitals on real user hardware. Optimize the Largest Contentful Paint, minimize layout shift, reduce Total Blocking Time. Ship with real user monitoring in place (Vercel Analytics, DataDog RUM) so regressions are caught before users notice them.
Tools and infrastructure we use for this capability.
Why Fordel
We Build AI Features Into the Application, Not Onto It
AI features that live in a sidebar or a floating chat widget are not AI-first web apps — they are regular apps with AI attached. We integrate AI capabilities into the primary user flows: search that understands intent, forms that fill themselves, content that generates in context. The difference in user experience is significant.
We Operate in the AI-Augmented Development Workflow
We use v0 for component scaffolding, Cursor for code generation, and well-structured design systems as context for AI tooling. This is not about replacing engineering skill — it is about the productivity baseline having shifted, and teams that have not adapted are slower than teams that have.
Design Systems Are Engineering Infrastructure
A well-built design system with design tokens and a documented component library does two things: it enforces visual consistency, and it gives every AI coding tool the context to generate correct components automatically. We build design systems that serve both purposes.
Performance Is a Feature
Core Web Vitals affect both user retention and search ranking. We measure performance on real user hardware throughout development, not just on developer machines before launch. The choices that hurt performance — client-side rendering for content that should be server-rendered, unoptimized images, oversized JavaScript bundles — are decisions we avoid by default.
Frequently asked
questions
What changed with React Server Components and why does it matter?
React Server Components render on the server and send HTML to the client — no JavaScript for that component is shipped to the browser. For data-heavy pages like dashboards and content pages, this eliminates loading spinners and reduces JavaScript bundle size significantly. The App Router in Next.js 13+ makes RSC the default. Teams still on the Pages Router are missing real performance and developer experience improvements. The mental model shift (which components are server, which are client, how they compose) takes a week to internalize and then becomes natural.
How do you integrate streaming AI responses into a web UI?
The Vercel AI SDK handles most of this: useChat and useCompletion hooks that manage the streaming state, error states, and loading states for LLM interactions. The server endpoint streams via the Vercel AI SDK's StreamingTextResponse, which handles the SSE protocol. The result is a chat interface or content generation feature where tokens appear as they generate, rather than a spinner followed by a full response appearing at once. The latter is noticeably worse for user experience.
Should we use Tailwind CSS or a CSS-in-JS solution?
Tailwind is the pragmatic choice for most projects in 2026. The ecosystem support (shadcn/ui, Radix, every major component library) is built around Tailwind. AI coding tools (v0, Cursor) generate Tailwind by default. The developer experience for teams already on Tailwind is fast. CSS-in-JS (styled-components, emotion) has a performance cost (CSS generated at runtime) and a more fractured ecosystem. The cases where CSS-in-JS is the better choice have narrowed significantly.
What is shadcn/ui and why do you use it?
shadcn/ui is a collection of accessible, composable UI components built on Radix UI primitives and styled with Tailwind. Unlike a traditional component library, shadcn/ui copies the component source into your repository — you own the code and can modify it freely. This makes it ideal as the foundation for a custom design system: you start with accessible, well-built base components and customize them to your design language, rather than fighting a library's theming API. It is now the de facto starting point for new Next.js applications.
How do AI tools like v0 fit into your development process?
v0 and similar tools (Bolt, Lovable) are component scaffolding accelerators — they are excellent at generating the initial structure of a UI component from a description or screenshot. The output needs engineering review and customization to fit the application architecture and design system. We use them for the initial scaffold of complex components, which might represent 60-70% of the component implementation, then engineer the remaining details that require application context and design judgment. The workflow saves significant time on component work without sacrificing quality.
Ready to work with us?
Tell us what you are building. We will scope it, price it honestly, and give you a clear plan.
Start a ConversationFree 30-minute scoping call. No obligation.