CINXE.COM

Dec 22: Why we use our own hardware at Fastmail | Fastmail

<!doctype html><html lang="en" class="no-script"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><link rel="preload" as="font" type="font/woff2" href="/assets/fonts/roca/rocaone-rg-webfont.woff2" crossorigin><link rel="preload" as="font" type="font/woff2" href="/assets/fonts/proximanova/basic/proximanova-regular.woff2" crossorigin><link rel="preload" as="font" type="font/woff2" href="/assets/fonts/proximanova/basic/proximanova-semibold.woff2" crossorigin><link rel="preload" as="font" type="font/woff2" href="/assets/fonts/proximanova/basic/proximanova-bold.woff2" crossorigin><link rel="stylesheet" href="/assets/css/highlight-16fa6bd7.css"><title>Dec 22: Why we use our own hardware at Fastmail | Fastmail</title><meta property="og:title" content="Dec 22: Why we use our own hardware at Fastmail"><meta name="twitter:title" content="Dec 22: Why we use our own hardware at Fastmail"><link rel="canonical" href="https://www.fastmail.com/blog/why-we-use-our-own-hardware/"><meta property="og:url" content="https://www.fastmail.com/blog/why-we-use-our-own-hardware/"><meta property="og:site_name" content="Fastmail"><meta name="twitter:site" content="@Fastmail"><meta name="twitter:creator" content="@Fastmail"><meta property="og:image" content="https://www.fastmail.com/assets/images/hero-fIwweCHst0-1200.png"><meta name="twitter:image" content="https://www.fastmail.com/assets/images/hero-fIwweCHst0-1200.png"><meta property="og:image:type" content="png"><meta property="og:image:width" content="1200"><meta property="og:image:height" content="630"><meta name="twitter:card" content="summary_large_image"><meta name="description" content="Why we use our own hardware and what the tradeoffs and costs look like"><meta property="og:description" content="Why we use our own hardware and what the tradeoffs and costs look like"><meta name="twitter:description" content="Why we use our own hardware and what the tradeoffs and costs look like"><meta property="og:type" content="article"><meta name="author" content="Rob Mueller"><meta property="article:author" content="Rob Mueller"><meta property="article:published_time" content="2024-12-22T00:00:01Z"><meta property="eleventy:path" content="./source/content/posts/2024-12-22-why-we-use-our-own-hardware.md"><script>document.querySelector("html").classList.remove("no-script");function run(o){document.readyState==="loading"?document.addEventListener("DOMContentLoaded",o):o()}(function(){if("fonts"in document){if(sessionStorage.fontsLoaded){document.documentElement.classList.add("fonts-loaded-2");return}Promise.all([document.fonts.load("400 1em 'Proxima Nova'"),document.fonts.load("400 1em roca")]).then(function(){document.documentElement.classList.add("fonts-loaded-1"),Promise.all([document.fonts.load("600 1em 'Proxima Nova'"),document.fonts.load("700 1em 'Proxima Nova'"),document.fonts.load("100 1em roca"),document.fonts.load("300 1em roca")]).then(function(){document.documentElement.classList.remove("fonts-loaded-1"),document.documentElement.classList.add("fonts-loaded-2"),sessionStorage.fontsLoaded=!0})})}})(); </script><style> /*! * Web Fonts from Fontspring.com * * All OpenType features and all extended glyphs have been removed. * Fully installable fonts can be purchased at http://www.fontspring.com * * The fonts included in this stylesheet are subject to the End User License you purchased * from Fontspring. The fonts are protected under domestic and international trademark and * copyright law. You are prohibited from modifying, reverse engineering, duplicating, or * distributing this font software. * * (c) 2010-2024 Fontspring * * The fonts included are copyrighted by the vendors listed below. * * Vendor: Mark Simonson Studio * License URL: https://www.fontspring.com/licenses/mark-simonson-studio/webfont * * Vendor: My Creative Land * License URL: https://www.fontspring.com/license/my-creative-land/webfont */@font-face{descent-override:55%;font-family:Georgia Roca Fallback;font-style:normal;size-adjust:90%;src:local(Georgia-Bold)}@font-face{font-display:swap;font-family:roca;font-style:normal;font-weight:100;src:url(/assets/fonts/roca/rocaone-th-webfont.woff2) format("woff2")}@font-face{font-display:swap;font-family:roca;font-style:normal;font-weight:300;src:url(/assets/fonts/roca/rocaone-lt-webfont.woff2) format("woff2")}@font-face{font-display:swap;font-family:roca;font-style:normal;font-weight:400;src:url(/assets/fonts/roca/rocaone-rg-webfont.woff2) format("woff2")}@font-face{font-display:swap;font-family:Proxima Nova;font-style:normal;font-weight:300;src:local("Proxima Nova Light"),local("ProximaNova-Light"),url(/assets/fonts/proximanova/basic/proximanova-light.woff2) format("woff2"),url(/assets/fonts/proximanova/basic/proximanova-light.woff) format("woff");unicode-range:u+0000-007e,u+00a0-00a3,u+00a5,u+00a8-00a9,u+00ab,u+00ae,u+00b4,u+00b8,u+00bb,u+00bf-00c2,u+00c4,u+00c6-00cb,u+00cd-00cf,u+00d1,u+00d3-00d4,u+00d6,u+00d9-00dc,u+00df-00e2,u+00e4,u+00e6-00eb,u+00ed-00ef,u+00f1,u+00f3-00f4,u+00f6,u+00f9-00fc,u+00ff,u+0152-0153,u+0178,u+02c6,u+02da,u+02dc,u+2013-2014,u+2018-201a,u+201c-201e,u+2022,u+2026,u+202f,u+2039-203a,u+20ac,u+2122}@font-face{font-display:swap;font-family:Proxima Nova;font-style:normal;font-weight:300;src:local("Proxima Nova Light"),local("ProximaNova-Light"),url(/assets/fonts/proximanova/extended/proximanova-light.woff2) format("woff2"),url(/assets/fonts/proximanova/extended/proximanova-light.woff) format("woff");unicode-range:u+007f-009f,u+00a4,u+00a6-00a7,u+00aa,u+00ac-00ad,u+00af-00b3,u+00b5-00b7,u+00b9-00ba,u+00bc-00be,u+00c3,u+00c5,u+00cc,u+00d0,u+00d2,u+00d5,u+00d7-00d8,u+00dd-00de,u+00e3,u+00e5,u+00ec,u+00f0,u+00f2,u+00f5,u+00f7-00f8,u+00fd-00fe,u+0100-0151,u+0154-0177,u+0179-02c5,u+02c7-02d9,u+02db,u+02dd-2012,u+2015-2017,u+201b,u+201f-2021,u+2023-2025,u+2027-202e,u+2030-2038,u+203b-20ab,u+20ad-2121,u+2123-fb04}@font-face{font-display:swap;font-family:Proxima Nova;font-style:normal;font-weight:400;src:local("Proxima Nova Regular"),local("ProximaNova-Regular"),url(/assets/fonts/proximanova/basic/proximanova-regular.woff2) format("woff2"),url(/assets/fonts/proximanova/basic/proximanova-regular.woff) format("woff");unicode-range:u+0000-007e,u+00a0-00a3,u+00a5,u+00a8-00a9,u+00ab,u+00ae,u+00b4,u+00b8,u+00bb,u+00bf-00c2,u+00c4,u+00c6-00cb,u+00cd-00cf,u+00d1,u+00d3-00d4,u+00d6,u+00d9-00dc,u+00df-00e2,u+00e4,u+00e6-00eb,u+00ed-00ef,u+00f1,u+00f3-00f4,u+00f6,u+00f9-00fc,u+00ff,u+0152-0153,u+0178,u+02c6,u+02da,u+02dc,u+2013-2014,u+2018-201a,u+201c-201e,u+2022,u+2026,u+202f,u+2039-203a,u+20ac,u+2122}@font-face{font-display:swap;font-family:Proxima Nova;font-style:normal;font-weight:400;src:local("Proxima Nova Regular"),local("ProximaNova-Regular"),url(/assets/fonts/proximanova/extended/proximanova-regular.woff2) format("woff2"),url(/assets/fonts/proximanova/extended/proximanova-regular.woff) format("woff");unicode-range:u+007f-009f,u+00a4,u+00a6-00a7,u+00aa,u+00ac-00ad,u+00af-00b3,u+00b5-00b7,u+00b9-00ba,u+00bc-00be,u+00c3,u+00c5,u+00cc,u+00d0,u+00d2,u+00d5,u+00d7-00d8,u+00dd-00de,u+00e3,u+00e5,u+00ec,u+00f0,u+00f2,u+00f5,u+00f7-00f8,u+00fd-00fe,u+0100-0151,u+0154-0177,u+0179-02c5,u+02c7-02d9,u+02db,u+02dd-2012,u+2015-2017,u+201b,u+201f-2021,u+2023-2025,u+2027-202e,u+2030-2038,u+203b-20ab,u+20ad-2121,u+2123-fb04}@font-face{font-display:swap;font-family:Proxima Nova;font-style:italic;font-weight:400;src:local("Proxima Nova Regular Italic"),local("ProximaNova-RegularIt"),url(/assets/fonts/proximanova/basic/proximanova-regularit.woff2) format("woff2"),url(/assets/fonts/proximanova/basic/proximanova-regularit.woff) format("woff");unicode-range:u+0000-007e,u+00a0-00a3,u+00a5,u+00a8-00a9,u+00ab,u+00ae,u+00b4,u+00b8,u+00bb,u+00bf-00c2,u+00c4,u+00c6-00cb,u+00cd-00cf,u+00d1,u+00d3-00d4,u+00d6,u+00d9-00dc,u+00df-00e2,u+00e4,u+00e6-00eb,u+00ed-00ef,u+00f1,u+00f3-00f4,u+00f6,u+00f9-00fc,u+00ff,u+0152-0153,u+0178,u+02c6,u+02da,u+02dc,u+2013-2014,u+2018-201a,u+201c-201e,u+2022,u+2026,u+202f,u+2039-203a,u+20ac,u+2122}@font-face{font-display:swap;font-family:Proxima Nova;font-style:italic;font-weight:400;src:local("Proxima Nova Regular Italic"),local("ProximaNova-RegularIt"),url(/assets/fonts/proximanova/extended/proximanova-regularit.woff2) format("woff2"),url(/assets/fonts/proximanova/extended/proximanova-regularit.woff) format("woff");unicode-range:u+007f-009f,u+00a4,u+00a6-00a7,u+00aa,u+00ac-00ad,u+00af-00b3,u+00b5-00b7,u+00b9-00ba,u+00bc-00be,u+00c3,u+00c5,u+00cc,u+00d0,u+00d2,u+00d5,u+00d7-00d8,u+00dd-00de,u+00e3,u+00e5,u+00ec,u+00f0,u+00f2,u+00f5,u+00f7-00f8,u+00fd-00fe,u+0100-0151,u+0154-0177,u+0179-02c5,u+02c7-02d9,u+02db,u+02dd-2012,u+2015-2017,u+201b,u+201f-2021,u+2023-2025,u+2027-202e,u+2030-2038,u+203b-20ab,u+20ad-2121,u+2123-fb04}@font-face{font-display:swap;font-family:Proxima Nova;font-style:normal;font-weight:500;src:local("Proxima Nova Medium"),local("ProximaNova-Medium"),url(/assets/fonts/proximanova/basic/proximanova-medium.woff2) format("woff2"),url(/assets/fonts/proximanova/basic/proximanova-medium.woff) format("woff");unicode-range:u+0000-007e,u+00a0-00a3,u+00a5,u+00a8-00a9,u+00ab,u+00ae,u+00b4,u+00b8,u+00bb,u+00bf-00c2,u+00c4,u+00c6-00cb,u+00cd-00cf,u+00d1,u+00d3-00d4,u+00d6,u+00d9-00dc,u+00df-00e2,u+00e4,u+00e6-00eb,u+00ed-00ef,u+00f1,u+00f3-00f4,u+00f6,u+00f9-00fc,u+00ff,u+0152-0153,u+0178,u+02c6,u+02da,u+02dc,u+2013-2014,u+2018-201a,u+201c-201e,u+2022,u+2026,u+202f,u+2039-203a,u+20ac,u+2122}@font-face{font-display:swap;font-family:Proxima Nova;font-style:normal;font-weight:500;src:local("Proxima Nova Medium"),local("ProximaNova-Medium"),url(/assets/fonts/proximanova/extended/proximanova-medium.woff2) format("woff2"),url(/assets/fonts/proximanova/extended/proximanova-medium.woff) format("woff");unicode-range:u+007f-009f,u+00a4,u+00a6-00a7,u+00aa,u+00ac-00ad,u+00af-00b3,u+00b5-00b7,u+00b9-00ba,u+00bc-00be,u+00c3,u+00c5,u+00cc,u+00d0,u+00d2,u+00d5,u+00d7-00d8,u+00dd-00de,u+00e3,u+00e5,u+00ec,u+00f0,u+00f2,u+00f5,u+00f7-00f8,u+00fd-00fe,u+0100-0151,u+0154-0177,u+0179-02c5,u+02c7-02d9,u+02db,u+02dd-2012,u+2015-2017,u+201b,u+201f-2021,u+2023-2025,u+2027-202e,u+2030-2038,u+203b-20ab,u+20ad-2121,u+2123-fb04}@font-face{font-display:swap;font-family:Proxima Nova;font-style:normal;font-weight:600;src:local("Proxima Nova Semibold"),local("ProximaNova-Semibold"),url(/assets/fonts/proximanova/basic/proximanova-semibold.woff2) format("woff2"),url(/assets/fonts/proximanova/basic/proximanova-semibold.woff) format("woff");unicode-range:u+0000-007e,u+00a0-00a3,u+00a5,u+00a8-00a9,u+00ab,u+00ae,u+00b4,u+00b8,u+00bb,u+00bf-00c2,u+00c4,u+00c6-00cb,u+00cd-00cf,u+00d1,u+00d3-00d4,u+00d6,u+00d9-00dc,u+00df-00e2,u+00e4,u+00e6-00eb,u+00ed-00ef,u+00f1,u+00f3-00f4,u+00f6,u+00f9-00fc,u+00ff,u+0152-0153,u+0178,u+02c6,u+02da,u+02dc,u+2013-2014,u+2018-201a,u+201c-201e,u+2022,u+2026,u+202f,u+2039-203a,u+20ac,u+2122}@font-face{font-display:swap;font-family:Proxima Nova;font-style:normal;font-weight:600;src:local("Proxima Nova Semibold"),local("ProximaNova-Semibold"),url(/assets/fonts/proximanova/extended/proximanova-semibold.woff2) format("woff2"),url(/assets/fonts/proximanova/extended/proximanova-semibold.woff) format("woff");unicode-range:u+007f-009f,u+00a4,u+00a6-00a7,u+00aa,u+00ac-00ad,u+00af-00b3,u+00b5-00b7,u+00b9-00ba,u+00bc-00be,u+00c3,u+00c5,u+00cc,u+00d0,u+00d2,u+00d5,u+00d7-00d8,u+00dd-00de,u+00e3,u+00e5,u+00ec,u+00f0,u+00f2,u+00f5,u+00f7-00f8,u+00fd-00fe,u+0100-0151,u+0154-0177,u+0179-02c5,u+02c7-02d9,u+02db,u+02dd-2012,u+2015-2017,u+201b,u+201f-2021,u+2023-2025,u+2027-202e,u+2030-2038,u+203b-20ab,u+20ad-2121,u+2123-fb04}@font-face{font-display:swap;font-family:Proxima Nova;font-style:normal;font-weight:700;src:local("Proxima Nova Bold"),local("ProximaNova-Bold"),url(/assets/fonts/proximanova/basic/proximanova-bold.woff2) format("woff2"),url(/assets/fonts/proximanova/basic/proximanova-bold.woff) format("woff");unicode-range:u+0000-007e,u+00a0-00a3,u+00a5,u+00a8-00a9,u+00ab,u+00ae,u+00b4,u+00b8,u+00bb,u+00bf-00c2,u+00c4,u+00c6-00cb,u+00cd-00cf,u+00d1,u+00d3-00d4,u+00d6,u+00d9-00dc,u+00df-00e2,u+00e4,u+00e6-00eb,u+00ed-00ef,u+00f1,u+00f3-00f4,u+00f6,u+00f9-00fc,u+00ff,u+0152-0153,u+0178,u+02c6,u+02da,u+02dc,u+2013-2014,u+2018-201a,u+201c-201e,u+2022,u+2026,u+202f,u+2039-203a,u+20ac,u+2122}@font-face{font-display:swap;font-family:Proxima Nova;font-style:normal;font-weight:700;src:local("Proxima Nova Bold"),local("ProximaNova-Bold"),url(/assets/fonts/proximanova/extended/proximanova-bold.woff2) format("woff2"),url(/assets/fonts/proximanova/extended/proximanova-bold.woff) format("woff");unicode-range:u+007f-009f,u+00a4,u+00a6-00a7,u+00aa,u+00ac-00ad,u+00af-00b3,u+00b5-00b7,u+00b9-00ba,u+00bc-00be,u+00c3,u+00c5,u+00cc,u+00d0,u+00d2,u+00d5,u+00d7-00d8,u+00dd-00de,u+00e3,u+00e5,u+00ec,u+00f0,u+00f2,u+00f5,u+00f7-00f8,u+00fd-00fe,u+0100-0151,u+0154-0177,u+0179-02c5,u+02c7-02d9,u+02db,u+02dd-2012,u+2015-2017,u+201b,u+201f-2021,u+2023-2025,u+2027-202e,u+2030-2038,u+203b-20ab,u+20ad-2121,u+2123-fb04}@font-face{font-display:swap;font-family:Proxima Nova;font-style:italic;font-weight:700;src:local("Proxima Nova Bold Italic"),local("ProximaNova-BoldIt"),url(/assets/fonts/proximanova/basic/proximanova-boldit.woff2) format("woff2"),url(/assets/fonts/proximanova/basic/proximanova-boldit.woff) format("woff");unicode-range:u+0000-007e,u+00a0-00a3,u+00a5,u+00a8-00a9,u+00ab,u+00ae,u+00b4,u+00b8,u+00bb,u+00bf-00c2,u+00c4,u+00c6-00cb,u+00cd-00cf,u+00d1,u+00d3-00d4,u+00d6,u+00d9-00dc,u+00df-00e2,u+00e4,u+00e6-00eb,u+00ed-00ef,u+00f1,u+00f3-00f4,u+00f6,u+00f9-00fc,u+00ff,u+0152-0153,u+0178,u+02c6,u+02da,u+02dc,u+2013-2014,u+2018-201a,u+201c-201e,u+2022,u+2026,u+202f,u+2039-203a,u+20ac,u+2122}@font-face{font-display:swap;font-family:Proxima Nova;font-style:italic;font-weight:700;src:local("Proxima Nova Bold Italic"),local("ProximaNova-BoldIt"),url(/assets/fonts/proximanova/extended/proximanova-boldit.woff2) format("woff2"),url(/assets/fonts/proximanova/extended/proximanova-boldit.woff) format("woff");unicode-range:u+007f-009f,u+00a4,u+00a6-00a7,u+00aa,u+00ac-00ad,u+00af-00b3,u+00b5-00b7,u+00b9-00ba,u+00bc-00be,u+00c3,u+00c5,u+00cc,u+00d0,u+00d2,u+00d5,u+00d7-00d8,u+00dd-00de,u+00e3,u+00e5,u+00ec,u+00f0,u+00f2,u+00f5,u+00f7-00f8,u+00fd-00fe,u+0100-0151,u+0154-0177,u+0179-02c5,u+02c7-02d9,u+02db,u+02dd-2012,u+2015-2017,u+201b,u+201f-2021,u+2023-2025,u+2027-202e,u+2030-2038,u+203b-20ab,u+20ad-2121,u+2123-fb04}</style><link rel="stylesheet" href="/assets/css/main-a7851194.css"><link rel="icon" href="/favicon.ico?v=64679438" sizes="48x48"><link rel="icon" href="/favicon.svg?v=5843ac65" sizes="any" type="image/svg+xml"><link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png?v=961604de"><link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png?v=10da1173"><link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png?v=79a96923"><link rel="manifest" href="/site.webmanifest?v=310b8694"><link rel="mask-icon" href="/safari-pinned-tab.svg?v=857521d6" color="#176bad"><meta name="msapplication-TileColor" content="#1f5077"><script type="module" src="/assets/js/vendor-5cdf60a8.js"></script><script type="module" src="/assets/js/main-5d19a6d9.js"></script><script type="module" src="/assets/js/JkGTe2CxkZ.js"></script></head><body class="font-sans text-fg"> <!--/* INJECT_BANNER */--> <div class="grid-body"> <div class="after:bg-transparent header-container sticky top-0 z-[9999]"> <div class="absolute h-full header-background-stuck left-0 top-0 w-full"></div> <div class="absolute h-full header-background-initial left-0 top-0 w-full"></div> <header id="header" class="flex h-header items-center relative select-none text-fx-lg wrapper"> <div class="flex flex-none h-full items-center relative"> <a href="/"><span class="sr-only">Home</span> <svg class="fill-[--logo-wordmark] i-fm-wordmark-logo w-[120px]" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 952.5 203.6"> <path d="M21.4 101.8a80.4 80.4 0 0 1 147.3-44.6l15.8 3.1 2-15A101.83 101.83 0 0 0 101.8 0C45.6 0 0 45.6 0 101.8c0 20.9 6.3 40.3 17.1 56.5l15.3 2 2.5-13.9a80.31 80.31 0 0 1-13.5-44.6z" fill="#0067b9"></path> <path d="M186.7 45.7c-.1-.1-.2-.2-.3-.4l-17.8 11.9c.1.1.2.2.3.4a79.89 79.89 0 0 1 13.3 44.2c0 44.4-36 80.4-80.4 80.4-27.7 0-52.2-14-66.6-35.4-.1-.1-.2-.3-.2-.4l-17.8 11.9c.1.1.2.3.2.4a101.7 101.7 0 0 0 84.4 44.9c56.2 0 101.8-45.6 101.8-101.8 0-20.7-6.2-40-16.9-56.1z" fill="#69b3e7"></path> <path d="M101.8 101.8 53.4 69.5V134c.5-.3.9-.6 0 0l30.4-9.4 18-22.8z" fill="#ffc107"></path> <path class="fill-inherit" d="M53.4 134h93.4c1.9 0 3.4-1.5 3.4-3.4V69.5L53.4 134zm292.5-99.1V54h-62.2v40h54.8v19.1h-54.8v55.5h-22.1V34.9h84.3zm89.8 132.6v1.1h-19.3c-.9-1.9-1.7-3.7-2.2-5.6-8.4 4.3-20.2 7.4-30.1 7.4-22.5 0-35.8-11.1-35.8-30.4 0-18.9 16.5-31.4 42-31.4 8.4 0 14.5.7 20.2 1.7v-2.8c0-13.9-8.4-20.8-23.4-20.8-9.1 0-18.9 1.5-28.8 4.8l-5.4-15.4c12.6-4.6 24.3-7.1 36.4-7.1 16.2 0 25.6 4.1 32.1 10.4 6.7 6.7 9.7 16.3 9.7 28V138c-.1 9.8 1.2 20.6 4.6 29.5zm-48.3-13.6c7.4 0 16.2-1.9 23-5.4V125c-5.9-1.1-10.6-1.7-18.8-1.7-15.2 0-23 5.9-23 15.8 0 10 6.7 14.8 18.8 14.8zm136-79.1-5.2 15.6c-9.8-3-19.7-4.5-29.5-4.5-11.9 0-17.5 4.5-17.5 10.6 0 6.3 4.3 10 19.9 13.9 27.7 6.9 37.9 15.4 37.9 30.1 0 19.9-14.9 29.9-42 29.9-13.2 0-26.7-2.2-39.4-6.5l5.4-15.6c11 3.3 23.6 5.4 34 5.4 14.9 0 21.4-3.9 21.4-11.1 0-5.9-4.5-9.8-23.2-14.3-25.4-6.1-34.2-15-34.2-30.6 0-16.5 13.4-28.6 37.7-28.6 12.2 0 23.7 2 34.7 5.7zm78.2 91.6c-6.3 2.6-14.9 4.1-22.1 4.1-8.5 0-16.3-2.2-21.2-7.1-5-5-7.2-11.5-7.2-22.5V88.6h-15.8V70.9h15.8V47.4h21.2V71H597v17.6h-24.7v49.6c0 10 4.5 14.5 13 14.5 4.5 0 9.3-.9 13.2-2l3.1 15.7zm160.7-62v64.2H741v-61.1c0-12.8-7.8-20.2-20.2-20.2-7.6 0-15.8 1.9-21.7 5.2v76.1h-21.2v-61.8c0-13.7-6.9-19.5-18.8-19.5-6.9 0-15.6 2.2-23 6.3v75h-21.4V70.9h20.1v6.7c8.7-5.2 20.6-8.5 31.9-8.5 9.8 0 19.1 3.5 25.8 9.7 9.8-5.9 22.8-9.7 35.5-9.7 10.8 0 19.9 3.5 25.4 9.3 6.3 6.3 8.9 14.3 8.9 26zm104.1 63.1v1.1h-19.3c-.9-1.9-1.7-3.7-2.2-5.6-8.4 4.3-20.2 7.4-30.1 7.4-22.5 0-35.8-11.1-35.8-30.4 0-18.9 16.5-31.4 42-31.4 8.4 0 14.5.7 20.2 1.7v-2.8c0-13.9-8.4-20.8-23.4-20.8-9.1 0-18.9 1.5-28.8 4.8l-5.4-15.4c12.6-4.6 24.3-7.1 36.4-7.1 16.2 0 25.6 4.1 32.1 10.4 6.7 6.7 9.7 16.3 9.7 28V138c-.1 9.8 1.2 20.6 4.6 29.5zm-48.3-13.6c7.4 0 16.2-1.9 23-5.4V125c-5.9-1.1-10.6-1.7-18.8-1.7-15.2 0-23 5.9-23 15.8.1 10 6.7 14.8 18.8 14.8zm88.7-120.1v18.4h-21.4V33.8h21.4zm0 37.1v97.7h-21.4V70.9h21.4zm45.7-39.7v137.4h-21.3V31.2h21.3z" fill="currentColor"></path> </svg> </a> </div> <div class="navigation-wrapper z-0"> <input id="menu-toggle" type="checkbox" role="button" aria-controls="primary-navigation" aria-expanded="false" aria-haspopup="true"> <label for="menu-toggle"> <span class="collasped-text sr-only">Open menu</span> <span class="expanded-text sr-only">Hide menu</span> <svg class="i-hamburger size-icon-lg stroke-[2.25]" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 32 32"> <path d="M5 9H27"></path> <path d="M5 16H27"></path> <path d="M5 23H27"></path> </svg> </label> <div id="side-nav-overlay" class="lg:hidden"></div> <ul id="primary-navigation"> <li class="bg-white left-0 lg:hidden sticky top-0 w-full z-10"></li> <li class="top-level-wrapper"> <a href="/features/" class="block top-level-nav-item"> <div class="label-wrapper"> <p class="text-fx-lg trim">Product tour</p> </div> </a> </li> <li class="top-level-wrapper"> <a href="/business/" class="block top-level-nav-item"> <div class="label-wrapper"> <p class="text-fx-lg trim">For business</p> </div> </a> </li> <li class="top-level-wrapper"> <details name="top-level" class="group/details"> <summary class="expandable top-level-nav-item"> <div class="label-wrapper"> <p class="text-fx-lg trim">Support & Resources</p> </div> <svg xmlns="http://www.w3.org/2000/svg" class="fill-none group-open/details:rotate-180 size-icon-sm" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none" aria-hidden="true"> <use class="i-chevron" href="#i-chevron"></use> </svg> </summary> <ul class="second-level-wrapper"> <li> <p class="font-semibold lg:text-fx-lg text-fx-lg trim">Support</p> <ul class="third-level-wrapper"> <li> <a href="https://fastmail.help/" class="group"> <p class="lg:max-w-max py-fx-4 text-fx-lg trim whitespace-nowrap"> <span class="lg:[--link-color:--theme-fg] lg:group-hover:link-underline lg:link whitespace-normal"> Fastmail help center</span> </p> </a> </li> <li> <a href="/support/" class="group"> <p class="lg:max-w-max py-fx-4 text-fx-lg trim whitespace-nowrap"> <span class="lg:[--link-color:--theme-fg] lg:group-hover:link-underline lg:link whitespace-normal"> Contact Fastmail support</span> </p> </a> </li> <li> <a href="https://fastmailstatus.com/" class="group"> <p class="lg:max-w-max py-fx-4 text-fx-lg trim whitespace-nowrap"> <span class="lg:[--link-color:--theme-fg] lg:group-hover:link-underline lg:link whitespace-normal"> System status</span> </p> </a> </li> <li> <a href="/bug-bounty/" class="group"> <p class="lg:max-w-max py-fx-4 text-fx-lg trim whitespace-nowrap"> <span class="lg:[--link-color:--theme-fg] lg:group-hover:link-underline lg:link whitespace-normal"> Report a security issue</span> </p> </a> </li> </ul> </li> <li> <p class="font-semibold lg:text-fx-lg text-fx-lg trim">How to</p> <ul class="third-level-wrapper"> <li> <a href="/how-to/move-from-gmail/" class="group"> <p class="lg:max-w-max py-fx-4 text-fx-lg trim whitespace-nowrap"> <span class="lg:[--link-color:--theme-fg] lg:group-hover:link-underline lg:link whitespace-normal"> Move from Gmail</span> </p> </a> </li> <li> <a href="/how-to/move-from-outlook/" class="group"> <p class="lg:max-w-max py-fx-4 text-fx-lg trim whitespace-nowrap"> <span class="lg:[--link-color:--theme-fg] lg:group-hover:link-underline lg:link whitespace-normal"> Move from Outlook</span> </p> </a> </li> <li> <a href="/how-to/move-from-yahoo/" class="group"> <p class="lg:max-w-max py-fx-4 text-fx-lg trim whitespace-nowrap"> <span class="lg:[--link-color:--theme-fg] lg:group-hover:link-underline lg:link whitespace-normal"> Move from Yahoo</span> </p> </a> </li> <li> <a href="/how-to/move-from-proton/" class="group"> <p class="lg:max-w-max py-fx-4 text-fx-lg trim whitespace-nowrap"> <span class="lg:[--link-color:--theme-fg] lg:group-hover:link-underline lg:link whitespace-normal"> Move from Proton</span> </p> </a> </li> <li> <a href="/how-to/move-from-hey/" class="group"> <p class="lg:max-w-max py-fx-4 text-fx-lg trim whitespace-nowrap"> <span class="lg:[--link-color:--theme-fg] lg:group-hover:link-underline lg:link whitespace-normal"> Move from HEY</span> </p> </a> </li> <li> <a href="/how-to/email-for-your-domain/" class="group"> <p class="lg:max-w-max py-fx-4 text-fx-lg trim whitespace-nowrap"> <span class="lg:[--link-color:--theme-fg] lg:group-hover:link-underline lg:link whitespace-normal"> Get email for your domain</span> </p> </a> </li> <li> <a href="/how-to/stop-spam/" class="group"> <p class="lg:max-w-max py-fx-4 text-fx-lg trim whitespace-nowrap"> <span class="lg:[--link-color:--theme-fg] lg:group-hover:link-underline lg:link whitespace-normal"> Stop spam</span> </p> </a> </li> <li> <a href="/how-to/inbox-zero/" class="group"> <p class="lg:max-w-max py-fx-4 text-fx-lg trim whitespace-nowrap"> <span class="lg:[--link-color:--theme-fg] lg:group-hover:link-underline lg:link whitespace-normal"> Achieve inbox zero</span> </p> </a> </li> </ul> </li> <li> <p class="font-semibold lg:text-fx-lg text-fx-lg trim">Resources</p> <ul class="third-level-wrapper"> <li> <a href="/blog/" class="group"> <p class="lg:max-w-max py-fx-4 text-fx-lg trim whitespace-nowrap"> <span class="lg:[--link-color:--theme-fg] lg:group-hover:link-underline lg:link whitespace-normal"> Blog</span> </p> </a> </li> <li> <a href="/digitalcitizen/" class="group"> <p class="lg:max-w-max py-fx-4 text-fx-lg trim whitespace-nowrap"> <span class="lg:[--link-color:--theme-fg] lg:group-hover:link-underline lg:link whitespace-normal"> Podcast</span> </p> </a> </li> <li> <a href="/company/about/" class="group"> <p class="lg:max-w-max py-fx-4 text-fx-lg trim whitespace-nowrap"> <span class="lg:[--link-color:--theme-fg] lg:group-hover:link-underline lg:link whitespace-normal"> About us</span> </p> </a> </li> <li> <a href="/company/values/" class="group"> <p class="lg:max-w-max py-fx-4 text-fx-lg trim whitespace-nowrap"> <span class="lg:[--link-color:--theme-fg] lg:group-hover:link-underline lg:link whitespace-normal"> Our values</span> </p> </a> </li> <li> <a href="/dev/" class="group"> <p class="lg:max-w-max py-fx-4 text-fx-lg trim whitespace-nowrap"> <span class="lg:[--link-color:--theme-fg] lg:group-hover:link-underline lg:link whitespace-normal"> API Documentation</span> </p> </a> </li> </ul> </li> <li> <p class="font-semibold lg:text-fx-lg text-fx-lg trim">Download the app</p> <ul class="third-level-wrapper"> <li> <a href="https://apps.apple.com/us/app/fastmail-email-calendar/id931370077" class="group" target="_blank"> <p class="lg:max-w-max py-fx-4 text-fx-lg trim whitespace-nowrap"> <span class="lg:[--link-color:--theme-fg] lg:group-hover:link-underline lg:link whitespace-normal"> App Store</span> <svg xmlns="http://www.w3.org/2000/svg" class="align-text-bottom inline size-icon" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none" aria-labelledby="external-link-title-d70699" role="graphics-symbol"> <title id="external-link-title-d70699">Download Fastmail on the App Store</title> <use class="i-external-link" href="#i-external-link"></use> </svg> </p> </a> </li> <li> <a href="https://play.google.com/store/apps/details?id=com.fastmail.app" class="group" target="_blank"> <p class="lg:max-w-max py-fx-4 text-fx-lg trim whitespace-nowrap"> <span class="lg:[--link-color:--theme-fg] lg:group-hover:link-underline lg:link whitespace-normal"> Google Play</span> <svg xmlns="http://www.w3.org/2000/svg" class="align-text-bottom inline size-icon" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none" aria-labelledby="external-link-title-37e552" role="graphics-symbol"> <title id="external-link-title-37e552">Download Fastmail on Google Play</title> <use class="i-external-link" href="#i-external-link"></use> </svg> </p> </a> </li> </ul> </li> </ul> </details> </li> <li class="top-level-wrapper"> <a href="/pricing/" class="block top-level-nav-item"> <div class="label-wrapper"> <p class="text-fx-lg trim">Pricing</p> </div> </a> </li> <span class="flex-grow ge-[64rem]:hidden"></span> <li class="bg-white bottom-0 flex flex-col gap-fx-2 left-0 lg:hidden pb-fx-6 pt-fx-2 px-fx-4 right-0 sticky text-center"> <a href="https://app.fastmail.com/"> <p class="active:bg-grey-100/20 bg-grey-100/10 hover:bg-grey-100/15 py-fx-4 rounded-md text-blue-120 text-fx-lg trim w-full">Log in</p> </a> <a href="https://app.fastmail.com/signup/"> <p class="active:bg-blue-120 bg-blue-100 font-semibold hover:bg-blue-110 py-fx-4 rounded-md text-fx-lg text-white trim w-full">Try for free</p> </a> </li> </ul> </div> <ul class="flex flex-1 flex-row-reverse flex-wrap gap-x-fx-2 gap-y-fx-10 overflow-hidden self-stretch"> <li class="flex items-center lt-[22.5rem]:hidden min-h-header product-nav-wrapper"> <a href="https://app.fastmail.com/signup/"> <div class="active:bg-[--header-signup-bg-active] bg-[--header-signup-bg] border border-[--header-signup-border] flex hover:bg-[--header-signup-bg-hover] items-center px-fx-5 py-[10.5px] rounded-md text-nowrap"> <p class="font-semibold text-[--header-signup-fg] text-fx-lg trim">Try for free</p> </div> </a> </li> <li class="flex items-center lt-[22.5rem]:hidden overflow-hidden product-nav-wrapper whitespace-nowrap"> <a href="https://app.fastmail.com/" class="py-fx-3 top-level-nav-item"> <div class="label-wrapper mx-fx-5"> <p class="text-fx-lg trim">Log in</p> </div> </a> </li> </ul> </header> </div> <main class="pb-5xl pt-l-5xl"> <nav class="mb-s prose-grid"> <a href="/blog/" class="group max-w-max"> <svg xmlns="http://www.w3.org/2000/svg" class="align-text-bottom inline-block rotate-180 size-icon" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none" aria-hidden="true"> <use class="i-arrow-right" href="#i-arrow-right"></use> </svg> <span class="[--link-hover:--theme-fg] group-hover:link-underline">Return to blog</span></a> </nav> <article class="*:prose *:prose-bleed-images *:prose-grid font-sans"> <header> <time data-pagefind-sort="date:2024-12-22" class="block dateline text-fg-subtle text-min-1 trim uppercase" datetime="2024-12-22T00:00:01Z">December 22, 2024 </time> <h1 data-pagefind-meta="title" data-pagefind-body data-pagefind-weight="7.0" class="mt-s title"> Dec 22: Why we use our own hardware at Fastmail </h1> <div class="instapaper_ignore mt-m"> <h2 class="comment instapaper_ignore sr-only">Post categories</h2> <ul role="list" class="flex flex-wrap gap-xs not-prose"> <a href="/blog/tags/technical/"> <li class="bg-info-bg hover:bg-info-selected px-xs py-2xs rounded-md text-accent"> <p data-pagefind-filter="tag" class="text-min-1 trim"> Technical </p> </li> </a> </ul> </div> <a class="block col-[2] group mt-xl not-prose" href="/blog/author/robm/"> <address class="flex gap-s items-center not-italic"> <picture><source type="image/webp" srcset="/assets/images/robm_profile_picture-NDG5w-lMeL-42.webp 42w, /assets/images/robm_profile_picture-NDG5w-lMeL-84.webp 84w" sizes="42px"><img src="/assets/images/robm_profile_picture-NDG5w-lMeL-42.png" alt="Profile picture for Rob Mueller" loading="lazy" decoding="async" class="instapaper_ignore object-cover rounded-full size-[42px]" width="84" height="84" srcset="/assets/images/robm_profile_picture-NDG5w-lMeL-42.png 42w, /assets/images/robm_profile_picture-NDG5w-lMeL-84.png 84w" sizes="42px"></picture> <div class="space-y-2xs"> <p data-pagefind-filter="author" class="author byline byline-name font-semibold group-hover:underline text-0 trim"> Rob Mueller </p> <p class="text-0 text-grey-70 trim">Founder & CTO</p> </div> </address> </a> <picture><source type="image/webp" srcset="/assets/images/hero-cX_ZkUhAKu-749.webp 749w, /assets/images/hero-cX_ZkUhAKu-1023.webp 1023w, /assets/images/hero-cX_ZkUhAKu-1498.webp 1498w, /assets/images/hero-cX_ZkUhAKu-2046.webp 2046w" sizes="(max-width: 64rem) 1023px, 749px"><img src="/assets/images/hero-cX_ZkUhAKu-749.png" alt loading="eager" decoding="sync" class="col-span-full lg:col-[2] lg:rounded mt-xl not-prose w-full" width="2046" height="730" srcset="/assets/images/hero-cX_ZkUhAKu-749.png 749w, /assets/images/hero-cX_ZkUhAKu-1023.png 1023w, /assets/images/hero-cX_ZkUhAKu-1498.png 1498w, /assets/images/hero-cX_ZkUhAKu-2046.png 2046w" sizes="(max-width: 64rem) 1023px, 749px"></picture> </header> <div data-pagefind-body data-cms-edit="content" class="content mt-4xl"> <p>This is the twenty-second post in the <a href="/blog/fastmail-advent-2024/">Fastmail Advent 2024</a> series. The previous post was <a href="/blog/fastmail-in-a-box/">Dec 21: Fastmail in a box</a>. The next post is <a href="/blog/ten-years-of-jmap/">Dec 23: Ten years of JMAP</a>.</p> <h2 id="why-we-use-our-own-hardware" tabindex="-1">Why we use our own hardware</h2> <p>There has recently been talk of <a href="https://www.google.com/search?q=Cloud+Repatriation" target="_blank" rel="noopener">cloud repatriation</a> where companies are moving from the cloud to on premises, with some particularly <a href="https://basecamp.com/cloud-exit" target="_blank" rel="noopener">noisy examples</a>.</p> <p>Fastmail has a long history of using our <a href="https://www.fastmail.com/blog/standalone-mail-servers/" target="_blank" rel="noopener">own</a> <a href="https://www.fastmail.com/blog/getting-the-most-out-of-hardware/" target="_blank" rel="noopener">hardware</a>. We have over two decades of experience running and optimising our systems to use our own <a href="https://en.wikipedia.org/wiki/Bare-metal_server" target="_blank" rel="noopener">bare metal</a> servers efficiently.</p> <p>We get way better cost optimisation compared to moving everything to the cloud because:</p> <ol> <li>We understand our short, medium and long term usage patterns, requirements and growth very well. This means we can plan our hardware purchases ahead of time and don’t need the fast dynamic scaling that cloud provides.</li> <li>We have in house operations experience installing, configuring and running our own hardware and networking. These are skills we’ve had to maintain and grow in house since we’ve been doing this for 25 years.</li> <li>We are able to use our hardware for long periods. We find our hardware can provide useful life for anywhere from 5-10 years depending on what it is and when in the global technology cycle it was bought, meaning we can amortise and depreciate the cost of any hardware over many years.</li> </ol> <p>Yes, that means we have to do more ourselves, including planning, choosing, buying, installing, etc, but the tradeoff for us has and we believe continues to be significantly worth it.</p> <h2 id="hardware-over-the-years" tabindex="-1">Hardware over the years</h2> <p>Of course over the 25 years we’ve been running Fastmail we’ve been through a number of hardware changes. For many years, our IMAP server storage platform was a combination of <a href="https://www.urbandictionary.com/define.php?term=Spinning%20Rust" target="_blank" rel="noopener">spinning rust</a> drives and <a href="https://www.areca.com.tw/" target="_blank" rel="noopener">ARECA RAID controllers</a>. We tended to use faster 15k RPM SAS drives in <a href="https://en.wikipedia.org/wiki/Standard_RAID_levels#RAID_1" target="_blank" rel="noopener">RAID1</a> for our hot meta data, and 7.2k RPM SATA drives in <a href="https://en.wikipedia.org/wiki/Standard_RAID_levels#RAID_6" target="_blank" rel="noopener">RAID6</a> for our main email blob data.</p> <p>In fact it was slightly more complex than this. Email blobs were written to the fast RAID1 SAS volumes on delivery, but then a separate archiving process would move them to the SATA volumes at low server activity times. Support for all of this had been added into <a href="https://www.cyrusimap.org" target="_blank" rel="noopener">cyrus</a> and our tooling over the years in the form of separate “meta”, “data” and <a href="https://www.cyrusimap.org/3.8/imap/reference/admin/locations/archive-partitions.html" target="_blank" rel="noopener">“archive”</a> partitions.</p> <h2 id="moving-to-nv-me-ssds" tabindex="-1">Moving to NVMe SSDs</h2> <p>A few years ago however we made our biggest hardware upgrade ever. We moved all our email servers to a new <a href="https://www.supermicro.com/en/aplus/system/2u/2113/as-2113s-wn24rt.cfm" target="_blank" rel="noopener">2U AMD platform</a> with pure <a href="https://www.solidigm.com/products/data-center.html" target="_blank" rel="noopener">NVMe SSDs</a>. The density increase (24 x 2.5&quot; NVMe drives vs 12 x 3.5&quot; SATA drives per 2U) and performance increase was enormous. We found that these new servers performed even better than our initial expectations.</p> <p>At the time we upgraded however NVMe RAID controllers weren’t widely available. So we had to decide on how to handle redundancy. We considered a RAID-less setup using raw SSDs drives on each machine with synchronous application level replication to other machines, but the software changes required were going to be more complex than expected.</p> <p>We were looking at using classic Linux <a href="https://en.wikipedia.org/wiki/Mdadm" target="_blank" rel="noopener">mdadm RAID</a>, but the <a href="https://en.wikipedia.org/wiki/RAID#Atomicity" target="_blank" rel="noopener">write hole</a> was a concern and the <a href="https://docs.kernel.org/driver-api/md/raid5-cache.html" target="_blank" rel="noopener">write cache</a> didn’t seem well tested at the time.</p> <p>We decided to have a look at <a href="https://arstechnica.com/information-technology/2020/05/zfs-101-understanding-zfs-storage-and-performance/" target="_blank" rel="noopener">ZFS</a> and at least test it out.</p> <p>Despite some of the cyrus on disk database structures being fairly hostile to <a href="https://en.wikipedia.org/wiki/ZFS#Copy-on-write_transactional_model" target="_blank" rel="noopener">ZFS Copy-on-write</a> semantics, they were still incredibly fast at all the IO we threw at them. And there were some other wins as well.</p> <h2 id="zfs-compression-and-tuning" tabindex="-1">ZFS compression and tuning</h2> <p>When we rolled out ZFS for our email servers we also enabled <a href="https://freebsdfoundation.org/wp-content/uploads/2021/05/Zstandard-Compression-in-OpenZFS.pdf" target="_blank" rel="noopener">transparent Zstandard compression</a>. This has worked very well for us, saving about 40% space on all our email data.</p> <p>We’ve also recently done some additional calculations to see if we could tune some of the parameters better. We sampled 1 million emails at random and calculated how many blocks would be required to store those emails uncompressed, and then with <a href="https://klarasystems.com/articles/tuning-recordsize-in-openzfs/" target="_blank" rel="noopener">ZFS record sizes</a> of 32k, 128k or 512k and zstd-3 or zstd-9 compression options. Although ZFS <a href="https://en.wikipedia.org/wiki/ZFS#ZFS's_approach:_RAID-Z_and_mirroring" target="_blank" rel="noopener">RAIDz2</a> seems conceptually similar to classic RAID6, the way it <a href="https://ibug.io/blog/2023/10/zfs-block-size/" target="_blank" rel="noopener">actually stores blocks of data</a> is quite different and so you have to take into account volblocksize, how files are split into logical recordsize blocks, and number of drives when doing calculations.</p> <pre><code> Emails: 1,026,000 Raw blocks: 34,140,142 32k &amp; zstd-3, blocks: 23,004,447 = 32.6% saving 32k &amp; zstd-9, blocks: 22,721,178 = 33.4% saving 128k &amp; zstd-3, blocks: 20,512,759 = 39.9% saving 128k &amp; zstd-9, blocks: 20,261,445 = 40.7% saving 512k &amp; zstd-3, blocks: 19,917,418 = 41.7% saving 512k &amp; zstd-9, blocks: 19,666,970 = 42.4% saving </code></pre> <p>This showed that the defaults of 128k record size and zstd-3 were already pretty good. Moving to a record size of 512k improved compression over 128k by a bit over 4%. Given all meta data is cached separately, this seems a worthwhile improvement with no significant downside. Moving to zstd-9 improved compression over zstd-3 by about 2%. Given the CPU cost of compression at zstd-9 is about 4x zstd-3, even though emails are immutable and tend to be kept for a long time, we’ve decided not to implement this change.</p> <h2 id="zfs-encryption" tabindex="-1">ZFS encryption</h2> <p>We always enable <a href="https://en.wikipedia.org/wiki/Data_at_rest#Encryption" target="_blank" rel="noopener">encryption at rest</a> on all of our drives. This was usually done with <a href="https://en.wikipedia.org/wiki/Linux_Unified_Key_Setup" target="_blank" rel="noopener">LUKS</a>. But with ZFS this was <a href="https://arstechnica.com/gadgets/2021/06/a-quick-start-guide-to-openzfs-native-encryption/" target="_blank" rel="noopener">built in</a>. Again, this reduces overall system complexity.</p> <h2 id="going-all-in-on-zfs" tabindex="-1">Going all in on ZFS</h2> <p>So after the success of our initial testing, we decided to go all in on ZFS for all our large data storage needs. We’ve now been using ZFS for all our email servers for over 3 years and have been very happy with it. We’ve also moved over all our database, log and backup servers to using ZFS on NVMe SSDs as well with equally good results.</p> <h2 id="ssd-lifetimes" tabindex="-1">SSD lifetimes</h2> <p>The flash memory in SSDs has a finite life and <a href="https://en.wikipedia.org/wiki/Flash_memory#Write_endurance" target="_blank" rel="noopener">finite number of times it can be written to</a>. SSDs employ increasingly complex <a href="https://en.wikipedia.org/wiki/Wear_leveling" target="_blank" rel="noopener">wear levelling</a> algorithms to spread out writes and increase drive lifetime. You’ll often see the quoted endurance of an enterprise SSD as either an absolute figure of “Lifetime Writes”/“Total bytes written” like 65 PBW (petabytes written) or a relative per-day figure of “Drive writes per day” like 0.3, which you can convert to lifetime figure by multiplying by the drive size and the drive expected lifetime which is often assumed to be 5 years.</p> <p>Although we could calculate IO rates for existing <a href="https://en.wikipedia.org/wiki/Hard_disk_drive" target="_blank" rel="noopener">HDD</a> systems, we were making a significant number of changes moving to the new systems. Switching to a COW filesystem like ZFS, removing the special casing meta/data/archive partitions, and the massive latency reduction and performance improvements mean that things that might have taken extra time previously and ended up batching IO together, are now so fast it actually causes additional separated IO actions.</p> <p>So one big unknown question we had was how fast would the SSDs wear in our actual production environment? After several years, we now have some clear data. From one server at random but this is fairly consistent across the fleet of our oldest servers:</p> <pre><code># smartctl -a /dev/nvme14 ... Percentage Used: 4% </code></pre> <p>At this rate, we’ll replace these drives due to increased drive sizes, or entirely new physical drive formats (such <a href="https://www.snia.org/forums/cmsi/knowledge/formfactors" target="_blank" rel="noopener">E3.S</a> which appears to finally be gaining traction) long before they get close to their rated write capacity.</p> <p>We’ve also anecdotally found SSDs just to be much more reliable compared to HDDs for us. Although we’ve only ever used <a href="https://www.micron.com/products/storage/ssd/data-center-ssd/" target="_blank" rel="noopener">datacenter</a> <a href="https://www.solidigm.com/products/data-center.html" target="_blank" rel="noopener">class</a> SSDs and <a href="https://www.seagate.com/www-content/datasheets/pdfs/exos-7-e8-data-sheet-DS1957-1-1709US-en_US.pdf" target="_blank" rel="noopener">HDDs</a> failures and replacements every few weeks were a regular occurrence on the old fleet of servers. Over the last 3+ years, we’ve only seen a couple of SSD failures in total across the entire upgraded fleet of servers. This is easily less than one tenth the failure rate we used to have with HDDs.</p> <h2 id="storage-cost-calculation" tabindex="-1">Storage cost calculation</h2> <p>After converting all our email storage to NVMe SSDs, we were recently looking at our data backup solution. At the time it consisted of a number of older 2U servers with 12 x 3.5&quot; SATA drive bays and we decided to do some cost calculations on:</p> <ol> <li>Move to cloud storage.</li> <li>Upgrade the HD drives in existing servers.</li> <li>Upgrade to SSD NVMe machines.</li> </ol> <h3 id="1-cloud-storage" tabindex="-1">1. Cloud storage:</h3> <p>Looking at various providers, the per TB per month price, and then a yearly price for 1000Tb/1Pb (prices as at Dec 2024)</p> <ul> <li><a href="https://aws.amazon.com/s3/pricing/" target="_blank" rel="noopener">Amazon S3</a> - $21 -&gt; $252,000/y</li> <li><a href="https://developers.cloudflare.com/r2/pricing/" target="_blank" rel="noopener">Cloudflare R2</a> - $15 -&gt; $180,000/y</li> <li><a href="https://wasabi.com/pricing" target="_blank" rel="noopener">Wasabi</a> - $6.99 -&gt; $83,880/y</li> <li><a href="https://www.backblaze.com/cloud-storage/pricing" target="_blank" rel="noopener">Backblaze B2</a> - $6 -&gt; $72,000/y</li> <li><a href="https://aws.amazon.com/s3/pricing/" target="_blank" rel="noopener">Amazon S3 Glacier Instant Retrieval</a> - $4 -&gt; $48,000/y</li> <li><a href="https://aws.amazon.com/s3/pricing/" target="_blank" rel="noopener">Amazon S3 Glacier Deep Archive (12 hour retrieval time)</a> - $0.99 -&gt; $11,880/y</li> </ul> <p>Some of these (e.g. Amazon) have potentially significant bandwidth fees as well.</p> <p>It’s interesting seeing the spread of prices here. Some also have a bunch of weird edge cases as well. e.g. “The S3 Glacier Flexible Retrieval and S3 Glacier Deep Archive storage classes require an additional 32 KB of data per object”. Given the large retrieval time and extra overhead per-object, you’d probably want to store small incremental backups in regular S3, then when you’ve gathered enough, build a biggish object to push down to Glacier. This adds implementation complexity.</p> <ul> <li><em>Pros</em>: No limit to amount we store. Assuming we use S3 compatible API, can choose between multiple providers.</li> <li><em>Cons</em>: Implementation cost of converting existing backup system that assumes local POSIX files to S3 style object API is uncertain and possibly significant. Lowest cost options require extra careful consideration around implementation details and special limitations. Ongoing monthly cost that will only increase as amount of data we store increases. Uncertain if prices will go down or not, or even go up. Possible significant bandwidth costs depending on provider.</li> </ul> <h3 id="2-upgrade-hdds" tabindex="-1">2. Upgrade HDDs</h3> <p><a href="https://www.seagate.com/au/en/products/enterprise-drives/exos-x/x24/" target="_blank" rel="noopener">Seagate Exos 24 HDs</a> are 3.5&quot; 24T HDDs. This would allow us to triple the storage on existing servers. Each HDD is about $500, so upgrading one 2U machine would be about $6,000 and have storage of 220T or so.</p> <ul> <li><em>Pros</em>: Reuses existing hardware we already have. Upgrades can be done a machine at a time. Fairly low price</li> <li><em>Cons</em>: Will existing units handle 24T drives? What’s the rebuild time on drive failure look like? It’s almost a day for 8T drives already, so possibly nearly a week for a failed 24T drive? Is there enough IO performance to handle daily backups at capacity?</li> </ul> <h3 id="3-upgrade-to-new-hardware" tabindex="-1">3. Upgrade to new hardware</h3> <p>As we know, SSDs are denser (2.5&quot; -&gt; 24 per 2U vs 3.5&quot; -&gt; 12 per 2U), more reliable, and now higher capacity - <a href="https://www.solidigm.com/products/data-center/d5/p5336.html#form=U.2%2015mm&amp;cap=61.44TB" target="_blank" rel="noopener">up to 61T per 2.5&quot; drive</a>. A single 2U server with 24 x 61T drives with 2 x 12 RAIDz2 = 1220T. Each drive is <a href="https://www.newegg.com/solidigm-61-44tb-d5-p5336/p/N82E16820318031" target="_blank" rel="noopener">about $7k</a> right now, prices fluctuate. So all up 24 x $7k = $168k + ~$20k server =~ $190k for &gt; 1000T storage one-time cost.</p> <ul> <li><em>Pros</em>: <strong>Much</strong> higher sequential and random IO than HDDs will ever have. Price &lt; 1 year of standard S3 storage. Internal to our WAN, no bandwidth costs and very low latency. No new development required, existing backup system will just work. Consolidate on single 2U platform for all storage (cyrus, db, backups) and SSD for all storage. Significant space and power savings over existing HDD based servers</li> <li><em>Cons</em>: Greater up front cost. Still need to predict and buy more servers as backups grow.</li> </ul> <p>One thing you don’t see in this calculation is datacenter space, power, cooling, etc. The reason is that compared to the amortised yearly cost of a storage server like this, these are actually reasonably minimal these days, on the order of $3000/2U/year. Calculating person time is harder. We have a lot of home built automation systems that mean installing and running one more server has minimal marginal cost.</p> <h3 id="result" tabindex="-1">Result</h3> <p>We ended up going with the the new 2U servers option:</p> <p><picture><source type="image/webp" srcset="/assets/images/nvme-imap-servers-AqR6yL3DlW-375.webp 375w, /assets/images/nvme-imap-servers-AqR6yL3DlW-750.webp 750w, /assets/images/nvme-imap-servers-AqR6yL3DlW-1500.webp 1500w" sizes="(max-width: 425px) 375px, 750px"><img alt="NVME IMAP Servers" loading="lazy" decoding="async" src="/assets/images/nvme-imap-servers-AqR6yL3DlW-375.png" width="1500" height="559" srcset="/assets/images/nvme-imap-servers-AqR6yL3DlW-375.png 375w, /assets/images/nvme-imap-servers-AqR6yL3DlW-750.png 750w, /assets/images/nvme-imap-servers-AqR6yL3DlW-1500.png 1500w" sizes="(max-width: 425px) 375px, 750px"></picture></p> <ul> <li>The 2U AMD NVMe platform with ZFS is a platform we have experience with already</li> <li>SSDs are much more reliable and much higher IO compared to HDDs</li> <li>No uncertainty around super large HDDs, RAID controllers, rebuild times, shuffling data around, etc.</li> <li>Significant space and power saving over existing HDD based servers</li> <li>No new development required, can use existing backup system and code</li> <li>Long expected hardware lifetime, controlled upfront cost, can depreciate hardware cost</li> </ul> <p>So far this has worked out very well. The machines have bonded 25Gbps networks and when filling them from scratch we were able to saturate the network links streaming around 5Gbytes/second of data from our IMAP servers, compressing and writing it all down to a RAIDz2 zstd-3 compressed ZFS dataset.</p> <h2 id="conclusion" tabindex="-1">Conclusion</h2> <p>Running your own hardware might not be for everyone and has distinct tradeoffs. But when you have the experience and the knowledge of how you expect to scale, the cost improvements can be significant.</p> </div> </article> <div class="prose-bleed-images prose-grid"> <div class="flex flex-wrap gap-s gap-y-xl justify-between mt-5xl"> <a class="block group not-prose" href="/blog/author/robm/"> <address class="flex gap-s items-center not-italic"> <picture><source type="image/webp" srcset="/assets/images/robm_profile_picture-NDG5w-lMeL-42.webp 42w, /assets/images/robm_profile_picture-NDG5w-lMeL-84.webp 84w" sizes="42px"><img src="/assets/images/robm_profile_picture-NDG5w-lMeL-42.png" alt="Profile picture for Rob Mueller" loading="lazy" decoding="async" class="instapaper_ignore object-cover rounded-full size-[42px]" width="84" height="84" srcset="/assets/images/robm_profile_picture-NDG5w-lMeL-42.png 42w, /assets/images/robm_profile_picture-NDG5w-lMeL-84.png 84w" sizes="42px"></picture> <div class="space-y-2xs"> <p data-pagefind-filter="author" class="author byline byline-name font-semibold group-hover:underline text-0 trim"> Rob Mueller </p> <p class="text-0 text-grey-70 trim">Founder & CTO</p> </div> </address> </a> <div class="flex gap-s not-prose"> <button data-share-action="copy-link" class="*:pointer-events-none active:bg-button-subtle-bg-active focus-visible:outline focus-visible:outline-button-subtle-outline gap-2xs hidden hover:bg-button-subtle-bg-hover hover:text-button-subtle-fg-hover items-center px-xs py-2xs rounded-md text-button-subtle-fg"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-icon"> <path stroke-linecap="round" stroke-linejoin="round" d="M13.19 8.688a4.5 4.5 0 0 1 1.242 7.244l-4.5 4.5a4.5 4.5 0 0 1-6.364-6.364l1.757-1.757m13.35-.622 1.757-1.757a4.5 4.5 0 0 0-6.364-6.364l-4.5 4.5a4.5 4.5 0 0 0 1.242 7.244"></path> </svg> <p class="relative text-0 trim"> <span data-done class="absolute left-0 opacity-0">Copied</span> <span data-initial>Copy link</span> </p> </button> <button data-share-action="share" class="*:pointer-events-none active:bg-button-subtle-bg-active focus-visible:outline focus-visible:outline-button-subtle-outline gap-2xs hidden hover:bg-button-subtle-bg-hover hover:text-button-subtle-fg-hover items-center px-xs py-2xs rounded-md text-button-subtle-fg"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="-translate-x-px size-icon"> <path stroke-linecap="round" stroke-linejoin="round" d="M7.217 10.907a2.25 2.25 0 1 0 0 2.186m0-2.186c.18.324.283.696.283 1.093s-.103.77-.283 1.093m0-2.186 9.566-5.314m-9.566 7.5 9.566 5.314m0 0a2.25 2.25 0 1 0 3.935 2.186 2.25 2.25 0 0 0-3.935-2.186Zm0-12.814a2.25 2.25 0 1 0 3.933-2.185 2.25 2.25 0 0 0-3.933 2.185Z"></path> </svg> <p class="relative text-0 trim"> <span data-done class="absolute left-0 opacity-0">Copied</span> <span data-initial>Share</span> </p> </button> </div> </div> </div> <nav class="mt-3xl prose-grid"> <ul class="flex gap-s justify-between"> <li class="flex-1"> <a class="[--link-hover:--theme-fg] flex gap-xs hover:link-underline" href="/blog/fastmail-in-a-box/"> <svg xmlns="http://www.w3.org/2000/svg" class="basis-icon flex-none inline-block rotate-180 size-icon" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none" aria-labelledby="arrow-right-title-9ce142" role="graphics-symbol"> <title id="arrow-right-title-9ce142">Profile picture for Rob Mueller</title> <use class="i-arrow-right" href="#i-arrow-right"></use> </svg> <div> <p class="font-semibold">Previous</p> <p class="text-min-1">Dec 21: Fastmail in a box</p> </div> </a> </li> <li class="flex-1"> <a class="[--link-hover:--theme-fg] flex gap-xs hover:link-underline justify-end" href="/blog/ten-years-of-jmap/"> <div class="text-right"> <p class="font-semibold">Next</p> <p class="text-min-1">Dec 23: Ten years of JMAP</p> </div> <svg xmlns="http://www.w3.org/2000/svg" class="basis-icon flex-none inline-block size-icon" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none" aria-labelledby="arrow-right-title-d11c17" role="graphics-symbol"> <title id="arrow-right-title-d11c17">Profile picture for Rob Mueller</title> <use class="i-arrow-right" href="#i-arrow-right"></use> </svg> </a> </li> </ul> </nav> </main> <template id="pre-toolbar"> <div class="group pre-wrapper"> <div class="-mb-fx-6 duration-200 ease-out-expo flex group-hover:opacity-100 h-[28px] justify-end leading-none left-0 max-h-[28px] not-prose opacity-0 right-0 sticky toolbar top-0 transition-opacity z-10"> <label> <span class="sr-only">Copy code block</span> <button data-toolbar-action="copy" class="*:pointer-events-none *:size-icon-sm active:bg-button-subtle-bg-active-alt bg-grey-5 focus-visible:outline focus-visible:outline-button-subtle-outline h-full hover:bg-button-subtle-bg-hover px-3xs py-3xs rounded-md text-button-subtle-fg w-full"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="1.5" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" d="M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 0 1-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 0 1 1.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 0 0-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 0 1-1.125-1.125v-9.25m12 6.625v-1.875a3.375 3.375 0 0 0-3.375-3.375h-1.5a1.125 1.125 0 0 1-1.125-1.125v-1.5a3.375 3.375 0 0 0-3.375-3.375H9.75"></path> </svg> </button> </label> </div> </div> </template> <footer class="[--link-color:--brand-color-deepblue-5] [--link-hover:--brand-color-deepblue-5] bg-footer-bg text-fg-footer"> <div class="[background-image:--footer-sep-gradient] h-[4px] w-full"></div> <nav aria-labelledby="footer-navigation" class="flex flex-col gap-y-fx-14 py-fx-14 wrapper"> <h2 id="footer-navigation" class="sr-only">Footer navigation</h2> <div class="flex flex-wrap gap-y-fx-10"> <div class="basis-2/6 flex-grow min-w-[min(18rem,100%)] space-y-fx-4"> <div class="-mt-fx-2"> <svg xmlns="http://www.w3.org/2000/svg" class="size-[40px]" aria-hidden="true"> <use class="i-fm-icon-logo" href="#i-fm-icon-logo"></use> </svg> </div> <p class="font-semibold text-fx-lg trim">Email and calendar made better</p> </div> <div class="basis-4/6 flex flex-grow flex-wrap gap-fx-9"> <div class="basis-[11.25rem] flex-1 space-y-fx-4 text-fx-base"> <h3 class="font-semibold text-fx-lg trim">Product</h3> <ul> <li> <a href="/features/" class="inline-block link"> <p class="py-fx-4 text-fx-base trim">Product tour</p> </a> </li> <li> <a href="/business/" class="inline-block link"> <p class="py-fx-4 text-fx-base trim">For business</p> </a> </li> <li> <a href="/pricing/" class="inline-block link"> <p class="py-fx-4 text-fx-base trim">Pricing</p> </a> </li> <li> <a href="/features/security/" class="inline-block link"> <p class="py-fx-4 text-fx-base trim">Security</p> </a> </li> <li> <a href="/features/privacy/" class="inline-block link"> <p class="py-fx-4 text-fx-base trim">Privacy</p> </a> </li> </ul> </div> <div class="basis-[11.25rem] flex-1 space-y-fx-4 text-fx-base"> <h3 class="font-semibold text-fx-lg trim">How to</h3> <ul> <li> <a href="/how-to/move-from-gmail/" class="inline-block link"> <p class="py-fx-4 text-fx-base trim">Move from Gmail</p> </a> </li> <li> <a href="/how-to/move-from-outlook/" class="inline-block link"> <p class="py-fx-4 text-fx-base trim">Move from Outlook</p> </a> </li> <li> <a href="/how-to/move-from-yahoo/" class="inline-block link"> <p class="py-fx-4 text-fx-base trim">Move from Yahoo</p> </a> </li> <li> <a href="/how-to/move-from-proton/" class="inline-block link"> <p class="py-fx-4 text-fx-base trim">Move from Proton</p> </a> </li> <li> <a href="/how-to/move-from-hey/" class="inline-block link"> <p class="py-fx-4 text-fx-base trim">Move from HEY</p> </a> </li> <li> <a href="/how-to/email-for-your-domain/" class="inline-block link"> <p class="py-fx-4 text-fx-base trim">Get email for your domain</p> </a> </li> <li> <a href="/how-to/stop-spam/" class="inline-block link"> <p class="py-fx-4 text-fx-base trim">Stop spam</p> </a> </li> <li> <a href="/how-to/inbox-zero/" class="inline-block link"> <p class="py-fx-4 text-fx-base trim">Achieve inbox zero</p> </a> </li> </ul> </div> <div class="basis-[11.25rem] flex-1 space-y-fx-4 text-fx-base"> <h3 class="font-semibold text-fx-lg trim">Support & Resources</h3> <ul> <li> <a href="/blog/" class="inline-block link"> <p class="py-fx-4 text-fx-base trim">Blog</p> </a> </li> <li> <a href="/digitalcitizen/" class="inline-block link"> <p class="py-fx-4 text-fx-base trim">Podcast</p> </a> </li> <li> <a href="https://fastmail.help/" class="inline-block link"> <p class="py-fx-4 text-fx-base trim">Fastmail help center</p> </a> </li> <li> <a href="/support/" class="inline-block link"> <p class="py-fx-4 text-fx-base trim">Contact Fastmail support</p> </a> </li> <li> <a href="/dev/" class="inline-block link"> <p class="py-fx-4 text-fx-base trim">API Documentation</p> </a> </li> <li> <a href="/bug-bounty/" class="inline-block link"> <p class="py-fx-4 text-fx-base trim">Report a security issue</p> </a> </li> </ul> </div> <div class="basis-[11.25rem] flex-1 space-y-fx-4 text-fx-base"> <h3 class="font-semibold text-fx-lg trim">Company</h3> <ul> <li> <a href="/company/about/" class="inline-block link"> <p class="py-fx-4 text-fx-base trim">About us</p> </a> </li> <li> <a href="/company/values/" class="inline-block link"> <p class="py-fx-4 text-fx-base trim">Our values</p> </a> </li> <li> <a href="https://apply.workable.com/fastmail-1/" class="inline-block link"> <p class="py-fx-4 text-fx-base trim">Careers</p> </a> </li> <li> <a href="/company/open-source/" class="inline-block link"> <p class="py-fx-4 text-fx-base trim">Open source and standards</p> </a> </li> <li> <a href="/company/partners/" class="inline-block link"> <p class="py-fx-4 text-fx-base trim">Partner with us</p> </a> </li> <li> <a href="/policies/" class="inline-block link"> <p class="py-fx-4 text-fx-base trim">Policies</p> </a> </li> <li> <a href="/media-kit/" class="inline-block link"> <p class="py-fx-4 text-fx-base trim">Media kit</p> </a> </li> </ul> </div> </div> </div> <div class="border-footer-border border-t flex gap-fx-8 items-center justify-center le-[66rem]:flex-col pt-fx-8 text-fx-base"> <ul class="flex flex-grow flex-wrap gap-fx-4 le-[66rem]:justify-center"> <li>&copy; 2025 Fastmail Pty Ltd. All rights reserved.</li> <li> <a href="https://fastmailstatus.com/" class="link">System status</a> </li> <li> <a href="/policies/terms-of-service/" class="link">Terms of service</a> </li> <li> <a href="/policies/privacy/" class="link">Privacy policy</a> </li> </ul> <div class="flex flex-wrap gap-fx-8 items-center justify-center"> <ul class="flex flex-grow flex-wrap gap-fx-6 items-center le-[66rem]:justify-center"> <li> <a href="https://mastodon.social/@fastmail"><span class="sr-only">Mastodon</span> <svg xmlns="http://www.w3.org/2000/svg" class="size-icon" fill="none" aria-hidden="true"> <use class="i-mastodon" href="#i-mastodon"></use> </svg> </a> </li> <li> <a href="https://twitter.com/Fastmail"><span class="sr-only">X</span> <svg xmlns="http://www.w3.org/2000/svg" class="size-icon" fill="none" aria-hidden="true"> <use class="i-x" href="#i-x"></use> </svg> </a> </li> <li> <a href="https://www.linkedin.com/company/fastmail"><span class="sr-only">LinkedIn</span> <svg xmlns="http://www.w3.org/2000/svg" class="size-icon" fill="none" aria-hidden="true"> <use class="i-linkedin" href="#i-linkedin"></use> </svg> </a> </li> <li> <a href="https://www.facebook.com/Fastmail/"><span class="sr-only">Facebook</span> <svg xmlns="http://www.w3.org/2000/svg" class="size-icon" fill="none" aria-hidden="true"> <use class="i-facebook" href="#i-facebook"></use> </svg> </a> </li> </ul> <ul class="flex flex-grow flex-wrap gap-fx-8 items-center le-[66rem]:justify-center"> <li> <a href="https://play.google.com/store/apps/details?id=com.fastmail.app"> <img src="/assets/images/play-store-_nKvx1K1d--135.svg" alt="Google Play" loading="lazy" decoding="async" width="135" height="40"> </a> </li> <li> <a href="https://apps.apple.com/us/app/fastmail-email-calendar/id931370077"> <img src="/assets/images/app-store-ZOqpK4vo0n-120.svg" alt="App Store" loading="lazy" decoding="async" width="120" height="40"> </a> </li> </ul> </div> </div> </nav> </footer> </div> <svg id="icon-sprite-sheet" class="sr-only"> <defs> <g id="i-arrow-right"> <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"> <path d="M4.75 11.75H19.25"></path> <path d="M14.4199 6.91992L19.2499 11.7499L14.4199 16.5799"></path> </svg> </g> <g id="i-chevron"> <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"> <polyline points="17.75 9.13 12 14.88 6.25 9.13"></polyline> </svg> </g> <g id="i-external-link"> <svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> <path d="M16.83 12.81V17.64C16.83 18.067 16.6604 18.4765 16.3584 18.7784C16.0565 19.0804 15.647 19.25 15.22 19.25H6.36C5.933 19.25 5.52349 19.0804 5.22156 18.7784C4.91962 18.4765 4.75 18.067 4.75 17.64V8.77998C4.75 8.35298 4.91962 7.94347 5.22156 7.64154C5.52349 7.33961 5.933 7.16998 6.36 7.16998H11.19"></path> <path d="M14.42 4.75H19.25V9.58"></path> <path d="M10.39 13.61L19.25 4.75"></path> </svg> </g> <g id="i-fm-icon-logo"> <svg viewbox="0 0 40 40" xmlns="http://www.w3.org/2000/svg"> <path d="M19.9998 19.9995L11.6665 14.2695V25.7279L16.8748 24.1645L19.9998 19.9995Z" fill="#FFC107"></path> <path d="M11.6665 25.7298H27.2915C27.8665 25.7298 28.3332 25.2632 28.3332 24.6882V14.2715L11.6665 25.7298Z" fill="#F4F5F7"></path> <path d="M32.8707 11.151C34.6034 13.6674 35.6234 16.7129 35.6234 20.0001C35.6234 28.6292 28.6271 35.6256 19.998 35.6256C14.6562 35.6256 9.94344 32.9401 7.12707 28.8492L4.37435 28.7492L3.52344 31.3274C7.13071 36.5638 13.1616 40.0001 19.9998 40.0001C31.0453 40.0001 39.9998 31.0456 39.9998 20.0001C39.9998 15.7929 38.6943 11.8947 36.4762 8.67285L33.7507 8.74921L32.8707 11.151Z" fill="#69B3E7"></path> <path d="M4.37455 20C4.37455 11.3709 11.3709 4.37455 20 4.37455C25.3418 4.37455 30.0545 7.06 32.8709 11.1509L36.4745 8.67273C32.8691 3.43636 26.8382 0 20 0C8.95455 0 0 8.95455 0 20C0 24.2073 1.30545 28.1055 3.52364 31.3273L7.12727 28.8491C5.39455 26.3327 4.37455 23.2873 4.37455 20Z" fill="#0067B9"></path> </svg> </g> <g id="i-mastodon"> <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20"> <mask id="mask0_714_15451" style="mask-type:luminance" maskunits="userSpaceOnUse" x="0" y="0" width="20" height="20"> <path d="M20 0H0V20H20V0Z" fill="white"></path> </mask> <g mask="url(#mask0_714_15451)"> <path fill-rule="evenodd" clip-rule="evenodd" d="M19.625 12C19.375 13.375 17 15 14.25 15.25C12.875 15.375 11.5 15.5 10 15.5C7.625 15.375 5.75 15 5.75 15V15.625C6 17.875 8.125 18 10 18C12 18.125 13.75 17.5 13.75 17.5L13.875 19.125C13.875 19.125 12.5 19.75 10.125 19.875C8.75 20 7.125 19.875 5.125 19.375C0.875 18.375 0.125 14.25 0 10V6.5C0 2.125 3 0.875 3 0.875C4.625 0.25 7.25 0 10 0C12.75 0 15.375 0.25 16.875 1C16.875 1 19.875 2.25 19.875 6.625C20 6.625 20 9.75 19.625 12ZM16.375 6.875V12.125H14.125V7C14.125 5.875 13.625 5.375 12.625 5.375C11.5 5.375 11 6 11 7.25V10H8.875V7.375C8.875 6.125 8.375 5.5 7.25 5.5C6.25 5.375 5.875 6 5.875 7V12.125H3.625V6.875C3.625 5.75 3.875 5 4.5 4.375C5.125 3.75 5.875 3.375 6.875 3.375C8 3.375 8.875 3.75 9.5 4.625L10 5.5L10.5 4.625C11.125 3.75 11.875 3.375 13.125 3.375C14.125 3.375 14.875 3.75 15.5 4.375C16.125 5 16.375 5.875 16.375 6.875Z" fill="#999EA3"></path> </g> </svg> </g> <g id="i-x"> <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"> <path d="M13.676 10.622L20.233 3H18.679L12.986 9.618L8.43897 3H3.19397L10.07 13.007L3.19397 21H4.74797L10.76 14.011L15.562 21H20.807L13.676 10.622ZM11.548 13.096L10.851 12.099L5.30797 4.17H7.69497L12.169 10.569L12.866 11.566L18.681 19.884H16.294L11.548 13.096Z" fill="#999EA3"></path> </svg> </g> <g id="i-linkedin"> <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"> <path fill-rule="evenodd" clip-rule="evenodd" d="M20.551 2H3.508C2.693 2 2 2.645 2 3.439V20.56C2 21.355 2.454 22 3.27 22H20.314C21.13 22 22.001 21.355 22.001 20.56V3.439C22.001 2.645 21.368 2 20.551 2ZM9.619 9.619H12.311V10.991H12.341C12.751 10.251 13.964 9.5 15.463 9.5C18.34 9.5 19.143 11.028 19.143 13.857V19.143H16.286V14.378C16.286 13.111 15.78 12 14.597 12C13.161 12 12.476 12.972 12.476 14.569V19.143H9.619V9.619ZM4.857 19.143H7.714V9.619H4.857V19.143ZM8.071 6.286C8.071 7.273 7.272 8.072 6.285 8.072C5.298 8.072 4.499 7.273 4.499 6.286C4.499 5.299 5.298 4.5 6.285 4.5C7.272 4.5 8.071 5.299 8.071 6.286Z" fill="#999EA3"></path> </svg> </g> <g id="i-facebook"> <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 20"> <path d="M20 10C20 4.477 15.523 0 10 0C4.477 0 0 4.477 0 10C0 14.69 3.229 18.625 7.584 19.706V13.056H5.522V10H7.584V8.683C7.584 5.279 9.124 3.702 12.466 3.702C13.1 3.702 14.193 3.826 14.64 3.95V6.72C14.404 6.695 13.994 6.683 13.485 6.683C11.845 6.683 11.212 7.304 11.212 8.919V10H14.478L13.917 13.056H11.212V19.927C16.163 19.329 20 15.113 20 10Z" fill="#999EA3"></path> </svg> </g> </defs> </svg> </body></html>

Pages: 1 2 3 4 5 6 7 8 9 10