Pour 1 gallon of milk into a large pot or Dutch oven. Place it on the stove and clip on your thermometer.
Slowly heat the milk to 55°F, stirring gently. Add the citric acid solution while stirring in an up-and-down motion. Don’t over-mix. Continue heating slowly.
At 88°F, stir in the rennet mixture with the same gentle up-and-down motion. Continue heating until the milk reaches 105°F, then cover the pot and let it sit for 5–10 minutes. Check the curd formation. You should see a firm curd that gives a clean break when cut.
Use a long knife to cut the curd into 1-inch cubes. Let them rest for 5 minutes to firm up.
Return the pot to the stove, and the salt and gently heat until the curds and whey reach about 150 - 170°F—hot enough for stretching but not boiling.
With gloved hands or a slotted spoon, lift curds directly from the hot whey and begin stretching and folding them back on themselves. Dip them back into the hot whey often to keep them pliable and glossy. Continue until the cheese becomes smooth, elastic, and shiny. See troubleshooting below if your cheese isn't stretching.
Sprinkle in an additional 1 teaspoon of cheese salt (or more to taste) and knead it in as you stretch. Keep dipping into the hot whey so the curds stay flexible.
Shape the fresh mozzarella cheese into balls or logs. Dunk each mozzarella ball into a bowl of ice water for a few minutes to set the shape and cool it down.