<?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: Donyaie Charkh</title>
    <description>The latest articles on DEV Community by Donyaie Charkh (@donyaiecharkh).</description>
    <link>https://dev.to/donyaiecharkh</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%2F4214759%2Fa8503a6f-8f5e-4d61-b110-34ec1ac9791a.png</url>
      <title>DEV Community: Donyaie Charkh</title>
      <link>https://dev.to/donyaiecharkh</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/donyaiecharkh"/>
    <language>en</language>
    <item>
      <title>Sizing Caster Wheels with a Tiny Python Helper (and Why "Weight 4" Breaks Carts)</title>
      <dc:creator>Donyaie Charkh</dc:creator>
      <pubDate>Fri, 30 Oct 2026 09:38:15 +0000</pubDate>
      <link>https://dev.to/donyaiecharkh/sizing-caster-wheels-with-a-tiny-python-helper-and-why-weight-4-breaks-carts-2ll8</link>
      <guid>https://dev.to/donyaiecharkh/sizing-caster-wheels-with-a-tiny-python-helper-and-why-weight-4-breaks-carts-2ll8</guid>
      <description>&lt;p&gt;Every time someone builds a cart, a machine base or a mobile workbench, the same question comes up: &lt;em&gt;which casters can actually carry this?&lt;/em&gt; The usual answer is "divide the weight by four", and that answer is wrong often enough to break wheels in the field. Here is a tiny, dependency-free Python helper that does the sizing properly, plus the reasoning behind each number.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why "weight ÷ 4" fails
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Floors are not flat.&lt;/strong&gt; On any real floor, one wheel of a four-wheel cart is often barely touching the ground for a moment. That means at any instant, roughly three wheels carry the whole load.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Loads are dynamic.&lt;/strong&gt; Rolling over a door threshold, an expansion joint or a cable protector creates a shock load well above the static weight.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speed and duty matter.&lt;/strong&gt; A cart pushed by hand at walking pace is very different from a trolley towed all shift by a tugger.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So the professional rule of thumb is: &lt;em&gt;divide by (number of wheels − 1)&lt;/em&gt;, then multiply by a safety factor that reflects floor and usage.&lt;/p&gt;

&lt;h2&gt;
  
  
  The helper
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;dataclasses&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;dataclass&lt;/span&gt;

&lt;span class="c1"&gt;# Safety factors are conservative rules of thumb, not a standard.
&lt;/span&gt;&lt;span class="n"&gt;FLOOR_FACTOR&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;smooth&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;average&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rough&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.5&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;DUTY_FACTOR&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;light&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;daily&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;continuous&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.3&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;@dataclass&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CasterSpec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;min_capacity_kg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;
    &lt;span class="n"&gt;note&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;required_caster_capacity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;load_kg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cart_kg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wheels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&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="n"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;average&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;duty&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;daily&lt;/span&gt;&lt;span class="sh"&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="n"&gt;CasterSpec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;wheels&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Use at least 3 casters&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;load_kg&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;cart_kg&lt;/span&gt;
    &lt;span class="n"&gt;bearing_wheels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;wheels&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;wheels&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="n"&gt;wheels&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
    &lt;span class="n"&gt;per_wheel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;bearing_wheels&lt;/span&gt;
    &lt;span class="n"&gt;capacity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;per_wheel&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;FLOOR_FACTOR&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;DUTY_FACTOR&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;duty&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;note&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; kg over &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;bearing_wheels&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; load-bearing wheels, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;floor=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;floor&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, duty=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;duty&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;CasterSpec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;capacity&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="n"&gt;note&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;spec&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;required_caster_capacity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;load_kg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cart_kg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wheels&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="n"&gt;floor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rough&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;duty&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;continuous&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# CasterSpec(min_capacity_kg=429.0, note='660 kg over 3 ...')
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a 600 kg load on a 60 kg cart, "÷ 4" gives 165 kg per wheel. The helper says you want casters rated around &lt;strong&gt;430 kg each&lt;/strong&gt; on a rough floor with continuous use. That gap is exactly where cracked wheels and bent forks come from.&lt;/p&gt;

&lt;h2&gt;
  
  
  Turning the number into a part
&lt;/h2&gt;

&lt;p&gt;Capacity is only the first filter. Once you have it, check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Wheel material vs floor.&lt;/strong&gt; Polyurethane is the default for most warehouse floors; rubber is quieter and kinder to delicate floors but carries less; nylon and cast iron suit very heavy, slow loads on hard floors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wheel diameter.&lt;/strong&gt; Larger wheels roll over joints and debris with much less push force. If your helper output is near the top of a series' rating, step up a diameter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swivel vs fixed layout.&lt;/strong&gt; Two fixed plus two swivel steers like a shopping cart and tracks straight on long runs; four swivel is maximally agile but harder to push in a line.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Locking.&lt;/strong&gt; Brakes stop the wheel from turning; for machines that must not move at all (work tables, packing stations, test rigs), a caster with a built-in leveling foot or jack stop lifts the load off the wheels entirely. Manufacturers such as &lt;a href="https://donyaiecharkh.com/" rel="noopener noreferrer"&gt;Donyaie Charkh&lt;/a&gt; list &lt;a href="https://donyaiecharkh.com/category/jack-stop-caster" rel="noopener noreferrer"&gt;heavy-duty casters with a jack stop&lt;/a&gt; for exactly this case, and comparing their rated loads against the helper's output is a quick sanity check.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Extending it
&lt;/h2&gt;

&lt;p&gt;Some easy improvements if you want to drop this into an internal tool:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add a &lt;code&gt;speed_kmh&lt;/code&gt; parameter and bump the factor above 4 km/h (towed trains).&lt;/li&gt;
&lt;li&gt;Return a recommended wheel diameter band based on floor roughness.&lt;/li&gt;
&lt;li&gt;Read a CSV of your caster catalog and return the cheapest model that clears &lt;code&gt;min_capacity_kg&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Small tool, but it has saved more than one project from a recall of broken wheels. If you size casters differently, I'd love to hear your rules of thumb in the comments.&lt;/p&gt;

</description>
      <category>python</category>
      <category>engineering</category>
      <category>manufacturing</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to Choose the Right Industrial Caster Wheel: A Practical Guide</title>
      <dc:creator>Donyaie Charkh</dc:creator>
      <pubDate>Thu, 29 Oct 2026 08:46:02 +0000</pubDate>
      <link>https://dev.to/donyaiecharkh/how-to-choose-the-right-industrial-caster-wheel-a-practical-guide-1ldm</link>
      <guid>https://dev.to/donyaiecharkh/how-to-choose-the-right-industrial-caster-wheel-a-practical-guide-1ldm</guid>
      <description>&lt;p&gt;Choosing the wrong caster wheel is one of the most common reasons carts, trolleys and machines wear out early, damage floors or become hard to push. Whether you equip a warehouse, a hospital or a supermarket, a few simple criteria make the decision much easier.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Calculate the load per wheel
&lt;/h2&gt;

&lt;p&gt;Add the weight of the equipment and its maximum load, then divide by the number of wheels minus one. That safety margin matters, because on uneven floors one wheel often loses contact. Heavy-duty &lt;a href="https://donyaiecharkh.com/category/industrial-wheels" rel="noopener noreferrer"&gt;industrial casters&lt;/a&gt; are designed for exactly these demanding conditions.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Match the wheel material to the floor
&lt;/h2&gt;

&lt;p&gt;Polyurethane wheels roll quietly, resist abrasion and protect epoxy or tiled floors, while rubber wheels absorb shocks better on rough surfaces. This comparison of &lt;a href="https://donyaiecharkh.com/post/polyurethane-vs-rubber-industrial-casters" rel="noopener noreferrer"&gt;polyurethane vs. rubber casters&lt;/a&gt; explains the trade-offs.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Fixed or swivel?
&lt;/h2&gt;

&lt;p&gt;Fixed casters keep a cart moving straight over long distances; swivel casters make tight turns possible. Most trolleys combine two of each, and swivel casters with a brake add safety on ramps.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Think about the environment
&lt;/h2&gt;

&lt;p&gt;Hospitals need quiet, non-marking, easy-to-clean wheels; cold rooms need materials that stay flexible at low temperatures; shopping carts need casters that survive thousands of cycles outdoors and indoors.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Plan for maintenance
&lt;/h2&gt;

&lt;p&gt;Regular cleaning, lubrication of bearings and checking the swivel head extend wheel life significantly and keep equipment safe.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bottom line
&lt;/h2&gt;

&lt;p&gt;For every weight, every surface and every application there is a suitable wheel. Taking ten minutes to check load, floor, mounting and environment saves money and downtime later. For a complete checklist, see this &lt;a href="https://donyaiecharkh.com/post/industrial-wheel-buying-guide" rel="noopener noreferrer"&gt;industrial wheel buying guide&lt;/a&gt; from &lt;a href="https://donyaiecharkh.com/" rel="noopener noreferrer"&gt;Donyaie Charkh&lt;/a&gt;, an Iranian manufacturer of industrial casters with more than 20 years of experience.&lt;/p&gt;

</description>
      <category>engineering</category>
      <category>manufacturing</category>
      <category>productivity</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
