My mozzarella is like cream cheese. It never firmed up.

This is usually due to the curd not being “healed” and cooked enough after cutting. The cubes did not get a chance to release enough whey so the final cheese contains too much moisture.

Lower the heat to the lowest setting when you have a clean break (a very clean slice that fills with whey immediately). After cutting, allow the cubes to sit and seep whey for about 1-2 minutes. Then move them ever so slowly in the whey while checking the bottom of the pot for larger pieces and cutting them as you go if needed. About 90% of the curd pieces should lose their sharp cut edges (they’ll look like scrambled eggs) and a piece should be able to be held without running right through your fingers (like yogurt would). This happens within 2-3 minutes as you slowly move the pieces in the warm whey maintained at 105-110F. It’s a subtle difference but a very important one. Patience pays off here.