<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Alexey Ryabov</title>
    <description>The latest articles on Forem by Alexey Ryabov (@lesha1201).</description>
    <link>https://forem.com/lesha1201</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F130184%2Fb350e53d-2721-4e47-b481-5345902e9d73.JPG</url>
      <title>Forem: Alexey Ryabov</title>
      <link>https://forem.com/lesha1201</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/lesha1201"/>
    <language>en</language>
    <item>
      <title>Real-world open-source projects built with Next.js 14 and App Router</title>
      <dc:creator>Alexey Ryabov</dc:creator>
      <pubDate>Fri, 28 Jun 2024 12:57:54 +0000</pubDate>
      <link>https://forem.com/datarockets/real-world-open-source-projects-built-with-nextjs-14-and-app-router-i1n</link>
      <guid>https://forem.com/datarockets/real-world-open-source-projects-built-with-nextjs-14-and-app-router-i1n</guid>
      <description>&lt;p&gt;Discover how others build real-world Next.js applications by examining their codebase.&lt;/p&gt;

&lt;p&gt;Learning from others' codebases can help you grow as a developer, gain inspiration for organizing your codebase, develop a certain feature, manage CI/CD, and much more. You can learn both best practices and some practices to avoid in real-world scenarios. You can find new technologies that might better solve certain cases.&lt;/p&gt;

&lt;p&gt;In this article, you will find a selection of open-source projects built using Next.js and App Router.&lt;/p&gt;




&lt;h2&gt;
  
  
  Unkey
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0dt3f6h0e8rvyyec2ne2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0dt3f6h0e8rvyyec2ne2.png" alt="Screenshot of Unkey"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/unkeyed/unkey" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;a href="https://www.unkey.com/" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Unkey is an open-source API management platform for scaling APIs. Unkey provides API key management and standalone rate limiting.&lt;/p&gt;

&lt;p&gt;The repository is a monorepo managed via &lt;a href="https://turbo.build/" rel="noopener noreferrer"&gt;Turborepo&lt;/a&gt;. It contains several apps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/unkeyed/unkey/tree/main/apps/www" rel="noopener noreferrer"&gt;www&lt;/a&gt; - marketing website, landing page, blog, etc.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/unkeyed/unkey/tree/main/apps/dashboard" rel="noopener noreferrer"&gt;dashboard&lt;/a&gt; - main application&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/unkeyed/unkey/tree/main/apps/docs" rel="noopener noreferrer"&gt;docs&lt;/a&gt; - documentation website&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; &lt;a href="https://turbo.build/" rel="noopener noreferrer"&gt;Turborepo&lt;/a&gt;, &lt;a href="https://tailwindcss.com/" rel="noopener noreferrer"&gt;Tailwind&lt;/a&gt;, &lt;a href="https://trpc.io/" rel="noopener noreferrer"&gt;tRPC&lt;/a&gt;, &lt;a href="https://planetscale.com/" rel="noopener noreferrer"&gt;Planetscale&lt;/a&gt;, &lt;a href="https://orm.drizzle.team/" rel="noopener noreferrer"&gt;Drizzle ORM&lt;/a&gt;, &lt;a href="https://clerk.com/" rel="noopener noreferrer"&gt;Clerk&lt;/a&gt;, &lt;a href="https://react-hook-form.com/" rel="noopener noreferrer"&gt;React Hook Form&lt;/a&gt;, &lt;a href="https://zod.dev/" rel="noopener noreferrer"&gt;Zod&lt;/a&gt;, &lt;a href="https://resend.com/" rel="noopener noreferrer"&gt;Resend&lt;/a&gt;, &lt;a href="https://stripe.com/" rel="noopener noreferrer"&gt;Stripe&lt;/a&gt;, &lt;a href="https://mintlify.com/" rel="noopener noreferrer"&gt;Mintlify&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Cal.com
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fahm6lkd9uys9u29tll40.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fahm6lkd9uys9u29tll40.png" alt="Screenshot of Cal.com"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/calcom/cal.com" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;a href="https://cal.com/" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An open-source Calendly alternative. A scheduling solution that gives you a full-control of your events and data.&lt;/p&gt;

&lt;p&gt;They are still in the process of migrating to App Router, which is a good example of how a large-scale app can be migrated to App Router incrementally.&lt;/p&gt;

&lt;p&gt;The repository is a monorepo managed via &lt;a href="https://turbo.build/" rel="noopener noreferrer"&gt;Turborepo&lt;/a&gt;. The main app is located in &lt;a href="https://github.com/calcom/cal.com/tree/main/apps/web" rel="noopener noreferrer"&gt;apps/web&lt;/a&gt;. There, you can find that it has both &lt;code&gt;app&lt;/code&gt; and &lt;code&gt;pages&lt;/code&gt; folder. And many routes from &lt;code&gt;pages&lt;/code&gt; are available in &lt;code&gt;app/future&lt;/code&gt; folder.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; &lt;a href="https://turbo.build/" rel="noopener noreferrer"&gt;Turborepo&lt;/a&gt;, &lt;a href="https://tailwindcss.com/" rel="noopener noreferrer"&gt;Tailwind&lt;/a&gt;, &lt;a href="https://trpc.io/" rel="noopener noreferrer"&gt;tRPC&lt;/a&gt;, &lt;a href="https://www.prisma.io/" rel="noopener noreferrer"&gt;Prisma&lt;/a&gt;, &lt;a href="https://kysely.dev/" rel="noopener noreferrer"&gt;Kysely&lt;/a&gt; &lt;a href="https://authjs.dev/" rel="noopener noreferrer"&gt;Auth.js&lt;/a&gt;, &lt;a href="https://react-hook-form.com/" rel="noopener noreferrer"&gt;React Hook Form&lt;/a&gt;, &lt;a href="https://zod.dev/" rel="noopener noreferrer"&gt;Zod&lt;/a&gt;, &lt;a href="https://zustand-demo.pmnd.rs/" rel="noopener noreferrer"&gt;Zustand&lt;/a&gt;, &lt;a href="https://tanstack.com/query" rel="noopener noreferrer"&gt;Tanstack Query&lt;/a&gt;, &lt;a href="https://stripe.com/" rel="noopener noreferrer"&gt;Stripe&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Documenso
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fle14lteww0t06kfr7vsy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fle14lteww0t06kfr7vsy.png" alt="Screenshot of Documenso"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/documenso/documenso" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;a href="https://documenso.com/" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An open-source DocuSign alternative. A service for signing documents digitally.&lt;/p&gt;

&lt;p&gt;The repository is a monorepo managed via &lt;a href="https://turbo.build/" rel="noopener noreferrer"&gt;Turborepo&lt;/a&gt;. It contains several Next.js apps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/documenso/documenso/tree/main/apps/marketing" rel="noopener noreferrer"&gt;marketing&lt;/a&gt; - marketing website, landing page, blog, etc.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/documenso/documenso/tree/main/apps/web" rel="noopener noreferrer"&gt;web&lt;/a&gt; - main application&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; &lt;a href="https://turbo.build/" rel="noopener noreferrer"&gt;Turborepo&lt;/a&gt;, &lt;a href="https://tailwindcss.com/" rel="noopener noreferrer"&gt;Tailwind&lt;/a&gt;, &lt;a href="https://trpc.io/" rel="noopener noreferrer"&gt;tRPC&lt;/a&gt;, &lt;a href="https://www.prisma.io/" rel="noopener noreferrer"&gt;Prisma&lt;/a&gt;, &lt;a href="https://kysely.dev/" rel="noopener noreferrer"&gt;Kysely&lt;/a&gt; &lt;a href="https://authjs.dev/" rel="noopener noreferrer"&gt;Auth.js&lt;/a&gt;, &lt;a href="https://react-hook-form.com/" rel="noopener noreferrer"&gt;React Hook Form&lt;/a&gt;, &lt;a href="https://zod.dev/" rel="noopener noreferrer"&gt;Zod&lt;/a&gt;, &lt;a href="https://resend.com/" rel="noopener noreferrer"&gt;Resend&lt;/a&gt;, &lt;a href="https://stripe.com/" rel="noopener noreferrer"&gt;Stripe&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  TypeHero
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsq4rcw474im8w3fl0e1f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsq4rcw474im8w3fl0e1f.png" alt="Screenshot of TypeHero"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/typehero/typehero" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;a href="https://typehero.dev/" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;TypeHero is a platform for enhancing your TypeScript skills via interactive code challenges.&lt;/p&gt;

&lt;p&gt;The repository is a monorepo managed via &lt;a href="https://turbo.build/" rel="noopener noreferrer"&gt;Turborepo&lt;/a&gt;. It contains several Next.js apps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/typehero/typehero/tree/main/apps/web" rel="noopener noreferrer"&gt;web&lt;/a&gt; - main application&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/typehero/typehero/tree/main/apps/admin" rel="noopener noreferrer"&gt;admin&lt;/a&gt; - admin panel for the main application&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; &lt;a href="https://turbo.build/" rel="noopener noreferrer"&gt;Turborepo&lt;/a&gt;, &lt;a href="https://tailwindcss.com/" rel="noopener noreferrer"&gt;Tailwind&lt;/a&gt;, &lt;a href="https://www.prisma.io/" rel="noopener noreferrer"&gt;Prisma&lt;/a&gt;, &lt;a href="https://authjs.dev/" rel="noopener noreferrer"&gt;Auth.js&lt;/a&gt;, &lt;a href="https://react-hook-form.com/" rel="noopener noreferrer"&gt;React Hook Form&lt;/a&gt;, &lt;a href="https://zod.dev/" rel="noopener noreferrer"&gt;Zod&lt;/a&gt;, &lt;a href="https://zustand-demo.pmnd.rs/" rel="noopener noreferrer"&gt;Zustand&lt;/a&gt;, &lt;a href="https://tanstack.com/query" rel="noopener noreferrer"&gt;Tanstack Query&lt;/a&gt;, &lt;a href="https://resend.com/" rel="noopener noreferrer"&gt;Resend&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Dify
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frovnj3riulpfckxc0i2f.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frovnj3riulpfckxc0i2f.jpg" alt="Screenshot of Dify"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/langgenius/dify" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;a href="https://dify.ai/" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dify is an open-source LLM app development platform. Dify's interface combines AI workflow, RAG pipeline, agent capabilities, model management, observability features and more.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; &lt;a href="https://tailwindcss.com/" rel="noopener noreferrer"&gt;Tailwind&lt;/a&gt;, &lt;a href="https://react-hook-form.com/" rel="noopener noreferrer"&gt;React Hook Form&lt;/a&gt;, &lt;a href="https://zod.dev/" rel="noopener noreferrer"&gt;Zod&lt;/a&gt;, &lt;a href="https://zustand-demo.pmnd.rs/" rel="noopener noreferrer"&gt;Zustand&lt;/a&gt;, &lt;a href="https://swr.vercel.app/" rel="noopener noreferrer"&gt;SWR&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Dub
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fapt2yzs5js510y8dgakp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fapt2yzs5js510y8dgakp.png" alt="Screenshot of Dub"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/dubinc/dub" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;a href="https://dub.co/" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dub.co is an open-source URL shortening service and a link management platform. An open-source alternative to Bitly.&lt;/p&gt;

&lt;p&gt;The repository is a monorepo managed via &lt;a href="https://turbo.build/" rel="noopener noreferrer"&gt;Turborepo&lt;/a&gt;. The main app is located in &lt;a href="https://github.com/dubinc/dub/tree/main/apps/web" rel="noopener noreferrer"&gt;apps/web&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; &lt;a href="https://turbo.build/" rel="noopener noreferrer"&gt;Turborepo&lt;/a&gt;, &lt;a href="https://tailwindcss.com/" rel="noopener noreferrer"&gt;Tailwind&lt;/a&gt;, &lt;a href="https://planetscale.com/" rel="noopener noreferrer"&gt;Planetscale&lt;/a&gt;, &lt;a href="https://www.prisma.io/" rel="noopener noreferrer"&gt;Prisma&lt;/a&gt;, &lt;a href="https://authjs.dev/" rel="noopener noreferrer"&gt;Auth.js&lt;/a&gt;, &lt;a href="https://zod.dev/" rel="noopener noreferrer"&gt;Zod&lt;/a&gt;, &lt;a href="https://swr.vercel.app/" rel="noopener noreferrer"&gt;SWR&lt;/a&gt;, &lt;a href="https://upstash.com/" rel="noopener noreferrer"&gt;Upstash&lt;/a&gt;, &lt;a href="https://tinybird.com/" rel="noopener noreferrer"&gt;Tinybird&lt;/a&gt;, &lt;a href="https://stripe.com/" rel="noopener noreferrer"&gt;Stripe&lt;/a&gt;, &lt;a href="https://mintlify.com/" rel="noopener noreferrer"&gt;Mintlify&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Noodle
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft7wqwklv382a0q560lpi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft7wqwklv382a0q560lpi.png" alt="Screenshot of Noodle"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/noodle-run/noodle" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;a href="https://noodle.run/" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Noodle is a platform for managing everything to do with students education like note-taking, calendar, task management, grade calculator, flashcards and more.&lt;/p&gt;

&lt;p&gt;It's an indie project and still not released yet. But it's a good example of an app built using modern technologies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; &lt;a href="https://bun.sh/" rel="noopener noreferrer"&gt;Bun&lt;/a&gt;, &lt;a href="https://tailwindcss.com/" rel="noopener noreferrer"&gt;Tailwind&lt;/a&gt;, &lt;a href="https://trpc.io/" rel="noopener noreferrer"&gt;tRPC&lt;/a&gt;, &lt;a href="https://orm.drizzle.team/" rel="noopener noreferrer"&gt;Drizzle ORM&lt;/a&gt;, &lt;a href="https://clerk.com/" rel="noopener noreferrer"&gt;Clerk&lt;/a&gt; &lt;a href="https://react-hook-form.com/" rel="noopener noreferrer"&gt;React Hook Form&lt;/a&gt;, &lt;a href="https://zod.dev/" rel="noopener noreferrer"&gt;Zod&lt;/a&gt;, &lt;a href="https://tanstack.com/query" rel="noopener noreferrer"&gt;Tanstack Query&lt;/a&gt;, &lt;a href="https://resend.com/" rel="noopener noreferrer"&gt;Resend&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Midday
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fedk6hmfli3en5943bmth.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fedk6hmfli3en5943bmth.png" alt="Screenshot of Midday"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/midday-ai/midday" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;a href="https://midday.ai/" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An all-in-one tool for freelancers, contractors, consultants, and solo entrepreneurs to manage their finances, track projects, store files, and send invoices.&lt;/p&gt;

&lt;p&gt;The repository is a monorepo managed via &lt;a href="https://turbo.build/" rel="noopener noreferrer"&gt;Turborepo&lt;/a&gt;. It contains several apps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/midday-ai/midday/tree/main/apps/website" rel="noopener noreferrer"&gt;website&lt;/a&gt; - marketing website, landing page, blog, etc.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/midday-ai/midday/tree/main/apps/dashboard" rel="noopener noreferrer"&gt;dashboard&lt;/a&gt; - main application, dashboard&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/midday-ai/midday/tree/main/apps/docs" rel="noopener noreferrer"&gt;docs&lt;/a&gt; - documentation website&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; &lt;a href="https://bun.sh/" rel="noopener noreferrer"&gt;Bun&lt;/a&gt;, &lt;a href="https://turbo.build/" rel="noopener noreferrer"&gt;Turborepo&lt;/a&gt;, &lt;a href="https://tailwindcss.com/" rel="noopener noreferrer"&gt;Tailwind&lt;/a&gt;, &lt;a href="https://supabase.com/" rel="noopener noreferrer"&gt;Supabase&lt;/a&gt;, &lt;a href="https://upstash.com/" rel="noopener noreferrer"&gt;Upstash&lt;/a&gt;, &lt;a href="https://react-hook-form.com/" rel="noopener noreferrer"&gt;React Hook Form&lt;/a&gt;, &lt;a href="https://zod.dev/" rel="noopener noreferrer"&gt;Zod&lt;/a&gt;, &lt;a href="https://zustand-demo.pmnd.rs/" rel="noopener noreferrer"&gt;Zustand&lt;/a&gt;, &lt;a href="https://resend.com/" rel="noopener noreferrer"&gt;Resend&lt;/a&gt;, &lt;a href="https://mintlify.com/" rel="noopener noreferrer"&gt;Mintlify&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Morphic
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc1zq9l7oyulg8gpwg13c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc1zq9l7oyulg8gpwg13c.png" alt="Screenshot of Morphic"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/miurla/morphic" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;a href="https://morphic.sh/" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An AI-powered search engine with a generative UI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; &lt;a href="https://bun.sh/" rel="noopener noreferrer"&gt;Bun&lt;/a&gt;, &lt;a href="https://tailwindcss.com/" rel="noopener noreferrer"&gt;Tailwind&lt;/a&gt;, &lt;a href="https://sdk.vercel.ai/docs" rel="noopener noreferrer"&gt;Vercel AI SDK&lt;/a&gt;, &lt;a href="https://openai.com/" rel="noopener noreferrer"&gt;OpenAI&lt;/a&gt;, &lt;a href="https://tavily.com/" rel="noopener noreferrer"&gt;Tavily AI&lt;/a&gt;, &lt;a href="https://serper.dev/" rel="noopener noreferrer"&gt;Serper&lt;/a&gt;, &lt;a href="https://jina.ai/" rel="noopener noreferrer"&gt;Jina AI&lt;/a&gt;, &lt;a href="https://upstash.com/" rel="noopener noreferrer"&gt;Upstash&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Supabase
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxrxcjbdf7die6n2bk6a3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxrxcjbdf7die6n2bk6a3.png" alt="Screenshot of Supabase"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/supabase/supabase" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;a href="https://supabase.com/" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Supabase is an open source Firebase alternative.&lt;/p&gt;

&lt;p&gt;Supabase doesn't use fully App Router but their new apps uses it. The repository is a monorepo managed via &lt;a href="https://turbo.build/" rel="noopener noreferrer"&gt;Turborepo&lt;/a&gt;. It contains several Next.js apps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/supabase/supabase/tree/master/apps/database-new" rel="noopener noreferrer"&gt;database-new&lt;/a&gt; - some new app by Supabase. It uses App Router.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/supabase/supabase/tree/master/apps/www" rel="noopener noreferrer"&gt;www&lt;/a&gt; - marketing website, landing page, blog, etc. It doesn't use App Router yet.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/supabase/supabase/tree/master/apps/studio" rel="noopener noreferrer"&gt;studio&lt;/a&gt; - main application. It doesn't use App Router yet.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/supabase/supabase/tree/master/apps/docs" rel="noopener noreferrer"&gt;docs&lt;/a&gt; - documentation website. It doesn't use App Router yet. There is PR for migrating it to App Router - &lt;a href="https://github.com/supabase/supabase/pull/23101" rel="noopener noreferrer"&gt;link&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; &lt;a href="https://turbo.build/" rel="noopener noreferrer"&gt;Turborepo&lt;/a&gt;, &lt;a href="https://tailwindcss.com/" rel="noopener noreferrer"&gt;Tailwind&lt;/a&gt;, &lt;a href="https://openai.com/" rel="noopener noreferrer"&gt;OpenAI&lt;/a&gt;, &lt;a href="https://react-hook-form.com/" rel="noopener noreferrer"&gt;React Hook Form&lt;/a&gt;, &lt;a href="https://zod.dev/" rel="noopener noreferrer"&gt;Zod&lt;/a&gt;, &lt;a href="https://tanstack.com/query" rel="noopener noreferrer"&gt;Tanstack Query&lt;/a&gt;, &lt;a href="https://stripe.com/" rel="noopener noreferrer"&gt;Stripe&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  OpenStatus
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqbv86igz8pdil4l7mgdc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqbv86igz8pdil4l7mgdc.png" alt="Screenshot of OpenStatus"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/openstatusHQ/openstatus" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;a href="https://www.openstatus.dev/" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;OpenStatus is an open-source synthetic and frontend performance monitoring service.&lt;/p&gt;

&lt;p&gt;The repository is a monorepo managed via &lt;a href="https://turbo.build/" rel="noopener noreferrer"&gt;Turborepo&lt;/a&gt;. It contains several apps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/openstatusHQ/openstatus/tree/main/apps/web" rel="noopener noreferrer"&gt;web&lt;/a&gt; - main application, landing page&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/openstatusHQ/openstatus/tree/main/apps/docs" rel="noopener noreferrer"&gt;docs&lt;/a&gt; - documentation website&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; &lt;a href="https://turbo.build/" rel="noopener noreferrer"&gt;Turborepo&lt;/a&gt;, &lt;a href="https://tailwindcss.com/" rel="noopener noreferrer"&gt;Tailwind&lt;/a&gt;, &lt;a href="https://trpc.io/" rel="noopener noreferrer"&gt;tRPC&lt;/a&gt;, &lt;a href="https://upstash.com/" rel="noopener noreferrer"&gt;Upstash&lt;/a&gt;, &lt;a href="https://tinybird.com/" rel="noopener noreferrer"&gt;Tinybird&lt;/a&gt;, &lt;a href="http://turso.tech/" rel="noopener noreferrer"&gt;Turso&lt;/a&gt;, &lt;a href="https://orm.drizzle.team/" rel="noopener noreferrer"&gt;Drizzle ORM&lt;/a&gt;, &lt;a href="https://authjs.dev/" rel="noopener noreferrer"&gt;Auth.js&lt;/a&gt;, &lt;a href="https://react-hook-form.com/" rel="noopener noreferrer"&gt;React Hook Form&lt;/a&gt;, &lt;a href="https://zod.dev/" rel="noopener noreferrer"&gt;Zod&lt;/a&gt;, &lt;a href="https://stripe.com/" rel="noopener noreferrer"&gt;Stripe&lt;/a&gt;, &lt;a href="https://resend.com/" rel="noopener noreferrer"&gt;Resend&lt;/a&gt;, &lt;a href="https://mintlify.com/" rel="noopener noreferrer"&gt;Mintlify&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Skateshop
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5qw6jkknhdn0isnojr14.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5qw6jkknhdn0isnojr14.png" alt="Screenshot of Skateshop"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/sadmann7/skateshop" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;a href="https://skateshop.sadmn.com/" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An open source e-commerce skateshop built with modern approaches and technologies.&lt;/p&gt;

&lt;p&gt;It's not a real-world application but a good example of how to develop modern Next.js application.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; &lt;a href="https://tailwindcss.com/" rel="noopener noreferrer"&gt;Tailwind&lt;/a&gt;, &lt;a href="https://clerk.com/" rel="noopener noreferrer"&gt;Clerk&lt;/a&gt;, &lt;a href="https://upstash.com/" rel="noopener noreferrer"&gt;Upstash&lt;/a&gt;, &lt;a href="https://openai.com/" rel="noopener noreferrer"&gt;OpenAI&lt;/a&gt;, &lt;a href="https://orm.drizzle.team/" rel="noopener noreferrer"&gt;Drizzle ORM&lt;/a&gt;, &lt;a href="https://react-hook-form.com/" rel="noopener noreferrer"&gt;React Hook Form&lt;/a&gt;, &lt;a href="https://zod.dev/" rel="noopener noreferrer"&gt;Zod&lt;/a&gt;, &lt;a href="https://stripe.com/" rel="noopener noreferrer"&gt;Stripe&lt;/a&gt;, &lt;a href="https://resend.com/" rel="noopener noreferrer"&gt;Resend&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Feedbase
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9qffae00l2vq5yyfor2k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9qffae00l2vq5yyfor2k.png" alt="Screenshot of Feedbase"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/chroxify/feedbase" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;a href="https://feedbase.app/" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An open-source solution for collecting feedback and communicating updates.&lt;/p&gt;

&lt;p&gt;The repository is a monorepo managed via &lt;a href="https://turbo.build/" rel="noopener noreferrer"&gt;Turborepo&lt;/a&gt;. It contains several apps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/chroxify/feedbase/tree/main/apps/web" rel="noopener noreferrer"&gt;web&lt;/a&gt; - main application, landing page&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/chroxify/feedbase/tree/main/apps/docs" rel="noopener noreferrer"&gt;docs&lt;/a&gt; - documentation website&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; &lt;a href="https://turbo.build/" rel="noopener noreferrer"&gt;Turborepo&lt;/a&gt;, &lt;a href="https://tailwindcss.com/" rel="noopener noreferrer"&gt;Tailwind&lt;/a&gt;, &lt;a href="https://supabase.com/" rel="noopener noreferrer"&gt;Supabase&lt;/a&gt;, &lt;a href="https://tinybird.com/" rel="noopener noreferrer"&gt;Tinybird&lt;/a&gt;, &lt;a href="https://react-hook-form.com/" rel="noopener noreferrer"&gt;React Hook Form&lt;/a&gt;, &lt;a href="https://zod.dev/" rel="noopener noreferrer"&gt;Zod&lt;/a&gt;, &lt;a href="https://swr.vercel.app/" rel="noopener noreferrer"&gt;SWR&lt;/a&gt;, &lt;a href="https://resend.com/" rel="noopener noreferrer"&gt;Resend&lt;/a&gt;, &lt;a href="https://mintlify.com/" rel="noopener noreferrer"&gt;Mintlify&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Plane
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6logldhi3z3wdzf706b5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6logldhi3z3wdzf706b5.png" alt="Screenshot of Plane"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/makeplane/plane" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;a href="https://plane.so/" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An open Source JIRA, Linear and Asana alternative. Plane helps you track your issues, epics, and product roadmaps.&lt;/p&gt;

&lt;p&gt;The repository is a monorepo managed via &lt;a href="https://turbo.build/" rel="noopener noreferrer"&gt;Turborepo&lt;/a&gt;. It contains several Next.js apps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/makeplane/plane/tree/preview/admin" rel="noopener noreferrer"&gt;admin&lt;/a&gt; - admin panel. It uses App Router.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/makeplane/plane/tree/preview/web" rel="noopener noreferrer"&gt;web&lt;/a&gt; - main application. It doesn't  App Router yet.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/makeplane/plane/tree/preview/space" rel="noopener noreferrer"&gt;space&lt;/a&gt; - some application. It uses App Router.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; &lt;a href="https://turbo.build/" rel="noopener noreferrer"&gt;Turborepo&lt;/a&gt;, &lt;a href="https://tailwindcss.com/" rel="noopener noreferrer"&gt;Tailwind&lt;/a&gt;, &lt;a href="https://react-hook-form.com/" rel="noopener noreferrer"&gt;React Hook Form&lt;/a&gt;, &lt;a href="https://swr.vercel.app/" rel="noopener noreferrer"&gt;SWR&lt;/a&gt;, &lt;a href="https://mobx.js.org/" rel="noopener noreferrer"&gt;MobX&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  egghead.io
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0nmtpx1iw7qy89nzmey8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0nmtpx1iw7qy89nzmey8.png" alt="Screenshot of egghead.io"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/skillrecordings/egghead-next" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;a href="https://egghead.io/" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;egghead a learning platform for front-end developers.&lt;/p&gt;

&lt;p&gt;They are still in the process of migrating to App Router, which is a good example of how a large-scale app can be migrated to App Router incrementally.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; &lt;a href="https://tailwindcss.com/" rel="noopener noreferrer"&gt;Tailwind&lt;/a&gt;, &lt;a href="https://trpc.io/" rel="noopener noreferrer"&gt;tRPC&lt;/a&gt;, &lt;a href="https://www.prisma.io/" rel="noopener noreferrer"&gt;Prisma&lt;/a&gt;, &lt;a href="https://www.sanity.io/" rel="noopener noreferrer"&gt;Sanity&lt;/a&gt;, &lt;a href="https://formik.org/" rel="noopener noreferrer"&gt;Formik&lt;/a&gt;, &lt;a href="https://zod.dev/" rel="noopener noreferrer"&gt;Zod&lt;/a&gt;, &lt;a href="https://swr.vercel.app/" rel="noopener noreferrer"&gt;SWR&lt;/a&gt;, &lt;a href="https://tanstack.com/query" rel="noopener noreferrer"&gt;Tanstack Query&lt;/a&gt;, &lt;a href="https://upstash.com/" rel="noopener noreferrer"&gt;Upstash&lt;/a&gt;, &lt;a href="https://stripe.com/" rel="noopener noreferrer"&gt;Stripe&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;In this article, we explored several open-source projects built with Next.js 14 and App Router. These open-source projects serve as excellent learning resources, offering practical examples of how to leverage Next.js 14 and App Router to build robust, scalable applications. Whether you are looking to enhance your skills, find inspiration, or discover new tools, delving into these codebases will undoubtedly contribute to your growth as a developer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Want to find more real-world projects?&lt;/strong&gt; You can find more projects built with different technologies in &lt;a href="https://github.com/stars/lesha1201/lists/real-world-apps" rel="noopener noreferrer"&gt;my collection&lt;/a&gt; on GitHub.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which open-source Next.js projects inspire you the most? Please, share your thoughts and experiences in the comments below.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>frontend</category>
      <category>react</category>
      <category>opensource</category>
    </item>
    <item>
      <title>How we estimate tasks in Story Points</title>
      <dc:creator>Alexey Ryabov</dc:creator>
      <pubDate>Mon, 18 Dec 2023 09:56:57 +0000</pubDate>
      <link>https://forem.com/datarockets/how-we-estimate-tasks-in-story-points-249i</link>
      <guid>https://forem.com/datarockets/how-we-estimate-tasks-in-story-points-249i</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Originally published &lt;a href="https://datarockets.com/blog/code/estimate-story-points/"&gt;here&lt;/a&gt; by &lt;a href="https://aryabov.com/"&gt;Alexey Ryabov&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Estimating story points may be a term you've come across in software development, as it is a common method used by teams to estimate the effort required to complete tasks. Unfortunately, without a deeper understanding of &lt;em&gt;how&lt;/em&gt; or &lt;em&gt;why&lt;/em&gt; it works, this method can be misused by teams and can even lead to unintended consequences and valuable time wasted.&lt;/p&gt;

&lt;p&gt;This article will break down the fundamentals of what story points are and provide a step-by-step guide on how to use them to estimate tasks in software development teams.&lt;/p&gt;

&lt;p&gt;Here's what we'll cover:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What are story points?&lt;/li&gt;
&lt;li&gt;How to estimate in story points?&lt;/li&gt;
&lt;li&gt;Why use story points?&lt;/li&gt;
&lt;li&gt;Examples of using story points&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At the end, you will find additional resources that can help you deepen your understanding of story points more.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are story points?
&lt;/h2&gt;

&lt;p&gt;Story points are an abstract unit of measurement to estimate the overall effort. Story points are a flexible and elegant method as they can take into account different factors based on your team's needs such as time, complexity, amount of work, risks and uncertainties, etc.&lt;/p&gt;

&lt;p&gt;The tasks are estimated in story points relative to each other. That's why it's important to have some baseline tasks that you have estimated together with your team and have discussed that estimation in detail. This will serve as a benchmark for everyone to estimate the other tasks.&lt;/p&gt;

&lt;p&gt;Story points are usually assigned using a scale such as the Fibonacci sequence (1, 2, 3, 5, 8, 13, 21, etc.). It's not a requirement to use this particular scale, you can use any scale that works for you. The advantage of the Fibonacci sequence is that it's a non-linear sequence that brings the following properties:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Represents well the idea that estimating a task becomes less precise as the task becomes larger.&lt;/li&gt;
&lt;li&gt;Illustrates well the idea of relative sizing. Using a linear scale (e.g., 1, 2, 3, 4, 5) might give the false impression that each story point is the same amount more complex as the one before. The Fibonacci sequence avoids this pitfall by emphasizing that the relationship between sizes is approximate and non-linear. The ratio between values is more important than the values itself.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to estimate in story points?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Define factors of story points
&lt;/h3&gt;

&lt;p&gt;Before using story points, you need to define what a story point represents. You need to think about which factors are the most important for your team and describe them in detail.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The factors can vary between teams and projects.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In this guide, we will be using the following factors:&lt;/p&gt;

&lt;h4&gt;
  
  
  ⌚ Time
&lt;/h4&gt;

&lt;p&gt;Even though Time isn't usually listed as a factor in other guides, I believe that it's quite an important one for tasks that are clear (usually small tasks). Instead of trying to give a precise amount of time to implement a task, it's better to use an approximate amount which improves the accuracy of estimations and makes it easier to estimate. If it's too hard to predict, we give our estimate based on other factors. If other factors differ a lot from the time, then it can mean that you need to revisit your estimation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Questions&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How long does it take to complete the task approximately?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Options&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;0 - 2 hours&lt;/li&gt;
&lt;li&gt;3 - 8 hours&lt;/li&gt;
&lt;li&gt;9 - 16 hours&lt;/li&gt;
&lt;li&gt;17 - 26 hours&lt;/li&gt;
&lt;li&gt;27 - 40 hours&lt;/li&gt;
&lt;li&gt;Unknown&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  🧠 Complexity
&lt;/h4&gt;

&lt;p&gt;Complexity takes into account such things as a need for special knowledge, clarity of implementation, amount of edge cases, etc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Questions&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How hard is it to complete this task?&lt;/li&gt;
&lt;li&gt;Do you need special knowledge to complete this task?&lt;/li&gt;
&lt;li&gt;Is the solution clear or does it require some time to come up with a solution?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Options&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lowest&lt;/li&gt;
&lt;li&gt;Low&lt;/li&gt;
&lt;li&gt;Medium&lt;/li&gt;
&lt;li&gt;High&lt;/li&gt;
&lt;li&gt;Highest&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  🛠️ Amount of work
&lt;/h4&gt;

&lt;p&gt;Amount of work assesses the sheer volume of work required to complete a task. This factor is quite related to Time but answers different questions. It's often the case when it's hard to estimate time but it's clear that you need to write a lot of code or you need to do some research before implementing a task.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Questions&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does it require writing a lot of code?&lt;/li&gt;
&lt;li&gt;How much work needs to be done?&lt;/li&gt;
&lt;li&gt;How much do you need to research?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Options&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lowest&lt;/li&gt;
&lt;li&gt;Low&lt;/li&gt;
&lt;li&gt;Medium&lt;/li&gt;
&lt;li&gt;High&lt;/li&gt;
&lt;li&gt;Highest&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  💣 Risk and uncertainty
&lt;/h4&gt;

&lt;p&gt;Risk and uncertainty take into account things you can't know until starting a task. For example, you can't envision what issues you will stumble across during an upgrade of some library to a major version even when it has clear release notes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Questions&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How much is known about a task?&lt;/li&gt;
&lt;li&gt;Is the task clear?&lt;/li&gt;
&lt;li&gt;Is there something that's hard to predict?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Options&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;None&lt;/li&gt;
&lt;li&gt;Low&lt;/li&gt;
&lt;li&gt;Medium&lt;/li&gt;
&lt;li&gt;High&lt;/li&gt;
&lt;li&gt;Highest&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the Examples section, we will use those factors, commenting on a decision for each of them.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Determine your story point sequence
&lt;/h3&gt;

&lt;p&gt;Your team needs to have a limited set of possible story points to make the estimation process more accurate and easier. It's not that important the actual values of story points. It can be numbers or even letters (e.g. S, M, L, see &lt;a href="https://asana.com/resources/t-shirt-sizing"&gt;T-shirt sizing&lt;/a&gt;). But the values should be relative to each other and easy to understand.&lt;/p&gt;

&lt;p&gt;Some popular choices are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.avion.io/blog/story-points-fibonacci/#the-fibonacci-sequence"&gt;Fibonacci sequence&lt;/a&gt; (1, 2, 3, 5, 8, 13, 21)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://asana.com/resources/t-shirt-sizing"&gt;T-shirt sizing&lt;/a&gt; (XS, S, M, L, XL)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's usually a good idea to have a small set of story points (~5 options) because as an estimate becomes bigger it becomes less accurate. When your estimate is big for a task, it's a good sign that you need to break the task down into smaller tasks and estimate them separately.&lt;/p&gt;

&lt;p&gt;In this guide, we will be using the Fibonacci sequence (1, 2, 3, 5, 8).&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Create a story point matrix
&lt;/h3&gt;

&lt;p&gt;A story point matrix helps your team to estimate tasks by accumulating all the factors. It makes estimations more consistent, helps the team to be on the same page when it comes to estimations and to argue the estimation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NsZEe0yX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dug7m9o5q2ppf1yq3z70.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NsZEe0yX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dug7m9o5q2ppf1yq3z70.png" alt="Story Point Matrix" width="800" height="369"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Explain the concept to the team
&lt;/h3&gt;

&lt;p&gt;Once you set the definition of a story point, determined a sequence, and created a story point matrix, now it's time to explain it to the team and show how to use it. It's important that each team member understands the concept.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Prepare baseline tasks for future estimates
&lt;/h3&gt;

&lt;p&gt;You need to select some tasks that will act as a reference/baseline for future estimates and estimate them in detail together with a team using the matrix. It will simplify the estimation process a lot in the future and will make story points and the matrix much clearer.&lt;/p&gt;

&lt;p&gt;The more you use story points, the more accurate estimates become so feel free to change baseline tasks from time to time.&lt;/p&gt;

&lt;p&gt;Ideally, you need to have at least one baseline task for each story point value you have.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Set up a poker planning session
&lt;/h3&gt;

&lt;p&gt;Poker planning helps to organize the estimation process. The idea of poker planning is that each participant estimates a task in story points privately and the result isn't shown until the voting is over. If the story points are the same, move on to the next task. If the story points differ much, it's time to discuss it together and clarify why participants chose a certain amount of story points.&lt;/p&gt;

&lt;p&gt;There are a lot of tools for this. In our team, we use Slack for communication and it has a good extension &lt;a href="https://deniz.co/slack-poker-planner/"&gt;"Poker Planner for Slack"&lt;/a&gt;. It has all the configurations we need, it's easy to use, and makes it possible to make the session asynchronous.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Execute your sprint and measure its velocity
&lt;/h3&gt;

&lt;p&gt;The beautiful side of estimation is that it allows us to measure a team's velocity. The velocity is the measure of a team's capacity to complete work during a sprint. Story points improve accuracy by having a limited amount of values and taking into account multiple factors. Knowing the team's velocity helps to see potential issues, discuss them with the team, and set realistic goals for the next sprints.&lt;/p&gt;

&lt;p&gt;To calculate the velocity, you just need to calculate the total amount of completed story points when a sprint ends. This number is the velocity of your team for the sprint.&lt;/p&gt;

&lt;p&gt;After completing several sprints, it's a good idea to measure an average velocity which will help you to understand how many story points you can plan for the next sprints.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why use story points?
&lt;/h2&gt;

&lt;p&gt;Now, when we know what story points are and how to use them, we can summarize the benefits of story points. Understanding these benefits will shed light on why teams often choose story points over other methods for estimation and planning.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;More Accurate Estimations&lt;/strong&gt;. Story points help us to estimate tasks more accurately compared to other simple measurements such as time because it takes into account multiple measurements, which often impact the estimations, such as complexity, amount of work, risks and uncertainties. Besides accuracy, it makes it easier to estimate because all the factors are approximate values and a team doesn't need to give precise estimations for each factor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reduced Pressure on Teams&lt;/strong&gt;. Since story points aren't tied to time only and it's an abstract unit, it reduces pressure on teams which leads to more productive work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Improved Team Collaboration&lt;/strong&gt;. Story points define an exact process for estimating tasks. It involves the whole team into the estimation process and gives a common language for estimating which improves communication. Techniques such as "Poker planning" make the estimation process more efficient and productive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Statistics&lt;/strong&gt;. Story points help the team to analyze their performance by calculating different metrics such as velocity. Having statistics helps us to spot performance issues in advance, discuss it with a team, and plan the next sprints more accurately based on the statistics.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Examples
&lt;/h2&gt;

&lt;p&gt;To better understand story points, let's estimate some tasks together using the matrix from this guide.&lt;/p&gt;

&lt;h3&gt;
  
  
  Task #1. Use pluralization rules for text
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We need to update all instances in the UI where we use a noun with a dynamic number to use a function that automatically applies the appropriate pluralization rule. For example, "1 word", "2 words", etc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Additional context&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We're going to use a library which we've used on other projects before. The codebase is of medium size and it's not hard to search in it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Estimation&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Time&lt;/strong&gt; - 0-2 hours. Knowing the existing code base isn't very big, we're pretty sure that this task won't take more than 2 hours.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complexity&lt;/strong&gt; - Lowest. There is nothing complex to implement. We don't need to implement pluralization from scratch since we're going to use a library for that.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Amount of work&lt;/strong&gt; - Low. It requires us to go through the codebase and find places where we need to update text.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Risk and uncertainty&lt;/strong&gt; - Low. Since we don't know the exact places where we need to update text, there is a small risk of underestimating and having more places than we initially expected.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Points - 1&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Task #2. Add virtualization to feed
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We have a feed of users' posts with infinite scroll. We need to implement virtualization in the list to improve its performance when the list becomes large.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Additional context&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We're going to use some library for virtualization but we don't know which one yet. The list has items with dynamic height. The code for the feed is readable and written quite well.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Estimation&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Time&lt;/strong&gt; - 3-8 hours. We don't need to implement the virtualization logic from scratch since we're going to use some library for that. We previously had experience of applying virtualization in previous projects, so we know the general idea and know approximately how much time it can take.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complexity&lt;/strong&gt; - Medium. Virtualization is not a straightforward concept. To successfully apply it, we need to understand how it works. We have a dynamic height for a list item and an infinite scroll, which complicates the usage of virtualization.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Amount of work&lt;/strong&gt; - Low. Since we had experience previously using some libraries for virtualization, we know that, in most cases, it doesn't require a lot of changes in the codebase. The code for the feed is written well, and it's easy to change and understand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Risk and uncertainty&lt;/strong&gt; - Medium. We don't know exactly what library we're going to use. There are some risks of something not working as before because it changes drastically the way the feed is rendered.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Points - 2&lt;/strong&gt;. Here we have an uncertain situation because the factors we chose don't map to the matrix fully. From the matrix, it should be either 2 or 3. We ended up choosing 2 because everyone was sure that it wouldn't take more than 8 hours, and it was a decisive factor.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Task #3. Implement login page
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the scope of this task, we need to add a new page &lt;code&gt;/sign-in&lt;/code&gt; which contains a simple form with &lt;code&gt;email&lt;/code&gt; and &lt;code&gt;password&lt;/code&gt; fields and a submit button. We need to handle errors from API. We also need to establish architecture for protected/unprotected routes and make the login page available only for unauthenticated users.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Additional context&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We're going to use some library for managing forms. We have all basic components like input, button, etc. in UI kit we use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Estimation&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Time&lt;/strong&gt; - 9-16 hours. Based on previous experience and taking into account that we're going to use a lot of existing solutions, we think that it won't take more than 16 hours.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complexity&lt;/strong&gt; - Low. It contains pretty common functionality. UI doesn't have anything complex and most of the components are already ready. All the complex form management/validation will handle some library. Amount of work - Medium. We need to do several things, like choosing a library for form management, communicating with API, handling errors from API, implementing an architecture for protected/unprotected routes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Risk and uncertainty&lt;/strong&gt; - Low. It's clear how it should work. We know how to communicate with API. We have experience working with forms, so even though we don't know which library we're going to use, we don't expect a lot of risks from it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Points - 3&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Task #4. Implement chart on dashboard
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We need to implement a chart on a dashboard which shows some statistics. It's a bar chart with a tooltip. The design for the chart is custom.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Additional context&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We're going to use some library for building charts but we don't know which one yet. We don't have any experience building charts. We need to implement it to look the same as on the design so we need a library where we can customize the appearance of charts as we need. We need to think about the loading state, empty state. We need to communicate with API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Estimation&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Time&lt;/strong&gt; - Unknown. It's hard to estimate how much time it needs since we don't have prior experience in implementing charts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complexity&lt;/strong&gt; - High. Data visualization isn't an easy concept and requires special knowledge to successfully build custom charts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Amount of work&lt;/strong&gt; - High. We need to find a library which covers all our requirements. We need to learn the found library and learn data visualization in general.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Risk and uncertainty&lt;/strong&gt; - High. Since we never did it before, there are a lot of uncertainties and risks. We don't know which library we're going to use, we don't know how hard it's to use that library and which issues it has, we don't know how hard it's to learn data visualization.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Points - 8&lt;/strong&gt;. Even though it might not take much time in the end, we still chose 8 because there are a lot of uncertainties.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Additional resources
&lt;/h2&gt;

&lt;p&gt;If you want to understand better story points then I highly recommend to read these articles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.parabol.co/blog/story-points/"&gt;Story Points: The Complete Guide &amp;amp; FAQ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://asana.com/resources/story-points"&gt;What are story points? Six easy steps to estimate work in Agile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.avion.io/blog/story-points-fibonacci/#the-fibonacci-sequence"&gt;Fibonacci for User Stories - How &amp;amp; Why to Use Relative Story Points&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>management</category>
      <category>productivity</category>
      <category>agile</category>
      <category>estimation</category>
    </item>
  </channel>
</rss>
