Pour milk to a heavy bottom pot & bring it to a gentle boil on a medium heat. Keep stirring occasionally to ensure the milk doesn't get scorched at the bottom.
Meanwhile place a colander over a large bowl to collect the whey. Spread a cheese cloth over the colander.
When the milk comes to a boil, turn off the stove and pour 2 tablespoons of vinegar.
Stir it well for 1 to 2 mins until the entire milk curdles completely. (milk solids begin to separate from the whey). When done correctly whey will be not be milky any more but will be clear.
Troubleshooting: If you see the milk doesn't curdle fully, then add 1 tbsp vinegar and turn ON the stove. Boil the milk on a medium heat until the whole pot of milk curdles. Turn off as soon as you see it curdles. If you continue to cook at this stage, paneer can become hard.
Gently pour the entire paneer along with whey to the colander. Pour some cold water to stop the paneer from cooking further.
Rinse it under running water to remove the smell & taste of the vinegar.
Wring the cheese cloth making a round shape of the paneer. Squeeze any excess whey or water. Make a knot and hang the paneer for 30 mins so the excess whey drains.
Remove the knot and twist the edges of the cloth. Place the cheese cloth along with the paneer on a flat colander or a wooden board. Press down the cloth & place a heavy object on it for the paneer to set. (check the video below)
I usually put a pot or cast iron pan over the paneer and then place a 2 to 3 kg rice pack.
After 3 to 4 hours, remove the cloth and cut the paneer to cubes.
Refrigerate the homemade paneer and use up with 2 to 3 weeks. Or freeze up to 3 months.
Avoid overcooking the paneer after adding it to the curry. It does not need much cooking. I generally add it to the gravy and turn off the stove. Keep the pan covered so the paneer absorbs the flavors.