Recipe Ten · Teochew

Sliced Fish Soup

潮州鱼片汤
The Crown Jewel of Teochew "Ching" Cooking
A tall, slightly cloudy off-white milky soup in a clear glass bowl — batang fish slices visible, slices of tomato, bittergourd, ginger curls floating, coriander on top. Steam rising. Bee hoon on the side, soy + cili padi dip beside.
Heritage Note from Hock Ko

If you want to taste Teochew philosophy in one bowl, this is it.

Teochew cooking believes in letting the ingredient speak. Sliced fish soup is the dish where this is most obvious — clear or milky broth, fresh fish slices, very few aromatics. No heavy stocks. No layered seasoning. Just fish and patience.

The Singapore version evolved through the post-war years. Heritage stalls — Han Kee at Amoy Street, Piao Ji at Amoy Street, Beach Road Fish Head Bee Hoon at Whampoa, Kwang Kee at Newton, 928 Yishun, Albert Centre — each has their own twist. Some clear, some milky, some with evaporated milk, some with Chinese wine.

The "milky" effect is the Teochew secret — and most Singaporeans assume it's evaporated milk. It can be evaporated milk in some stalls. But the traditional technique is dairy-free: hard-fry fish bones in hot oil, then add boiling water — the violent emulsification of fish gelatin and fat creates a naturally milky broth, like Japanese tonkotsu uses pork bones.

The fish of choice is batang (Spanish mackerel) — firm, lightly sweet flesh. Other options: song fish (grass carp), pomfret, garoupa, red snapper. Each has a slightly different character. Batang is the Singapore standard.

This is one of the most commercially viable dishes for a young hawker. High demand, low ingredient cost, healthy positioning, fast service. The 928 Yishun queue is proof.

Serves
4
Active Time
30 min
Total Time
1 hr
Difficulty
★★★

🛒Ingredients

The naturally milky broth, the marinated fish, the per-bowl assembly. The technique is the secret — no dairy needed.

For the Naturally Milky Fish Stock

Fish bones (batang head + spine)1 kgAsk fishmonger for "fish frames" — the cleaned skeleton + head. Cheap if you ask nicely.
Pork bones300 gOptional, for body. Adds complexity; can omit for fish-purist version.
Ginger50 gSliced thick.
Spring onions (whole stalks)4Knotted.
Napa / Chinese cabbage200 gChopped. Heritage addition — sweetens the broth naturally.
Dried sole fish (ti po)10 gToasted.
Pork lard or neutral oil4 tbsp
Saltto taste
White pepper½ tsp
Water2.5 LMust be boiling-hot when added — see Master's Tip.

For the Sliced Fish

Fresh batang fillet500 gCleaned, sliced 5 mm thick against the grain. Remove pin bones. Snapper or grouper substitute.
Light soy sauce1 tsp
Sesame oil1 tsp
Shaoxing wine1 tsp
White peppera pinch
Cornflour½ tsp

For Each Bowl

Thick bee hoon (rice vermicelli)80 gCooked to package instructions.
Fresh tomato4–5 slices
Fresh bittergourda few slicesBlanched 30 sec — heritage Teochew touch.
Bok choy or chye sim100 gBlanched.
Chinese rice wine (Shaoxing or Hua Tiao)1 tspFinishing splash.
Fried shallots1 tbsp
Coriander leavesa pinch
Spring oniona pinchChopped.

Dipping Sauce

Light soy sauce2 tbsp
cili padi (bird's-eye chilli)1Finely sliced.
Hot water1 tspTo mellow the soy.

🌶️Shifu's Lift

choose one path — see "Shifu's Secret" chapter for the philosophy
  • Old-school path: ¼ tsp MSG to broth
  • Modern hawker path: ½ tsp chicken stock powder
  • Heritage purist path: Already covered with sole fish + cabbage technique
  • Optional premium: 1 tbsp evaporated milk per bowl AT THE END (not during simmering — see Master's Tip)

👨‍🍳Method

Three stages. Stage 2 is the alchemy — hard-fry the bones, then boiling water. Watch the splatter.

1Stage

Marinate the Fish

Slice batang fillet against the grain into 5 mm pieces. Toss with light soy, sesame oil, Shaoxing wine, white pepper, cornflour. Set aside in fridge for 15 minutes.

Step illustration: slicing the batang fillet against the grain into 5mm pieces, marinade ingredients beside.
Stage 1 — slice against the grain. 5 mm. Marinade for 15.
2Stage

The Milky Broth Technique

Wash fish bones thoroughly under cold water. Remove all dark blood, gills, and membranes — these cause cloudiness AND fishiness. Critical step.

Pat bones bone-dry with paper towel. Wet bones cause oil to splatter dangerously.

In a large pot or wok, heat 4 tbsp lard or oil over medium-high heat until shimmering. Add fish bones — carefully, they will splatter. Add ginger slices.

Fry hard for 5–6 minutes, turning occasionally, until the bones are deeply golden and the lard turns slightly opaque. This is the magic step — frying the bones hard.

Now the alchemy: immediately pour in 2.5 litres of boiling-hot water (have a kettle ready). The cold-water-vs-boiling-water distinction is critical — boiling water and hot oil emulsify the fish gelatin into a milky white broth.

Add cabbage, knotted spring onions, dried sole fish, pork bones (if using). Simmer gently, partly covered, for 45 minutes.

Strain through fine sieve. The broth should be naturally milky-white — like skim milk, slightly cloudy. Season with salt and pepper.

Step illustration: fish bones being hard-fried in lard, oil bubbling, golden brown colour, steam rising.
Stage 2a — hard-fry the bones. Five to six minutes, deep golden.
Step illustration: the moment of pouring boiling water into the hot oil and bones, dramatic cloud of steam, oil and water emulsifying.
Stage 2b — boiling water meets hot oil. The emulsification. The milky.
Critical moment: the milky-white broth strained, ready, the colour and translucence of skim milk.
The critical moment — naturally milky, no dairy. Just bones, oil, and boiling water.
3Stage

Cook & Assemble

Bring the strained milky broth back to a simmer.

Per bowl:

  1. Place pre-cooked thick bee hoon at the bottom of bowl.
  2. Add tomato slices, bittergourd, bok choy.
  3. Carefully drop 8–10 slices of marinated batang into the simmering broth. They cook in 60–90 seconds — when they turn opaque, they're done. Do not over-cook.
  4. Ladle the hot broth and fish slices over the bee hoon.
  5. Splash 1 tsp of Shaoxing wine on top.
  6. Garnish with fried shallots, coriander, spring onion.

Serve with the soy + chilli dip on the side. Dip the fish in the sauce between spoonfuls of broth — never pour the sauce into the soup itself.

🎯The Three Tips

Heritage. Master's. Mistake.

🏛 Heritage Note

The Soy Dip is Sacred

The chilli-soy dip is not optional. It is the third dimension of the dish. The clean broth is one note. The fish is another. The dip — sharp, hot, salty, immediate — is the third.

Old-school Teochew etiquette: dip the fish slice, eat with rice or noodles, then sip the broth. Repeat. Never pour the dip into the soup — that combines the notes and you lose the contrast.

This is why "Singapore fish soup" stalls without a proper dipping sauce are not Teochew fish soup. They're something else entirely.

👨‍🍳 Master's Tip

Hard Fry, Hot Water

The naturally milky broth depends on two things:

  1. Hard frying the fish bones. The Maillard browning + gelatin extraction happens only at high heat. Soft-poaching bones gives a clear broth, not a milky one.
  2. Boiling water (not cold water) hits the hot oil. This causes immediate, violent emulsification. The emulsified fat globules suspend in the broth, scattering light, creating the milky appearance.

If you do this right, you don't need evaporated milk. Many heritage stalls add evaporated milk at the end as a style choice, not a necessity. The traditional Teochew technique gives you natural milkiness from the bones alone.

For premium positioning: skip the evaporated milk. Tell customers your milkiness is "100% from fish bones, no dairy." This is a real differentiator.

⚠ Common Mistake

Fishy Broth

If your broth tastes "fishy" in a bad way (not the clean, sweet-fishy of good Teochew soup, but rancid, ammonia-like off-fishiness):

  1. You did not clean the fish bones properly. Blood and dark membranes cause off-fishiness. Fix: Soak fish bones in cold salted water for 15 minutes before frying. Rinse thoroughly. Remove gills, dark membranes, all visible blood clots.
  2. You used old fish. Same-day catch only for the bones AND the fish slices. Fix: Build a relationship with a fishmonger. Buy at the morning market.
  3. You boiled the broth at full rolling boil. Hard boiling extracts bitter compounds. Fix: Gentle simmer only. The broth should murmur, not roar.
📈 Scaling for Hawker Service

One of the highest-margin hawker categories in Singapore

  • Volume: A successful sliced fish stall (like 928 Yishun, Han Kee) does 300–600 bowls a day.
  • Daily fish needs: 8–15 kg fillet + 4–8 kg bones, depending on traffic. Source from Jurong Fishery Port at 4–5am.
  • Broth production: 25 L of milky stock prepared from 5am, ready by 10am opening. Make a second batch at 1pm for dinner service — the morning batch cannot last all day without losing brightness.
  • Slice on demand: Slice fish fresh per order, not in bulk. Pre-sliced fish loses moisture and turns rubbery within 30 minutes.
  • Premium upsell: Regular sliced batang (SGD 6), fried fish (SGD 7), fish + prawn combo (SGD 9), pomfret head (SGD 10–14), grouper sliced (SGD 12–18).
  • Cost (Singapore 2026): Per bowl ~SGD 2.20 (fish 1.20 + broth amortised 0.50 + bee hoon/sides 0.50). Sells SGD 6–18. Margin: 65–80% — one of the most profitable hawker categories.
You serve fish soup like you tell the truth — clean, direct, with nothing hiding behind it. The Teochew way.
— Hock Ko