I built ProjectCalc — a free library of 73 calculators for construction, home improvement,
and DIY projects. No signup, no popups, no AI chatbot, runs entirely in your browser. Stack: Next.js 16 (App Router) +
TypeScript + vanilla CSS, deployed on Vercel.
Source: github.com/sabanite08/projectcalc
## Why
Every existing construction calculator on Google is buried under cookie banners, popup signups, AI chatbots, and ads.
The Reddit answer to "how much concrete do I need" is always a screenshot from someone else's calculator because the
original site is unusable.
So I built the version I wanted: dead simple, fast, no friction.
## What shipped
73 calculators across 6 categories:
- Carpentry — beam span, header size, stair stringer, rafter length, floor joist span, snow load, plywood sheets, lumber cuts, framing
- Electrical — voltage drop (NEC), conduit fill (Chapter 9), wire gauge (Table 310.16), panel load (NEC 220), circuit breaker (240.6), conduit bending, generator sizing
- Plumbing — drain/vent/supply pipe sizing (IPC), trap size, pressure loss (Hazen-Williams), fixture units
- HVAC — Manual J load, BTU sizing, duct CFM, refrigerant charge, static pressure, mini-split sizing
- Home & DIY — concrete, drywall, paint, hardwood, roofing, tile, gravel, mulch, sod, pavers, fence, deck stain
- Finance — mortgage, car payment, personal loan
Plus a visual room sketcher that draws your room as you type dimensions, then jumps
you into the matching calc with the numbers pre-filled. Handles L-shapes too.
Each calc shows the formula, worked example, common mistakes, and rules of thumb so you can sanity-check the result.
Code references documented (NEC, IPC, IRC, ACCA) where applicable.
## Stack
- Next.js 16 with App Router, TypeScript, vanilla CSS (no Tailwind — wanted to keep the bundle tight)
- Vercel for hosting + auto-deploy on push to main
- Static generation for every calc page — they're all SSG'd, so first paint is sub-second
-
Single source of truth:
lib/calculators.tsdefines all 73 calcs as a typed array. The dynamic route/[slug]/page.tsxrenders any of them. Adding a calc = adding one entry.
// Calculator type — every calc is one entry in lib/calculators.ts
export interface Calculator {
slug: string;
name: string;
category: 'construction' | 'home' | 'finance' | 'utility';
trade?: 'Carpentry' | 'Masonry & Siding' | 'Electrical' | 'Plumbing' | 'HVAC';
desc: string;
formula: string;
metaTitle: string;
metaDesc: string;
seoIntro: string;
howToUse?: string;
workedExample?: string;
commonMistakes?: string;
rulesOfThumb?: string;
inputs: CalcInput[];
calc: (data: Record<string, string | number>) => CalcResult;
// ...
}
This was the highest-leverage decision in the whole codebase. New calculator = one new entry in the array, zero new
components.
## What worked
Static generation + small bundle. Every page prerenders to plain HTML at build time. Lighthouse scores 95+ across
the board. First Contentful Paint under 1s on a slow 3G simulation.
Schema.org structured data on every page. WebApplication + FAQPage on calc pages, BreadcrumbList everywhere,
ItemList on the homepage telling Google "this site has 73 calculators." Costs nothing, helps a lot for SERP features.
Companion blog posts. Every calculator has a 700-1,000 word companion blog post. Cross-linked to the calc and to
related calcs. This builds an internal link graph that Google can crawl efficiently.
Visual sketcher as a differentiator. Most calculator sites are forms. The room sketcher (live SVG drawing as you
type) is the one feature competitors don't have. Useful AND a unique selling point.
## What didn't work (yet)
This is the unsexy part nobody talks about when they launch.
1. Google AdSense rejected the site for "low value content" at day 8. The calc pages themselves were too thin —
just a form + short intro. Spent today rewriting every calc page to 800-1,200 words of contextual content (how to use
it, worked example, common mistakes, rules of thumb). Will reapply in 2-4 weeks.
2. impact.com Marketplace declined the site. Almost certainly traffic — was 8 days old. Direct Home Depot
affiliate also declined. Falling back to CJ Affiliate, ShareASale, FlexOffers as alternatives.
3. Google Search Console shows 94 of ~140 pages "Crawled - currently not indexed." Site age + zero backlinks =
Google being conservative. The fix is time (re-crawl after the prose expansion) plus earning a few backlinks.
4. Reddit's site-wide spam filter killed my launch post within minutes. Brand-new account + link post =
auto-removed. Need to build comment karma over a couple weeks before link posts clear.
## Lessons
- For a new domain in any commercial niche, plan for 8-12 weeks of rejection-by-default before signals start coming through. Google, AdSense, affiliate networks, Reddit, HN — they all have new-site/new-account filters that exist because of the spammers who came before you.
- Static + structured + cross-linked is table stakes for SEO. It's not a strategy, it's the floor. The strategy is the content depth on each page.
- The single highest-leverage decision was the calculator schema. Adding a calc takes 10 minutes. If I had started with bespoke pages, adding the 50th calc would have been a 4-hour task.
- Vulnerability beats hype. I'd rather post about getting denied by 3 affiliate networks than pretend I'm crushing it.
## Try it
projectcalc.app — click any calculator, no signup, runs in your browser.
Feedback I'm looking for:
- Honest critique on whichever calc you click into first
- Calcs you wish existed — if it's reasonable scope I'll add it
- Anything broken on mobile (tested but limited devices)
Source on GitHub — issues and PRs welcome, especially formula corrections
with code citations.
What's the most over-engineered website you've ever needed for a 30-second math problem?
Top comments (0)