<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[I built 100 free website templates and a tool that shows how much your current site costs]]></title><description><![CDATA[I built 100 free website templates and a tool that shows how much your current site costs]]></description><link>https://get-scala.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Sat, 07 Nov 2026 11:01:45 GMT</lastBuildDate><atom:link href="https://get-scala.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[How I Built 100 Industry-Specific Website Templates and Why I'm Giving Them Away]]></title><description><![CDATA[Last week I open-sourced a project I've been building for several months: 100 website templates across 100 industry verticals, organized as a pnpm…]]></description><link>https://get-scala.hashnode.dev/how-i-built-100-industry-specific-website-templates-and-why-i-m-giving-them-away</link><guid isPermaLink="true">https://get-scala.hashnode.dev/how-i-built-100-industry-specific-website-templates-and-why-i-m-giving-them-away</guid><category><![CDATA[Next.js]]></category><category><![CDATA[TypeScript]]></category><category><![CDATA[Open Source]]></category><category><![CDATA[webdev]]></category><dc:creator><![CDATA[AleB]]></dc:creator><pubDate>Sat, 08 Aug 2026 01:11:58 GMT</pubDate><content:encoded><![CDATA[<p>Last week I open-sourced a project I've been building for several months: 100 website templates across 100 industry verticals, organized as a pnpm monorepo, MIT licensed, free to deploy.</p>
<p>GitHub: <a href="https://github.com/Alessandro114/scala-sites">https://github.com/Alessandro114/scala-sites</a> Live demo: <a href="https://scala-sites.vercel.app">https://scala-sites.vercel.app</a></p>
<p>This post covers three things: the technical architecture decisions, the business reasoning behind giving it away, and a cost analysis that motivated the whole thing.</p>
<h2>The Problem with Generic Templates</h2>
<p>Every website template marketplace sells you the same thing: a generic hero component, a features grid, a testimonials section, a contact form. The assumption is that good design transfers across industries.</p>
<p>It doesn't.</p>
<p>A restaurant's website needs to answer: what's on the menu today, can I book a table right now, what do real customers say. A law firm's website needs to answer: do you handle my specific type of case, how do I get a consultation, what's your track record. A gym's website needs to answer: what classes run when, can I sign up directly, what membership costs.</p>
<p>These are structurally different problems. A generic <code>&lt;Hero&gt;</code> component with a title and a button doesn't solve any of them particularly well.</p>
<p>So I built per-vertical hero components, per-vertical JSON-LD schemas, and per-vertical component sets.</p>
<h2>The Theming System</h2>
<p>Rather than a global design token system, I went with three base themes and a <code>createCustomTheme()</code> override function:</p>
<pre><code class="language-typescript">import { createCustomTheme, themeToStyleObject } from '@scala-sites/themes'

const restaurantTheme = createCustomTheme('classic', {
  primary: '#1e3a5f',
  accent: '#c9a84c',
  background: '#fafaf8',
})

const style = themeToStyleObject(restaurantTheme)
// Returns: { '--color-primary': '#1e3a5f', '--color-accent': '#c9a84c', ... }
</code></pre>
<p>The three base themes:</p>
<ul>
<li><p><strong>Minimal</strong> — white background, Inter font, subtle borders. Works for luxury brands, professional services.</p>
</li>
<li><p><strong>Bold</strong> — dark background, Bebas Neue headings, sharp edges. Works for gyms, nightlife, automotive.</p>
</li>
<li><p><strong>Classic</strong> — warm tones, Playfair Display serif, soft radius. Works for traditional restaurants, heritage brands, legal.</p>
</li>
</ul>
<p>No CSS-in-JS runtime. No Tailwind config rebuild when you change a color. Pure CSS variables injected at the root. Theme switching is a single property change, and SSR works without hydration mismatches.</p>
<h2>JSON-LD by Vertical</h2>
<p>The SEO package handles structured data automatically based on which vertical you're in:</p>
<ul>
<li><p>Restaurant emits <code>FoodEstablishment</code> schema with <code>servesCuisine</code>, <code>hasMenu</code>, <code>priceRange</code></p>
</li>
<li><p>Law firm emits <code>LegalService</code> with <code>areaServed</code>, <code>knowsAbout</code></p>
</li>
<li><p>Medical emits <code>MedicalBusiness</code> with <code>medicalSpecialty</code></p>
</li>
<li><p>Gym emits <code>SportsActivityLocation</code></p>
</li>
</ul>
<p>The <code>FAQAccordion</code> component — shared across all verticals — always emits <code>FAQPage</code> schema, which Google uses to populate rich results directly in search.</p>
<p>The goal: a developer using these templates doesn't need to think about structured data. It's correct by default.</p>
<h2>Hero Architecture Decision</h2>
<p>The most debated decision was whether to have a single parameterized <code>&lt;Hero&gt;</code> component or per-vertical hero implementations.</p>
<p>I went per-vertical. Here's the argument:</p>
<p>A restaurant hero needs: full-bleed video or image, overlay gradient, reservation CTA as primary action, menu CTA as secondary, possibly an urgency element ("booking fast this weekend").</p>
<p>A gym hero needs: class schedule preview above the fold, membership CTA, possibly a live class counter or next-class timer.</p>
<p>A law firm hero needs: practice area selector, consultation CTA, social proof counter — but restrained, because aggressive sales tactics read wrong in legal contexts.</p>
<p>These aren't just different slot content. They're different interaction models. Forcing them into one component either makes it so generic it adds no value, or so complex it becomes harder to maintain than separate components.</p>
<h2>The Cost Analysis</h2>
<p>I also built <a href="https://analyze.get-scala.com">https://analyze.get-scala.com</a> — a tool that shows what a typical SMB pays for its digital stack.</p>
<p>I spent a week on pricing research across every major tool category. The result for a typical 3-location restaurant:</p>
<table>
<thead>
<tr>
<th>Category</th>
<th>Tool</th>
<th>Monthly</th>
</tr>
</thead>
<tbody><tr>
<td>Website builder</td>
<td><a href="http://WordPress.com">WordPress.com</a> Business</td>
<td>$40</td>
</tr>
<tr>
<td>Email (5 users)</td>
<td>Google Workspace</td>
<td>$35</td>
</tr>
<tr>
<td>CRM</td>
<td>HubSpot Starter</td>
<td>$40</td>
</tr>
<tr>
<td>Booking</td>
<td>Calendly (2 seats)</td>
<td>$20</td>
</tr>
<tr>
<td>Live chat + AI</td>
<td>Tidio + Lyro</td>
<td>$68</td>
</tr>
<tr>
<td>WhatsApp API</td>
<td>2K marketing msgs</td>
<td>$40</td>
</tr>
<tr>
<td>SEO</td>
<td>SEMrush Pro</td>
<td>$140</td>
</tr>
<tr>
<td>Reviews</td>
<td>Trustpilot Starter</td>
<td>$99</td>
</tr>
<tr>
<td>Email marketing</td>
<td>Mailchimp (2K contacts)</td>
<td>$27</td>
</tr>
<tr>
<td>Forms</td>
<td>Typeform Basic</td>
<td>$29</td>
</tr>
<tr>
<td>Social scheduling</td>
<td>Buffer (3 channels)</td>
<td>$15</td>
</tr>
<tr>
<td>Analytics</td>
<td>GA4</td>
<td>$0</td>
</tr>
<tr>
<td><strong>Total</strong></td>
<td><strong>14 vendors</strong></td>
<td><strong>$555/mo</strong></td>
</tr>
</tbody></table>
<p>That's \(6,660/year. And this is the conservative version — with Intercom instead of Tidio you hit \)1,500/month.</p>
<p>Three things I found notable:</p>
<ul>
<li><p>Mailchimp's free tier went from 2,000 contacts (2022) to 500 (2023) to 250 (2026). They degrade it deliberately to force upgrades.</p>
</li>
<li><p>Ahrefs raised Lite from $99 to $129 in March 2026 with no feature changes.</p>
</li>
<li><p>SiteGround intro pricing is \(2.99/month; renewal rates hit \)17.99/month — a 6x jump.</p>
</li>
</ul>
<p>The full pricing data (with sources) is in <a href="http://COST-COMPARISON-DATA.md"><code>COST-COMPARISON-DATA.md</code></a> in the repo.</p>
<h2>Why Give It Away</h2>
<p>My company sells an AI operating system for SMBs — real-time booking, WhatsApp automations, multi-location CRM. The website is the entry point, not the product.</p>
<p>The templates are free because reaching business owners early — before they've committed to a fragmented stack — is worth more than charging for templates. Give them something genuinely useful. Be present before anyone asks to see a pitch deck.</p>
<p>MIT licensed code has to be good enough to fork. That pressure is useful.</p>
<hr />
<p>GitHub: <a href="https://github.com/Alessandro114/scala-sites">https://github.com/Alessandro114/scala-sites</a><br />Live demos: <a href="https://scala-sites.vercel.app">https://scala-sites.vercel.app</a><br />Cost analyzer: <a href="https://analyze.get-scala.com">https://analyze.get-scala.com</a></p>
]]></content:encoded></item></channel></rss>