No milk and no long cooking times needed! Make Singapore-Style Milky Sliced Fish Soup at home—rich, nourishing, just tender fish, milky broth, and comforting flavours.

If you want to make the milky version of Singapore sliced fish soup at home, here’s how!
I recently came across a bag of fish bones from the wet market — the kind that’s usually sold very cheaply — and immediately knew what I wanted to make. A big pot of Singapore milky sliced fish soup.
This is one of those dishes that feels incredibly comforting and nourishing, yet surprisingly light. And despite how rich and opaque it looks, there’s actually no milk in it at all.
The best part? Unlike most soups that take hours to develop flavour, this one comes together fast. Active prep takes about 10 minutes, and the rest is just letting the pot do its thing.
Jump to Recipe
What is Singapore sliced fish soup?
Singapore sliced fish soup is a classic hawker dish made with fresh white fish slices served in a clean yet deeply savoury broth. There are clear versions, but for many people (myself included), the milky version is the ultimate.
At hawker centres, it’s common to assume that milk or evaporated milk is added to get that creamy, white broth. And to be fair, some stalls do add a splash of evaporated milk over an anchovy or chicken stock base.
But the traditional technique doesn’t rely on dairy at all.
The real deal gets its milky appearance from:
- frying fish bones until deeply golden
- then boiling them hard so the natural fats emulsify into the broth
That’s what turns a clear stock cloudy and white… no cream, no milk!
It’s a technique that looks impressive, but is actually very doable at home.
Why you’ll love this dish
Key ingredients (and why they matter)
Milky base soup
- Fish bones: Or the spare bits of a fish, such as the fish head and tail. This forms the foundation of the soup. Frying the bones builds flavour, and boiling them hard releases natural fats and collagen that turn the broth milky — no dairy needed. Generally a whole fish is filleted – the fish slices will be used as the topping later, and the rest, including the head, gets turned into a soup. If you want an even richer flavour, and a more opaque soup, use a whole fish with the fish fillets still intact. Of course, it will cost more too.
- Fresh ginger: Adds warmth and fragrance while keeping the soup clean and balanced.
- Neutral oil: Essential for properly frying the fish bones. This step is key to achieving a rich, opaque broth.
- Water: Simple, but important. Using boiling water helps emulsify the fats quickly and gives you that signature white soup.
Fish
- White fish slices: Common choices include batang, grouper, snapper, or cod. Mild, flaky fish works best and only needs a short cooking time to stay tender.
- Light seasoning or marinade (optional): A touch of salt, white pepper, sesame oil, and cornstarch keeps the fish silky and well-seasoned without overpowering the broth.
Soup add-ins & finishing ingredients
- Napa cabbage: A very Singaporean addition! It turns tender and sweet as it cooks, balancing the richness of the milky broth.
- Tomatoes: Add light acidity and natural sweetness, which brightens the soup and keeps it from tasting flat.
- Scallions/Spring onions: Optional, but great for freshness and aroma at the end.
- White pepper and salt: Used sparingly. The soup should taste clean — the dipping sauce brings the punch.
Key steps to making it milky (no milk involved)
1. Prep the fish bones (important!)

- Wash the fish bones thoroughly under cold running water. Carefully remove any blood, dark membranes, or residue stuck along the spine and joints.
- Lightly sprinkle the fish bones with a small amount of salt and cornstarch, gently rubbing it over the surface. Rinse thoroughly under running water until clean, then pat dry.
2. Frying the Fish Bones

- Heat oil in a large pot over medium-high heat.
- Add fish bones and fry until deeply golden and slightly crusty — don’t rush this step. If possible, break the bones up further to help release more collagen.
- Add ginger (and scallions, if using) and fry for 30–60 seconds until fragrant.
3. Make the milky base soup

- Carefully pour in boiling water.
- The broth should start turning milky almost immediately. Bring to a rolling boil and keep boiling (not simmering) for 10 minutes until opaque and white.

- Turn off the heat. Strain the broth through a sieve to remove the bones, then return the milky soup to the pot.
4. Prepare the fish
- Gently mix fish slices with marinade ingredients (if using).
- Set aside for 10 minutes.
For fried fish slices (optional):
Lightly coat fish with additional cornstarch, shaking off excess.

- Pan fry: Fry over medium heat for 2–3 minutes, just until firm on the outside.
- Air fry: Place fish in the air fryer basket, lightly spritz with oil, and air fry at 200°C / 400°F for 4–5 minutes, flipping halfway and spritzing with more oil.
The fish should be just firm on the outside, lightly cooked, not browned.
Avoid a thick floury coating — these slices aren’t meant to be ultra-crispy like battered wings! Often times, cornstarch is not even included.
5. Assemble the soup

- Bring the strained soup base back to a boil.
- Add napa cabbage and tomatoes (or veggies of choice). Cook until cabbage is tender but still sweet.
- Season with salt and white pepper to taste.
- Lower heat to medium and add fish slices. If you fried the fish, serve it with the soup at the end.
- Cook for 1–2 minutes only, just until the fish turns opaque.
6. To Serve
- Carbs (make it a full meal!):
- Noodles: Thick bee hoon (or laksa noodles) are typical at hawker stalls, but any noodles you like will work. Add them to the soup for 1–2 minutes to heat through, then serve immediately.
- Rice: My personal favourite — serve a bowl of steamed white rice on the side.
- Finishing touches:
- Sprinkle with chopped scallions or spring onions for freshness.
- Serve hot with Singapore-style soy sauce + cili padi dipping sauce on the side. Dip the fish between spoonfuls of soup rather than pouring the sauce in.
How to serve Singapore sliced fish soup
This soup is best served hot and fresh, ladled into individual serving bowls.
It’s served with either noodles tossed in at the end, or with side serving or rice – which is personally my favourite way to have it.
And most importantly — with a dipping sauce on the side. This simple mix of light soy sauce, hot water, and finely chopped cili padi is non-negotiable! You dip the fish between spoonfuls of soup, never pour it into the bowl. That contrast of clean broth and punchy sauce is what makes the dish addictive.
Tips and tricks for the best fish soup
How to get clean soup with no fishy taste
1️⃣ Prep the fish bones properly
- Coat fish bones with salt and cornstarch. Rinse the fish bones thoroughly under cold running water and remove any bloody bits, especially around the spine and cavities.
- Pat dry well before cooking — this is crucial for a clean-tasting soup.
2️⃣ Fry the fish bones until deeply golden
- Heat oil over medium-high heat and fry the bones until deeply golden and slightly crusty. Don’t rush this step. Proper browning removes raw fish flavours and builds the base of a rich, savoury broth.
3️⃣ Add ginger at the right time
- Add sliced ginger only after the bones are well-browned. Fry briefly until fragrant — ginger should smell fresh and aromatic, not burnt.
4️⃣ Use boiling water and keep a rolling boil
- Pour in boiling water and bring the soup to a rolling boil. Keep it boiling (not simmering) to emulsify the natural fats — this is what turns the broth milky and prevents lingering fishiness.
5️⃣ Cook SLICED fish LAST and gently
- Add vegetables first, then fish slices last. Cook the fish just until opaque (1–2 minutes only).
- Overcooking releases proteins that dull the flavour and make the soup taste fishy.
- This is also why you’d might prefer to fry the sliced fish separately, to minimise the proteins leeching into the soup.
Storing and reheating
This soup is best eaten fresh, but you can store components separately.
To store
- Strain and store the soup base in an airtight container.
- Keep fish slices separate.
- Refrigerate for up to 2 days.
- The soup base can be frozen.
If the soup thickens slightly when cold, that’s a good sign! It’s the collagen doing its thing.
To reheat
- Bring the soup back to a boil.
- Add fresh or leftover fish slices only at the end.
- Avoid reheating fish for too long — it will toughen.







