Sliced Fish Soup
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.
🛒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 kg | Ask fishmonger for "fish frames" — the cleaned skeleton + head. Cheap if you ask nicely. |
| Pork bones | 300 g | Optional, for body. Adds complexity; can omit for fish-purist version. |
| Ginger | 50 g | Sliced thick. |
| Spring onions (whole stalks) | 4 | Knotted. |
| Napa / Chinese cabbage | 200 g | Chopped. Heritage addition — sweetens the broth naturally. |
| Dried sole fish (ti po) | 10 g | Toasted. |
| Pork lard or neutral oil | 4 tbsp | |
| Salt | to taste | |
| White pepper | ½ tsp | |
| Water | 2.5 L | Must be boiling-hot when added — see Master's Tip. |
For the Sliced Fish
| Fresh batang fillet | 500 g | Cleaned, sliced 5 mm thick against the grain. Remove pin bones. Snapper or grouper substitute. |
| Light soy sauce | 1 tsp | |
| Sesame oil | 1 tsp | |
| Shaoxing wine | 1 tsp | |
| White pepper | a pinch | |
| Cornflour | ½ tsp |
For Each Bowl
| Thick bee hoon (rice vermicelli) | 80 g | Cooked to package instructions. |
| Fresh tomato | 4–5 slices | |
| Fresh bittergourd | a few slices | Blanched 30 sec — heritage Teochew touch. |
| Bok choy or chye sim | 100 g | Blanched. |
| Chinese rice wine (Shaoxing or Hua Tiao) | 1 tsp | Finishing splash. |
| Fried shallots | 1 tbsp | |
| Coriander leaves | a pinch | |
| Spring onion | a pinch | Chopped. |
Dipping Sauce
| Light soy sauce | 2 tbsp | |
| cili padi (bird's-eye chilli) | 1 | Finely sliced. |
| Hot water | 1 tsp | To 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.
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.
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.
Cook & Assemble
Bring the strained milky broth back to a simmer.
Per bowl:
- Place pre-cooked thick bee hoon at the bottom of bowl.
- Add tomato slices, bittergourd, bok choy.
- 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.
- Ladle the hot broth and fish slices over the bee hoon.
- Splash 1 tsp of Shaoxing wine on top.
- 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:
- 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.
- 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):
- 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.
- 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.
- 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.