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, 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)

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.
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.
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.















