To begin, prepare all vegetables: peel and dice the potatoes, slice the carrot thinly, and finely chop the onion and leek. Set them aside separately to maintain even cooking.
In a large, heavy based pot, melt the butter over medium heat. Add the chopped onion and sauté gently until translucent, about 3–4 minutes. Stir often to prevent browning, as you want the base to stay sweet and delicate.
Add the sliced leek and carrot to the pot. Continue to cook for another 3 minutes, stirring occasionally. The vegetables should soften slightly but retain their bright colour for a fresher taste.
Pour in the fish stock (or water) and bring to a gentle simmer. Add the diced potatoes, bay leaf, whole peppercorns, and salt. Cook uncovered for 10–12 minutes, or until the potatoes are tender but not falling apart. Skim any foam from the surface for a clearer broth.
While the potatoes cook, lightly season the fish pieces with a pinch of salt. This will help firm them up and deepen their natural flavour when added to the soup.
Once the potatoes are tender, gently add the fish pieces into the simmering soup. Stir carefully to avoid breaking the fish. Simmer for another 5–7 minutes, just until the fish flakes easily with a fork.
Lower the heat to its minimum setting. Slowly pour in the milk (or single cream), stirring gently to blend without breaking the fish. Heat through without allowing the soup to boil, as boiling can cause the milk to curdle.
Taste the broth and adjust seasoning with extra salt or freshly ground white pepper as needed. Traditional Kalakeitto should taste mild and slightly sweet, never overly salty.
Turn off the heat and stir in most of the chopped fresh dill, reserving a little for garnish. Let the soup sit for 5 minutes to allow the flavours to meld gently.
Ladle the Kalakeitto into warm bowls and sprinkle with the reserved dill. Serve immediately with slices of dense rye bread on the side for a truly authentic Finnish meal. For added richness, offer a knob of butter atop the bread.