<?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: HostingSift</title>
    <description>The latest articles on DEV Community by HostingSift (@hostingsift).</description>
    <link>https://dev.to/hostingsift</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%2F3781248%2Fb9ccc1bf-a147-491d-a8ef-32f6dcafac23.png</url>
      <title>DEV Community: HostingSift</title>
      <link>https://dev.to/hostingsift</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hostingsift"/>
    <language>en</language>
    <item>
      <title>VPS Price Per GB of RAM: 711 Plans Across 39 Hosts</title>
      <dc:creator>HostingSift</dc:creator>
      <pubDate>Mon, 31 Aug 2026 11:32:21 +0000</pubDate>
      <link>https://dev.to/hostingsift/vps-price-per-gb-of-ram-711-plans-across-39-hosts-8d6</link>
      <guid>https://dev.to/hostingsift/vps-price-per-gb-of-ram-711-plans-across-39-hosts-8d6</guid>
      <description>&lt;p&gt;A gigabyte of RAM on a virtual server costs \$0.47 per month. It also costs \$58.00 per month. Same unit, same billing period, both prices live on 31 August 2026.&lt;/p&gt;

&lt;p&gt;We priced every plan in our database that publishes a RAM figure: 711 active VPS and cloud plans from 39 providers, EUR prices converted to USD, everything normalised to dollars per gigabyte per month. The median came out at exactly \$6.00. Half the market sits above that line, half below, and the distance between the two ends is 123x.&lt;/p&gt;

&lt;p&gt;That spread is not a mistake, and it is not all margin either. But it is far wider than most buyers assume, and the reason it stays wide is that almost nobody prices RAM by the gigabyte when they shop. They look at the plan name and the monthly figure.&lt;/p&gt;

&lt;h2&gt;
  
  
  How we counted
&lt;/h2&gt;

&lt;p&gt;Every number here comes from our nightly price readings, taken on 30 and 31 August 2026. The rules we applied:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Only plans currently active and in stock, with both a price and a stated RAM figure. VPS and cloud categories, no shared hosting, no dedicated metal.&lt;/li&gt;
&lt;li&gt;Prices converted to USD at our stored rate for the eight EUR-billed hosts in the set (Contabo, Hetzner, Netcup, OVHcloud, Private Hosting, Diploi, Evolution Host, Time4VPS).&lt;/li&gt;
&lt;li&gt;Monthly-equivalent pricing. A 24-month Contabo term shows as its per-month figure, which is how the provider advertises it.&lt;/li&gt;
&lt;li&gt;Railway's Pro plan is excluded. Its 1 TB figure is an account ceiling rather than provisioned memory, and including it would have handed the crown to a plan that does not give you a 1 TB server.&lt;/li&gt;
&lt;li&gt;Fly.io's storage and bandwidth are usage-based and not counted against the RAM price.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The cheapest gigabyte at each host
&lt;/h2&gt;

&lt;p&gt;For every provider we took its single best plan by dollars per GB, then looked up what that same plan renews at. The renewal column is where the ranking falls apart.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Best plan&lt;/th&gt;
&lt;th&gt;RAM&lt;/th&gt;
&lt;th&gt;Price/mo&lt;/th&gt;
&lt;th&gt;\$/GB intro&lt;/th&gt;
&lt;th&gt;\$/GB renewal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Contabo&lt;/td&gt;
&lt;td&gt;Cloud VPS 18&lt;/td&gt;
&lt;td&gt;96 GB&lt;/td&gt;
&lt;td&gt;\$45.08&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;\$0.47&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;\$0.47&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time4VPS&lt;/td&gt;
&lt;td&gt;Container C16&lt;/td&gt;
&lt;td&gt;16 GB&lt;/td&gt;
&lt;td&gt;\$8.06&lt;/td&gt;
&lt;td&gt;\$0.50&lt;/td&gt;
&lt;td&gt;\$1.01&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NameHero&lt;/td&gt;
&lt;td&gt;Business VPS&lt;/td&gt;
&lt;td&gt;32 GB&lt;/td&gt;
&lt;td&gt;\$20.68&lt;/td&gt;
&lt;td&gt;\$0.65&lt;/td&gt;
&lt;td&gt;\$1.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IONOS&lt;/td&gt;
&lt;td&gt;VPS XL+&lt;/td&gt;
&lt;td&gt;16 GB&lt;/td&gt;
&lt;td&gt;\$11.00&lt;/td&gt;
&lt;td&gt;\$0.69&lt;/td&gt;
&lt;td&gt;\$2.75&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OVHcloud&lt;/td&gt;
&lt;td&gt;VPS-6 2026&lt;/td&gt;
&lt;td&gt;96 GB&lt;/td&gt;
&lt;td&gt;\$71.35&lt;/td&gt;
&lt;td&gt;\$0.74&lt;/td&gt;
&lt;td&gt;\$0.74&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hostinger&lt;/td&gt;
&lt;td&gt;KVM 4&lt;/td&gt;
&lt;td&gt;16 GB&lt;/td&gt;
&lt;td&gt;\$12.99&lt;/td&gt;
&lt;td&gt;\$0.81&lt;/td&gt;
&lt;td&gt;\$1.81&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Netcup&lt;/td&gt;
&lt;td&gt;VPS 8000 G12&lt;/td&gt;
&lt;td&gt;64 GB&lt;/td&gt;
&lt;td&gt;\$55.14&lt;/td&gt;
&lt;td&gt;\$0.86&lt;/td&gt;
&lt;td&gt;\$0.86&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HostGator&lt;/td&gt;
&lt;td&gt;Snappy 2000 NVMe 4&lt;/td&gt;
&lt;td&gt;4 GB&lt;/td&gt;
&lt;td&gt;\$4.18&lt;/td&gt;
&lt;td&gt;\$1.04&lt;/td&gt;
&lt;td&gt;\$2.34&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HostArmada&lt;/td&gt;
&lt;td&gt;Unmanaged Ignition&lt;/td&gt;
&lt;td&gt;16 GB&lt;/td&gt;
&lt;td&gt;\$16.89&lt;/td&gt;
&lt;td&gt;\$1.06&lt;/td&gt;
&lt;td&gt;\$2.64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DreamHost&lt;/td&gt;
&lt;td&gt;Stack 16&lt;/td&gt;
&lt;td&gt;16 GB&lt;/td&gt;
&lt;td&gt;\$17.49&lt;/td&gt;
&lt;td&gt;\$1.09&lt;/td&gt;
&lt;td&gt;\$1.66&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ServaRica&lt;/td&gt;
&lt;td&gt;NVMe Cheetah&lt;/td&gt;
&lt;td&gt;6 GB&lt;/td&gt;
&lt;td&gt;\$7.00&lt;/td&gt;
&lt;td&gt;\$1.17&lt;/td&gt;
&lt;td&gt;\$1.17&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;InMotion Hosting&lt;/td&gt;
&lt;td&gt;VPS 8 vCPU&lt;/td&gt;
&lt;td&gt;16 GB&lt;/td&gt;
&lt;td&gt;\$19.99&lt;/td&gt;
&lt;td&gt;\$1.25&lt;/td&gt;
&lt;td&gt;\$3.56&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Private Hosting&lt;/td&gt;
&lt;td&gt;VPS-RAM-64GB&lt;/td&gt;
&lt;td&gt;64 GB&lt;/td&gt;
&lt;td&gt;\$91.99&lt;/td&gt;
&lt;td&gt;\$1.44&lt;/td&gt;
&lt;td&gt;\$1.44&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;InterServer&lt;/td&gt;
&lt;td&gt;1 Slice&lt;/td&gt;
&lt;td&gt;2 GB&lt;/td&gt;
&lt;td&gt;\$3.00&lt;/td&gt;
&lt;td&gt;\$1.50&lt;/td&gt;
&lt;td&gt;\$1.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bluehost&lt;/td&gt;
&lt;td&gt;NVME 8&lt;/td&gt;
&lt;td&gt;8 GB&lt;/td&gt;
&lt;td&gt;\$12.99&lt;/td&gt;
&lt;td&gt;\$1.62&lt;/td&gt;
&lt;td&gt;\$3.62&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A2 Hosting&lt;/td&gt;
&lt;td&gt;Self Managed Linux L&lt;/td&gt;
&lt;td&gt;32 GB&lt;/td&gt;
&lt;td&gt;\$54.98&lt;/td&gt;
&lt;td&gt;\$1.72&lt;/td&gt;
&lt;td&gt;\$3.44&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GoDaddy&lt;/td&gt;
&lt;td&gt;32 vCPU / 128 GB&lt;/td&gt;
&lt;td&gt;128 GB&lt;/td&gt;
&lt;td&gt;\$219.99&lt;/td&gt;
&lt;td&gt;\$1.72&lt;/td&gt;
&lt;td&gt;\$2.66&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Namecheap&lt;/td&gt;
&lt;td&gt;Hypernova&lt;/td&gt;
&lt;td&gt;24 GB&lt;/td&gt;
&lt;td&gt;\$46.88&lt;/td&gt;
&lt;td&gt;\$1.95&lt;/td&gt;
&lt;td&gt;\$2.20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LiquidWeb&lt;/td&gt;
&lt;td&gt;VPS 4GB (Self-Managed)&lt;/td&gt;
&lt;td&gt;4 GB&lt;/td&gt;
&lt;td&gt;\$8.50&lt;/td&gt;
&lt;td&gt;\$2.12&lt;/td&gt;
&lt;td&gt;\$4.25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Linode&lt;/td&gt;
&lt;td&gt;High Memory 24GB&lt;/td&gt;
&lt;td&gt;24 GB&lt;/td&gt;
&lt;td&gt;\$60.00&lt;/td&gt;
&lt;td&gt;\$2.50&lt;/td&gt;
&lt;td&gt;\$2.50&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Below that group the numbers climb quickly. AWS Lightsail's best memory ratio is \$4.50/GB, Hetzner's cloud line \$4.67, Vultr \$5.00, DigitalOcean \$5.25. Cloudways cannot get under \$9.66 and SiteGround's cloud entry point works out at \$12.50 per GB.&lt;/p&gt;

&lt;p&gt;Contabo taking first place surprises nobody who has shopped European VPS before. What surprises people is second place: Time4VPS, a Lithuanian host most buyers have never heard of, selling 16 GB containers for \$8.06 a month. Its catch is in the renewal column, where the price doubles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Renewal reshuffles the whole board
&lt;/h2&gt;

&lt;p&gt;Twelve of the 39 hosts charge exactly what they advertise, forever. The rest use an intro rate, and the size of the step varies enormously.&lt;/p&gt;

&lt;p&gt;IONOS runs the steepest one in the set. VPS XL+ is the fourth cheapest gigabyte in the market at signup and drops to sixteenth once the first year ends, because \$11.00 becomes \$44.00. That is a 4x step on a plan whose specs do not change. IONOS is far from alone: InMotion Hosting moves from twelfth to twenty-first, HostArmada from ninth to seventeenth, A2 Hosting from sixteenth to twenty-second.&lt;/p&gt;

&lt;p&gt;Movement runs the other way too. OVHcloud is fifth cheapest at signup and second cheapest at renewal. Netcup goes from seventh to third. InterServer, whose flat \$1.50 per GB looks unremarkable next to Contabo's \$0.47, climbs from fourteenth to eighth simply by not raising anything.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Rank at signup&lt;/th&gt;
&lt;th&gt;Rank at renewal&lt;/th&gt;
&lt;th&gt;Move&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OVHcloud&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;+3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Netcup&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;+4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ServaRica&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;+6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;InterServer&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;+6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time4VPS&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;-2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NameHero&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;-6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HostArmada&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;-8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;InMotion Hosting&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;-9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IONOS&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;-12&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Contabo holds first place in both columns. So does its price, which is the entire argument for buying there.&lt;/p&gt;

&lt;p&gt;If you want to see what a specific step costs you over a full term rather than a month, our &lt;a href="https://hostingsift.com/tools/true-cost-calculator" rel="noopener noreferrer"&gt;true cost calculator&lt;/a&gt; does that arithmetic, and we went deeper on the pattern in &lt;a href="https://hostingsift.com/blog/monthly-vs-annual-vs-3-year-hosting-plans" rel="noopener noreferrer"&gt;monthly vs annual vs 3-year plans&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What 8 GB actually costs, host by host
&lt;/h2&gt;

&lt;p&gt;Ratios are useful for ranking. For a buying decision you want a fixed basket, so here is the same question asked concretely: what does an 8 GB server cost, and what else comes with it?&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;vCPU&lt;/th&gt;
&lt;th&gt;Storage&lt;/th&gt;
&lt;th&gt;Price/mo&lt;/th&gt;
&lt;th&gt;Renews at&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Time4VPS&lt;/td&gt;
&lt;td&gt;Container C8&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;100 GB SSD&lt;/td&gt;
&lt;td&gt;\$5.04&lt;/td&gt;
&lt;td&gt;\$10.07&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Contabo&lt;/td&gt;
&lt;td&gt;Cloud VPS 4&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;100 GB SSD&lt;/td&gt;
&lt;td&gt;\$5.06&lt;/td&gt;
&lt;td&gt;\$5.06&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IONOS&lt;/td&gt;
&lt;td&gt;VPS L+&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;240 GB NVMe&lt;/td&gt;
&lt;td&gt;\$6.00&lt;/td&gt;
&lt;td&gt;\$21.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OVHcloud&lt;/td&gt;
&lt;td&gt;VPS-1 2026&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;75 GB NVMe&lt;/td&gt;
&lt;td&gt;\$6.35&lt;/td&gt;
&lt;td&gt;\$6.35&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NameHero&lt;/td&gt;
&lt;td&gt;Plus VPS&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;100 GB NVMe&lt;/td&gt;
&lt;td&gt;\$6.85&lt;/td&gt;
&lt;td&gt;\$15.92&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HostGator&lt;/td&gt;
&lt;td&gt;Snappy 4000 NVMe 8&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;200 GB NVMe&lt;/td&gt;
&lt;td&gt;\$8.36&lt;/td&gt;
&lt;td&gt;\$18.70&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hostinger&lt;/td&gt;
&lt;td&gt;KVM 2&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;100 GB NVMe&lt;/td&gt;
&lt;td&gt;\$8.99&lt;/td&gt;
&lt;td&gt;\$14.99&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DreamHost&lt;/td&gt;
&lt;td&gt;Stack 8&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;150 GB NVMe&lt;/td&gt;
&lt;td&gt;\$10.99&lt;/td&gt;
&lt;td&gt;\$16.99&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Netcup&lt;/td&gt;
&lt;td&gt;VPS 1000 G12&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;256 GB NVMe&lt;/td&gt;
&lt;td&gt;\$11.93&lt;/td&gt;
&lt;td&gt;\$11.93&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;InterServer&lt;/td&gt;
&lt;td&gt;4 Slices&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;160 GB SSD&lt;/td&gt;
&lt;td&gt;\$12.00&lt;/td&gt;
&lt;td&gt;\$12.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bluehost&lt;/td&gt;
&lt;td&gt;NVME 8&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;200 GB NVMe&lt;/td&gt;
&lt;td&gt;\$12.99&lt;/td&gt;
&lt;td&gt;\$28.99&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Private Hosting&lt;/td&gt;
&lt;td&gt;VPS-RAM-8GB&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;50 GB NVMe&lt;/td&gt;
&lt;td&gt;\$14.94&lt;/td&gt;
&lt;td&gt;\$14.94&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A2 Hosting&lt;/td&gt;
&lt;td&gt;Self Managed Linux S&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;160 GB NVMe&lt;/td&gt;
&lt;td&gt;\$19.99&lt;/td&gt;
&lt;td&gt;\$39.99&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LiquidWeb&lt;/td&gt;
&lt;td&gt;VPS 8GB Self-Managed&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;240 GB SSD&lt;/td&gt;
&lt;td&gt;\$22.50&lt;/td&gt;
&lt;td&gt;\$45.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vultr&lt;/td&gt;
&lt;td&gt;CC Regular 4vCPU/8 GB&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;160 GB SSD&lt;/td&gt;
&lt;td&gt;\$40.00&lt;/td&gt;
&lt;td&gt;\$40.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hetzner&lt;/td&gt;
&lt;td&gt;CPX32&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;160 GB NVMe&lt;/td&gt;
&lt;td&gt;\$40.81&lt;/td&gt;
&lt;td&gt;\$40.81&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DigitalOcean&lt;/td&gt;
&lt;td&gt;Basic Regular 8 GiB&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;160 GB NVMe&lt;/td&gt;
&lt;td&gt;\$48.00&lt;/td&gt;
&lt;td&gt;\$48.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Linode&lt;/td&gt;
&lt;td&gt;Shared Linode 8GB&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;160 GB SSD&lt;/td&gt;
&lt;td&gt;\$48.00&lt;/td&gt;
&lt;td&gt;\$48.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloudways&lt;/td&gt;
&lt;td&gt;DO Basic Large&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;160 GB NVMe&lt;/td&gt;
&lt;td&gt;\$99.00&lt;/td&gt;
&lt;td&gt;\$99.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SiteGround&lt;/td&gt;
&lt;td&gt;Jump Start&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;40 GB SSD&lt;/td&gt;
&lt;td&gt;\$100.00&lt;/td&gt;
&lt;td&gt;\$100.00&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Look at the bottom four rows against the top four. Cloudways charges \$99 for a DigitalOcean droplet that DigitalOcean sells for \$48, and the \$51 difference is the managed layer: patching, staging, a control panel, support that answers. Whether that is worth 2x depends entirely on how many hours of your own time you were planning to spend on server administration. We took that question apart in &lt;a href="https://hostingsift.com/blog/managed-vs-unmanaged-vps" rel="noopener noreferrer"&gt;managed vs unmanaged VPS&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;SiteGround's Jump Start is the one row that resists any justification on the numbers. \$100 for 8 GB and 40 GB of disk is 20x Contabo's rate for the same memory and less than half the storage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bigger boxes do not get you cheaper RAM
&lt;/h2&gt;

&lt;p&gt;Standard intuition says memory gets cheaper per gigabyte as you scale up. Across the whole market that intuition is wrong.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;RAM size&lt;/th&gt;
&lt;th&gt;Plans&lt;/th&gt;
&lt;th&gt;Median \$/GB&lt;/th&gt;
&lt;th&gt;Cheapest \$/GB&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Under 4 GB&lt;/td&gt;
&lt;td&gt;104&lt;/td&gt;
&lt;td&gt;\$7.14&lt;/td&gt;
&lt;td&gt;\$1.45&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4 GB&lt;/td&gt;
&lt;td&gt;89&lt;/td&gt;
&lt;td&gt;\$6.50&lt;/td&gt;
&lt;td&gt;\$0.83&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8 GB&lt;/td&gt;
&lt;td&gt;105&lt;/td&gt;
&lt;td&gt;\$6.00&lt;/td&gt;
&lt;td&gt;\$0.63&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16 GB&lt;/td&gt;
&lt;td&gt;102&lt;/td&gt;
&lt;td&gt;\$5.99&lt;/td&gt;
&lt;td&gt;\$0.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;32 GB&lt;/td&gt;
&lt;td&gt;79&lt;/td&gt;
&lt;td&gt;\$5.81&lt;/td&gt;
&lt;td&gt;\$0.65&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;64 GB&lt;/td&gt;
&lt;td&gt;53&lt;/td&gt;
&lt;td&gt;\$6.09&lt;/td&gt;
&lt;td&gt;\$0.53&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;96 GB and up&lt;/td&gt;
&lt;td&gt;91&lt;/td&gt;
&lt;td&gt;\$6.91&lt;/td&gt;
&lt;td&gt;\$0.47&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The median barely moves from 4 GB to 64 GB, and at the top of the ladder it goes back up. Meanwhile the cheapest available rate keeps falling. Both facts are true because the volume discount is real inside certain hosts and absent at others, and the ones without it dominate the large-plan population.&lt;/p&gt;

&lt;p&gt;Ranked by how much cheaper a provider's largest plan is per gigabyte than its smallest:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Smallest plan \$/GB&lt;/th&gt;
&lt;th&gt;Largest plan \$/GB&lt;/th&gt;
&lt;th&gt;Discount&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Private Hosting&lt;/td&gt;
&lt;td&gt;\$5.74 (1 GB)&lt;/td&gt;
&lt;td&gt;\$1.44 (64 GB)&lt;/td&gt;
&lt;td&gt;4.0x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HostArmada&lt;/td&gt;
&lt;td&gt;\$3.69 (1 GB)&lt;/td&gt;
&lt;td&gt;\$1.06 (16 GB)&lt;/td&gt;
&lt;td&gt;3.5x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time4VPS&lt;/td&gt;
&lt;td&gt;\$5.10 (0.5 GB)&lt;/td&gt;
&lt;td&gt;\$1.60 (64 GB)&lt;/td&gt;
&lt;td&gt;3.2x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OVHcloud&lt;/td&gt;
&lt;td&gt;\$2.02 (2 GB)&lt;/td&gt;
&lt;td&gt;\$0.74 (96 GB)&lt;/td&gt;
&lt;td&gt;2.7x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Contabo&lt;/td&gt;
&lt;td&gt;\$1.26 (4 GB)&lt;/td&gt;
&lt;td&gt;\$0.47 (96 GB)&lt;/td&gt;
&lt;td&gt;2.7x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GoDaddy&lt;/td&gt;
&lt;td&gt;\$4.50 (2 GB)&lt;/td&gt;
&lt;td&gt;\$1.72 (128 GB)&lt;/td&gt;
&lt;td&gt;2.6x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hostinger&lt;/td&gt;
&lt;td&gt;\$1.62 (4 GB)&lt;/td&gt;
&lt;td&gt;\$0.81 (32 GB)&lt;/td&gt;
&lt;td&gt;2.0x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DigitalOcean&lt;/td&gt;
&lt;td&gt;\$8.00 (0.5 GB)&lt;/td&gt;
&lt;td&gt;\$6.19 (384 GB)&lt;/td&gt;
&lt;td&gt;1.3x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;InterServer&lt;/td&gt;
&lt;td&gt;\$1.50 (2 GB)&lt;/td&gt;
&lt;td&gt;\$1.50 (16 GB)&lt;/td&gt;
&lt;td&gt;1.0x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vultr&lt;/td&gt;
&lt;td&gt;\$5.00 (0.5 GB)&lt;/td&gt;
&lt;td&gt;\$5.00 (256 GB)&lt;/td&gt;
&lt;td&gt;1.0x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SiteGround&lt;/td&gt;
&lt;td&gt;\$12.50 (8 GB)&lt;/td&gt;
&lt;td&gt;\$20.00 (20 GB)&lt;/td&gt;
&lt;td&gt;0.6x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kamatera&lt;/td&gt;
&lt;td&gt;\$4.00 (1 GB)&lt;/td&gt;
&lt;td&gt;\$7.88 (8 GB)&lt;/td&gt;
&lt;td&gt;0.5x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fly.io&lt;/td&gt;
&lt;td&gt;\$7.76 (256 MB)&lt;/td&gt;
&lt;td&gt;\$15.50 (32 GB)&lt;/td&gt;
&lt;td&gt;0.5x&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Vultr and InterServer sell memory at a perfectly linear rate. Their pricing pages are honest in a way that makes comparison shopping trivial, and it means there is zero reward for over-provisioning.&lt;/p&gt;

&lt;p&gt;The last three rows are the interesting ones. At Kamatera, Fly.io and SiteGround, scaling up costs you &lt;em&gt;more&lt;/em&gt; per gigabyte, not less. Fly.io's Performance tier at \$15.50 per GB against its own \$7.76 shared tier is a dedicated-vCPU premium, which is the honest explanation. It is still a price signal worth reading before you scale a Fly app upward on autopilot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why cheap RAM is cheap
&lt;/h2&gt;

&lt;p&gt;Contabo's \$0.47 and DigitalOcean's \$5.25 are not the same product wearing different price tags. Four things account for most of the gap.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CPU allocation.&lt;/strong&gt; Budget hosts oversubscribe cores heavily. Contabo's 96 GB plan comes with 24 shared vCPU on EPYC silicon and you will feel the neighbours under sustained load. Hetzner's CCX line and Vultr's Optimized range give you dedicated cores, which is why their per-GB numbers look terrible. They are not selling you memory. Memory is a side effect of selling you a core.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Network.&lt;/strong&gt; Contabo, Netcup and OVHcloud market unlimited or unmetered transfer at consumer speeds. DigitalOcean and Linode meter it precisely and charge overages. Our data shows Hostinger's KVM 4 including 16 TB of transfer while Vultr's 8 GB plans cap at 5 to 6 TB.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Support.&lt;/strong&gt; A \$5 Contabo ticket goes into a queue. LiquidWeb answers in minutes and staffs Linux engineers around the clock. That difference is roughly half the price of a managed plan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recovery time when something breaks.&lt;/strong&gt; This one never shows up in a spec table and matters more than the rest combined once you are hosting anything that earns money.&lt;/p&gt;

&lt;p&gt;None of that makes \$12.50 per GB defensible at SiteGround. It does make \$5.25 per GB defensible at DigitalOcean if you use the API, the managed databases and the load balancers that come with it. Choose the tier that matches how you actually operate, then compare inside it: &lt;a href="https://hostingsift.com/compare/contabo-vs-ovhcloud" rel="noopener noreferrer"&gt;Contabo against OVHcloud&lt;/a&gt; for the European budget end, &lt;a href="https://hostingsift.com/compare/digitalocean-vs-hostinger" rel="noopener noreferrer"&gt;DigitalOcean against Hostinger&lt;/a&gt; when you are weighing a developer cloud against a value VPS.&lt;/p&gt;

&lt;h2&gt;
  
  
  These prices barely move
&lt;/h2&gt;

&lt;p&gt;We have been recording VPS prices every night since 12 February 2026, which lets us answer a question nobody else can: how stable is any of this?&lt;/p&gt;

&lt;p&gt;Very. Of the 185 plans in this analysis that we have been reading since mid-February, 165 have shown the same price on every single nightly reading. That is 89% of the sample frozen for six and a half months.&lt;/p&gt;

&lt;p&gt;The stability is concentrated at the top of the market. DigitalOcean has not changed a single price on any of its 90 plans since we started watching. Linode has not moved on 39 plans, AWS on 25, Hostwinds on 40, Cloudways on 60. OVHcloud's entire 41-plan catalogue has held since we picked it up on 1 April 2026.&lt;/p&gt;

&lt;p&gt;The movers are mostly budget and mid-market hosts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hostinger, 3 March 2026.&lt;/strong&gt; KVM 4 went from \$9.99 to \$12.99 and has read \$12.99 on every night since, 133 readings through 30 August. The renewal price moved first, from \$24.99 to \$28.99 on 27 February, which is the pattern we keep seeing: the invoice rises before the storefront does.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Netcup, 4 June 2026.&lt;/strong&gt; VPS 8000 G12 went from about \$42 to \$55 in USD terms, roughly 24%, and has held on all 86 readings since.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IONOS, 20 June 2026.&lt;/strong&gt; The old VPS line was retired and replaced with the "+" range on yearly billing. Intro prices fell and renewals rose. VPS L+ has read \$6.00 renewing at \$21.00 on all 74 nights since.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hetzner repriced its cloud range in mid-2026 and it is no longer the cheap default it was for a decade. Our own chart for it splits at 13 August 2026 for a data reason we document on the provider page, so treat the older part of that series as catalogue history rather than a clean nightly series.&lt;/p&gt;

&lt;p&gt;The practical takeaway from all this stillness: a good price today will still be a good price when you get round to migrating. The risk is not that the market moves under you. The risk is your own renewal date.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would actually buy
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Running a side project or a staging box, under \$10 a month.&lt;/strong&gt; &lt;a href="https://hostingsift.com/hosting/contabo" rel="noopener noreferrer"&gt;Contabo&lt;/a&gt; Cloud VPS 4 at \$5.06 for 8 GB, or &lt;a href="https://hostingsift.com/hosting/ovhcloud" rel="noopener noreferrer"&gt;OVHcloud&lt;/a&gt; VPS-1 at \$6.35 if you want a European provider whose price will not double. Both renew at what they advertise. Skip Time4VPS's \$5.04 here despite it topping the table, because the renewal doubles and 8 GB is not enough headroom to make the migration worth deferring.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Production WordPress or a small SaaS, 8 to 16 GB.&lt;/strong&gt; &lt;a href="https://hostingsift.com/hosting/netcup" rel="noopener noreferrer"&gt;Netcup&lt;/a&gt; VPS 1000 G12 at \$11.93 flat, or &lt;a href="https://hostingsift.com/hosting/interserver" rel="noopener noreferrer"&gt;InterServer&lt;/a&gt; at \$12.00 flat if you want US datacentres and per-slice scaling. &lt;a href="https://hostingsift.com/hosting/hostinger" rel="noopener noreferrer"&gt;Hostinger&lt;/a&gt; KVM 4 gives you 16 GB for \$12.99, which is the best headroom per dollar in the set, but budget for \$28.99 when the two-year term ends. Worth comparing directly: &lt;a href="https://hostingsift.com/compare/netcup-vs-ovhcloud" rel="noopener noreferrer"&gt;Netcup against OVHcloud&lt;/a&gt; and &lt;a href="https://hostingsift.com/compare/contabo-vs-hostinger" rel="noopener noreferrer"&gt;Contabo against Hostinger&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You want an API, snapshots and managed databases.&lt;/strong&gt; &lt;a href="https://hostingsift.com/hosting/digitalocean" rel="noopener noreferrer"&gt;DigitalOcean&lt;/a&gt; or &lt;a href="https://hostingsift.com/hosting/vultr" rel="noopener noreferrer"&gt;Vultr&lt;/a&gt; at around \$5 per GB. You are paying roughly 8x Contabo's rate for the ecosystem, and for a team shipping weekly that maths usually works.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You do not want to touch a server.&lt;/strong&gt; &lt;a href="https://hostingsift.com/hosting/cloudways" rel="noopener noreferrer"&gt;Cloudways&lt;/a&gt; at \$99 for 8 GB. Expensive per gigabyte and correctly priced for what it removes from your week.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Avoid on the numbers.&lt;/strong&gt; SiteGround's cloud tier at \$12.50 per GB, and any IONOS VPS bought without a calendar reminder for month twelve.&lt;/p&gt;

&lt;p&gt;The full set of plans behind this analysis is browsable on our &lt;a href="https://hostingsift.com/category/vps-hosting" rel="noopener noreferrer"&gt;VPS hosting&lt;/a&gt; and &lt;a href="https://hostingsift.com/category/cloud-hosting" rel="noopener noreferrer"&gt;cloud hosting&lt;/a&gt; pages, with the nightly price history attached to each provider profile. If you are still deciding whether you need any of this, &lt;a href="https://hostingsift.com/blog/when-to-upgrade-from-shared-hosting" rel="noopener noreferrer"&gt;when to upgrade from shared hosting&lt;/a&gt; is the earlier question.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Prices recorded 31 August 2026 from our nightly readings. EUR converted to USD. Monthly-equivalent figures; several budget plans require a 24-month commitment to hit the advertised rate.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://hostingsift.com/blog/vps-price-per-gb-ram-2026" rel="noopener noreferrer"&gt;hostingsift.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>vps</category>
      <category>hosting</category>
      <category>cloud</category>
      <category>devops</category>
    </item>
    <item>
      <title>ARM VPS Hosting in 2026: More Cores for Less Money</title>
      <dc:creator>HostingSift</dc:creator>
      <pubDate>Fri, 28 Aug 2026 06:22:53 +0000</pubDate>
      <link>https://dev.to/hostingsift/arm-vps-hosting-in-2026-more-cores-for-less-money-3bc6</link>
      <guid>https://dev.to/hostingsift/arm-vps-hosting-in-2026-more-cores-for-less-money-3bc6</guid>
      <description>&lt;p&gt;ARM processors are no longer just the chip in your phone. By 2026 they power a serious chunk of cloud infrastructure, and the most interesting part is that they have reached VPS plans at prices that make classic x86 servers look overpriced. Pick the right provider and you get more cores, lower power draw, and a bill that is dramatically smaller than what the American clouds charge.&lt;/p&gt;

&lt;p&gt;This is a practical look. Real plans, real prices from our &lt;a href="https://hostingsift.com/category/vps-hosting" rel="noopener noreferrer"&gt;VPS hosting database&lt;/a&gt; (current as of June 2026), and an honest answer to when ARM is the better choice and when it still pays to stay on x86.&lt;/p&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;An ARM VPS is a virtual server running on an ARM chip (usually Ampere Altra) instead of a classic Intel or AMD one.&lt;/li&gt;
&lt;li&gt;The best value in Europe comes from &lt;a href="https://hostingsift.com/hosting/netcup" rel="noopener noreferrer"&gt;Netcup&lt;/a&gt; and &lt;a href="https://hostingsift.com/hosting/hetzner" rel="noopener noreferrer"&gt;Hetzner&lt;/a&gt;. Netcup literally gives you more cores for less money than its own x86 plans.&lt;/li&gt;
&lt;li&gt;Netcup VPS 1000 ARM: 6 vCPU, 8 GB RAM, 256 GB NVMe for 7.77 EUR per month. The equivalent x86 plan costs 10.37 EUR.&lt;/li&gt;
&lt;li&gt;Against the American clouds the gap is drastic. A 4 GB RAM plan on Hetzner ARM is around 3.79 EUR, while the same class at AWS Lightsail, Linode and Vultr runs between 20 and 24 USD.&lt;/li&gt;
&lt;li&gt;ARM is excellent for web servers, containers, databases, CI/CD and Go or Node apps. Be more careful with legacy software that only ships x86 binaries.&lt;/li&gt;
&lt;li&gt;ARM chips draw less power per unit of performance, so it is also the greener choice.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What ARM hosting actually is and why it is suddenly everywhere
&lt;/h2&gt;

&lt;p&gt;For years servers were almost entirely x86 from Intel and AMD. ARM was for mobile devices because it sips power. Then Amazon launched Graviton, Ampere shipped Altra chips with dozens of cores, and cloud providers discovered something pleasant: ARM servers deliver comparable performance at lower power draw and a lower cost per core.&lt;/p&gt;

&lt;p&gt;By 2026 that wave has reached the ordinary VPS market. Ampere Altra machines with up to 80 cores are being sliced into virtual plans you can rent for the price of a coffee. The software ecosystem has caught up too. Almost everything important now has an ARM64 build: the Linux distributions, Docker images, Node, Python, Go, PostgreSQL, MySQL, Nginx, Redis. That is exactly what was missing three years ago, and exactly why ARM is now a real option rather than an experiment.&lt;/p&gt;

&lt;h2&gt;
  
  
  ARM vs x86: the real price-per-resource comparison
&lt;/h2&gt;

&lt;p&gt;The best way to feel the difference is to put ARM and x86 plans from the same provider side by side. Here is how it looks at &lt;a href="https://hostingsift.com/hosting/netcup" rel="noopener noreferrer"&gt;Netcup&lt;/a&gt;, where the effect is clearest.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;Architecture&lt;/th&gt;
&lt;th&gt;vCPU&lt;/th&gt;
&lt;th&gt;RAM&lt;/th&gt;
&lt;th&gt;NVMe&lt;/th&gt;
&lt;th&gt;Price/mo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;VPS 1000 ARM G11&lt;/td&gt;
&lt;td&gt;ARM (Ampere)&lt;/td&gt;
&lt;td&gt;6 vCPU&lt;/td&gt;
&lt;td&gt;8 GB&lt;/td&gt;
&lt;td&gt;256 GB&lt;/td&gt;
&lt;td&gt;7.77 EUR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VPS 1000 G12&lt;/td&gt;
&lt;td&gt;x86&lt;/td&gt;
&lt;td&gt;4 vCPU&lt;/td&gt;
&lt;td&gt;8 GB&lt;/td&gt;
&lt;td&gt;256 GB&lt;/td&gt;
&lt;td&gt;10.37 EUR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VPS 2000 ARM G11&lt;/td&gt;
&lt;td&gt;ARM (Ampere)&lt;/td&gt;
&lt;td&gt;10 vCPU&lt;/td&gt;
&lt;td&gt;16 GB&lt;/td&gt;
&lt;td&gt;512 GB&lt;/td&gt;
&lt;td&gt;13.41 EUR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VPS 2000 G12&lt;/td&gt;
&lt;td&gt;x86&lt;/td&gt;
&lt;td&gt;8 vCPU&lt;/td&gt;
&lt;td&gt;16 GB&lt;/td&gt;
&lt;td&gt;512 GB&lt;/td&gt;
&lt;td&gt;19.25 EUR&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Read that table again. At every tier the ARM plan has more cores, the same memory, the same disk space, and costs 25 to 30 percent less. This is not a marketing trick, it is a direct consequence of cheaper hardware. ARM cores are smaller and cheaper to manufacture, so the provider can pack more of them into a plan and still sell it for less.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hetzner CAX: the pure Ampere line
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://hostingsift.com/hosting/hetzner" rel="noopener noreferrer"&gt;Hetzner&lt;/a&gt; brands its ARM plans as CAX. They run on Ampere Altra and start genuinely low.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;vCPU&lt;/th&gt;
&lt;th&gt;RAM&lt;/th&gt;
&lt;th&gt;NVMe&lt;/th&gt;
&lt;th&gt;Price/mo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CAX11&lt;/td&gt;
&lt;td&gt;2 vCPU&lt;/td&gt;
&lt;td&gt;4 GB&lt;/td&gt;
&lt;td&gt;40 GB&lt;/td&gt;
&lt;td&gt;3.79 EUR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CAX21&lt;/td&gt;
&lt;td&gt;4 vCPU&lt;/td&gt;
&lt;td&gt;8 GB&lt;/td&gt;
&lt;td&gt;80 GB&lt;/td&gt;
&lt;td&gt;6.49 EUR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CAX31&lt;/td&gt;
&lt;td&gt;8 vCPU&lt;/td&gt;
&lt;td&gt;16 GB&lt;/td&gt;
&lt;td&gt;160 GB&lt;/td&gt;
&lt;td&gt;12.49 EUR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CAX41&lt;/td&gt;
&lt;td&gt;16 vCPU&lt;/td&gt;
&lt;td&gt;32 GB&lt;/td&gt;
&lt;td&gt;320 GB&lt;/td&gt;
&lt;td&gt;24.49 EUR&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;At Hetzner the small shared x86 plan (CX23) is a few cents cheaper than CAX11, so ARM does not win at the very bottom here. The real strength shows up when you need dedicated cores. Compare CAX31 with 8 ARM cores at 12.49 EUR against the dedicated x86 plan CCX23, which gives 4 cores for 24.49 EUR. For workloads that use every core, ARM simply delivers more compute per euro.&lt;/p&gt;

&lt;h3&gt;
  
  
  Netcup ARM G11: the most cores for the money
&lt;/h3&gt;

&lt;p&gt;If you are chasing the maximum number of cores, Netcup ARM is hard to beat. VPS 8000 ARM gives 18 vCPU, 64 GB RAM and 2 TB NVMe for around 40 EUR per month. That is a resource density that would cost a four-figure bill at the American providers. It is also why Netcup is a favourite among people running databases, self-hosted apps and heavy container stacks.&lt;/p&gt;

&lt;h2&gt;
  
  
  How much cheaper it is than the American clouds
&lt;/h2&gt;

&lt;p&gt;Here the difference stops being percentages and becomes a multiple. We take a 4 GB RAM class and put the European ARM plans next to the familiar American names we track in our database.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;vCPU&lt;/th&gt;
&lt;th&gt;RAM&lt;/th&gt;
&lt;th&gt;Storage&lt;/th&gt;
&lt;th&gt;Price/mo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://hostingsift.com/hosting/hetzner" rel="noopener noreferrer"&gt;Hetzner&lt;/a&gt; (ARM)&lt;/td&gt;
&lt;td&gt;CAX11&lt;/td&gt;
&lt;td&gt;2 vCPU&lt;/td&gt;
&lt;td&gt;4 GB&lt;/td&gt;
&lt;td&gt;40 GB NVMe&lt;/td&gt;
&lt;td&gt;3.79 EUR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://hostingsift.com/hosting/vultr" rel="noopener noreferrer"&gt;Vultr&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Cloud Compute 4 GB&lt;/td&gt;
&lt;td&gt;2 vCPU&lt;/td&gt;
&lt;td&gt;4 GB&lt;/td&gt;
&lt;td&gt;80 GB SSD&lt;/td&gt;
&lt;td&gt;20.00 USD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://hostingsift.com/hosting/aws" rel="noopener noreferrer"&gt;Amazon Lightsail&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;4 GB / 2 vCPU&lt;/td&gt;
&lt;td&gt;2 vCPU&lt;/td&gt;
&lt;td&gt;4 GB&lt;/td&gt;
&lt;td&gt;80 GB SSD&lt;/td&gt;
&lt;td&gt;24.00 USD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://hostingsift.com/hosting/linode" rel="noopener noreferrer"&gt;Linode&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Shared 4GB&lt;/td&gt;
&lt;td&gt;2 vCPU&lt;/td&gt;
&lt;td&gt;4 GB&lt;/td&gt;
&lt;td&gt;80 GB SSD&lt;/td&gt;
&lt;td&gt;24.00 USD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://hostingsift.com/hosting/digitalocean" rel="noopener noreferrer"&gt;DigitalOcean&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Basic 4 GB&lt;/td&gt;
&lt;td&gt;2 vCPU&lt;/td&gt;
&lt;td&gt;4 GB&lt;/td&gt;
&lt;td&gt;80 GB NVMe&lt;/td&gt;
&lt;td&gt;24.00 USD&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Note: the ARM prices are in euros, the American ones in dollars. For reference, 24 USD is roughly 22 EUR at June 2026 rates, so the gap stays a multiple.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Same memory class, yet the bill on European ARM is five to six times smaller. It is fair to point out that part of the difference comes not only from the architecture but from the fact that Hetzner and Netcup are generally more aggressive on price than the hyperscalers. But the architecture helps. Among the American providers, AWS now offers its own ARM chips (Graviton), which are usually 10 to 20 percent cheaper than the x86 equivalent, confirming the same trend.&lt;/p&gt;

&lt;p&gt;Before you fall in love with the lowest price, run your real scenario through our &lt;a href="https://hostingsift.com/tools/true-cost-calculator" rel="noopener noreferrer"&gt;true cost calculator&lt;/a&gt;. The monthly price is one thing, but traffic, backups and add-on services change the picture.&lt;/p&gt;

&lt;h2&gt;
  
  
  What ARM is great for and what it is not
&lt;/h2&gt;

&lt;p&gt;ARM is not a universal replacement. It shines on some workloads and creates headaches on others. Here is the honest breakdown.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where ARM works brilliantly
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Web servers and APIs.&lt;/strong&gt; Nginx, Caddy, Node, Go, PHP, Python. All of these have mature ARM64 builds and run with no noticeable difference.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Containers.&lt;/strong&gt; Docker and Kubernetes have supported ARM64 for a long time. Most popular images are multi-arch, so they pull the right version automatically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Databases.&lt;/strong&gt; PostgreSQL, MySQL, MariaDB and Redis run great on ARM, and the high core counts at Netcup help with parallel queries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI/CD and build machines.&lt;/strong&gt; More cores per euro means faster builds, especially for Go and Rust projects that use every core.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-hosted apps.&lt;/strong&gt; Nextcloud, Gitea, n8n, Vaultwarden and the like have official ARM images.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Where x86 is still worth it
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Legacy software with x86-only binaries.&lt;/strong&gt; Some closed corporate apps, old plugins or specific drivers have no ARM build. Check before you migrate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Software with heavy x86 assembly optimizations.&lt;/strong&gt; Rare cases, but they exist. Test performance, do not assume anything.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When your team has no time to test.&lt;/strong&gt; If your stack has been x86 for years and everything works, the migration is a time cost you have to justify with real savings.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Energy efficiency and the green angle
&lt;/h2&gt;

&lt;p&gt;ARM chips are designed to deliver maximum performance per watt. That started as a phone-battery advantage, but in the data center it turns into less power burned for the same work. Less power means a lower carbon footprint per request and lower operating costs, part of which comes back to you as a cheaper plan.&lt;/p&gt;

&lt;p&gt;If sustainability is a factor in your choice, ARM hosting fits naturally. It is not a marketing sticker, it is a consequence of the architecture. Combine an ARM server with a provider that uses renewable energy and you get a serious cut in footprint without compromising performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to migrate to ARM without pain
&lt;/h2&gt;

&lt;p&gt;The transition is easier than most people expect, as long as you approach it methodically.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Inventory your stack.&lt;/strong&gt; List every piece of software you run. For each one, check whether an ARM64 build exists. For mainstream things the answer is almost always yes.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Use multi-arch Docker images.&lt;/strong&gt; If you are already on containers, most official images are multi-arch and the move is nearly seamless. You just run the stack on an ARM host.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Test on a cheap plan first.&lt;/strong&gt; Grab a CAX11 for 3.79 EUR, deploy the app and run a load test. The cost of the experiment is symbolic.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Compare real performance.&lt;/strong&gt; Do not look only at benchmarks. Measure response time and throughput of your own application under real load.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Migrate gradually.&lt;/strong&gt; Move the non-critical services first. Once you are convinced, move production too.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you are also considering self-hosting AI models on a budget server, read our guide to &lt;a href="https://hostingsift.com/blog/self-hosted-llm-5-dollar-vps-2026" rel="noopener noreferrer"&gt;running local LLMs on a VPS under 5 dollars&lt;/a&gt;. Many of the same ARM considerations apply there.&lt;/p&gt;

&lt;h2&gt;
  
  
  Our recommendation
&lt;/h2&gt;

&lt;p&gt;For most people who want the best value from an ARM VPS in 2026, the choice comes down to two providers.&lt;/p&gt;

&lt;p&gt;Pick &lt;a href="https://hostingsift.com/hosting/netcup" rel="noopener noreferrer"&gt;Netcup&lt;/a&gt; if you are chasing the maximum number of cores and disk space for your money. Their ARM plans literally beat their own x86 plans on value, and the higher tiers offer a resource density that is hard to match in Europe.&lt;/p&gt;

&lt;p&gt;Pick &lt;a href="https://hostingsift.com/hosting/hetzner" rel="noopener noreferrer"&gt;Hetzner&lt;/a&gt; if you value a clean interface, hourly billing and a mature cloud ecosystem with snapshots, networks and load balancers. The CAX line is ideal for container and dedicated-core workloads.&lt;/p&gt;

&lt;p&gt;And if you are tied to an American cloud because of a specific region or integration, check whether your provider offers ARM instances and compare them with the x86 equivalent. You will almost always save something. For the full picture, browse our &lt;a href="https://hostingsift.com/category/cloud-hosting" rel="noopener noreferrer"&gt;cloud hosting&lt;/a&gt; and &lt;a href="https://hostingsift.com/category/vps-hosting" rel="noopener noreferrer"&gt;VPS&lt;/a&gt; categories.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is an ARM VPS slower than x86?
&lt;/h3&gt;

&lt;p&gt;Not in any way you will notice on a typical web or application workload. A single ARM core on Ampere Altra is comparable to an x86 core for most tasks, and because you get more cores for the same money, total performance is often higher. Exceptions exist for very specific single-thread or x86-optimized workloads.&lt;/p&gt;

&lt;h3&gt;
  
  
  Will WordPress run on ARM hosting?
&lt;/h3&gt;

&lt;p&gt;Yes, completely. PHP, MySQL or MariaDB, Nginx and Redis all have ARM builds. WordPress does not even know what architecture it runs on. This holds for most popular plugins too, because they are PHP rather than compiled binaries.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I run Docker on an ARM VPS?
&lt;/h3&gt;

&lt;p&gt;Yes. Docker has supported ARM64 for years. Most official images are multi-arch and automatically pull the right version. If you build your own images, just make sure the base image has an ARM64 variant.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why is European ARM so much cheaper than the American clouds?
&lt;/h3&gt;

&lt;p&gt;Two reasons combine. First, providers like Hetzner and Netcup are generally more aggressive on price than the hyperscalers. Second, ARM hardware is cheaper per unit of performance, so they put more cores in a plan and still sell it for less.&lt;/p&gt;

&lt;h3&gt;
  
  
  Who is an ARM VPS not right for?
&lt;/h3&gt;

&lt;p&gt;Teams that depend on closed software with x86-only binaries, or who have no resources to test the migration. If your stack is fully open and containerized, the benefits almost always win.&lt;/p&gt;

&lt;p&gt;The takeaway for 2026 is simple. ARM is no longer an experiment but a mature, cheaper way to run almost any modern web application. Start with a plan for a few euros, run a real test, and see whether your bill has any reason to stay this high.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://hostingsift.com/blog/arm-vps-hosting-2026" rel="noopener noreferrer"&gt;hostingsift.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>arm</category>
      <category>vps</category>
      <category>hosting</category>
      <category>performance</category>
    </item>
    <item>
      <title>MCP Server Hosting: Where to Actually Deploy in 2026</title>
      <dc:creator>HostingSift</dc:creator>
      <pubDate>Fri, 21 Aug 2026 15:42:03 +0000</pubDate>
      <link>https://dev.to/hostingsift/mcp-server-hosting-where-to-actually-deploy-in-2026-279e</link>
      <guid>https://dev.to/hostingsift/mcp-server-hosting-where-to-actually-deploy-in-2026-279e</guid>
      <description>&lt;p&gt;Model Context Protocol went from "Anthropic curiosity" to "thing every AI tooling vendor implements" in roughly twelve months. If you build agentic apps in 2026, you almost certainly need to host an MCP server somewhere. The official docs cover the protocol. They do not cover the boring infrastructure question: where does this thing actually run, and what does it cost?&lt;/p&gt;

&lt;p&gt;This guide answers that. We will look at the three deployment modes (stdio, HTTP, SSE), the security gotchas that bite teams in production, and the actual hosting price points for running MCP servers at scale. Real plans, real numbers from providers in our database.&lt;/p&gt;

&lt;h2&gt;
  
  
  What an MCP server is, in one paragraph
&lt;/h2&gt;

&lt;p&gt;Model Context Protocol is an open standard from Anthropic that lets LLM applications connect to external tools and data sources through a unified interface. An MCP server exposes resources (files, database rows, API endpoints) and tools (functions the model can call) to any compatible client. Claude Desktop, Cursor, VS Code Copilot, and dozens of agent frameworks all speak MCP now. Build one server, plug into all of them.&lt;/p&gt;

&lt;p&gt;The protocol itself is JSON-RPC 2.0 over a transport layer. That transport is where hosting decisions start mattering.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three transport modes, three hosting profiles
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Stdio (local only)
&lt;/h3&gt;

&lt;p&gt;The server runs as a subprocess of the client. The client spawns your binary, talks to it over stdin/stdout, kills it on exit. Zero network surface. Zero hosting needed.&lt;/p&gt;

&lt;p&gt;This is how every Claude Desktop config you have ever seen works. &lt;code&gt;command: "node"&lt;/code&gt;, &lt;code&gt;args: ["./my-server.js"]&lt;/code&gt;, done. Great for personal tools, code that runs against your local filesystem, anything you do not want exposed to the internet.&lt;/p&gt;

&lt;p&gt;Hosting cost: zero. You are the host.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. HTTP with Server-Sent Events (SSE)
&lt;/h3&gt;

&lt;p&gt;The original networked transport. Server runs as a long-lived HTTP service. Clients connect, hold an SSE stream open, send requests over POST. This is the mode most public MCP servers use today.&lt;/p&gt;

&lt;p&gt;Hosting requirements: a process that stays running, a public URL with TLS, and a host that does not kill long-lived connections. That last one matters more than people realize. Serverless platforms with hard timeouts (Vercel Functions, Cloudflare Workers default tier) will close the SSE stream after 10-60 seconds. Game over.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Streamable HTTP (the 2025 spec update)
&lt;/h3&gt;

&lt;p&gt;Anthropic merged SSE and POST into one bidirectional endpoint. Stateless mode is possible. Each request is a self-contained exchange. This unlocks serverless and edge deployments because you no longer need a persistent connection.&lt;/p&gt;

&lt;p&gt;Stateless streamable HTTP is the mode you want if your server does not need session memory. Stateful mode still requires a sticky backend.&lt;/p&gt;

&lt;h2&gt;
  
  
  Picking the right host
&lt;/h2&gt;

&lt;p&gt;The decision tree:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Stateless streamable HTTP, low traffic:&lt;/strong&gt; serverless or PaaS. Cheapest.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stateful SSE, persistent connections:&lt;/strong&gt; VPS or container platform.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High traffic, autoscaling:&lt;/strong&gt; managed container service or Kubernetes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Internal-only, behind VPN:&lt;/strong&gt; any VPS with a private network.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most teams overestimate which bucket they fall into. If your MCP server fronts a small API and gets a few hundred requests per day, you do not need Kubernetes. A 4 EUR VPS is fine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Self-hosted on a VPS: the realistic baseline
&lt;/h2&gt;

&lt;p&gt;This is what most production MCP servers actually run on. A small VPS, Node or Python process behind a reverse proxy, systemd keeping it alive. Total cost: under 10 EUR per month.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;vCPU / RAM&lt;/th&gt;
&lt;th&gt;Storage&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://hostingsift.com/hosting/hetzner" rel="noopener noreferrer"&gt;Hetzner&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;CX23&lt;/td&gt;
&lt;td&gt;2 / 4 GB&lt;/td&gt;
&lt;td&gt;40 GB NVMe&lt;/td&gt;
&lt;td&gt;3.49 EUR/mo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://hostingsift.com/hosting/hetzner" rel="noopener noreferrer"&gt;Hetzner&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;CAX11 (ARM)&lt;/td&gt;
&lt;td&gt;2 / 4 GB&lt;/td&gt;
&lt;td&gt;40 GB NVMe&lt;/td&gt;
&lt;td&gt;3.79 EUR/mo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://hostingsift.com/hosting/netcup" rel="noopener noreferrer"&gt;Netcup&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;VPS 500 G12&lt;/td&gt;
&lt;td&gt;2 / 4 GB&lt;/td&gt;
&lt;td&gt;128 GB NVMe&lt;/td&gt;
&lt;td&gt;4.87 EUR/mo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://hostingsift.com/hosting/contabo" rel="noopener noreferrer"&gt;Contabo&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Cloud VPS 10&lt;/td&gt;
&lt;td&gt;4 / 8 GB&lt;/td&gt;
&lt;td&gt;75 GB NVMe&lt;/td&gt;
&lt;td&gt;3.60 EUR/mo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://hostingsift.com/hosting/digitalocean" rel="noopener noreferrer"&gt;DigitalOcean&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Basic Regular 1 GB&lt;/td&gt;
&lt;td&gt;1 / 1 GB&lt;/td&gt;
&lt;td&gt;25 GB SSD&lt;/td&gt;
&lt;td&gt;$6/mo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://hostingsift.com/hosting/vultr" rel="noopener noreferrer"&gt;Vultr&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Regular Cloud Compute&lt;/td&gt;
&lt;td&gt;1 / 1 GB&lt;/td&gt;
&lt;td&gt;25 GB SSD&lt;/td&gt;
&lt;td&gt;$6/mo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://hostingsift.com/hosting/linode" rel="noopener noreferrer"&gt;Linode&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Shared Nanode&lt;/td&gt;
&lt;td&gt;1 / 1 GB&lt;/td&gt;
&lt;td&gt;25 GB SSD&lt;/td&gt;
&lt;td&gt;$5/mo&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The Hetzner CX23 at 3.49 EUR has shocked a lot of engineers in 2026. Two vCPUs and 4 GB RAM for the price of a coffee. It handles MCP servers with hundreds of concurrent SSE connections without breaking a sweat.&lt;/p&gt;

&lt;p&gt;For pure value, Contabo Cloud VPS 10 at 3.60 EUR gives you 4 vCPU and 8 GB RAM, but the I/O is slower and latency varies. Fine for a hobby MCP server. Not what you want for production.&lt;/p&gt;

&lt;p&gt;If you are running multiple MCP servers and need elbow room, the Hetzner CCX13 dedicated AMD instance at 12.49 EUR with 2 dedicated vCPUs and 8 GB RAM is the sweet spot most teams converge on.&lt;/p&gt;

&lt;h3&gt;
  
  
  The setup, briefly
&lt;/h3&gt;

&lt;p&gt;Provision the VPS. Install Node or Python. Clone your MCP server repo. Wrap the process in systemd (or PM2 if you prefer). Put Caddy or nginx in front for TLS. Open port 443. Done.&lt;/p&gt;

&lt;p&gt;Anthropic publishes a TypeScript SDK and a Python SDK. Both have starter templates. Most teams have their first MCP server live in under an hour.&lt;/p&gt;

&lt;h2&gt;
  
  
  PaaS deployment: less work, slightly more money
&lt;/h2&gt;

&lt;p&gt;If you do not want to think about systemd or TLS certs, Railway and Render handle the plumbing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hostingsift.com/hosting/railway" rel="noopener noreferrer"&gt;Railway&lt;/a&gt; charges per resource used. A small MCP server with 512 MB RAM and minimal CPU lands around $5 to $8 per month including bandwidth. You push from GitHub, Railway builds and deploys. SSE works out of the box because Railway runs your container long-lived.&lt;/p&gt;

&lt;p&gt;Render's Web Service plans start at $7 per month for 512 MB RAM, $25 for 2 GB. Render also handles SSE and WebSockets correctly. Their free tier spins down after inactivity, which kills MCP servers, so do not use it for anything serious.&lt;/p&gt;

&lt;p&gt;The tradeoff is honest: PaaS costs roughly 2x what a Hetzner VPS costs for equivalent resources, and you trade that money for zero ops work. Worth it for small teams without an ops person.&lt;/p&gt;

&lt;p&gt;For deeper PaaS analysis, see our &lt;a href="https://hostingsift.com/blog/paas-hosting-railway-render-new-hosting" rel="noopener noreferrer"&gt;PaaS hosting comparison&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Serverless: cheap and fast, with caveats
&lt;/h2&gt;

&lt;p&gt;Streamable HTTP in stateless mode opens the door to truly serverless MCP servers. Cloudflare Workers, AWS Lambda, Vercel Functions can all host an MCP endpoint as long as each request is self-contained.&lt;/p&gt;

&lt;p&gt;Cloudflare Workers is probably the best fit. Global edge, zero cold starts under typical load, $5 per month for 10 million requests on the paid tier. Their &lt;code&gt;nodejs_compat&lt;/code&gt; flag handles the Anthropic SDK reasonably well.&lt;/p&gt;

&lt;p&gt;Watch out for these limits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Request timeout: Workers is 30 seconds CPU time, Lambda is 15 minutes max, Vercel Hobby is 10 seconds (yes, 10).&lt;/li&gt;
&lt;li&gt;Response size: Workers caps at 100 MB streamed, Lambda at 6 MB synchronous.&lt;/li&gt;
&lt;li&gt;Cold starts: relevant if your MCP server hits cold instances often. Workers wins here.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your MCP server wraps a slow external API and individual tool calls might take 45 seconds, serverless is wrong. Use a VPS.&lt;/p&gt;

&lt;p&gt;If your MCP server is a thin wrapper around a fast database query, serverless is perfect and you might never spend more than a few dollars per month.&lt;/p&gt;

&lt;h2&gt;
  
  
  The security part nobody likes talking about
&lt;/h2&gt;

&lt;p&gt;An MCP server is a remote code execution surface for whoever talks to it. The LLM client calls tools on your server. Those tools execute code. If you expose that endpoint to the public internet without auth, you are running an open execution endpoint.&lt;/p&gt;

&lt;p&gt;Here is what teams keep getting wrong:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. No authentication on the MCP endpoint
&lt;/h3&gt;

&lt;p&gt;The MCP spec supports OAuth 2.1 for HTTP transports. Use it. Anthropic added OAuth flows to the spec in 2025 specifically because too many public MCP servers shipped without auth.&lt;/p&gt;

&lt;p&gt;If OAuth is too much for your use case, at minimum require a bearer token in the Authorization header and validate it on every request. Hardcoded API keys in env vars work fine for B2B MCP servers used by a single client team.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Tools that take filesystem paths
&lt;/h3&gt;

&lt;p&gt;An MCP tool called &lt;code&gt;read_file(path)&lt;/code&gt; that does no path validation is a path traversal exploit waiting to happen. The LLM will eventually try &lt;code&gt;../../../etc/passwd&lt;/code&gt; because the user asked it to debug something. Validate. Sandbox. Use chroot or container isolation for anything filesystem-related.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Database tools with no row-level filtering
&lt;/h3&gt;

&lt;p&gt;If your MCP server exposes a &lt;code&gt;query_users()&lt;/code&gt; tool, the LLM client speaks for whoever invoked it. Pass user identity through the protocol context and apply row-level security at the database. Otherwise tenant A can ask their AI for tenant B's data through your MCP server, and your AI will happily oblige.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Rate limiting
&lt;/h3&gt;

&lt;p&gt;LLMs in agent loops can hammer an endpoint. A buggy agent we saw last quarter called the same MCP tool 4,000 times in two minutes before timing out. Without rate limiting that becomes your AWS bill. Caddy and Cloudflare both do this cheaply.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-world architecture: MCP server in front of a SaaS API
&lt;/h2&gt;

&lt;p&gt;The most common production pattern in 2026 looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Your existing SaaS has a REST API.&lt;/li&gt;
&lt;li&gt;You write an MCP server that wraps the REST API in tool definitions.&lt;/li&gt;
&lt;li&gt;The MCP server runs on a small VPS or Railway service.&lt;/li&gt;
&lt;li&gt;OAuth flow issues per-customer tokens.&lt;/li&gt;
&lt;li&gt;Claude/Cursor/your-agent-of-choice connects to the MCP server using those tokens.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This unlocks AI integration without forcing your customers to integrate with twenty different agent frameworks. You build one MCP server. Everything else just works.&lt;/p&gt;

&lt;p&gt;For a B2B SaaS doing 50,000 tool calls per day, this entire setup runs comfortably on a 6.49 EUR Hetzner CPX22 with Caddy fronting the Node process. Total monthly bill: under 10 EUR including bandwidth.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where MCP server hosting is going
&lt;/h2&gt;

&lt;p&gt;Two trends to watch in 2026:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP marketplaces.&lt;/strong&gt; Anthropic, Glama, and Smithery are building registries where third parties publish hosted MCP servers. You will not always host your own. You will sometimes use a hosted MCP server the way you use a third-party API today. Pricing models there are still shaking out, mostly per-call or per-seat.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP-native hosting platforms.&lt;/strong&gt; A handful of providers are building dedicated MCP hosting products: deploy your server with one command, get OAuth and rate limiting included, pay per request. Expect this category to consolidate quickly. By 2027 we will probably have two or three dominant players the same way Vercel won Next.js hosting.&lt;/p&gt;

&lt;p&gt;For now, a VPS plus a half-day of setup gets you a production MCP server cheaper than any managed alternative.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 30-second recommendation
&lt;/h2&gt;

&lt;p&gt;Building your first MCP server for testing? Stdio mode, local machine. No hosting.&lt;/p&gt;

&lt;p&gt;Shipping an MCP server to a customer or to the public? Hetzner CX23 at 3.49 EUR plus Caddy plus systemd. You will spend an hour setting up. The thing will run for years.&lt;/p&gt;

&lt;p&gt;Already on a PaaS for your main app? Add the MCP server to the same project on Railway or Render. Your bill goes up by maybe $5 per month.&lt;/p&gt;

&lt;p&gt;Want zero ops and very low traffic? Stateless streamable HTTP on Cloudflare Workers. Free tier handles a surprising amount.&lt;/p&gt;

&lt;p&gt;The hosting decision matters less than the security one. Auth your endpoint, validate your tool inputs, rate-limit your server. Then ship.&lt;/p&gt;




&lt;p&gt;Originally published at &lt;a href="https://hostingsift.com/blog/mcp-server-hosting-guide-2026" rel="noopener noreferrer"&gt;hostingsift.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>hosting</category>
      <category>security</category>
      <category>devops</category>
    </item>
    <item>
      <title>Self-Hosted LLM on a $5 VPS in 2026: What Actually Works</title>
      <dc:creator>HostingSift</dc:creator>
      <pubDate>Wed, 12 Aug 2026 05:05:12 +0000</pubDate>
      <link>https://dev.to/hostingsift/self-hosted-llm-on-a-5-vps-in-2026-what-actually-works-5d83</link>
      <guid>https://dev.to/hostingsift/self-hosted-llm-on-a-5-vps-in-2026-what-actually-works-5d83</guid>
      <description>&lt;p&gt;"Run your own ChatGPT for five bucks a month" sounds like cheap clickbait. And mostly it is. But the gap between clickbait and reality has narrowed a lot in 2026. Quantized 3B and 7B models have become genuinely useful. VPS providers now pack 8 GB of RAM into plans under $6. If you pick carefully, you can run a respectable local model on a budget server.&lt;/p&gt;

&lt;p&gt;This article is about what actually works, what falls over, and which provider from our &lt;a href="/hosting"&gt;hosting comparison&lt;/a&gt; gives you the most compute per dollar for AI workloads.&lt;/p&gt;

&lt;h2&gt;The short version&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You will not run GPT-4-class models on a $5 VPS. Stop expecting to.&lt;/li&gt;
&lt;li&gt;You &lt;em&gt;can&lt;/em&gt; run Llama 3.2-3B, Qwen 2.5-7B, or Mistral-7B in 4-bit quantization if you have at least 8 GB of RAM.&lt;/li&gt;
&lt;li&gt;CPU inference is slow (5 to 15 tokens per second) but usable for personal automation, chatbots with low traffic, or embedding generation.&lt;/li&gt;
&lt;li&gt;The providers that matter for this use case: &lt;a href="/hosting/contabo"&gt;Contabo&lt;/a&gt; and &lt;a href="/hosting/netcup"&gt;Netcup&lt;/a&gt;, both German-speaking and both useful for EU data residency. &lt;a href="/hosting/hetzner"&gt;Hetzner&lt;/a&gt; has pulled its entire budget line from sale, so its entry point here is now €35.49 rather than €8.49.&lt;/li&gt;
&lt;li&gt;Avoid US hyperscaler $5 plans (DO, Vultr, Linode) for LLM work. Same price, one quarter of the RAM.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Why self-host an LLM at all?&lt;/h2&gt;

&lt;p&gt;Three reasons keep coming up in our research:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Privacy.&lt;/strong&gt; 44% of organizations cite data privacy as the top barrier to adopting hosted LLM APIs. Self-hosting means your prompts, documents, and customer data never leave your box. For law firms, clinics, and anyone building internal knowledge bases, this is non-negotiable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cost at volume.&lt;/strong&gt; Hosted API costs add up fast once you run batch jobs, background summarization, or embedding pipelines. The rough break-even with a $5 VPS sits around two million tokens per day for small models. Below that, APIs are cheaper. Above that, self-hosting starts to win.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Learning and control.&lt;/strong&gt; You get to pick the model, tune the system prompt at the weight level (via LoRA adapters), and run without rate limits. Worth it for developers.&lt;/p&gt;

&lt;h2&gt;What "self-hosted LLM" actually needs&lt;/h2&gt;

&lt;p&gt;Before we compare VPS plans, a quick hardware reality check. On CPU-only servers (which every budget VPS is), the bottleneck is RAM bandwidth, not CPU speed. Model weights must fit in RAM, and every token generation pass reads the entire weight file. So the two numbers that matter are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;RAM size.&lt;/strong&gt; Determines which model you can load at all.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RAM bandwidth.&lt;/strong&gt; Determines how many tokens per second you get.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here is roughly what each tier can do in 4-bit quantization (GGUF format, llama.cpp inference):&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Update (12 August 2026) — corrections.&lt;/strong&gt; A data audit found two errors in the earlier version of this article, and we would rather say so plainly than quietly swap the numbers.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Hetzner's entire budget line is no longer sold.&lt;/strong&gt; The CX23/33/43/53 and CAX11/21/31/41 plans are marked "not available" on Hetzner's own site, in every location. Their listed prices are still accurate, which is exactly why our checks missed it — we were tracking price, not stock. The cheapest Hetzner plan you can actually buy with 8 GB of RAM is now the CPX32 at €35.49, roughly four times the €8.49 CX33 this article originally recommended. That single fact changes the shape of this comparison, so the Hetzner section below has been rewritten rather than repriced.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Our Contabo prices were wrong, and the catalogue was stale.&lt;/strong&gt; The Contabo plans quoted earlier — Cloud VPS 10 at €3.60 and Cloud VPS 20 at €5.60 — no longer exist. Contabo replaced that line with Cloud VPS 4 through 18 (the number is the vCPU count) and our scraper had been serving cached figures rather than reading the live site, understating some prices by up to 38%. Everything below is now read from Contabo's live pricing page.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Netcup's VPS 1000 ARM G11 did move honestly, from €6.26 to €7.77. The full change history for all three is on our &lt;a href="/trends/hetzner"&gt;Hetzner&lt;/a&gt;, &lt;a href="/trends/netcup"&gt;Netcup&lt;/a&gt; and &lt;a href="/trends/contabo"&gt;Contabo&lt;/a&gt; price history pages.&lt;/em&gt;&lt;/p&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;RAM&lt;/th&gt;
&lt;th&gt;Largest usable model&lt;/th&gt;
&lt;th&gt;Realistic tokens/sec (CPU)&lt;/th&gt;
&lt;th&gt;Good for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2 GB&lt;/td&gt;
&lt;td&gt;Qwen 2.5-0.5B, Llama 3.2-1B&lt;/td&gt;
&lt;td&gt;20-40 tok/s&lt;/td&gt;
&lt;td&gt;Embeddings, simple classification&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4 GB&lt;/td&gt;
&lt;td&gt;Llama 3.2-3B, Phi-3.5 Mini&lt;/td&gt;
&lt;td&gt;8-15 tok/s&lt;/td&gt;
&lt;td&gt;Personal chatbots, summarization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8 GB&lt;/td&gt;
&lt;td&gt;Qwen 2.5-7B, Mistral-7B, Llama 3.1-8B&lt;/td&gt;
&lt;td&gt;4-8 tok/s&lt;/td&gt;
&lt;td&gt;Production-adjacent use, RAG&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16 GB&lt;/td&gt;
&lt;td&gt;Mixtral 8x7B (barely), Qwen 2.5-14B&lt;/td&gt;
&lt;td&gt;2-4 tok/s&lt;/td&gt;
&lt;td&gt;More complex reasoning&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Below 8 GB you are limited to small models. Above 8 GB you unlock the "actually useful" tier. This matters enormously when picking a VPS.&lt;/p&gt;

&lt;h2&gt;The $3 to $6 VPS plans that can run real LLMs&lt;/h2&gt;

&lt;p&gt;Pulled directly from our database, filtered to plans where the RAM is at least 8 GB (the practical floor for running a 7B model in 4-bit quantization) &lt;em&gt;and&lt;/em&gt; that the provider will actually sell you today. The first price is the 24-month rate; the figure in brackets is what you pay month-to-month with no commitment.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;Price / mo&lt;/th&gt;
&lt;th&gt;RAM&lt;/th&gt;
&lt;th&gt;vCPU&lt;/th&gt;
&lt;th&gt;Storage&lt;/th&gt;
&lt;th&gt;Bandwidth&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/hosting/contabo"&gt;Contabo&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Cloud VPS 4&lt;/td&gt;
&lt;td&gt;€4.40 (€5.50)&lt;/td&gt;
&lt;td&gt;8 GB&lt;/td&gt;
&lt;td&gt;4 vCPU&lt;/td&gt;
&lt;td&gt;100 GB SSD&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/hosting/contabo"&gt;Contabo&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Cloud VPS 6&lt;/td&gt;
&lt;td&gt;€6.00 (€7.50)&lt;/td&gt;
&lt;td&gt;12 GB&lt;/td&gt;
&lt;td&gt;6 vCPU&lt;/td&gt;
&lt;td&gt;200 GB SSD&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/hosting/netcup"&gt;Netcup&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;VPS 1000 ARM G11&lt;/td&gt;
&lt;td&gt;€7.77&lt;/td&gt;
&lt;td&gt;8 GB&lt;/td&gt;
&lt;td&gt;6 vCPU (ARM)&lt;/td&gt;
&lt;td&gt;256 GB NVMe&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/hosting/contabo"&gt;Contabo&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Cloud VPS Plus 4&lt;/td&gt;
&lt;td&gt;€10.80 (€13.50)&lt;/td&gt;
&lt;td&gt;8 GB&lt;/td&gt;
&lt;td&gt;4 vCPU (AMD EPYC)&lt;/td&gt;
&lt;td&gt;150 GB NVMe&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/hosting/hetzner"&gt;Hetzner&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;CPX32&lt;/td&gt;
&lt;td&gt;€35.49&lt;/td&gt;
&lt;td&gt;8 GB&lt;/td&gt;
&lt;td&gt;4 vCPU&lt;/td&gt;
&lt;td&gt;160 GB NVMe&lt;/td&gt;
&lt;td&gt;20 TB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Compare that to the "famous" $5 cloud plans:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;Price / mo&lt;/th&gt;
&lt;th&gt;RAM&lt;/th&gt;
&lt;th&gt;vCPU&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/hosting/digitalocean"&gt;DigitalOcean&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Basic Regular&lt;/td&gt;
&lt;td&gt;$4.00&lt;/td&gt;
&lt;td&gt;512 MiB&lt;/td&gt;
&lt;td&gt;1 vCPU&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/hosting/vultr"&gt;Vultr&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;CC Regular&lt;/td&gt;
&lt;td&gt;$2.50&lt;/td&gt;
&lt;td&gt;512 MB&lt;/td&gt;
&lt;td&gt;1 vCPU&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/hosting/linode"&gt;Linode&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Shared Nanode&lt;/td&gt;
&lt;td&gt;$5.00&lt;/td&gt;
&lt;td&gt;1 GB&lt;/td&gt;
&lt;td&gt;1 vCPU&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That 8x RAM difference at the same price point is the whole reason European providers win this category. DO, Vultr and Linode are excellent for web apps and small services. They are not designed for the RAM-heavy workload an LLM needs.&lt;/p&gt;

&lt;h2&gt;Provider deep dive&lt;/h2&gt;

&lt;h3&gt;Contabo: the price-per-GB winner&lt;/h3&gt;

&lt;p&gt;Contabo Cloud VPS 4 gives you 8 GB RAM, 4 vCPU and 100 GB SSD for €4.40 a month on a two-year term, or €5.50 with no commitment. Nothing else in this comparison matches that. The catch is real: Contabo is known for inconsistent CPU steal on noisy neighbours, and network latency can be variable. For LLM inference, which is RAM-bound rather than network-bound, that tradeoff is usually acceptable.&lt;/p&gt;

&lt;p&gt;Go up one tier to Cloud VPS 6 at €6.00 (€7.50 monthly) for 12 GB RAM and 6 vCPU. This is the sweet spot for running Qwen 2.5-14B in 4-bit while still having headroom for a web server and a small vector database on the same machine.&lt;/p&gt;

&lt;p&gt;One note on storage, since it changed with the new line: the standard Cloud VPS tiers ship SSD, not NVMe. If disk speed matters to you — loading an 8 GB model off disk on every restart, for instance — Cloud VPS Plus 4 at €10.80 keeps the same 8 GB of RAM but moves you to 150 GB of NVMe on AMD EPYC cores.&lt;/p&gt;

&lt;h3&gt;Hetzner: no longer competing at this price&lt;/h3&gt;

&lt;p&gt;Hetzner used to be the obvious quality pick here, and this article said so. That is no longer true, for a reason that has nothing to do with price: the whole cost-optimised line — CX23 through CX53 and CAX11 through CAX41 — is marked "not available" on Hetzner's site, in every location. The prices are still published, which is what fooled our tracker for a month, but you cannot buy the machines.&lt;/p&gt;

&lt;p&gt;What remains purchasable with 8 GB of RAM starts at the CPX32, €35.49 a month. It is a genuinely good server — AMD EPYC cores, 160 GB NVMe, 20 TB of bandwidth, datacentres in Germany, Finland and Virginia, and a control panel that is minimal in the good way. It is simply in a different price bracket, four times the CX33 it replaces, and it is hard to justify for a hobby inference box when Contabo sells 8 GB for €4.40.&lt;/p&gt;

&lt;p&gt;The loss worth mourning is the ARM line. The CAX21's Ampere Altra cores benchmarked roughly 15 to 25 percent faster than the x86 CX33 on llama.cpp thanks to higher sustained memory bandwidth, which made it the best tokens-per-euro option in this whole comparison. If Hetzner brings that line back, it goes straight back into this table — our &lt;a href="/trends/hetzner"&gt;Hetzner price history page&lt;/a&gt; tracks it nightly.&lt;/p&gt;

&lt;h3&gt;Netcup: the quiet competitor&lt;/h3&gt;

&lt;p&gt;Less known outside the German-speaking market. The VPS 1000 ARM G11 at €7.77 gives you 8 GB RAM, 6 vCPU, and 256 GB of NVMe, which is the largest disk in this comparison. Useful if you want to store multiple models and switch between them without re-downloading 4 to 8 GB each time.&lt;/p&gt;

&lt;h2&gt;What you will actually run on 8 GB&lt;/h2&gt;

&lt;p&gt;Here is the honest menu for an 8 GB VPS with Ollama or llama.cpp:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Qwen 2.5-7B-Instruct (Q4_K_M)&lt;/strong&gt;. Best general-purpose model in this size. Strong reasoning, multi-language, clean code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Llama 3.1-8B-Instruct (Q4_K_M)&lt;/strong&gt;. Ubiquitous, well-supported, safe default. Slightly weaker than Qwen on code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mistral-7B-Instruct-v0.3 (Q5_K_M)&lt;/strong&gt;. Older but predictable. Good for summarization.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phi-3.5-Mini (Q6_K)&lt;/strong&gt;. Smaller (3.8B), fits in 4 GB of RAM, quick for chat.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;nomic-embed-text or bge-small-en&lt;/strong&gt;. Embedding models for RAG pipelines. Run these alongside the main model.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What you will &lt;em&gt;not&lt;/em&gt; run well: anything 14B+, models with vision capabilities (qwen-vl, llava), or anything demanding low-latency streaming to many users.&lt;/p&gt;

&lt;h2&gt;Practical setup in 15 minutes&lt;/h2&gt;

&lt;p&gt;Rough sketch so you know what you are signing up for. This assumes Ubuntu 22.04 or 24.04 on a 8 GB VPS.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# 1. Install Ollama (handles download, quantization, serving)
curl -fsSL https://ollama.com/install.sh | sh

# 2. Pull a model
ollama pull qwen2.5:7b-instruct-q4_K_M

# 3. Test
ollama run qwen2.5:7b-instruct-q4_K_M "Summarize the French Revolution in two paragraphs."

# 4. Expose the API (careful with firewall rules)
# Ollama serves on localhost:11434 by default. Reverse-proxy with Caddy or Nginx.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Add Open WebUI if you want a ChatGPT-like browser interface. Add &lt;code&gt;llama-swap&lt;/code&gt; if you want to load different models on demand without restarting.&lt;/p&gt;

&lt;h2&gt;When NOT to self-host&lt;/h2&gt;

&lt;p&gt;A $5 VPS gives you about 5 to 8 tokens per second on a 7B model. That is fine for one user typing in a chat. It is not fine for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Real-time voice assistants. Latency will be embarrassing.&lt;/li&gt;
&lt;li&gt;Multi-user chat services. Four concurrent users will queue and feel broken.&lt;/li&gt;
&lt;li&gt;Anything that needs tool use, function calling at scale, or long-context (&amp;gt;8K tokens).&lt;/li&gt;
&lt;li&gt;Production RAG over millions of documents with tight latency SLAs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For those workloads, you want a GPU instance. That immediately pushes you above $100/month with Vast.ai, RunPod, or a dedicated server with a consumer GPU. At that point, OpenAI API or Anthropic API is often cheaper up to surprisingly high volumes.&lt;/p&gt;

&lt;h2&gt;Quick comparison: which $5 to $7 VPS wins?&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use case&lt;/th&gt;
&lt;th&gt;Best pick&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Lowest price with 8 GB RAM&lt;/td&gt;
&lt;td&gt;Contabo Cloud VPS 4&lt;/td&gt;
&lt;td&gt;€4.40 for 8 GB is unmatched&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best tokens per second per euro&lt;/td&gt;
&lt;td&gt;Netcup VPS 1000 ARM G11&lt;/td&gt;
&lt;td&gt;ARM memory bandwidth, now that Hetzner's CAX line is unavailable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Largest model storage&lt;/td&gt;
&lt;td&gt;Netcup VPS 1000 ARM G11&lt;/td&gt;
&lt;td&gt;256 GB NVMe stores a dozen models easily&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fast disk for model loading&lt;/td&gt;
&lt;td&gt;Contabo Cloud VPS Plus 4&lt;/td&gt;
&lt;td&gt;150 GB NVMe on EPYC; standard Cloud VPS is SSD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Running LLM + web app on one box&lt;/td&gt;
&lt;td&gt;Contabo Cloud VPS 6&lt;/td&gt;
&lt;td&gt;12 GB RAM leaves room for Postgres and nginx&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reliability regardless of price&lt;/td&gt;
&lt;td&gt;Hetzner CPX32&lt;/td&gt;
&lt;td&gt;The cheapest 8 GB Hetzner you can still buy, at €35.49&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;You can also compare them side by side on &lt;a href="/compare/contabo-vs-hetzner"&gt;Contabo vs Hetzner&lt;/a&gt; or review the full &lt;a href="/category/cloud-hosting"&gt;cloud VPS category&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;What changes this year&lt;/h2&gt;

&lt;p&gt;Two developments worth tracking in 2026:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Smaller models keep getting smarter.&lt;/strong&gt; Phi-3.5 Mini already outperforms last year's 13B models on some benchmarks. Expect 2B and 3B models to be genuinely production-useful by Q4 2026. That makes the 2 GB RAM tier (under $2) a legitimate option.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ARM inference is closing the gap.&lt;/strong&gt; Apple showed what M-series can do. Ampere Altra and AWS Graviton are bringing similar memory bandwidth advantages to $5 VPS plans. If you have not tried ARM yet, this is the year.&lt;/p&gt;

&lt;h2&gt;The verdict&lt;/h2&gt;

&lt;p&gt;If you want to learn, build a personal assistant, run background summarization, or stand up a private chatbot for a small team, a €5 to €8 VPS with 8 GB of RAM is genuinely enough in 2026. Pick &lt;a href="/hosting/contabo"&gt;Contabo&lt;/a&gt; for raw price, &lt;a href="/hosting/netcup"&gt;Netcup&lt;/a&gt; for ARM throughput and storage. &lt;a href="/hosting/hetzner"&gt;Hetzner&lt;/a&gt; is still the reliability benchmark, but until its cost-optimised line comes back, entry is €35.49 rather than €8.49. Avoid the US hyperscaler budget tiers; they are optimised for a different use case.&lt;/p&gt;

&lt;p&gt;If you want to serve real users at real volume, stop pretending a shared VPS is the answer. Use an API, or skip straight to a GPU host.&lt;/p&gt;

&lt;h2&gt;Related reading&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="/blog/ai-powered-hosting-what-providers-actually-offer-2026"&gt;AI-Powered Hosting: What Providers Actually Offer in 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/blog/managed-vs-unmanaged-vps"&gt;Managed vs Unmanaged VPS: When Is the Premium Worth It?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/blog/vultr-vs-linode-vs-digitalocean"&gt;Vultr vs Linode vs DigitalOcean: Developer Cloud Hosting Compared&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>vps</category>
      <category>selfhosted</category>
    </item>
    <item>
      <title>The Raw Power of Svelte 5 Runes: 70 Components, 25 KB, Full Reactivity</title>
      <dc:creator>HostingSift</dc:creator>
      <pubDate>Wed, 25 Feb 2026 13:14:30 +0000</pubDate>
      <link>https://dev.to/hostingsift/the-raw-power-of-svelte-5-runes-70-components-25-kb-full-reactivity-2npp</link>
      <guid>https://dev.to/hostingsift/the-raw-power-of-svelte-5-runes-70-components-25-kb-full-reactivity-2npp</guid>
      <description>&lt;h1&gt;
  
  
  Svelte 5 Runes in Production: What We Learned Building 70+ Components
&lt;/h1&gt;

&lt;p&gt;When Svelte 5 shipped runes, the community split in two. One side said "you're just copying React." The other saw the future of reactivity. We just started writing code. 70+ components later, powering &lt;a href="https://hostingsift.com" rel="noopener noreferrer"&gt;HostingSift&lt;/a&gt; (a hosting comparison platform), here's what we actually know.&lt;/p&gt;

&lt;h2&gt;
  
  
  What runes are and why you should care
&lt;/h2&gt;

&lt;p&gt;Runes are compiler instructions. They look like functions (&lt;code&gt;$state()&lt;/code&gt;, &lt;code&gt;$derived()&lt;/code&gt;, &lt;code&gt;$effect()&lt;/code&gt;), but they're not. Svelte transforms them at build time, not at runtime. That's the key difference from React hooks, Vue composables, and everything else out there.&lt;/p&gt;

&lt;p&gt;In Svelte 4, reactivity was implicit. Write &lt;code&gt;let count = 0&lt;/code&gt; and the compiler decides when to update the DOM. It worked, but it had traps. &lt;code&gt;$:&lt;/code&gt; blocks got confusing with complex logic, and the line between "reactive" and "just a variable" was blurry.&lt;/p&gt;

&lt;p&gt;Runes fix that with explicit signals:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight svelte"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"ts"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;hostings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;$state&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Hosting&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;&amp;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;loading&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;$state&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&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;error&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;$state&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;string&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&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;currentSort&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;$state&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;rating&lt;/span&gt;&lt;span class="dl"&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;totalPages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;$derived&lt;/span&gt;&lt;span class="p"&gt;(&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;ceil&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;total&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

  &lt;span class="nf"&gt;$effect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;currentQueryString&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;fetchHostings&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You read it and know exactly what's reactive. No magic. No guessing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The reactivity model: what actually happens under the hood
&lt;/h2&gt;

&lt;p&gt;Here's the thing most articles skip. Svelte 5's reactivity is signal-based, but the compiler does the dependency tracking for you. You never call &lt;code&gt;createSignal()&lt;/code&gt; or wrap things in &lt;code&gt;ref()&lt;/code&gt;. You write normal JavaScript and the compiler figures out the reactive graph.&lt;/p&gt;

&lt;p&gt;When you write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight svelte"&gt;&lt;code&gt;let loading = $state(true)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The compiler turns it into something like:&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;let&lt;/span&gt; &lt;span class="nx"&gt;loading&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;source&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every read of &lt;code&gt;loading&lt;/code&gt; in the template or in a &lt;code&gt;$derived&lt;/code&gt;/&lt;code&gt;$effect&lt;/code&gt; block registers a dependency. Every write triggers updates to anything that depends on it. No manual dependency arrays. No stale closure bugs.&lt;/p&gt;

&lt;p&gt;This is fundamentally different from React's model. In React, &lt;code&gt;useEffect&lt;/code&gt; re-runs based on a dependency array &lt;em&gt;you&lt;/em&gt; maintain. Forget a dependency, get a stale value. Add too many, get infinite loops. Svelte tracks dependencies automatically because it controls the compiler. The reactive graph is built at compile time, not runtime.&lt;/p&gt;

&lt;p&gt;Compared to Vue's &lt;code&gt;ref()&lt;/code&gt; / &lt;code&gt;reactive()&lt;/code&gt;, you also skip the &lt;code&gt;.value&lt;/code&gt; ceremony. In Vue you write &lt;code&gt;count.value++&lt;/code&gt;. In Svelte you write &lt;code&gt;count++&lt;/code&gt;. The compiler knows it's reactive and generates the right code.&lt;/p&gt;

&lt;h2&gt;
  
  
  How we built a reactive filter system with runes
&lt;/h2&gt;

&lt;p&gt;This is where runes really clicked for us. Our &lt;a href="https://hostingsift.com/hosting" rel="noopener noreferrer"&gt;hosting comparison page&lt;/a&gt; has multiple filter dimensions: hosting type, technology stack, price range, search, sort order, pagination. Each filter lives in its own nanostore atom, and they all feed into a computed API query string.&lt;/p&gt;

&lt;p&gt;Here's the store layer (plain nanostores, framework-agnostic):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// stores/filters.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;atom&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;computed&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;nanostores&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;$type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;atom&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;$tech&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;atom&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;$minPrice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;atom&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;$maxPrice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;atom&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;$sort&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;atom&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;price-asc&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;$page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;atom&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;$search&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;atom&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// This recomputes whenever ANY filter changes&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;$apiQueryString&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;$type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;$tech&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;$minPrice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;$maxPrice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;$sort&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;$page&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;$search&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tech&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;minPrice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;maxPrice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URLSearchParams&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tech&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tech&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tech&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;()&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;Seven independent atoms feeding into one computed query string. When you change any filter, &lt;code&gt;$apiQueryString&lt;/code&gt; recomputes and the list refetches. That's the reactive graph in action.&lt;/p&gt;

&lt;p&gt;Now here's the interesting part: bridging this into Svelte 5 components.&lt;/p&gt;

&lt;h3&gt;
  
  
  The bridge pattern we use everywhere
&lt;/h3&gt;

&lt;p&gt;Nanostores don't know about runes. So we bridge them with a pattern that shows up in almost every component:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight svelte"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"ts"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;$type&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;typeStore&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setType&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../../stores/filters&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;activeType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;$state&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;string&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;typeStore&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

  &lt;span class="nf"&gt;$effect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&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;typeStore&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;val&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;activeType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;val&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three lines: initial value from the store, subscribe in an effect, cleanup returned automatically. Every filter component does this. &lt;code&gt;TypeTabs&lt;/code&gt;, &lt;code&gt;TechFilter&lt;/code&gt;, &lt;code&gt;PriceRangeSlider&lt;/code&gt;, &lt;code&gt;ActiveFilters&lt;/code&gt; all follow the same pattern.&lt;/p&gt;

&lt;p&gt;For components that track multiple stores, we batch the subscriptions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight svelte"&gt;&lt;code&gt;$effect(() =&amp;gt; &lt;span class="si"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;unsubs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nx"&gt;typeStore&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;val&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;currentType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;val&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="nx"&gt;techStore&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;val&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;currentTech&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;val&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="nx"&gt;minPriceStore&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;val&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;currentMinPrice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;val&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="nx"&gt;maxPriceStore&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;val&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;currentMaxPrice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;val&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="nx"&gt;priceMaxStore&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;val&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ceiling&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;val&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="nx"&gt;priceFloorStore&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;val&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;floor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;val&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="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;unsubs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;unsub&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;unsub&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="si"&gt;}&lt;/span&gt;)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One effect, six subscriptions, one cleanup function. The effect runs once on mount, subscribes to everything, and cleans up all listeners when the component is destroyed. In React you'd need &lt;code&gt;useEffect&lt;/code&gt; with a dependency array (probably wrong on the first try) or multiple &lt;code&gt;useEffect&lt;/code&gt; calls. Here it's flat and obvious.&lt;/p&gt;

&lt;h3&gt;
  
  
  $derived for computed filter state
&lt;/h3&gt;

&lt;p&gt;The real power shows when you start deriving values. Our &lt;code&gt;ActiveFilters&lt;/code&gt; component needs to know if any filter is active:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight svelte"&gt;&lt;code&gt;const hasFilters = $derived(
  currentType !== null ||
  currentTech.length &amp;gt; 0 ||
  currentMinPrice &amp;gt; floor ||
  currentMaxPrice &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nt"&gt;ceiling&lt;/span&gt;
&lt;span class="err"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No &lt;code&gt;useMemo&lt;/code&gt;. No cache key. Just an expression that re-evaluates when any of its dependencies change. Svelte tracks which &lt;code&gt;$state&lt;/code&gt; variables you read inside &lt;code&gt;$derived&lt;/code&gt; and only recalculates when those specific values change.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;TechFilter&lt;/code&gt; component uses &lt;code&gt;$derived&lt;/code&gt; for show/hide logic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight svelte"&gt;&lt;code&gt;const visibleOptions = $derived(
  showAll ? techOptions : techOptions.slice(0, VISIBLE_COUNT)
)
const hiddenCount = $derived(
  Math.max(0, techOptions.length - VISIBLE_COUNT)
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When &lt;code&gt;showAll&lt;/code&gt; flips or &lt;code&gt;techOptions&lt;/code&gt; changes (after the API responds), both derived values update and the template re-renders. You don't think about it. It just works.&lt;/p&gt;

&lt;h3&gt;
  
  
  The price slider: reactive all the way down
&lt;/h3&gt;

&lt;p&gt;Our dual-range price slider is the most reactive component we have. It juggles local drag state, store values, computed percentages, and dynamically generated pip labels:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight svelte"&gt;&lt;code&gt;let localMin = $state(minPriceStore.get())
let localMax = $state(maxPriceStore.get())
let ceiling = $state(priceMaxStore.get())
let isDragging = $state(false)

// Sync from store, but not while dragging
$effect(() =&amp;gt; &lt;span class="si"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;unsubMin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;minPriceStore&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;val&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;isDragging&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;localMin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;val&lt;/span&gt;
  &lt;span class="si"&gt;}&lt;/span&gt;)
  const unsubMax = maxPriceStore.subscribe(val =&amp;gt; &lt;span class="si"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;isDragging&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;localMax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;val&lt;/span&gt;
  &lt;span class="si"&gt;}&lt;/span&gt;)
  // ...
  return () =&amp;gt; &lt;span class="si"&gt;{&lt;/span&gt; &lt;span class="nf"&gt;unsubMin&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="nf"&gt;unsubMax&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="cm"&gt;/* ... */&lt;/span&gt; &lt;span class="si"&gt;}&lt;/span&gt;
})

// These recompute on every drag frame
const range = $derived(ceiling - floor)
const minPercent = $derived(range &amp;gt; 0 ? ((localMin - floor) / range) * 100 : 0)
const maxPercent = $derived(range &amp;gt; 0 ? ((localMax - floor) / range) * 100 : 100)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As the user drags, &lt;code&gt;localMin&lt;/code&gt;/&lt;code&gt;localMax&lt;/code&gt; update, which triggers &lt;code&gt;minPercent&lt;/code&gt;/&lt;code&gt;maxPercent&lt;/code&gt; to recompute, which moves the slider fill in the template. When they release, we commit to the store, which triggers the API fetch. The &lt;code&gt;isDragging&lt;/code&gt; guard prevents the store subscription from fighting with the local drag state.&lt;/p&gt;

&lt;p&gt;In React you'd model this with &lt;code&gt;useState&lt;/code&gt; + &lt;code&gt;useRef&lt;/code&gt; + &lt;code&gt;useCallback&lt;/code&gt; + &lt;code&gt;useEffect&lt;/code&gt; with carefully managed dependency arrays. Here it's just assignments and derived values. The compiler handles the rest.&lt;/p&gt;

&lt;p&gt;The pip labels are a &lt;code&gt;$derived.by()&lt;/code&gt; because the logic needs intermediate variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight svelte"&gt;&lt;code&gt;const pips = $derived.by(() =&amp;gt; &lt;span class="si"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;range&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;`$${floor}`&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;rough&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;range&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mag&lt;/span&gt; &lt;span class="o"&gt;=&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;pow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&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;floor&lt;/span&gt;&lt;span class="p"&gt;(&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;log10&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rough&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;1&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;norm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;rough&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;mag&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;step&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;norm&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;mag&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;norm&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;mag&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;mag&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&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="s2"&gt;`$${floor}`&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="k"&gt;for &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;v&lt;/span&gt; &lt;span class="o"&gt;=&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;ceil&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;floor&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;step&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;step&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;ceiling&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;step&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`$${v}`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="si"&gt;}&lt;/span&gt;
  return labels
})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;$derived()&lt;/code&gt; is for single expressions. &lt;code&gt;$derived.by()&lt;/code&gt; is for when you need &lt;code&gt;if&lt;/code&gt;, &lt;code&gt;for&lt;/code&gt;, or temporary variables. Both are reactive the same way.&lt;/p&gt;

&lt;h2&gt;
  
  
  $effect: the cleanup story
&lt;/h2&gt;

&lt;p&gt;The killer feature of &lt;code&gt;$effect&lt;/code&gt; isn't the effect itself. It's the cleanup. You return a function and Svelte calls it when dependencies change or the component unmounts. No &lt;code&gt;onDestroy&lt;/code&gt; import, no separate cleanup lifecycle.&lt;/p&gt;

&lt;p&gt;Click outside handler with automatic cleanup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight svelte"&gt;&lt;code&gt;$effect(() =&amp;gt; &lt;span class="si"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;searchOpen&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;handleClickOutside&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;removeEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;handleClickOutside&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="si"&gt;}&lt;/span&gt;
})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The listener only exists while the dropdown is open. Close it, listener gone. Unmount the component, listener gone. You can't forget.&lt;/p&gt;

&lt;p&gt;Body scroll lock for a mobile bottom sheet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight svelte"&gt;&lt;code&gt;let isOpen = $state(false)

function open() &lt;span class="si"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;isOpen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;overflow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hidden&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="si"&gt;}&lt;/span&gt;

function close() &lt;span class="si"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;isOpen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;overflow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;
&lt;span class="si"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No effect needed here because the state change is synchronous and user-driven. That's another thing runes teach you: not everything needs to be reactive. Sometimes a plain function is better.&lt;/p&gt;

&lt;h2&gt;
  
  
  The simplicity argument: less code, fewer bugs
&lt;/h2&gt;

&lt;p&gt;Let's be blunt. Every framework claims to be simple. But simplicity isn't about marketing copy. It's about how much code you write for the same result, and how many places that code can go wrong.&lt;/p&gt;

&lt;p&gt;Here's a toggle button. React:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;isOpen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setIsOpen&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vue:&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;const&lt;/span&gt; &lt;span class="nx"&gt;isOpen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Svelte:&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;let&lt;/span&gt; &lt;span class="nx"&gt;isOpen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;$state&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All three are one-liners. Fair enough. Now let's look at something real: a component that reads from an external store, derives a computed value, and cleans up on unmount.&lt;/p&gt;

&lt;p&gt;React version of our TypeTabs filter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;TypeTabs&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="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;activeType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setActiveType&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;typeStore&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

  &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;unsub&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;typeStore&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;val&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setActiveType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;val&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;unsub&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;handleClick&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useCallback&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&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="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"flex flex-wrap gap-2"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;TYPES&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;
          &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
          &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;`chip &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;activeType&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;active&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
          &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;handleClick&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&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;Svelte version. The actual code we ship:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight svelte"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"ts"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;$type&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;typeStore&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setType&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../../stores/filters&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;activeType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;$state&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;string&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;typeStore&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

  &lt;span class="nf"&gt;$effect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&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;typeStore&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;val&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;activeType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;val&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"flex flex-wrap gap-2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="k"&gt;#each&lt;/span&gt; &lt;span class="nx"&gt;TYPES&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt;
      &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"chip {activeType === t.value ? 'active' : ''}"&lt;/span&gt;
      &lt;span class="na"&gt;onclick=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="k"&gt;/each&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Count the concepts. React: &lt;code&gt;useState&lt;/code&gt;, &lt;code&gt;useEffect&lt;/code&gt;, &lt;code&gt;useCallback&lt;/code&gt;, dependency array, JSX return statement, &lt;code&gt;className&lt;/code&gt; instead of &lt;code&gt;class&lt;/code&gt;, &lt;code&gt;key&lt;/code&gt; prop. Svelte: &lt;code&gt;$state&lt;/code&gt;, &lt;code&gt;$effect&lt;/code&gt;, template. That's it.&lt;/p&gt;

&lt;p&gt;The React version has more ways to break. Forget the dependency array, you get stale state. Skip &lt;code&gt;useCallback&lt;/code&gt;, you get unnecessary re-renders (or your linter screams at you). The Svelte version has one moving part: the store subscription with automatic cleanup.&lt;/p&gt;

&lt;p&gt;Now look at our &lt;code&gt;ActiveFilters&lt;/code&gt; component. It subscribes to 6 stores and derives a boolean:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight svelte"&gt;&lt;code&gt;let currentType = $state(typeStore.get())
let currentTech = $state(techStore.get())
let currentMinPrice = $state(minPriceStore.get())
let currentMaxPrice = $state(maxPriceStore.get())
let ceiling = $state(priceMaxStore.get())
let floor = $state(priceFloorStore.get())

$effect(() =&amp;gt; &lt;span class="si"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;unsubs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nx"&gt;typeStore&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;val&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;currentType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;val&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="nx"&gt;techStore&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;val&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;currentTech&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;val&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="nx"&gt;minPriceStore&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;val&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;currentMinPrice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;val&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="nx"&gt;maxPriceStore&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;val&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;currentMaxPrice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;val&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="nx"&gt;priceMaxStore&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;val&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ceiling&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;val&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="nx"&gt;priceFloorStore&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;val&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;floor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;val&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="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;unsubs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;unsub&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;unsub&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="si"&gt;}&lt;/span&gt;)

const hasFilters = $derived(
  currentType !== null ||
  currentTech.length &amp;gt; 0 ||
  currentMinPrice &amp;gt; floor ||
  currentMaxPrice &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nt"&gt;ceiling&lt;/span&gt;
&lt;span class="err"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In React, this would be six &lt;code&gt;useState&lt;/code&gt; calls, a &lt;code&gt;useEffect&lt;/code&gt; with an empty dependency array, and a &lt;code&gt;useMemo&lt;/code&gt; with six dependencies (that you'd probably get wrong on the first try). Or you'd pull in Zustand or Jotai and add another abstraction layer.&lt;/p&gt;

&lt;p&gt;In Svelte, it's assignments and one effect. &lt;code&gt;$derived&lt;/code&gt; doesn't need you to list dependencies. The compiler reads the expression and tracks them automatically.&lt;/p&gt;

&lt;p&gt;This scales. Our most complex component (&lt;code&gt;HostingList&lt;/code&gt;) has 12 &lt;code&gt;$state&lt;/code&gt; declarations, 4 &lt;code&gt;$derived&lt;/code&gt; values, 5 &lt;code&gt;$effect&lt;/code&gt; blocks, and handles search, sort, filters, pagination, and compare selection. It's 286 lines including the template. The equivalent React component would easily be 400+, and most of that extra code would be dependency arrays, memoization, and state setter functions.&lt;/p&gt;

&lt;p&gt;The point isn't that React is bad. It's that Svelte's compiler does work that React pushes onto the developer. Less manual bookkeeping means fewer places to mess up.&lt;/p&gt;

&lt;h2&gt;
  
  
  $props: TypeScript-first component contracts
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight svelte"&gt;&lt;code&gt;interface Props &lt;span class="si"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CompareItem&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;
  &lt;span class="nx"&gt;max&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;number&lt;/span&gt;
  &lt;span class="nx"&gt;onRemove&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;
  &lt;span class="nx"&gt;onClear&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;
  &lt;span class="nx"&gt;onCompare&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;
&lt;span class="si"&gt;}&lt;/span&gt;

let &lt;span class="si"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;max&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;onRemove&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;onClear&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;onCompare&lt;/span&gt; &lt;span class="si"&gt;}&lt;/span&gt;: Props = $props()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of &lt;code&gt;export let items&lt;/code&gt; and hoping the parent passes the right type. TypeScript catches mistakes at compile time. Default values work with standard destructuring. Callbacks are just props, same as React.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bundle size: the actual numbers
&lt;/h2&gt;

&lt;p&gt;Svelte 5 compiles runes to vanilla JS at build time. There's no 40+ KB runtime (React) or 30+ KB runtime (Vue) shipped to the browser. Svelte's runtime is under 5 KB gzipped and tree-shakes aggressively.&lt;/p&gt;

&lt;p&gt;In our case: 70+ Svelte components including a quiz wizard, dual-range price slider, filter system, compare bar, review form, and a full admin panel. Client JS stays under 25 KB per page (gzipped, including routing). React's runtime alone is bigger than that.&lt;/p&gt;

&lt;p&gt;Runes add zero overhead. &lt;code&gt;$state(0)&lt;/code&gt; compiles to:&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;let&lt;/span&gt; &lt;span class="nx"&gt;rating&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;source&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;$derived(items.length &amp;gt;= 2)&lt;/code&gt; becomes:&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;let&lt;/span&gt; &lt;span class="nx"&gt;canCompare&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;derived&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The compiler knows exactly which values are reactive and generates only the code it needs. No virtual DOM diffing. No runtime dependency tracking. Just surgical DOM updates.&lt;/p&gt;

&lt;h2&gt;
  
  
  What surprised us
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Granular updates without effort.&lt;/strong&gt; When &lt;code&gt;hostings = newArray&lt;/code&gt; runs, Svelte doesn't re-render the whole list. It diffs the keyed &lt;code&gt;{#each}&lt;/code&gt; block and only touches changed DOM nodes. We never had to think about &lt;code&gt;React.memo&lt;/code&gt; or &lt;code&gt;shouldComponentUpdate&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conditional effects actually work.&lt;/strong&gt; &lt;code&gt;$effect&lt;/code&gt; + &lt;code&gt;if&lt;/code&gt; + &lt;code&gt;return cleanup&lt;/code&gt; gives you fine-grained control in 5 lines. The click-outside handler above would be a custom hook in React (15+ lines, reusable but noisy).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TypeScript just works.&lt;/strong&gt; &lt;code&gt;$state&amp;lt;Hosting[]&amp;gt;([])&lt;/code&gt; does what you expect. No wrapper types, no utility generics, no &lt;code&gt;Ref&amp;lt;T&amp;gt;&lt;/code&gt; vs &lt;code&gt;T&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Derived chains are fast.&lt;/strong&gt; &lt;code&gt;floor&lt;/code&gt; changes, &lt;code&gt;range&lt;/code&gt; recomputes, &lt;code&gt;minPercent&lt;/code&gt; recomputes, &lt;code&gt;pips&lt;/code&gt; recomputes, DOM updates. Four levels of derived state and it's instant because each step only runs if its inputs changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What bites
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The nanostores bridge.&lt;/strong&gt; Four lines per store isn't terrible, but it's ceremony. We'll probably write a &lt;code&gt;useNanostore()&lt;/code&gt; utility at some point. For now the pattern is consistent and bug-free.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;$effect grabs everything it reads.&lt;/strong&gt; If you read &lt;code&gt;currentQueryString&lt;/code&gt; inside an effect, the effect re-runs when it changes. This is correct behavior, but you need to be careful not to trigger infinite loops (effect writes to state that the effect reads).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Migrating from Svelte 4.&lt;/strong&gt; Not trivial. &lt;code&gt;$:&lt;/code&gt; blocks need to be split into &lt;code&gt;$derived&lt;/code&gt; and &lt;code&gt;$effect&lt;/code&gt;. &lt;code&gt;export let&lt;/code&gt; becomes &lt;code&gt;$props()&lt;/code&gt;. The good news: &lt;code&gt;npx sv migrate svelte-5&lt;/code&gt; handles 90% of cases.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick reference
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rune&lt;/th&gt;
&lt;th&gt;Use case&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$state()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Mutable value&lt;/td&gt;
&lt;td&gt;&lt;code&gt;let loading = $state(true)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$derived()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Computed from state&lt;/td&gt;
&lt;td&gt;&lt;code&gt;const total = $derived(items.length)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$derived.by()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Complex computed with if/for&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$derived.by(() =&amp;gt; { ... })&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$effect()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Side effects, subscriptions&lt;/td&gt;
&lt;td&gt;Fetch, event listeners, store sync&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$props()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Component inputs&lt;/td&gt;
&lt;td&gt;&lt;code&gt;let { name } = $props()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$bindable()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Two-way binding prop&lt;/td&gt;
&lt;td&gt;&lt;code&gt;let { value = $bindable() } = $props()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Bottom line
&lt;/h2&gt;

&lt;p&gt;Runes make reactivity explicit. You know what's state, what's computed, what's a side effect. The compiler generates minimal code. TypeScript works without hacks. The reactive graph is built once at compile time and runs with near-zero overhead.&lt;/p&gt;

&lt;p&gt;We run 70+ components in production at &lt;a href="https://hostingsift.com" rel="noopener noreferrer"&gt;HostingSift&lt;/a&gt; with Astro SSR, nanostores for cross-island state, and Svelte 5 runes for local reactivity. A full filter system with type tabs, technology chips, a dual-range price slider, active filter pills, search with autocomplete, and sort dropdown. All reactive, all coordinated through a single computed query string, all under 25 KB shipped to the browser.&lt;/p&gt;

&lt;p&gt;If you're starting a new project and the React/Vue/Svelte decision is eating your time, just try runes. They're different enough to deserve a real look.&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>javascript</category>
      <category>performance</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Why we chose Astro over SvelteKit for our hosting comparison platform</title>
      <dc:creator>HostingSift</dc:creator>
      <pubDate>Mon, 23 Feb 2026 21:00:31 +0000</pubDate>
      <link>https://dev.to/hostingsift/why-we-chose-astro-over-sveltekit-for-our-hosting-comparison-platform-3cc6</link>
      <guid>https://dev.to/hostingsift/why-we-chose-astro-over-sveltekit-for-our-hosting-comparison-platform-3cc6</guid>
      <description>&lt;h1&gt;
  
  
  Why we chose Astro over SvelteKit for our hosting comparison platform
&lt;/h1&gt;

&lt;p&gt;We're building &lt;a href="https://hostingsift.com" rel="noopener noreferrer"&gt;HostingSift&lt;/a&gt;, a platform for comparing hosting providers side by side. Pricing tables, feature breakdowns, filters, user reviews. When we started, we had one decision that would shape everything else: SvelteKit or Astro?&lt;/p&gt;

&lt;p&gt;We went with Astro. Here's why.&lt;/p&gt;

&lt;h2&gt;
  
  
  Some context first
&lt;/h2&gt;

&lt;p&gt;HostingSift is a content-heavy site. We have 23+ hosting provider profiles, each with multiple plans, pricing tiers, feature specs, and user reviews. On top of that there are comparison pages, category listings, a recommendation quiz, and a blog.&lt;/p&gt;

&lt;p&gt;The interactive parts are specific and well-contained: filtering plans by billing period, toggling comparison tables, authentication flows, review forms. Most of what users actually see is static content that doesn't need JavaScript to render.&lt;/p&gt;

&lt;p&gt;This ratio matters. It shaped everything that followed.&lt;/p&gt;

&lt;h2&gt;
  
  
  SvelteKit was the obvious choice
&lt;/h2&gt;

&lt;p&gt;We love Svelte. The reactivity model in Svelte 5 with runes is elegant. The developer experience is fantastic. SvelteKit is a mature, full-featured framework with file-based routing, SSR, API endpoints, form actions.&lt;/p&gt;

&lt;p&gt;So why not just use it?&lt;/p&gt;

&lt;p&gt;Because SvelteKit is an application framework. It assumes your pages are interactive by default. Every route ships a JavaScript bundle to hydrate the page client-side, even if the page is mostly static HTML.&lt;/p&gt;

&lt;p&gt;You can work around this. You can set &lt;code&gt;ssr: true&lt;/code&gt; and use &lt;code&gt;+page.server.ts&lt;/code&gt; to keep data fetching on the server. You can prerender specific routes. But you're swimming against the current. The defaults push you toward shipping more JavaScript than a content site needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Astro gets right for content sites
&lt;/h2&gt;

&lt;p&gt;Astro starts from the opposite end. Zero client JavaScript by default. Every page renders as static HTML until you explicitly opt in to interactivity.&lt;/p&gt;

&lt;p&gt;This is not a subtle difference. It changes how you think about building pages.&lt;/p&gt;

&lt;h3&gt;
  
  
  Islands, not full-page hydration
&lt;/h3&gt;

&lt;p&gt;With Astro, we compose pages from &lt;code&gt;.astro&lt;/code&gt; components (static HTML, zero JS) and Svelte components (interactive, with JS). The Svelte components are islands. They hydrate independently. The rest of the page is just HTML that the browser renders immediately.&lt;/p&gt;

&lt;p&gt;Our hosting profile page is a good example. The page layout, provider description, specs table, pros and cons list, SEO metadata... all static Astro components. Zero JavaScript shipped. Then we drop in a &lt;code&gt;PlanCard&lt;/code&gt; component with &lt;code&gt;client:load&lt;/code&gt; for the interactive pricing table where users toggle billing periods. A &lt;code&gt;ReviewForm&lt;/code&gt; for authenticated review submission. A &lt;code&gt;HeaderAuth&lt;/code&gt; for login state.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;---
import Layout from '../../layouts/Layout.astro'
import PlanCard from '../../components/PlanCard.svelte'
import ReviewSection from '../../components/ReviewSection.svelte'
import SpecsTable from '../../components/SpecsTable.astro'

const { hosting, plans } = await fetchHostingData(slug)
---

&amp;lt;Layout title={hosting.name}&amp;gt;
  &amp;lt;article&amp;gt;
    &amp;lt;h1&amp;gt;{hosting.name}&amp;lt;/h1&amp;gt;
    &amp;lt;p&amp;gt;{hosting.description}&amp;lt;/p&amp;gt;

    &amp;lt;!-- Static HTML, no JS overhead --&amp;gt;
    &amp;lt;SpecsTable specs={hosting.specs} /&amp;gt;

    &amp;lt;!-- Interactive islands, hydrate independently --&amp;gt;
    &amp;lt;PlanCard client:load plans={plans} /&amp;gt;
    &amp;lt;ReviewSection client:load hostingId={hosting.id} /&amp;gt;
  &amp;lt;/article&amp;gt;
&amp;lt;/Layout&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each island hydrates on its own. If one fails, the rest of the page still works fine. In SvelteKit, the entire page is a single hydration unit.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prerendering is the default, not an opt-in
&lt;/h3&gt;

&lt;p&gt;In Astro's hybrid mode, pages are prerendered at build time unless you explicitly say otherwise. Our homepage, category pages, legal pages, blog posts... all static HTML files. Fast, cacheable, no server compute on each request.&lt;/p&gt;

&lt;p&gt;For pages that need fresh data (hosting profiles with live pricing, filtered listings), we mark them as server-rendered. It's explicit and intentional.&lt;/p&gt;

&lt;p&gt;SvelteKit takes the opposite approach. Everything is server-rendered by default. You opt in to prerendering per route. The mental model is reversed. For a site where the majority of pages can safely be static, Astro's default aligns better with reality.&lt;/p&gt;

&lt;h3&gt;
  
  
  We still write Svelte
&lt;/h3&gt;

&lt;p&gt;This is what made the decision easy. Astro is not a replacement for Svelte. It's a composition layer around it.&lt;/p&gt;

&lt;p&gt;All our interactive components are pure Svelte 5 with runes, stores, reactive state. We didn't lose anything from the Svelte ecosystem. We just moved the routing and page composition up to Astro, where it can make smarter decisions about what ships to the browser.&lt;/p&gt;

&lt;p&gt;The pattern feels natural once you get used to it. Page structure lives in &lt;code&gt;.astro&lt;/code&gt; files (templating with zero overhead). Interactive behavior lives in &lt;code&gt;.svelte&lt;/code&gt; files (full reactivity where it's actually needed).&lt;/p&gt;

&lt;h2&gt;
  
  
  The tradeoffs we accepted
&lt;/h2&gt;

&lt;p&gt;Astro is not a free lunch. Here's what we gave up.&lt;/p&gt;

&lt;h3&gt;
  
  
  No form actions
&lt;/h3&gt;

&lt;p&gt;SvelteKit's form actions with progressive enhancement are genuinely nice. In Astro, we handle forms through our Hono API with client-side fetch calls. It works, but there's more boilerplate involved. We write &lt;code&gt;onSubmit&lt;/code&gt; handlers and manage loading states manually where SvelteKit would handle the plumbing for us.&lt;/p&gt;

&lt;h3&gt;
  
  
  Two component models
&lt;/h3&gt;

&lt;p&gt;Anyone working on the codebase needs to understand both &lt;code&gt;.astro&lt;/code&gt; and &lt;code&gt;.svelte&lt;/code&gt; files. When does something belong in Astro vs Svelte? The rule is straightforward (static content = Astro, interactive behavior = Svelte), but it's still a decision you make dozens of times a day.&lt;/p&gt;

&lt;h3&gt;
  
  
  View Transitions have rough edges
&lt;/h3&gt;

&lt;p&gt;Astro's View Transitions look great but come with real gotchas. Inline scripts re-execute on each navigation. We spent more time than expected getting Google Analytics and &lt;code&gt;vanilla-cookieconsent&lt;/code&gt; to behave correctly, adding guard flags to prevent double initialization. SvelteKit's client-side routing handles this more gracefully out of the box.&lt;/p&gt;

&lt;h3&gt;
  
  
  Separate API server
&lt;/h3&gt;

&lt;p&gt;SvelteKit has &lt;code&gt;+server.ts&lt;/code&gt; for API routes, tightly integrated with the framework. We chose to run a standalone Hono server for our API. This was intentional (the API will eventually serve a mobile app too), but it means two processes to manage, separate deployments, and CORS configuration that SvelteKit wouldn't need.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this paid off
&lt;/h2&gt;

&lt;p&gt;The results justified the decision.&lt;/p&gt;

&lt;p&gt;Our homepage ships about 40KB of JavaScript total. The interactive bits (provider grid, newsletter form) are small isolated bundles. In a SvelteKit setup, the framework's client-side router adds baseline overhead before any of our code even loads.&lt;/p&gt;

&lt;p&gt;Server-side OG image generation fits naturally into Astro's endpoint model. We generate dynamic Open Graph images for every hosting profile, comparison page, and blog post using Satori and Sharp. It's just a standard API route that returns a PNG buffer. No special configuration needed.&lt;/p&gt;

&lt;p&gt;Build times stay fast. Prerendering 50+ static pages, generating sitemaps, and compiling the Svelte islands takes under 30 seconds. Adding a new provider doesn't slow anything down because the build is mostly parallel.&lt;/p&gt;

&lt;h2&gt;
  
  
  The deployment question
&lt;/h2&gt;

&lt;p&gt;This one doesn't get discussed enough.&lt;/p&gt;

&lt;p&gt;SvelteKit works everywhere in theory. In practice, the smoothest path is deploying to Vercel. Rich Harris works there, &lt;code&gt;adapter-auto&lt;/code&gt; detects Vercel out of the box, and the integration is polished. You can absolutely use &lt;code&gt;adapter-node&lt;/code&gt; and self-host, but you'll be configuring things that Vercel handles for you automatically.&lt;/p&gt;

&lt;p&gt;We wanted to self-host. Our stack runs on a single Hetzner ARM64 VPS: the Astro site, the Hono API, PostgreSQL, all behind nginx and Cloudflare. The whole thing costs about €5 a month.&lt;/p&gt;

&lt;p&gt;With Astro, deploying to a VPS was straightforward. Install &lt;code&gt;@astrojs/node&lt;/code&gt;, build, run with PM2. That's it. No adapter quirks, no platform-specific edge cases. The output is a standard Node.js server.&lt;/p&gt;

&lt;p&gt;The cost angle is worth mentioning too. Platforms like Vercel and Netlify use usage-based pricing. The Pro plans start at $20-25 per month, but the real cost depends on traffic, serverless function execution time, and bandwidth. Overages are billed automatically. There are well-documented cases of bills spiking unexpectedly after traffic surges or bot crawls. For a content site that serves a lot of static pages, this pricing model works against you.&lt;/p&gt;

&lt;p&gt;A fixed-cost VPS eliminates that variable entirely. Traffic can double or triple and the bill stays the same. If we outgrow the current server, the next tier up is still a fraction of what a managed platform would cost at equivalent traffic. We're not locked into any vendor's pricing model, and migrating to a bigger box is a straightforward process.&lt;/p&gt;

&lt;p&gt;To be fair, managed platforms give you CI/CD, preview deployments, edge functions, and zero-config scaling. Those are real features with real value, especially for teams that don't want to manage infrastructure. The tradeoff is control and cost predictability versus convenience.&lt;/p&gt;

&lt;p&gt;For us, a €5 VPS with full control was the obvious pick.&lt;/p&gt;

&lt;h2&gt;
  
  
  After several months in production
&lt;/h2&gt;

&lt;p&gt;23 hosting providers, hundreds of plans, comparison pages, a quiz, a blog, user auth, admin panel. All running on that single Hetzner box.&lt;/p&gt;

&lt;p&gt;The architecture has held up. New provider profiles are just data. New interactive features are new Svelte islands dropped into existing pages. New static pages are &lt;code&gt;.astro&lt;/code&gt; files with no client-side cost.&lt;/p&gt;

&lt;p&gt;Would SvelteKit have worked? Of course. For a more app-like product with dashboards, real-time collaboration, heavy client state, we'd pick SvelteKit without thinking twice.&lt;/p&gt;

&lt;p&gt;But for a content-first site where interactivity is the exception rather than the rule, Astro with Svelte islands turned out to be the right call. Not because SvelteKit couldn't do it. Because Astro's defaults already pointed in the direction we wanted to go.&lt;/p&gt;

&lt;p&gt;There's real value in not having to fight your framework.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>frontend</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I Built a Hosting Comparison Platform with Astro, Svelte 5 &amp; Hono</title>
      <dc:creator>HostingSift</dc:creator>
      <pubDate>Sat, 21 Feb 2026 08:59:10 +0000</pubDate>
      <link>https://dev.to/hostingsift/i-built-a-hosting-comparison-platform-with-astro-svelte-5-hono-3kde</link>
      <guid>https://dev.to/hostingsift/i-built-a-hosting-comparison-platform-with-astro-svelte-5-hono-3kde</guid>
      <description>&lt;p&gt;I got tired of hosting comparison websites. You know the ones. "Top 10 Best Hosting 2024" articles that haven't been updated since 2022, prices that are completely wrong, and rankings that suspiciously always put the same provider first no matter what.&lt;/p&gt;

&lt;p&gt;So I decided to build my own. Not a blog post with affiliate links, but an actual tool where you can filter by hosting type, compare plans side by side, and see prices that are actually current. After about six months of work, &lt;a href="https://hostingsift.com/" rel="noopener noreferrer"&gt;HostingSift&lt;/a&gt; is live and I figured I'd share what went into it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Stack
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Astro&lt;/strong&gt; in hybrid SSR mode was the obvious pick. Most pages (hosting profiles, categories, homepage) get prerendered at build time, which means they're fast out of the box. A few routes like the comparison tool need server rendering, and Astro handles that switch per-page which is really convenient.&lt;/p&gt;

&lt;p&gt;For interactive bits I went with &lt;strong&gt;Svelte 5&lt;/strong&gt;. I was on React before and honestly the new runes API (&lt;code&gt;$state&lt;/code&gt;, &lt;code&gt;$derived&lt;/code&gt;, &lt;code&gt;$effect&lt;/code&gt;) won me over pretty quickly. No dependency arrays, no stale closures, components feel lighter. It took maybe a week to get comfortable with the mental model shift and after that I didn't look back.&lt;/p&gt;

&lt;p&gt;The backend is &lt;strong&gt;Hono&lt;/strong&gt; on Node.js. Think Express but with actual TypeScript support and better performance. It handles auth, the admin panel API, affiliate click tracking, all that stuff. Database is &lt;strong&gt;PostgreSQL&lt;/strong&gt; with &lt;strong&gt;Drizzle ORM&lt;/strong&gt; which has been solid for both queries and migrations.&lt;/p&gt;

&lt;p&gt;Everything lives in a monorepo: &lt;code&gt;apps/web&lt;/code&gt;, &lt;code&gt;apps/api&lt;/code&gt;, &lt;code&gt;packages/db&lt;/code&gt;, &lt;code&gt;packages/email&lt;/code&gt;. pnpm workspaces glue it together.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keeping Prices Up to Date
&lt;/h2&gt;

&lt;p&gt;The whole point of the site is showing accurate pricing, so I built an automated pipeline that pulls plan data from each provider on a weekly schedule. Every plan, every billing period, every feature toggle. It compares incoming data against what's already in the database and upserts the differences. Each run also creates a snapshot, so if a provider quietly bumps their renewal price by $2/month, that gets recorded. Over time this builds a price history for every single plan.&lt;/p&gt;

&lt;p&gt;Getting the data right for each provider was the biggest time sink. Every provider structures their pricing page differently. Some have clean layouts, others hide plans behind tabs and dropdowns, and a few change their page structure often enough that things break. You end up writing very provider-specific logic and accepting that maintenance is part of the deal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Things I'd Do Differently
&lt;/h2&gt;

&lt;p&gt;I'd spend more time on data validation early on. I almost "fixed" what looked like a pricing bug for one provider before checking their actual website. Turns out they give their biggest promotional discount to mid-tier plans, not the cheapest ones. Now I always verify against the source before touching anything in the database.&lt;/p&gt;

&lt;p&gt;Svelte 5 + Astro is a great combo but the ecosystem is still catching up. Some things that are one-line solutions in React/Next don't have equivalents yet. The tradeoff is worth it though, the output is noticeably lighter and the developer experience is genuinely good.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://hostingsift.com" rel="noopener noreferrer"&gt;HostingSift&lt;/a&gt; is live if you want to check it out. You can filter by hosting type, compare providers, see current prices. Still adding more providers and features so if something looks off or you have ideas, I'd love to hear about it in the comments.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>typescript</category>
      <category>performance</category>
    </item>
  </channel>
</rss>
