Tahu campur: fried tofu, beef, yellow noodles, lontong, bean sprouts and lettuce layered in a dark brown broth
Serves4 servings
CuisineIndonesian

Tahu Campur: Surabaya Fried Tofu and Beef Soup with Shrimp Paste

Tahu campur from Surabaya, East Java: fried tofu, noodles and beef broth tied with petis shrimp paste. Covers half-dry tofu, lento fritters and petis swaps.

Level: Intermediate

Cooking flow

Cooking steps

STEP 11 / 10

Simmer the beef

Beef brisket simmering in water in a deep pot while the foam is skimmed off
Skim while the foam is still grey and loose; once it boils back in, the broth clouds

Put the brisket and the water in a deep pot and bring it to a boil. Skim off the grey foam as it rises so the broth stays clear, then lower the heat to a gentle, steady bubble. If the water drops too far, top it up with boiling water rather than cold. As a rough guide, an ordinary pot takes 60 to 90 minutes, but judge by the meat, not the clock. The beef is ready when the fibres split apart under a firm press of your finger.

STEP 22 / 10

Grind and fry the spice paste

Spice paste frying in a pan, with galangal and lemongrass ready to go in
The paste should look glossy and slightly separated from its oil before the aromatics go in

Pound or blend the garlic, shallots, fresh turmeric, black pepper, cumin and salt for the paste into a smooth, thick paste. Heat the oil in a frying pan and fry the paste, stirring, until it darkens and smells cooked. Add the galangal, lemongrass and lime leaves and keep frying until they soften. The paste is done when the oil turns reddish-brown and the raw, powdery smell is gone.

STEP 33 / 10

Season the broth

Fried spice paste and sweet soy sauce added to the beef broth, turning it dark brown
Pour the sweet soy in a thin stream and stir; the broth darkens to reddish-brown almost at once

Scrape the fried paste and aromatics into the beef pot. Add the palm sugar and sweet soy sauce, bring the broth back to a boil and let it simmer so the beef takes on the seasoning. If the liquid has reduced too far, add hot water. The broth is ready when it is a deep, clear brown and tastes sweet first, with the spices behind it. Hold off on extra salt until everything else is done.

STEP 44 / 10

Fry the tofu until half-dry

Tofu blocks frying in a wok until faintly coloured, then draining on a rack
Only the edges should catch colour; the faces stay pale cream

Wrap the tofu blocks in paper towels and press out the surface water. Slide them into hot oil and fry until they are setengah kering, half-dry: the surface is dry and lightly coloured, short of golden brown. Lift them onto a rack to drain, then cut them into bite-size pieces. The inside should still be pale and soft when you cut through.

Stop before golden

Half-dry is the cue. A pale, dry skin soaks up broth and petis in the bowl; tofu fried to deep brown turns tough and stops absorbing.

Hot oil

Wet tofu spatters hard in hot oil. Dry it well, lower it in away from you, and keep children and pets away from the stove.

STEP 55 / 10

Make the petis sauce

Green chillies and petis pounded together and loosened with warm water into a dark sauce
Add the water in splashes; the sauce should fall from the spoon in a thick ribbon

Steam or stir-fry the green chillies until they are soft and cooked through. Pound them with 3 tablespoons of the petis and the salt, then loosen the mixture with the warm water. Taste, and work in the rest of the petis a little at a time up to the full amount. Bring the sauce to a boil once in a small saucepan, then let it cool; the heat softens its flavour slightly. It is ready when it is dark, glossy and pourable but still thick.

Petis decides the salt

Brands of petis vary widely in saltiness and sweetness. Start with 3 tablespoons and taste before adding the rest, because petis and sweet soy sauce together move the salt of the whole bowl more than anything else.

STEP 66 / 10

Mix the lento

STEP 6

Dry-toast the cumin and coriander seed in a dry pan until fragrant. Pound them with the garlic, kencur and ground turmeric into a paste. Mix the paste into the grated cassava with the spring onions and salt to taste. If the cassava is very wet, squeeze out a little of the liquid. The mixture is right when a spoonful holds its shape when pressed.

STEP 77 / 10

Shape and fry the lento

Grated cassava shaped into small ovals and fried into golden lento
The raw mix looks fibrous and moist, never smooth like dough

Shape the mixture into small, flat ovals, about the size of croquettes. Fry them in hot oil, turning once. Lift them out when the outside is crisp and golden brown, and drain them on paper. The centres should be tender while the shell crackles when tapped.

STEP 88 / 10

Prepare the bowl components

STEP 8

Slice the lontong into rounds. Bring a pot of water to a boil and cook the bean sprouts until they are fully cooked rather than just scalded, then drain them. Lift the beef out of the broth and slice it. Shake the noodles loose and keep the broth at a simmer. Everything is ready when the sprouts have lost their raw snap and the broth is steaming.

STEP 99 / 10

Assemble the bowls

Lettuce, lontong, noodles, sprouts, fried tofu and beef layered in a bowl as hot broth is poured over
Pour around the edge so the stack stays intact and the beef keeps its place on top

Lay lettuce in the bottom of each bowl. Layer on the lontong, noodles, bean sprouts, fried tofu and beef in that order. Pour plenty of hot broth over everything, and do it just before serving. The bowl is ready when the broth rises around the layers and the top slices of beef sit just above it.

STEP 1010 / 10

Finish and mix at the table

Mixing the petis sauce through a bowl of tahu campur with a spoon
Fold from the bottom up so the lontong and noodles pick up the sauce too

Scatter fried shallots over the top and add the crackers and lento. Serve the petis sauce alongside, so each person can spoon in as much as they like. Just before eating, stir the whole bowl until the sauce dissolves into the broth. It is ready to eat when the broth has turned slightly cloudy and darker where the sauce has melted in.

0 / 0
Ingredients

Ingredients

1 / 1

Ingredients

Ingredient Amount Role
Beef brisket (daging sandung lamur sapi) 1.1 lb (500 g) Broth base and topping; a cut with fat gives the best broth
Water 8⅓ cups (2 L) Simmering the beef and the broth itself
Palm sugar (gula merah) 1 oz (30 g) Sweetness and dark colour
Sweet soy sauce (kecap manis) 4 tbsp Depth and brown colour
Galangal (lengkuas) ⅜-inch (1 cm) piece Backbone of the broth's aroma
Makrut lime leaves (daun jeruk) 2 Citrus aroma
Lemongrass (serai) 1 stalk, bruised Fresh, bright aroma
Garlic (bawang putih), for the paste 3 cloves Aromatic base
Shallots (bawang merah), for the paste 5 Sweetness and aroma
Fresh turmeric (kunyit), for the paste ¾-inch (2 cm) piece Yellow colour and earthy aroma
Black pepper (merica), for the paste ½ tsp Gentle heat
Cumin (jinten), for the paste ½ tsp Distinctive warm aroma
Salt (garam), for the paste 1 tbsp Base seasoning
Oil, for frying the paste 1–2 tbsp, as a guide Cooking the paste
Green bird's-eye chillies (cabe rawit hijau), for the sauce 10 Heat
Petis udang (fermented shrimp paste), for the sauce 5 tbsp Bittersweet, salty depth; the heart of the dish
Salt, for the sauce ½ tsp Sharpens the sauce
Warm water, for the sauce 1 cup (250 ml) Loosens the sauce
Large white tofu (tahu putih besar) 3 blocks Fried tofu
Yellow noodles (mie kuning) 1.1 lb (500 g) One of the two starches
Bean sprouts (tauge) 3½ oz (100 g) Crunch and lightness
Lontong (compressed rice cake) 4 rolls The other starch
Lettuce (selada) as needed Bed at the bottom of the bowl
Fried shallots (bawang merah goreng) as needed Toasty finish
Shrimp crackers or tapioca crackers (kerupuk udang / kanji) as needed Crisp contrast
Oil for deep-frying as needed Frying the tofu and lento
Grated cassava (singkong parut), for the lento 10½ oz (300 g) Body of the fritters
Spring onions, for the lento 2, thinly sliced Freshness and flecks of green
Cumin, for the lento 1 tsp, dry-toasted Aroma
Garlic, for the lento 3 cloves Aroma
Coriander seed, for the lento ½ tsp, dry-toasted Aroma
Kencur 1¼-inch (3 cm) piece Camphor-like aroma
Ground turmeric, for the lento 1 tbsp Colour and aroma
Salt, for the lento to taste Seasoning
0 / 0

The spoon goes in at the edge of the bowl, and a dark, glossy streak of chilli and shrimp paste starts to bleed into the broth. You fold it through lettuce, rice cake, yellow noodles, bean sprouts, fried tofu and slices of beef, and the shrimp crackers on top soften just enough at the corners. Tahu campur is a beef-broth bowl from the Surabaya area of East Java, sold at street stalls from midday into the night. The broth is deep brown and sweet from palm sugar and sweet soy sauce, and the petis sauce lands on top of it, salty, a little bitter and a little sweet, with the heat of green chillies running underneath. Every bite is different until you have stirred it all together.

A Village Dish That Carries Its Hometown's Name

Campur means "mixed", and the name describes what happens at the table rather than in the kitchen. Everything is cooked separately: the broth, the paste, the tofu, the fritters, the sauce. It only becomes one dish when the eater stirs the petis sauce, the fried shallots and the sambal through all of it. That final mixing is where the dish comes together, so it is left to the person holding the spoon.

The dish belongs to greater Surabaya, which takes in Surabaya itself, Lamongan, Gresik and Sidoarjo. Its home is usually given as Padenganploso, a village in Pucuk district of Lamongan regency. A gate at the entrance reads "Bumi Tahu Campur", the land of tahu campur, and villagers say that around nine in ten residents make their living selling it. As people from the village moved away and set up stalls elsewhere, the dish travelled with them, which is why so many stalls in Surabaya hang a sign reading "Tahu Campur Lamongan".

How it began is not settled, and two stories are told side by side. In one, a villager who had worked as a cook for a Dutch household during the colonial period came home and spread the dish. In the other, a soto seller with leftover tofu and bean sprouts added petis to them, and the combination stuck. Lamongan has already registered soto Lamongan and sego boranan as regional intellectual property and is working to do the same for tahu campur. In 2023 a bowl at a stall cost around 12,000 to 15,000 rupiah.

Surabaya style and Lamongan style

There are two distinct pots under the same name. The Surabaya style cooked here colours the broth dark brown with sweet soy sauce and palm sugar, and every bowl comes with lontong rice cake and lento, the spiced cassava fritter. The Lamongan style builds a clearer spiced broth from lemongrass, ginger, turmeric and cumin, sweetens it with plain sugar, uses no sweet soy or palm sugar, and does not list lontong. The two are different recipes, and blending their amounts gives you neither. Even within one style, every stall mixes its petis sauce to its own sweetness, so the range of flavour is wide.

Tahu campur shares the East Javanese love of a big, layered soup bowl with soto ayam, and its beef broth puts it near rawon, though rawon goes in a darker, earthier direction. Tahu gejrot from Cirebon is a separate dish: fried tofu in a thin sweet-sour sauce, with no broth at all. Tahu tek, also called tahu telur, is another neighbour that pairs fried tofu with egg and peanut sauce. More of the country's cooking is gathered on the Indonesia page.

Lento and its many recipes

Lento, also written lentho, is a small fried patty of grated cassava, sometimes called perkedel singkong. Recipes differ from cook to cook. The one here seasons raw grated cassava with kencur, turmeric, cumin and spring onion; another style uses steamed cassava with grated coconut, shallots, garlic and coriander. Each works on its own, so choose one rather than combining them.


Ingredients (serves 4)

Tahu campur ingredients laid out: beef, tofu, noodles, lontong, bean sprouts, lettuce, spices, petis and sweet soy sauce, with the coriander, turmeric powder, kencur, frying oil, water and crackers for the lento set apart
Keep the lento ingredients in their own group so the two spice mixes never cross
Allergen information

This dish contains wheat (noodles, crackers), soy (tofu, sweet soy sauce), crustaceans (petis udang, shrimp crackers) and beef. Depending on the type, crackers can also contain peanuts or coconut, so read the label. Petis is a fermented shrimp product; anyone with a crustacean allergy needs it replaced, and shrimp-based substitutes do not solve that.

Equipment

  • Deep pot large enough for 2 L of broth
  • Pressure cooker (optional, to soften the beef faster)
  • Frying pan for the spice paste
  • Wok or deep pan for frying the tofu and lento
  • Mortar and pestle, or a food processor
  • Small saucepan for the petis sauce
  • Slotted spoon, paper towels and a draining rack
  • Measuring cups and spoons

Choosing and Substituting

Petis udang is the one ingredient worth a special trip. Look for an East Javanese petis at an Asian grocer or online; it is thick, nearly black and smells deeply of shrimp. Shrimp miso with a little sugar gets you close in saltiness, but the sticky body and the bittersweet edge are hard to reproduce. Sweet soy sauce, palm sugar, galangal, frozen makrut lime leaves, lemongrass, kencur, frozen grated cassava and vacuum-packed lontong come from the same shops. Cumin, coriander and ground turmeric are in any spice aisle.

Buy a cut with fat

The broth draws its body from fat. Brisket gives the fullest broth; beef shank or chuck works, but with less fat the broth tastes shallower.

Ingredient Swap What changes
Palm sugar Unrefined dark cane sugar More toasty and bitter notes come forward
Sweet soy sauce Soy sauce with mirin or sugar Close in flavour, but thinner and differently sweet
Galangal Thai galangal; ginger only as a last resort Ginger gives a different aroma altogether
Fresh makrut lime leaves, lemongrass Dried Works, with weaker aroma
Shallots ½ small onion The sweetness changes character
Fresh turmeric ½–1 tsp ground turmeric Works for colour and earthiness
Cumin No good swap Leaving it out changes the outline of the aroma
Green bird's-eye chillies Red or dried chillies Heat stays, aroma changes
Yellow noodles Medium-thin alkaline Chinese noodles Close
Lontong Mochi or plain white rice Works, with a different texture
Kencur Leave it out The lento loses its camphor note
Fried shallots Store-bought fried onions Close

What makes the bowl taste of East Java is the bittersweet petis, the aromatic beef broth and the mixing at the table. Lento can be skipped and lontong can be replaced when you are cooking far from an Indonesian shop; the dish loses some texture but keeps its character.


Method

Start with the beef, because it needs the longest time and asks little of you while it simmers. While it cooks, grind and fry the spice paste, fry the tofu, make the petis sauce and mix and fry the lento. Everything is cooked separately and comes together only in the bowl.

When It Goes Wrong

What you see Why What to do
The broth is cloudy and tastes only of salt The beef boiled hard and the foam was not skimmed Skim early and keep a gentle bubble; top up only with boiling water
The broth tastes raw or powdery The spice paste went in undercooked Fry the paste until the oil turns reddish-brown before adding it
Tofu spatters and breaks in the oil Too much surface water Wrap and press in paper towels before frying
Lento falls apart in the oil The cassava was too wet Squeeze out some liquid before shaping
Noodles are swollen and the bowl has gone dry The broth was poured too early Pour the broth only at the moment of serving
The bowl is too hot to enjoy Chilli seeds and pith Seed the chillies before pounding next time; keep the sauce on the side

Salt and heat are the two things to watch, and both are best handled before the bowl is assembled: taste the broth for salt only after the sweet soy has gone in, and adjust the petis sauce while it is still in the mortar.


Serving, Variations and Storage

At the table

Tahu campur is a full meal in one bowl, with noodles and lontong both acting as the starch. Set out extra fried shallots, crackers and petis sauce so people can add more as they go. The crackers are best eaten as they soften at the edges in the broth, so add them just before the first spoonful.

Variations

  • Pressure-cooked beef. Soften the beef under pressure, then follow the same seasoning. The seasoning stays the same and the waiting time drops.
  • Without lento. Leave out the fritters for a weeknight bowl. It is quicker, but the crisp-tender contrast that marks the Surabaya style is lost.
  • More lontong, fewer noodles. Shifting the balance of starches makes the bowl denser and more filling.
  • Two sauces. Divide the petis sauce ingredients and make one batch with seeded chillies and one with seeds left in, for a mild and a hot pot at the same table.
  • Beef shank. For a leaner bowl, use shank; the broth is lighter and less rich.

Storage

Keep the broth and the solids apart. Let both cool, then refrigerate them promptly in covered containers. When reheating, bring the broth to a full boil and assemble the bowls fresh, pouring the broth over just before eating so the noodles do not swell.

Bean sprouts and leftovers

Always cook bean sprouts through; do not serve them raw or just scalded. Bring reheated broth to a boil every time.

Frequently asked questions

Can I use a pressure cooker for the beef?

Yes. As a rough guide, the beef softens in about 25 to 35 minutes under pressure. Check it the same way as in an ordinary pot: the fibres should split when pressed. If they resist, cook it a little longer.

Is lento worth the effort?

In the Surabaya style, every bowl comes with lento, and its crisp shell against the soft tofu is a big part of the pleasure. It is optional, and the bowl still works without it. If time is short, make the beef and petis sauce properly and skip the fritters.

How do I make it milder?

Remove the seeds and white pith from the green chillies before pounding them. Keep the full petis amount, because cutting back on petis takes away depth along with heat. Serving the sauce on the side also lets each person set their own level.

Does lontong need cooking?

Lontong is already cooked; it only needs slicing into rounds. The hot broth warms it in the bowl. If you replace it with mochi or rice, warm those before adding them.

Sources