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

  • Naturally milky without dairy: The richness comes purely from fish bones and technique.
  • Fast, not fussy: Active cooking time is short, making it perfect for weeknights.
  • Nutritious and nourishing: Fish bones release gelatin and collagen as they boil, giving the soup body and that slightly sticky, lip-coating feel.
  • Light yet satisfying: Clean-tasting, not greasy, but still deeply comforting.
  • Affordable at home: Fish bones are inexpensive at wet markets and fishmongers, which makes this far more economical to cook yourself.
  • Customisable: Add sliced fish, fried fish, napa cabbage, tomatoes, or tofu — it adapts easily.

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.
  • NOTE: This step is not to season. This step helps draw out impurities and odour-causing proteins, resulting in a cleaner, sweeter-tasting broth.

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

  • Don’t overcrowd the pot when frying bones: You want proper browning, not steaming.
  • Boiling = milky, simmering = clear: If your soup isn’t turning white, turn the heat up.
  • Add vegetables before the fish: Let them release their sweetness into the broth first.
  • Season lightly: The dipping sauce provides most of the salt and heat.
  • Use the freshest fish you can: This soup is simple — freshness really matters.

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.



Singapore Sliced Fish Soup (Milky, No Milk)

Recipe by Sha
5.0 from 2 votes
Course: 30 Minutes u0026amp; Under, Asian, Curries, Soups u0026amp; Stews, Dinner, Easy Weeknight, Recipes, Seafood, Singaporean
Servings
+

4

servings
Prep time

10

minutes
Cooking time

15

minutes

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

Cook Mode

Keep the screen of your device on

Ingredients

  • Milky Base Soup
  • 400 g fish bones (14 oz)

  • 2–3 tbsp neutral oil

  • 3–4 inches ginger, sliced (8–10 cm)

  • 1.5 litres boiling water (6 cups)

  • 8–10 scallions/spring onions, cut into large sections (optional)

  • Fish
  • 400–500 g white fish fillets, thinly sliced (14–18 oz) (batang, grouper, snapper, cod)

  • Optional light marinade
  • 1 tsp salt

  • ½ tsp white pepper

  • 1 tsp cornstarch (optional)

  • Soup Add-Ins & Seasoning
  • 3 cups napa cabbage, chopped

  • 2 tomatoes, wedged

  • 2 tsp salt, or to taste

  • ½ tsp white pepper, or to taste

  • Extra chopped scallions, to finish

  • To Serve
  • 4 servings rice and/or noodles of choice (such as thick bee hoon noodles)

  • Cili padi soy dipping sauce

Directions

  • Prep the fish bones
  • Rinse fish bones thoroughly under cold running water, removing any blood or dark residue.
  • Lightly rub with a small amount of salt and cornstarch.
  • Rinse clean again and pat dry with paper towels.
  • Fry the bones
  • Heat oil in a large pot over medium-high heat.
  • Add fish bones and fry until deeply golden and slightly crusty.
  • Add ginger (and scallions, if using) and fry for 30–60 seconds until fragrant.
  • Make the milky base
  • With the heat still high, carefully pour in boiling water.
  • Bring to a rolling boil and keep boiling (not simmering) for 10 minutes, until the broth turns opaque and milky.
  • Strain out the bones and return the milky soup back to the pot.
  • Prepare the sliced fish
  • Gently mix fish slices with marinade ingredients (if using) and 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. Fish should be just firm, not browned.
  • Assemble the soup
  • Bring the soup base back to a boil.
  • Add napa cabbage and tomatoes and cook for 4–5 minutes, until tender but still sweet.
  • Season with salt and white pepper to taste.
  • Lower heat to medium, add fish slices (if not fried), and cook for 1–2 minutes, just until opaque.
  • To serve
  • Serve with Singapore-style cili padi soy sauce dipping sauce on the side.
  • Serve hot with noodles (thick bee hoon or laksa noodles, added to the soup for 1–2 minutes) or with steamed white rice.
  • Finish with chopped scallions or spring onions. Serve and enjoy!
Instagram

Did you make this recipe?

Tag @nomadetteats on Instagram


Keep Up with Nomadette

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.