<?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>DEV Community: Brent </title>
    <description>The latest articles on DEV Community by Brent  (@sabanite08).</description>
    <link>https://dev.to/sabanite08</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%2F3918308%2Fa9e60be0-138b-4561-aca6-7fea9a3be6b8.png</url>
      <title>DEV Community: Brent </title>
      <link>https://dev.to/sabanite08</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sabanite08"/>
    <language>en</language>
    <item>
      <title>I built 73 free construction calculators in 11 days with Next.js. Here's what shipped, what broke, and what I learned about SEO for a brand-new domain</title>
      <dc:creator>Brent </dc:creator>
      <pubDate>Thu, 07 May 2026 16:06:31 +0000</pubDate>
      <link>https://dev.to/sabanite08/i-built-73-free-construction-calculators-in-11-days-with-nextjs-heres-what-shipped-what-broke-4pp6</link>
      <guid>https://dev.to/sabanite08/i-built-73-free-construction-calculators-in-11-days-with-nextjs-heres-what-shipped-what-broke-4pp6</guid>
      <description>&lt;p&gt;I built &lt;a href="https://projectcalc.app" rel="noopener noreferrer"&gt;ProjectCalc&lt;/a&gt; — a free library of 73 calculators for construction, home improvement,&lt;br&gt;
  and DIY projects. No signup, no popups, no AI chatbot, runs entirely in your browser. Stack: Next.js 16 (App Router) +&lt;br&gt;
   TypeScript + vanilla CSS, deployed on Vercel.&lt;/p&gt;

&lt;p&gt;Source: &lt;a href="https://github.com/sabanite08/projectcalc" rel="noopener noreferrer"&gt;github.com/sabanite08/projectcalc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;## Why&lt;/p&gt;

&lt;p&gt;Every existing construction calculator on Google is buried under cookie banners, popup signups, AI chatbots, and ads.&lt;br&gt;
  The Reddit answer to "how much concrete do I need" is always a screenshot from someone else's calculator because the&lt;br&gt;
  original site is unusable.&lt;/p&gt;

&lt;p&gt;So I built the version I wanted: dead simple, fast, no friction.&lt;/p&gt;

&lt;p&gt;## What shipped&lt;/p&gt;

&lt;p&gt;73 calculators across 6 categories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Carpentry&lt;/strong&gt; — beam span, header size, stair stringer, rafter length, floor joist span, snow load, plywood sheets,
lumber cuts, framing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Electrical&lt;/strong&gt; — voltage drop (NEC), conduit fill (Chapter 9), wire gauge (Table 310.16), panel load (NEC 220),
circuit breaker (240.6), conduit bending, generator sizing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plumbing&lt;/strong&gt; — drain/vent/supply pipe sizing (IPC), trap size, pressure loss (Hazen-Williams), fixture units&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HVAC&lt;/strong&gt; — Manual J load, BTU sizing, duct CFM, refrigerant charge, static pressure, mini-split sizing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Home &amp;amp; DIY&lt;/strong&gt; — concrete, drywall, paint, hardwood, roofing, tile, gravel, mulch, sod, pavers, fence, deck stain&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Finance&lt;/strong&gt; — mortgage, car payment, personal loan&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Plus a &lt;a href="https://projectcalc.app/sketch" rel="noopener noreferrer"&gt;visual room sketcher&lt;/a&gt; that draws your room as you type dimensions, then jumps&lt;br&gt;
  you into the matching calc with the numbers pre-filled. Handles L-shapes too.&lt;/p&gt;

&lt;p&gt;Each calc shows the formula, worked example, common mistakes, and rules of thumb so you can sanity-check the result.&lt;br&gt;
  Code references documented (NEC, IPC, IRC, ACCA) where applicable.&lt;/p&gt;

&lt;p&gt;## Stack&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js 16&lt;/strong&gt; with App Router, TypeScript, vanilla CSS (no Tailwind — wanted to keep the bundle tight)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vercel&lt;/strong&gt; for hosting + auto-deploy on push to main&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Static generation&lt;/strong&gt; for every calc page — they're all SSG'd, so first paint is sub-second&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Single source of truth&lt;/strong&gt;: &lt;code&gt;lib/calculators.ts&lt;/code&gt; defines all 73 calcs as a typed array. The dynamic route
&lt;code&gt;/[slug]/page.tsx&lt;/code&gt; renders any of them. Adding a calc = adding one entry.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;  &lt;span class="c1"&gt;// Calculator type — every calc is one entry in lib/calculators.ts&lt;/span&gt;
  &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Calculator&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;construction&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;home&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;finance&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utility&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;trade&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Carpentry&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Masonry &amp;amp; Siding&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Electrical&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Plumbing&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;HVAC&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;desc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;formula&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;metaTitle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;metaDesc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;seoIntro&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;howToUse&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;workedExample&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;commonMistakes&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;rulesOfThumb&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CalcInput&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;
    &lt;span class="nl"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Record&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;CalcResult&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This was the highest-leverage decision in the whole codebase. New calculator = one new entry in the array, zero new&lt;br&gt;
  components.&lt;/p&gt;

&lt;p&gt;## What worked&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Static generation + small bundle.&lt;/strong&gt; Every page prerenders to plain HTML at build time. Lighthouse scores 95+ across&lt;br&gt;
  the board. First Contentful Paint under 1s on a slow 3G simulation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Schema.org structured data on every page.&lt;/strong&gt; WebApplication + FAQPage on calc pages, BreadcrumbList everywhere,&lt;br&gt;
  ItemList on the homepage telling Google "this site has 73 calculators." Costs nothing, helps a lot for SERP features.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Companion blog posts.&lt;/strong&gt; Every calculator has a 700-1,000 word companion blog post. Cross-linked to the calc and to&lt;br&gt;
  related calcs. This builds an internal link graph that Google can crawl efficiently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Visual sketcher as a differentiator.&lt;/strong&gt; Most calculator sites are forms. The room sketcher (live SVG drawing as you&lt;br&gt;
  type) is the one feature competitors don't have. Useful AND a unique selling point.&lt;/p&gt;

&lt;p&gt;## What didn't work (yet)&lt;/p&gt;

&lt;p&gt;This is the unsexy part nobody talks about when they launch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Google AdSense rejected the site for "low value content"&lt;/strong&gt; at day 8. The calc pages themselves were too thin —&lt;br&gt;
  just a form + short intro. Spent today rewriting every calc page to 800-1,200 words of contextual content (how to use&lt;br&gt;
  it, worked example, common mistakes, rules of thumb). Will reapply in 2-4 weeks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. impact.com Marketplace declined the site.&lt;/strong&gt; Almost certainly traffic — was 8 days old. Direct Home Depot&lt;br&gt;
  affiliate also declined. Falling back to CJ Affiliate, ShareASale, FlexOffers as alternatives.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Google Search Console shows 94 of ~140 pages "Crawled - currently not indexed."&lt;/strong&gt; Site age + zero backlinks =&lt;br&gt;
  Google being conservative. The fix is time (re-crawl after the prose expansion) plus earning a few backlinks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Reddit's site-wide spam filter killed my launch post&lt;/strong&gt; within minutes. Brand-new account + link post =&lt;br&gt;
  auto-removed. Need to build comment karma over a couple weeks before link posts clear.&lt;/p&gt;

&lt;p&gt;## Lessons&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;For a new domain in any commercial niche, plan for 8-12 weeks of rejection-by-default before signals start coming
through.&lt;/strong&gt; Google, AdSense, affiliate networks, Reddit, HN — they all have new-site/new-account filters that exist
because of the spammers who came before you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Static + structured + cross-linked is table stakes for SEO.&lt;/strong&gt; It's not a strategy, it's the floor. The strategy is
the content depth on each page.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The single highest-leverage decision was the calculator schema.&lt;/strong&gt; Adding a calc takes 10 minutes. If I had started
with bespoke pages, adding the 50th calc would have been a 4-hour task.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vulnerability beats hype.&lt;/strong&gt; I'd rather post about getting denied by 3 affiliate networks than pretend I'm crushing
it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;## Try it&lt;/p&gt;

&lt;p&gt;&lt;a href="https://projectcalc.app" rel="noopener noreferrer"&gt;projectcalc.app&lt;/a&gt; — click any calculator, no signup, runs in your browser.&lt;/p&gt;

&lt;p&gt;Feedback I'm looking for:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Honest critique on whichever calc you click into first&lt;/li&gt;
&lt;li&gt;Calcs you wish existed — if it's reasonable scope I'll add it&lt;/li&gt;
&lt;li&gt;Anything broken on mobile (tested but limited devices)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Source on &lt;a href="https://github.com/sabanite08/projectcalc" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; — issues and PRs welcome, especially formula corrections&lt;br&gt;
   with code citations.&lt;/p&gt;

&lt;p&gt;What's the most over-engineered website you've ever needed for a 30-second math problem?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>nextjs</category>
      <category>showdev</category>
      <category>seo</category>
    </item>
  </channel>
</rss>
