<?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: Farbod F.</title>
    <description>The latest articles on DEV Community by Farbod F. (@farbodf).</description>
    <link>https://dev.to/farbodf</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%2F4185281%2Fd81958b4-48d0-4895-9e6e-478398a7fba2.png</url>
      <title>DEV Community: Farbod F.</title>
      <link>https://dev.to/farbodf</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/farbodf"/>
    <language>en</language>
    <item>
      <title>I Ship 61 Calculators as a Static Site in 12 Languages — Here's How</title>
      <dc:creator>Farbod F.</dc:creator>
      <pubDate>Wed, 14 Oct 2026 18:16:34 +0000</pubDate>
      <link>https://dev.to/farbodf/i-ship-61-calculators-as-a-static-site-in-12-languages-heres-how-fl</link>
      <guid>https://dev.to/farbodf/i-ship-61-calculators-as-a-static-site-in-12-languages-heres-how-fl</guid>
      <description>&lt;h1&gt;
  
  
  I Ship 61 Calculators as a Static Site in 12 Languages — Here's How
&lt;/h1&gt;

&lt;p&gt;We're a small team of software engineers, and we run &lt;a href="https://youcancalc.com/" rel="noopener noreferrer"&gt;youcancalc.com&lt;/a&gt; — a free collection of 61 calculators, localized into 12 languages. No accounts, no backend, no paywall, no tracking pixels. Every calculation happens in your browser. This is a notes-from-the-trenches post about the architecture choices that make that possible, and the ones we'd make again.&lt;/p&gt;

&lt;h2&gt;
  
  
  The whole thing is static
&lt;/h2&gt;

&lt;p&gt;The site is a statically-exported site: every page is pre-rendered to plain HTML at build time and served as files. There is no application server, no database, no API to keep warm. A calculator page is a document with a script attached, not an app with a backend.&lt;/p&gt;

&lt;p&gt;This sounds limiting until you realize what a calculator actually needs: inputs, arithmetic, and formatted output. None of that requires a server round-trip. The result is pages that answer instantly — no spinners, no "computing..." states — and hosting that is boring in the best way.&lt;/p&gt;

&lt;h2&gt;
  
  
  All computation is client-side
&lt;/h2&gt;

&lt;p&gt;Each calculator page follows the same contract:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Inputs&lt;/strong&gt; — the user types numbers, picks options.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instant result&lt;/strong&gt; — recomputed on every keystroke, locally.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How it works&lt;/strong&gt; — the formula is printed next to the answer, not hidden.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Worked examples&lt;/strong&gt; — concrete numbers walked through step by step.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FAQ&lt;/strong&gt; — the questions people actually ask about this calculation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Related calculators&lt;/strong&gt; — the natural next questions.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Because everything runs client-side, there's a privacy property we get for free and take seriously: &lt;strong&gt;your inputs never leave your browser.&lt;/strong&gt; There's nothing to leak because there's nowhere for the data to go. We don't have your numbers; we never did. In an era where every form field seems to phone home, "the architecture makes surveillance impossible" is a stronger guarantee than any privacy policy paragraph.&lt;/p&gt;

&lt;h2&gt;
  
  
  i18n without a translation department
&lt;/h2&gt;

&lt;p&gt;Twelve locales: English, Spanish, French, German, Italian, Portuguese, Arabic, Dutch, Polish, Chinese, Japanese, Korean. A few things we learned doing this as a tiny team:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Locale-prefixed routes.&lt;/strong&gt; Every language lives under its own path prefix (&lt;code&gt;/es/&lt;/code&gt;, &lt;code&gt;/de/&lt;/code&gt;, …), so each locale is a fully crawlable, shareable site — not a JavaScript-swapped afterthought.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Localize everything, including the math.&lt;/strong&gt; Formulas, worked examples, and FAQs are content, not chrome — they all go through the i18n layer. A French user should read the explanation of compound interest in French, not just the buttons.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Numbers are not universal.&lt;/strong&gt; This is the bug class that keeps us humble. &lt;code&gt;Intl.NumberFormat&lt;/code&gt; exists for a reason: 1,234.56 in English is 1.234,56 in German. Decimal separators, digit grouping, and even digit shapes differ. Every numeric input and output goes through locale-aware formatting and parsing — parse with the locale, never with &lt;code&gt;parseFloat&lt;/code&gt; on raw user input.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RTL is a layout commitment.&lt;/strong&gt; Arabic means right-to-left, and that affects more than text direction: form layouts, example tables, and the visual order of "inputs → result" all need to mirror correctly. We test it; it's the kind of thing that's either right or embarrassing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we deliberately don't do
&lt;/h2&gt;

&lt;p&gt;Constraints are features. We don't do accounts (nothing to personalize), we don't do paywalls (the calculators are the product, and they're free), and we don't do tracking (see above: nothing to track with). We also don't have a blog — each calculator page carries its own explanation, examples, and FAQ, so the content lives where the question is asked instead of in a separate content silo.&lt;/p&gt;

&lt;p&gt;This keeps the operational surface tiny: no user data to protect, no sessions to manage, no email infrastructure, no A/B testing apparatus watching your mouse. The site is, by construction, a very boring thing to operate. We like boring.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest trade-offs
&lt;/h2&gt;

&lt;p&gt;Static has costs and we won't pretend otherwise:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Build time grows with locales × pages.&lt;/strong&gt; 61 calculators × 12 languages is hundreds of pages per build. It's fine on modern hardware, but it's the thing we watch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No personalization.&lt;/strong&gt; We can't remember your last calculation across devices, because we don't know who you are. We consider this acceptable — arguably it's the point.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Client-side means client constraints.&lt;/strong&gt; Very old browsers and very slow devices get a degraded but functional experience; we keep the client-side script lean and avoid heavy client libraries rather than assuming a flagship phone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Translation quality is an ongoing process.&lt;/strong&gt; Machine-assisted translation gets you 90% of the way; the last 10% — idioms in FAQs, culturally specific examples — needs human eyes, and with 12 locales it's never "done."&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why this architecture fits calculators specifically
&lt;/h2&gt;

&lt;p&gt;A calculator is a pure function with a nice UI: same inputs, same outputs, every time. There's no shared state, no feed, no real-time collaboration. The moment you notice your product is embarrassingly parallel and stateless, the correct architecture is usually "files on a CDN." We just took that seriously and stopped there instead of adding a backend out of habit.&lt;/p&gt;

&lt;p&gt;If you're building something similar — reference tools, converters, small utilities — our sincere recommendation: start static, compute locally, and only add a server when you can name the specific thing it does that the browser can't. You might be surprised how rarely that day comes.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;We're the team behind youcancalc — 61 free calculators, 12 languages, zero tracking. If you build tiny tools on the web, we'd genuinely like to hear how you architect them.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
