<?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: Cyril Yevdokimov</title>
    <description>The latest articles on Forem by Cyril Yevdokimov (@cyrilye).</description>
    <link>https://forem.com/cyrilye</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%2F3798867%2Fe707f2a2-166f-4441-b681-78a1bb8bc0b7.jpg</url>
      <title>Forem: Cyril Yevdokimov</title>
      <link>https://forem.com/cyrilye</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/cyrilye"/>
    <language>en</language>
    <item>
      <title>How I Built 1,182 Pages of Free Time Tools with Next.js 16</title>
      <dc:creator>Cyril Yevdokimov</dc:creator>
      <pubDate>Sat, 28 Feb 2026 23:21:45 +0000</pubDate>
      <link>https://forem.com/cyrilye/how-i-built-1182-pages-of-free-time-tools-with-nextjs-16-1b75</link>
      <guid>https://forem.com/cyrilye/how-i-built-1182-pages-of-free-time-tools-with-nextjs-16-1b75</guid>
      <description>&lt;p&gt;I'm a product designer and developer. A few months ago I decided to build a side project - a comprehensive collection of free time tools that could generate organic traffic through programmatic SEO. The result is &lt;a href="https://timerjoy.com" rel="noopener noreferrer"&gt;Timerjoy&lt;/a&gt; — 1,182+ pages across 37 categories, all statically generated with Next.js 16.&lt;/p&gt;

&lt;p&gt;Here's how it works and what I learned.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Concept
&lt;/h2&gt;

&lt;p&gt;Take a category like "timers" and generate pages programmatically. A 1-minute timer, 5-minute timer, 25-minute timer - each with unique metadata, JSON-LD structured data, and actual functionality. Now multiply that across 37 categories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Timers&lt;/strong&gt; — 1 second to 12 hours, visual, classroom, Pomodoro&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Breathing exercises&lt;/strong&gt; — Box Breathing, 4-7-8, Wim Hof&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fitness timers&lt;/strong&gt; — HIIT, Tabata, Boxing rounds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chess clocks&lt;/strong&gt; — Blitz, Rapid, Classical&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sunrise/sunset&lt;/strong&gt; — for 348 US cities&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Moon phases&lt;/strong&gt; — current phase + monthly calendar&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;64 holiday countdowns&lt;/strong&gt; — Christmas, Ramadan, Diwali, and more&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Date calculators, world clock, caffeine calculator, tea timer, meditation timer...&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every page is a real, working tool — not SEO filler.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Stack
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Framework&lt;/td&gt;
&lt;td&gt;Next.js 16 (App Router)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Language&lt;/td&gt;
&lt;td&gt;TypeScript&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Styling&lt;/td&gt;
&lt;td&gt;Tailwind CSS 4 + custom design system&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployment&lt;/td&gt;
&lt;td&gt;Vercel (Edge Network)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rendering&lt;/td&gt;
&lt;td&gt;Static Generation (SSG)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  How 1,182 Pages Get Built
&lt;/h2&gt;

&lt;p&gt;The core of programmatic SEO in Next.js is &lt;code&gt;generateStaticParams()&lt;/code&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Define data arrays (348 cities, 64 holidays, timer presets, etc.)&lt;/li&gt;
&lt;li&gt;Each array feeds a dynamic route like &lt;code&gt;/sunrise-sunset/[city]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Next.js generates all pages at build time&lt;/li&gt;
&lt;li&gt;Every page gets unique metadata, structured data (JSON-LD), and content&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The result: 1,182 fully static HTML pages, served from Vercel's edge network. Average page load: under 200ms.&lt;/p&gt;

&lt;p&gt;Adding a new category is straightforward — define the data, create the route, and the build system handles the rest. When I added sunrise/sunset data for US cities, it generated 348 new pages automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Design System
&lt;/h2&gt;

&lt;p&gt;I wanted something that felt different from the typical SaaS look. The entire UI is inspired by vintage Braun products — Dieter Rams' "less, but better" philosophy.&lt;/p&gt;

&lt;p&gt;The design system has a few core components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;braun-panel&lt;/strong&gt; — light outer container with subtle shadows&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;braun-display&lt;/strong&gt; — dark screen area, like a calculator LCD&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;braun-btn-orange&lt;/strong&gt; — the iconic Braun orange accent&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Indicator dots&lt;/strong&gt; — tiny LED-style state indicators&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything uses a warm cream palette (&lt;code&gt;#f4f4f2&lt;/code&gt;), deliberate spacing, and minimal typography. No gradients, no glassmorphism — just clean functional design.&lt;/p&gt;

&lt;p&gt;Building a consistent design system early on was one of the best decisions. Every new tool uses the same components, so adding features takes hours instead of days.&lt;/p&gt;

&lt;h2&gt;
  
  
  SEO Infrastructure
&lt;/h2&gt;

&lt;p&gt;Each page gets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;meta description&amp;gt;&lt;/code&gt;&lt;/strong&gt; — unique per page, keyword-targeted&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JSON-LD structured data&lt;/strong&gt; — WebApplication, FAQPage schemas&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Canonical URLs&lt;/strong&gt; — preventing duplicate content&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic sitemap&lt;/strong&gt; — generated at build time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-links&lt;/strong&gt; — related tools link to each other, building internal link structure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The sitemap alone is massive — 1,182 URLs that Google needs to discover and crawl.&lt;/p&gt;

&lt;h2&gt;
  
  
  Early Results
&lt;/h2&gt;

&lt;p&gt;The site launched recently. First week in Google Search Console:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;27,900 impressions&lt;/strong&gt; — Google is showing pages in search results&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sunrise/sunset and moon phases&lt;/strong&gt; are the strongest categories so far&lt;/li&gt;
&lt;li&gt;Most pages are still in Google's crawl queue — with 1,182 URLs, it takes time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The foundation is there. As Google indexes more pages and the domain builds authority, traffic should compound.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Static wins for tools.&lt;/strong&gt; Users want instant results. Static pages load faster than any server-rendered alternative. The tradeoff (longer build times) is worth it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Design systems compound.&lt;/strong&gt; Investing in a consistent component library early meant every new tool category was fast to build and visually consistent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Programmatic SEO is a long game.&lt;/strong&gt; Google doesn't index 1,182 pages overnight. Patience and proper technical SEO (sitemaps, structured data, canonicals) matter more than content volume.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Zero-friction UX matters.&lt;/strong&gt; No sign-up walls, no cookie banners, no "subscribe to continue" popups. Just tools that work. Users stay longer when there's nothing in their way.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;PWA support (install as app)&lt;/li&gt;
&lt;li&gt;Custom timer presets&lt;/li&gt;
&lt;li&gt;Sound themes&lt;/li&gt;
&lt;li&gt;More international holidays&lt;/li&gt;
&lt;li&gt;Multi-language support&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://timerjoy.com" rel="noopener noreferrer"&gt;Timerjoy&lt;/a&gt; is completely free — no accounts, no ads. The &lt;a href="https://github.com/Cyril-Ye/timerjoy-app" rel="noopener noreferrer"&gt;project overview&lt;/a&gt; is on GitHub.&lt;/p&gt;

&lt;p&gt;I'd love to hear feedback — what would you add to a tool like this?&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>typescript</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
