<?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: Free-TDEE-Calculator</title>
    <description>The latest articles on DEV Community by Free-TDEE-Calculator (@freetdeecalculator).</description>
    <link>https://dev.to/freetdeecalculator</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4193541%2F82f45eff-488f-4613-9940-c727410e641f.png</url>
      <title>DEV Community: Free-TDEE-Calculator</title>
      <link>https://dev.to/freetdeecalculator</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/freetdeecalculator"/>
    <language>en</language>
    <item>
      <title>How I Built a Free TDEE Calculator with Astro: Formulas, Performance, and SEO</title>
      <dc:creator>Free-TDEE-Calculator</dc:creator>
      <pubDate>Mon, 19 Oct 2026 15:48:06 +0000</pubDate>
      <link>https://dev.to/freetdeecalculator/how-i-built-a-free-tdee-calculator-with-astro-formulas-performance-and-seo-5cbm</link>
      <guid>https://dev.to/freetdeecalculator/how-i-built-a-free-tdee-calculator-with-astro-formulas-performance-and-seo-5cbm</guid>
      <description>&lt;p&gt;I recently built &lt;a href="https://freetdeecalculator.app/" rel="noopener noreferrer"&gt;Free TDEE Calculator&lt;/a&gt;, a set of fitness calculators (TDEE, BMR, macros, calorie deficit) with Astro, hosted on Cloudflare. Here is what actually mattered in the build.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Astro for a Calculator Site
&lt;/h2&gt;

&lt;p&gt;Calculator pages are mostly static content with small islands of interactivity. Astro ships zero JavaScript by default, so the pages load fast and Google reads clean HTML. The interactive calculator inputs are tiny client-side scripts, not a framework runtime.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Formula Layer
&lt;/h2&gt;

&lt;p&gt;Every calculator on the site shares one formula module. The foundation is Mifflin-St Jeor for BMR:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;calculateBMR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;weightKg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;heightCm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;isMale&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;bmr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;weightKg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;6.25&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;heightCm&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;isMale&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;bmr&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;bmr&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;161&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ACTIVITY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;sedentary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;light&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.375&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;moderate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.55&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;active&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.725&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;veryActive&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.9&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;calculateTDEE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bmr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;activityLevel&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bmr&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ACTIVITY&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;activityLevel&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="mf"&gt;1.2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;TDEE is BMR times an activity multiplier. The macro calculator then splits the result into protein, carbs, and fat targets, which you can try on the live &lt;a href="https://freetdeecalculator.app/macro-calculator/" rel="noopener noreferrer"&gt;macro calculator&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance Choices That Mattered
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Static output:&lt;/strong&gt; Astro pre-renders every page. No server round-trip for content.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minimal client JS:&lt;/strong&gt; only the input handlers ship to the browser.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No layout shift:&lt;/strong&gt; result areas reserve space before calculation, so CLS stays near zero.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  SEO for Tool Sites
&lt;/h2&gt;

&lt;p&gt;A calculator with no content does not rank. Each tool page on the site pairs the calculator with a real guide: formula explanations, worked examples, and FAQ schema. The &lt;a href="https://freetdeecalculator.app/bmr-calculator/" rel="noopener noreferrer"&gt;BMR calculator&lt;/a&gt; page, for example, documents the equation it implements.&lt;/p&gt;

&lt;p&gt;Takeaway: for content-plus-tool sites, Astro gives you the SEO of static HTML with just enough interactivity for the tools. The full site is live at &lt;a href="https://freetdeecalculator.app" rel="noopener noreferrer"&gt;https://freetdeecalculator.app&lt;/a&gt; if you want to inspect the output.&lt;/p&gt;

</description>
      <category>astro</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>seo</category>
    </item>
  </channel>
</rss>
