A good vegan moqueca recipe gives you the same coconut-rich comfort as the traditional fish stew, minus the seafood. You still get everything that makes moqueca recognizable — a coconut milk base, jammy tomatoes, bell peppers, lime, and cilantro — just built around tofu instead.
The biggest challenge with any plant-based moqueca is texture. Tofu stirred straight into a simmering sauce can turn soft and a little sad; tofu that’s pressed, marinated, and browned first holds its own against the rich broth. This recipe walks through the second approach.
Moqueca is a Brazilian stew traditionally built on firm white fish (or shrimp), simmered in a coconut milk and tomato base with onion, garlic, bell peppers, and cilantro. It’s most closely associated with Bahia, where it’s often made with dendê (palm) oil for a distinctive orange color and earthy aroma — this version is called Moqueca Baiana. A lighter, more tomato-forward version from Espírito Santo, called Moqueca Capixaba, usually skips the coconut milk entirely.
The vegan take on this dish swaps the fish for tofu, keeping the coconut-tomato-lime structure that makes moqueca taste like moqueca in the first place.
5
servings15
minutes30
minutes1 medium butternut squash (about 2.2 lb / 1 kg), peeled and cubed
2 tbsp olive oil, divided
1 large onion, finely chopped
1½ tbsp coconut oil (or more olive oil)
4 garlic cloves, minced
1 (2-inch) piece fresh ginger, grated
1 red chili, finely chopped (or to taste)
4 tomatoes, chopped
1 can (14 oz) full-fat coconut milk
1 cup vegetable stock
Juice of 1 lime, plus extra for serving
2 red bell peppers, thinly sliced
1 cup green beans, trimmed
1½ cups spinach (fresh or frozen)
12 oz firm tofu, pressed and cubed
Fresh cilantro, chopped, for finishing
Salt and pepper, to taste
Optional tofu marinade: toss the pressed, cubed tofu with 1 tbsp lime juice, 1 minced garlic clove, and a pinch of salt. Cover and refrigerate for at least 1 hour (overnight is even better) before browning — plain tofu doesn't have much flavor of its own, so giving it a head start makes a real difference.
Press the tofu. Wrap the tofu block in a clean towel, weigh it down with a heavy pan or a few cans, and let it sit for 10-15 minutes. This single step matters more for the final texture than any seasoning choice later. If you have time, marinate it as described above.
Roast the squash. Preheat the oven to 400°F (200°C). Toss the squash with 1 tbsp olive oil and a pinch of salt, spread on a baking sheet, and roast 25-30 minutes until tender and lightly browned at the edges. This step is optional but adds a rounder, deeper flavor than adding raw squash straight to the pot.
Build the base. In a large pot, warm the coconut oil over low heat. Add the onion and cook about 10 minutes, until soft and translucent — don't rush this, since a properly sweated onion is the foundation the rest of the flavor builds on. Add the garlic, ginger, and chili, and cook 1 minute more, until fragrant.
Cook down the tomatoes. Add the chopped tomatoes and cook 8-10 minutes, until they collapse into a thick, jammy consistency rather than staying loose and watery.
Build the broth. Stir in the coconut milk, vegetable stock, lime juice, salt, and pepper. Bring to a gentle simmer.
Layer in the vegetables. Add the bell peppers and green beans, and simmer 7-8 minutes until just tender. Add the spinach and simmer 2 minutes more — it needs far less time than the other vegetables, so adding it last keeps it from turning mushy and dull.
Brown the tofu separately. In a skillet, heat the remaining 1 tbsp olive oil over medium-high heat. Fry the tofu cubes until golden on a few sides, about 5-7 minutes. This step gives the tofu a texture that holds up against the broth instead of dissolving into it.
Combine and finish. Stir the browned tofu and roasted squash into the stew. Add the cilantro, taste, and adjust with more salt, lime, or chili as needed.
If you want a rich, comforting bowl, lean into the Baiana style — coconut milk as the backbone, with tofu that holds up well against a bold, creamy sauce. If you’d rather have something lighter for a weeknight, go Capixaba-inspired: skip the coconut milk, lean more heavily on tomatoes, herbs, and stock, and brown the tofu a bit more assertively since the broth won’t be as rich to lean on.
White rice is the classic pairing — it soaks up the coconut broth beautifully. Fried plantains or farofa (toasted cassava flour) both make good additions if you want the full spread.
A coconut milk and tomato-based stew, traditionally built on firm white fish or shrimp, with onion, garlic, bell peppers, and cilantro. Bahian versions often include dendê (palm) oil.
It can be, depending on the chili used, but it’s not inherently a spicy dish. This version lets you control the heat by adding chili gradually and finishing with lime for brightness instead of relying on more spice.
Olive oil is the simplest substitute. A mix of olive oil and virgin coconut oil gets a bit closer to the tropical richness dendê provides, though the flavor will lean more “adapted” than fully traditional.
Yes — mushrooms (shiitake or oyster) work well for a meatier bite, and hearts of palm add texture if you want to skip soy entirely.
Baiana is richer, built on coconut milk and often dendê oil. Capixaba is lighter and more tomato-forward, typically without coconut milk at all. For a vegan version, Baiana is generally the easier, more forgiving style to nail.
Almost always skipped or insufficient pressing. Press for a full 10-15 minutes, and use firm or extra-firm tofu rather than soft or silken.
A good vegan moqueca recipe isn’t about disguising tofu as fish — it’s about building the same bright, coconut-rich structure that makes moqueca what it is, then giving the tofu the prep it needs to hold its own in that broth. Press it, marinate it if you have the time, and brown it before it goes anywhere near the pot. Do that, and the dish stands on its own, no seafood required.