Preheat oven to 375°F.
Make the Cream Sauce: Add butter to a skillet heated to medium heat and melt. Add in the garlic and sauté for about 1 minute. Add in the sliced onions and heat stirring frequently for about 4-5 minutes or until they become slightly softened.
Add the flour into the pan and whisk continuously for about 1 minute. Gradually pour in the milk and whisk until smooth and then follow with the broth. Add in the 1/2 tsp. salt, pepper and smoked paprika.
Continue to cook the sauce for another 2-4 minutes, whisking regularly, allowing it to thicken. Adjust heat as needed so as not to boil the mixture.
Once the cream sauce has thickened, (it should coat the back of the spoon) remove from heat and stir in the parmesan, allowing it to melt. Add any fresh herbs to the sauce you would like to add at this time. Set the cream sauce aside briefly.
Assemble the Dish: Add half of the potatoes to a well greased 9×13 inch baking pan. Sprinkle sea salt over top (using the other half of the sea salt, more if desired--you can add pepper here as well.)
Spoon half of the cream sauce and spread to cover the layer of potatoes. Sprinkle 1 cup of the shredded gruyere over top of the sauce.
Add the remaining potatoes over top of the cheese , adding another sprinkle of sea salt and pour remaining cream sauce and cheese over top–you can really cover with the cheese–no need to just stick to one cup!
Bake tightly covered with foil for about 35-40 minutes and then uncovered for about another 35-40 minutes, more as needed until potatoes are nice and soft, cheese is browned and bubbling.
Allow to rest for about 15 minutes before serving. Serving suggestion: sprinkle chopped chives, thyme or parsley over top.