Preheat oven to 400°F.
Optional - I like to precook the potatoes in my Instant Pot so they are nice and fluffy. I put them in a strainer basket with one cup of water in the bottom and cook at high pressure for 3 minutes, then quick release. They are nice and pillowy soft in the frittata this way. (If you don't have an Instant Pot, you can boil them on the stove until they are fork-tender, then strain them.)
Melt butter in a large oven-safe skillet over medium heat.
Once the butter is melted, add onions and potatoes to the skillet.
Cook until onions are translucent and the potatoes have a little crisp on the edges. (Pre-cooking the potatoes will get the edges crispy and the inside fluffy.)
While onions and potatoes are cooking, whisk cream, eggs, kosher salt, and pepper together in a large bowl. Add about ¾ of the cheese to the eggs.
When the potatoes and onions are cooked, pour in the egg mixture and spread the potatoes out evenly in the eggs.
Let the eggs set on the edges, then add the ham. Spread a spatula around the edges once or twice to make sure it has set and it isn't sticking to the pan.
Cook on the stove until the frittata is mostly set and the edges start to harden - the top will still be soupy but you should be able to run a spoon or spatula cleanly under the sides of the frittata.
Sprinkle the remaining cheese on top of the frittata and place it in the warm oven and bake for 8 - 10 minutes. The frittata is ready when the edges are golden brown and the top is no longer runny. Try not to overcook the eggs or they can get tough - slightly underdone is okay because the frittata will continue cooking a little as it cools.
Serve immediately, garnished with fresh cracked pepper and salt, green onions or chives, sliced tomatoes, or even a dollop of sour cream. I have also seen people add a little bit of hot sauce.