WhoBuilt

Building a Linktree Clone!

Jan 8, 2023· 1 h 20 min· 51K views·Watch on YouTube

Lee Robinson, a developer at Vercel, builds a Linktree-style page with Next.js, React, Tailwind CSS, and Vercel Edge Config during a live coding session with audience questions.

Model the profile data

Lee starts with a simple JSON structure for a profile: a name, avatar, links with titles and URLs, and social accounts. He considers optional images for links and notes that keeping content separate from the application would let people update it without redeploying.

Build the page with Tailwind

He sets up Tailwind in a Pages Router project, then builds a profile header, link cards, and social icons. The styling includes a gradient background, responsive spacing, and optional link images. For external destinations, he uses ordinary anchor tags rather than Next.js Link.

Move from Pages to the App Router

Lee migrates the page to Next.js 13’s App Router, creating a root layout and moving the route into `page.tsx`. He explains that the layout replaces `_app` and `_document`, and that server components run on the server by default. He also notes that server components can reduce client-side JavaScript.

Fetch profile data from Edge Config

He moves the JSON profile into Vercel Edge Config and reads it from an async server component. The migration requires pulling environment variables locally and adding types for the returned data; Lee mentions schema validation as another option. He adds a fallback redirect for missing data.

Choose when the page renders dynamically

Lee finds that the production build treats the Edge Config data as static, so he sets `dynamic` to `force-dynamic` to fetch fresh data on each request. He explains that the App Router can support static, dynamic, and revalidated data at the fetch level, though the demo makes the whole page dynamic. He deploys the finished profile page.

Takeaways

  • Keep profile content in a data store so updates do not require redeploying the application.
  • Use standard anchor tags for external links and Next.js Link for navigation within the app.
  • In the App Router, server components can fetch data directly without client-side fetching logic.
  • Check production behavior when choosing caching or dynamic rendering; development behavior may differ.
  • Add explicit types or schema validation when remote JSON replaces a locally typed data file.

Mentioned in this talk

Search inside this talk

What was claimed 8

  • uses
    Next.js 15 RC uses React 19 RC under the hood
    “Next.js also released the RC version of Next.js 15, which uses React 19 RC under the hood”
    3:09inReact Universe BriefingYouTube
    Verified3 sources· Talk
  • feature
    Turbo: Provides faster hot module reloading and faster updates after saving.
    “which should give you faster hot module reloading”
    YouTube
    Unverified1 source· Talk
  • uses
    “I'm using Turbopack through Next.js 13”
    YouTube
    Unverified1 source· Talk
  • feature
    Next.js: The App Router uses Server Components by default and supports server-side data fetching.
    “everything in app runs on the server by default as a Server Component”
    YouTube
    Unverified1 source· Talk
  • feature
    Vercel Edge Config: Stores JSON and configuration data that can be updated without redeploying.
    “You can update it very quickly without redeploying to fetch that data”
    YouTube
    Unverified1 source· Talk
  • integrates with
    “inside my page, I can import this and get a value from the key-value store”
    YouTube
    Unverified1 source· Talk
  • uses
    “the actual Linktree does use Next.js”
    YouTube
    Unverified1 source· Talk
  • feature
    Next.js: The App Router can mix static, dynamic, and revalidated data fetching at the data-fetch level.
    “this now happens at the fetch level, at the data-fetch level”
    YouTube
    Unverified1 source· Talk

Related talks

Building a Linktree Clone! · WhoBuilt