diff --git a/calc/src/desc.ts b/calc/src/desc.ts
index 504314c61..bd8be6859 100644
--- a/calc/src/desc.ts
+++ b/calc/src/desc.ts
@@ -31,6 +31,7 @@ export interface RawDesc {
   isAuroraVeil?: boolean;
   isFlowerGiftAttacker?: boolean;
   isFlowerGiftDefender?: boolean;
+  isSteelySpiritAttacker?: boolean;
   isFriendGuard?: boolean;
   isHelpingHand?: boolean;
   isCritical?: boolean;
@@ -939,6 +940,9 @@ function buildDescription(description: RawDesc, attacker: Pokemon, defender: Pok
   if (description.isFlowerGiftAttacker) {
     output += 'with an ally\'s Flower Gift ';
   }
+  if (description.isSteelySpiritAttacker) {
+    output += 'with an ally\'s Steely Spirit ';
+  }
   if (description.isBattery) {
     output += 'Battery boosted ';
   }
diff --git a/calc/src/field.ts b/calc/src/field.ts
index 0c759013c..890e1582e 100644
--- a/calc/src/field.ts
+++ b/calc/src/field.ts
@@ -91,6 +91,7 @@ export class Side implements State.Side {
   isAuroraVeil: boolean;
   isBattery: boolean;
   isPowerSpot: boolean;
+  isSteelySpirit: boolean;
   isSwitching?: 'out' | 'in';
 
   constructor(side: State.Side = {}) {
@@ -113,6 +114,7 @@ export class Side implements State.Side {
     this.isAuroraVeil = !!side.isAuroraVeil;
     this.isBattery = !!side.isBattery;
     this.isPowerSpot = !!side.isPowerSpot;
+    this.isSteelySpirit = !!side.isSteelySpirit;
     this.isSwitching = side.isSwitching;
   }
 
diff --git a/calc/src/mechanics/gen789.ts b/calc/src/mechanics/gen789.ts
index f8d3e48bc..08cfe7b25 100644
--- a/calc/src/mechanics/gen789.ts
+++ b/calc/src/mechanics/gen789.ts
@@ -1390,6 +1390,14 @@ export function calculateAtModsSMSSSV(
     desc.isFlowerGiftAttacker = true;
   }
 
+  if (
+    field.attackerSide.isSteelySpirit &&
+    move.hasType('Steel')
+  ) {
+    atMods.push(6144);
+    desc.isSteelySpiritAttacker = true;
+  }
+
   if ((defender.hasAbility('Thick Fat') && move.hasType('Fire', 'Ice')) ||
       (defender.hasAbility('Water Bubble') && move.hasType('Fire')) ||
      (defender.hasAbility('Purifying Salt') && move.hasType('Ghost'))) {
diff --git a/calc/src/state.ts b/calc/src/state.ts
index bd59b7383..82d473398 100644
--- a/calc/src/state.ts
+++ b/calc/src/state.ts
@@ -75,6 +75,7 @@ export namespace State {
     isAuroraVeil?: boolean;
     isBattery?: boolean;
     isPowerSpot?: boolean;
+    isSteelySpirit?: boolean;
     isSwitching?: 'out' | 'in';
   }
 }
diff --git a/calc/src/test/calc.test.ts b/calc/src/test/calc.test.ts
index 3814567c4..b884db69a 100644
--- a/calc/src/test/calc.test.ts
+++ b/calc/src/test/calc.test.ts
@@ -749,6 +749,38 @@ describe('calc', () => {
         });
       });
     });
+
+    inGens(8, 9, ({gen, calculate, Pokemon, Move, Field}) => {
+      test('Steely Spirit should boost Steel-type moves as a field effect.', () => {
+        const pokemon = Pokemon('Perrserker', {
+          ability: 'Battle Armor',
+        });
+
+        const move = Move('Iron Head');
+
+        let result = calculate(pokemon, pokemon, move);
+
+        expect(result.desc()).toBe(
+          '0 Atk Perrserker Iron Head vs. 0 HP / 0 Def Perrserker: 46-55 (16.3 - 19.5%) -- possible 6HKO'
+        );
+
+        const field = Field({attackerSide: {isSteelySpirit: true}});
+
+        result = calculate(pokemon, pokemon, move, field);
+
+        expect(result.desc()).toBe(
+          '0 Atk Perrserker with an ally\'s Steely Spirit Iron Head vs. 0 HP / 0 Def Perrserker: 70-83 (24.9 - 29.5%) -- 99.9% chance to 4HKO'
+        );
+
+        pokemon.ability = 'Steely Spirit' as AbilityName;
+
+        result = calculate(pokemon, pokemon, move, field);
+
+        expect(result.desc()).toBe(
+          '0 Atk Steely Spirit Perrserker with an ally\'s Steely Spirit Iron Head vs. 0 HP / 0 Def Perrserker: 105-124 (37.3 - 44.1%) -- guaranteed 3HKO'
+        );
+      });
+    });
   });
 
 
diff --git a/src/index.template.html b/src/index.template.html
index fd8f0b1be..d527c0f73 100644
--- a/src/index.template.html
+++ b/src/index.template.html
@@ -954,6 +954,17 @@
                                 <label class="btn btn-xxwide" for="flowerGiftR">Flower Gift</label>
                             </div></td>
                         </tr>
+                        <tr class="gen-specific g8 g9">
+                            <td><div class="left" title="Is the Pok&eacute;mon affected by an ally's Steely Spirit?">
+                                <div hidden id="selectSteelySpiritInstruction">Is the Pok&eacute;mon affected by an ally's Steely Spirit?</div>
+                                <input aria-describedby="selectSteelySpiritInstruction" class="visually-hidden calc-trigger" type="checkbox" id="steelySpiritL" />
+                                <label class="btn btn-xxwide" for="steelySpiritL">Steely Spirit</label>
+                            </div></td>
+                            <td><div class="right" title="Is the Pok&eacute;mon affected by an ally's Steely Spirit?">
+                                <input aria-describedby="selectSteelySpiritInstruction" class="visually-hidden calc-trigger" type="checkbox" id="steelySpiritR" />
+                                <label class="btn btn-xxwide" for="steelySpiritR">Steely Spirit</label>
+                            </div></td>
+                        </tr>
                         <tr class="gen-specific g5 g6 g7 g8 g9">
                             <td><div class="left" title="Is the Pok&eacute;mon protected by an ally's Friend Guard?">
                                 <div hidden id="selectFriendGuardInstruction">Is the Pok&eacute;mon protected by an ally's Friend Guard?</div>
diff --git a/src/js/shared_controls.js b/src/js/shared_controls.js
index feec7e57e..9f92cb0c5 100644
--- a/src/js/shared_controls.js
+++ b/src/js/shared_controls.js
@@ -1188,6 +1188,7 @@ function createField() {
 	var isHelpingHand = [$("#helpingHandL").prop("checked"), $("#helpingHandR").prop("checked")];
 	var isTailwind = [$("#tailwindL").prop("checked"), $("#tailwindR").prop("checked")];
 	var isFlowerGift = [$("#flowerGiftL").prop("checked"), $("#flowerGiftR").prop("checked")];
+	var isSteelySpirit = [$("#steelySpiritL").prop("checked"), $("#steelySpiritR").prop("checked")];
 	var isFriendGuard = [$("#friendGuardL").prop("checked"), $("#friendGuardR").prop("checked")];
 	var isAuroraVeil = [$("#auroraVeilL").prop("checked"), $("#auroraVeilR").prop("checked")];
 	var isBattery = [$("#batteryL").prop("checked"), $("#batteryR").prop("checked")];
@@ -1200,7 +1201,7 @@ function createField() {
 			spikes: spikes[i], isSR: isSR[i], steelsurge: steelsurge[i],
 			vinelash: vinelash[i], wildfire: wildfire[i], cannonade: cannonade[i], volcalith: volcalith[i],
 			isReflect: isReflect[i], isLightScreen: isLightScreen[i],
-			isProtected: isProtected[i], isSeeded: isSeeded[i], isForesight: isForesight[i],
+			isProtected: isProtected[i], isSeeded: isSeeded[i], isForesight: isForesight[i], isSteelySpirit: isSteelySpirit[i],
 			isTailwind: isTailwind[i], isHelpingHand: isHelpingHand[i], isFlowerGift: isFlowerGift[i], isFriendGuard: isFriendGuard[i],
 			isAuroraVeil: isAuroraVeil[i], isBattery: isBattery[i], isPowerSpot: isPowerSpot[i], isSwitching: isSwitchingOut[i] ? 'out' : undefined
 		});
diff --git a/src/randoms.template.html b/src/randoms.template.html
index 6b9c08a9b..18517a2d4 100644
--- a/src/randoms.template.html
+++ b/src/randoms.template.html
@@ -949,6 +949,17 @@
                                 <label class="btn btn-xxwide" for="flowerGiftR">Flower Gift</label>
                             </div></td>
                         </tr>
+                        <tr class="gen-specific g8 g9 hide">
+                            <td><div class="left" title="Is the Pok&eacute;mon affected by an ally's Steely Spirit?">
+                                <div hidden id="selectSteelySpiritInstruction">Is the Pok&eacute;mon affected by an ally's Steely Spirit?</div>
+                                <input aria-describedby="selectSteelySpiritInstruction" class="visually-hidden calc-trigger" type="checkbox" id="steelySpiritL" />
+                                <label class="btn btn-xxwide" for="steelySpiritL">Steely Spirit</label>
+                            </div></td>
+                            <td><div class="right" title="Is the Pok&eacute;mon affected by an ally's Steely Spirit?">
+                                <input aria-describedby="selectSteelySpiritInstruction" class="visually-hidden calc-trigger" type="checkbox" id="steelySpiritR" />
+                                <label class="btn btn-xxwide" for="steelySpiritR">Steely Spirit</label>
+                            </div></td>
+                        </tr>
                         <tr class="gen-specific g5 g6 g7 g8 g9">
                             <td><div class="left" title="Is the Pok&eacute;mon protected by an ally's Friend Guard?">
                                 <div hidden id="selectFriendGuardInstruction">Is the Pok&eacute;mon protected by an ally's Friend Guard?</div>