Prep your ingredients: Dice the potatoes into small ½-inch cubes for faster cooking. Chop the onion, pepper, and ham.
Shred the cheese and wash the spinach. Crack the eggs into a bowl and whisk with a pinch of salt, pepper, and the milk or cream if using.
Cook the potatoes: Heat the oil and butter in a large skillet over medium heat. Add the diced potatoes with a pinch of salt and smoked paprika.
Cook, stirring occasionally, until golden and tender, about 10–12 minutes. If they start to brown too fast, lower the heat and cover for a few minutes.
Sauté aromatics: Add the onion and bell pepper to the skillet. Cook 3–4 minutes until softened.
Stir in the garlic and cook 30 seconds, just until fragrant.
Add the ham: Stir in the diced ham. Cook 2–3 minutes to warm through and lightly brown the edges. Taste and season with more salt and pepper as needed.
Wilt the spinach: Add the spinach in handfuls.
Toss until just wilted, 1–2 minutes. If using frozen spinach, make sure it’s well-drained and cook off any extra moisture.
Create wells for the eggs: Use a spoon to make 4–6 small pockets in the hash. Pour a little oil into each well if the pan looks dry.
Carefully pour a whisked egg into each well, or crack eggs directly if you prefer sunny-side up.
Cheese it up: Sprinkle cheese evenly over the skillet, avoiding the egg yolks if you want them to show. Reduce heat to medium-low. Cover the pan and cook until egg whites are set and yolks are done to your liking, about 4–7 minutes.
Finish and serve: Sprinkle red pepper flakes and fresh herbs if you like.
Taste and adjust seasoning. Serve hot straight from the skillet.