Cooking Recipe

Easy Vegan Chili with TVP

This chili is easy to make, healthy, and my kids all like it, so I cook it frequently in the colder months. It’s also vegan and gluten-free.

The recipe evolved over the years (from a mediocre starting point) and I typically just cook it from memory. But a couple of people have asked for this recipe and I’d probably be more consistent if I cooked it to spec each time. I recently took notes as I made a particularly good batch and behold, a recipe.

There’s one lesser-known ingredient: TVP, which stands for textured vegetable protein. This recipe works fine without it but the TVP takes it to the next level. I keep TVP in the pantry but acknowledge it’s a divisive ingredient that some people dislike. Wikipedia notes, “Because of its relatively low cost, high protein content, and long shelf life, TVP is often used in prisons and schools, as well as for disaster preparedness.”

Without further ado, chili. It’s not spicy (unless your chili powder is powerful) so that everyone in my family can enjoy it. I like it hot so I just add hot sauce or chipotle powder to my bowl. This makes a big batch, around 8 servings. It’s good leftover and freezes well.

In short, saute the vegetables and cook a bit longer in tomatoes with spices until everything is soft. Then add beans and broth, cook a while, add TVP, cook a little more. Serve over thick, crumbled-up corn chips (Ann Arbor Tortilla Factory is the best, Fritos is fine too).

As in my lentil soup, smoke gestures at the meat that some might be expecting. Feel free to increase or modify the spices, this is a starting point.

Easy Vegan Chili with TVP

Serves about 8. I’m separating the ingredients and cooking steps so that my recipe software can parse this post correctly.


  • 3 tbsp vegetable oil
  • 1 red onion, diced
  • 1 yellow onion, diced
  • 4 cloves of garlic, diced
  • 2 bell peppers, chopped
  • 1 can (14 oz.) diced tomatoes
  • 1/2 tsp chili powder
  • 1/2 tsp smoked paprika –
  • 1 tsp dried oregano
  • 1 tsp ground coriander
  • 2 tsp ground cumin
  • 4 oz or less tomato paste. If I have an open jar of tomato sauce in the fridge, I use it up here instead of the paste. An entire 6 oz. can will make it too tomato-ey.
  • 5 cups cooked or canned beans. I use a mix of black, kidney, white, and/or pinto beans depending on what’s on hand.
  • 2 quarts vegetable broth
  • 1 cup textured vegetable protein (TVP)


  • Dice the onions and garlic and saute in oil.
  • Add the peppers and saute another minute or two.
  • Add the can of tomatoes and cook until peppers are soft, between 5-10 minutes.
  • Add the spices and tomato paste, stir.
  • Immediately add the beans and broth, stir.
  • Cook until beans are about done. If they’re already soft, this can be as little as couple minutes after it comes to a boil. Adjust seasoning as needed – it will probably need salt.
  • Add the TVP. TVP sponges up liquid, which makes it a good hack for drying out a too-watery dish. Here that means you may need to add more water or broth if the TVP has soaked up too much liquid after cooking for a few minutes.
  • Check seasoning and acid one last time. It may need a teaspoon of vinegar for brightness.

This is all tolerant to variation. Use different kinds of onions, beans, spices, add bay leaves, etc. Just get the overall consistency and spicing right.

I was recently tempted into making the Serious Eats Chili Paste and I have some cubes of it frozen. I added some to the latest batch of this chili and it turned out very nice. I don’t often have time for such fanciful cooking but if this recipe is too simple for you and you want to work harder for more flavor, that would be a good twist.

Long live the bean soup project!

ruminations Software Work Writing

LLMs are good coders, useless writers

My writer friends say Large Language Models (LLMs) like ChatGPT and Bard are overhyped and useless. Software developer friends say they’re a valuable tool, so much so that some pay out-of-pocket for ChatGPT Plus. They’re both correct: the writing they spew is pointless at best, pernicious at worst. … and coding with them has become an exciting part of my job as a data analyst.

Here I share a few concrete examples where they’ve shined for me at work and ruminate on why they’re good at coding but of limited use in writing. Compared to the general public, computer programmers are much more convinced of the potential of so-called Generative AI models. Perhaps these examples will help explain that difference.

Example 1: Finding a typo in my code

I was getting a generic error message from running this command, something whose Google results were not helpful. My prompt to Bard:

Bard told me I had a “significant issue”:

Yep! So trivial, but I wasn’t seeing it. It also suggested a styling change and, conveniently, gave me back the fixed code so that I could copy-paste it instead of correcting my typos. Here the LLM was able to work with my unique situation when StackOverflow and web searches were not helping. I like that the LLM can audit my code.

Example 2: Writing a SQL query

Today I started writing a query to check an assumption about my data. I could see that in translating my thoughts directly to code, I was getting long-winded, already on my third CTE (common table expression). There had to be a simpler way. I described my problem to Bard and it delivered.

My prompt:

Bard replied:

ruminations Writing

Finish The Book, Sam

Another installment in what I’m realizing is a series of book-update blog posts.

In November 2021 I wrote half of a novel. In another six months I’d finished the rough draft. Then in November 2022, I resolved to edit it so that someone could read it. Then I said I would get it done by the end of June. I missed that deadline, but finally “finished” this fall! Two finishes so far.

In October I shared it with a few beta readers. There was good news and bad. The good news: it is not terrible! Most of the readers – my friends, granted – finished and enjoyed it.

It is, of course, rife with problems. Most of them I can chalk up to the ignorance of a beginner. For instance:

  • The book opens with my protagonist, Dani, waking up. I now realize that’s a deadly cliche.
  • Dani’s emotional growth arc needs work. I failed to plan that aspect of the novel before writing it.
  • Beta readers universally disliked my handling of a small romance subplot. They are right.

This is, in one sense, the worst news. Were the manuscript irredeemably bad, I would be done. Actually finished. But I believe there’s a chance it could become a good, solid book … with a lot more work. And it would be a shame to waste that chance. Argh. I was so glad to be “done” and finally hand it to people!

It has been satisfying to discuss the world that only lived in my head with others who have now visited it. They had good questions and ideas for making it better. Now I need to steel myself and commit to re-entering that world, not leaving until I’ve shored up its weaknesses as best I can.

If I buckle down, could I make the changes in … two or three months? The rewrite list isn’t enormous. For instance, I’m not changing the perspective from 1st to 3rd person, a task I would not accept.

Discussing this at Workantile, my friend Anthony reassured me that I do finish things. And I have finished things. Now I need to keep finishing. I hope I can find the focus and willpower to finish until this is actually Finished.

I keep coming back to this quote from an old interview with Andre 3000 about releasing imperfect art:

As an artist you can sit and tinker with stuff forever. You can add and take away but I think that’s kind of the importance of having someone over you saying, “We need this, this is a deadline.” Sometimes those oppositions or those who push and pull are needed because we’ll just sit and tinker forever. There are actually songs on The Love Below that were not finished, but that’s how they are, that’s how it came out.

I just knew I wanted to put that [imperfect song] on there, but it wasn’t done, but it was enough.

The GQ&A: Andre 3000

The worst would be to sit on this book and not keep improving it. It’s not timeless material and I need to wrap it up and move on and stop having it paralyze me. So I think I need to say, February is the deadline. I hope I work hard on it until then and fall back in love with the story and the process. But even if I don’t, or I only complete some of what I hoped to, it might be time to say, it’s enough.

In the meantime, feel free to ask me about the project and encourage and/or shame me depending on how it’s going!