Tag: Food

  • Organizing Recipes with ML For Creative Cooking

    Organizing Recipes with ML For Creative Cooking

    Today, I’m sharing my recipe tracking app powered by machine learning, how it works, and some things I struggled with (mostly Next.js).

    Okay, okay. Yes, I’m also tired of the industry shoving AI/ML into every product that has no business doing any AI/ML. It’s like blockchains and NFTs all over again, but with way more money, promise, and fantasy.

    BUT HEAR ME OUT! For the last few months, I’ve been working on a new app to revolutionize how I store and search my recipes using some basic machine learning techniques. It’s got one monthly active user (me) and generates a profit of -$12/mo. Customer satisfaction is through the roof! But enough of my success story, let me share why I even started this project.

    4 years ago, I started taking notes on my cooking. I love cooking, but I’ve been pretty sloppy with improving myself for a long time. ADHD always pushes me to new shiny recipes while my fried rice or mapo tofu stagnates. My partner kindly explained how tired she was of me making the same mistakes over and over again. I should have learned by now that she does not like spicy soup nearly as much as I do, or that our dumpling wrappers were too salty last time, or that David Chang’s Bo Saam recipe is an atrocity to both blood pressure and diabetes.

    All those notes live in a single 55MB, 117 page long Google Doc. I didn’t intend to make a monster. I just wanted to science up my cooking! Jokes aside, I take a bunch of notes whenever I cook and I’ve become a lot more adventurous and consistent because of it! I write down all my modifications and how well it turned out. Sometimes, just eating my food inspires me; “oh, I should try potato starch next time!” But my ADHD also means I filled my doc full of recipes I will never cook. They’re just there for inspiration. This has lead to a huge growth in my doc and now it’s falling apart.

    Unfortunately, I’ve outgrown this doc. It sucks in a lot of ways. It crashes if I try to search on my phone. It’s so damn long that my eyes glaze over trying to read even the recipe names.

    Google Docs crashes as soon as I try to search for anything…

    So I made a web app that uses some Machine Learning ideas to organize my recipes, supporting fancy search, and improving discoverability. Along the way, I learned Next.js which feels really popular on reddit so I’ll share some of my thoughts on that.

    Table of Contents:

    Quick Definitions for the non-Machine Learning folks

    Already a AI/ML aficionado? Skip to the next section!

    I’m a noob at ML/AI so I’ll share my definitions that are likely somewhat wrong:

    • embedding – a vector of numbers representing something. For example, in word2vec, vec is the embedding representing the word.
    • feature extraction – taking some thing and making an embedding out of it. For example, in word2vec, the process of applying word2vec on a word to get a vector/embedding is the feature extraction. You can think of it as extracting the important “features” out of some input and getting something that represents the important bits.

    Cool things you can do with embeddings:

    • In some embedding spaces like word2vec, you can add them together and get resulting vectors that make sense: king + woman = queen.
    • There are surprisingly simple ways of combining vectors / embeddings like averaging or adding.
    Credit: Kawin Ethayarajh

    Check out this visualization of my recipes! It flattens the 384 dimensional vector into 2 dimensions using UMAP (versus PCA or t-SNE). Try searching “eggplant” or “rice” and you’ll find things are pretty localized. Zoom in and you’ll likely find some surprisingly good clusters. On the other hand, there are some bad examples, like ramen, pasta, and spaghetti are not related at all.

    Hard to use? Try visiting it directly in WizMap on a computer.

    You can also see the distribution of individual words words and how they cluster based on this model:

    Hard to use? Try visiting it directly in WizMap on a computer.

    Still not excited? Read Embeddings are underrated (HN discussion). It’s a short but fun blog post that talks in more detail.

    A Front Page of Inspiration

    I want a front page where everything is a bit different. Diversity is important! A random list of recipes is more inspiring.

    What I currently have is awful. I read table of contents for my doc and it’s a huge wall of text, where my eyes glaze over immediately. It’s always in the same order. At one point, I grouped related recipes together, but that actually breaks my “inspiration” use case because I’ll have 20 recipes in a row about making rice or tacos, and everything else is chronological because I was too lazy to organize all 300+ recipes.

    Video of me scrolling through the table of contents for my doc. It’s a huge wall of blue text. Nothing to focus on.

    https://www.whatthefuckshouldimakefordinner.com is a funny website but it’s really kind of useless. You can only see one recipe at a time and most are boring or irrelevant to me.

    I tried out Paprika but it seems more focused on organizing your recipes and meal-planning rather than exploring. There’s no “random” section.

    Finally, I just feel bored looking at these things. It’s nearing Thanksgiving and every recipe website is showing me 20 ways to roast a turkey. PaprikaApp just shows me sorted by last added date.

    BudgetBytes shows their top Thanksgiving Recipes. Seasonal, fun, but not really my jam when I’m making things day-to-day.

    So I made a random front page! When you go to my list of recipes, the app randomizes all my recipes, every time. Don’t like what you see? Refresh!

    Still don’t like it? Try searching for something (and see the next section)!

    Existing platforms do a poor job on searching and organizing recipes.

    In PaprikaApp, you can organize your recipes into categories and folders but it’s completely manual. Also, I’ve never found a good method for categorizing recipes. Some people do it by primary ingredient (beef, chicken, bean) but I feel like I should just search for that ingredient and the recipes should just show up. Also, what happens when I am more okay with substituting ingredients? Or when a commenter tried a recipe with beef instead of chicken and it was great? Maybe I’m searching for “shrimp” but the recipe I want says “prawns”. I personally need something much more flexible.

    On AllRecipes.com, you lose a bunch of “potato” recipes when you search “potatoes”.

    On websites like AllRecipes, you can search all the recipes in the world but it’s pretty strict. If I search “mashed potatoes” (plural), it’ll ignore every recipe that spells it “mashed potato” (singular). Again, I need something that is flexible.

    Basic Search Implementation

    I went with a super basic search implementation, where I tokenize the query into “words” and then search for each word as a substring in each recipe. Then I give each recipe a score using TF-IDF.

    When searcing “bacon and eggs” (with debug mode enabled), we give more weight to “bacon” and “eggs” because those terms are more unique and rarer among recipes. “and” is a useless term because it appears in nearly every recipe, it provides no useful information about relevance. So we should show recipes that say “bacon” and “eggs” much more often!

    In debug mode, you can see where the terms matched (title, notes, or linked content), how often it matched, and what score we gave to those matches based on TF-IDF. We demote “and” whereas we promote “bacon” and “eggs”

    Think about TF-IDF in terms of Information Gain. Does this term meaningfully select for recipes?

    I have lots of typos in my recipes. I spell ratatouille 3 ways. Cooking against transliterated recipes is hard too, like chow mein vs chao mian. In Peru, they say chaufa instead of chow fan. All these mean the same thing but spelled differently.

    To fix typos and near-words, I calculate Levenshtein distance from the input word to all words found in my recipes. This distance measures the needed number of character changes to convert one word to another. PostgreSQL supports it natively, too!

    I searched for “ratatouiee” and it suggested “ratatouille” as a similar word found within my recipes.

    Levenshtein distance also handles plural words really well:

    • waffles <-> waffle has a distance of 1
    • potatoes <-> potato has a distance of 2
    • eggs <-> egg has a distance of 1

    Notice how the singular word usually covers the plural word if you search by substring: “egg” is a substring of “eggs”, “potato” is a substring of “potatoes”. Substring search gives you more complete results and so the app should encourage substring terms.

    This is where ML embeddings really take over. Say I am just exploring recipes or maybe I have a vague idea of what recipe I am looking for. Was it shrimp? Was it crawfish? I’m not sure. Did I save the recipe as noodles or pasta? Who knows. I want my app to tell me what other terms might be appropriate to search with:

    • shrimp -> seafood, crawfish, lobster, crab, prawns
    • bread -> dough, sandwich, wheat
    • pasta -> spaghetti, noodles, cheese, pizza, italian
    Every time I type into this form, I generate an embedding (vector representing the word) and query for every word in my recipes for the words most closely related to my term. It seems to work pretty well!

    This is actually pretty simple to implement! If I take all my recipe content and tokenize them into words, then generate embeddings for every word I see, then I can search for words that have embeddings closest to my search terms. Vector support in PostgreSQL is pretty easy to use, but PostgreSQL awkwardly stores as a JSON string.

    I searched for shrimp and it found a typo: shrimo. It also suggested seafood, crawfish, lobster, crab, prawns, fish, and eel!

    From here, you just click on each suggested term that you want to add. I thought about doing this automatically, so you don’t need to click, but I couldn’t really find a good threshold for what to include. Also, some very related words aren’t good to merge. I might actually be searching directly for a shrimp recipe, and not a general seafood recipe. If I want a general search, I can just click all the terms I’m okay with.

    Search Through Linked Content

    This was a big deal for me. This makes my recipe app SUPER worthwhile. When I drop a link to a recipe, I want to be able to search by the contents of that link.

    Why is this so powerful?

    Let’s say I drop a YouTube link, if I could search through the title, description, and subtitles/transcript, then I can search by what the video is about! I just need to paste a link like https://www.youtube.com/watch?v=gUlkwSHOT7Q and then search “congee”.

    Other times, I’ll search for “kale” and a suprising recipe comes up because someone commented that the recipe “works great with kale”.

    Including linked content allows me to be a lot more creative about what I can cook because it’s a lot more fuzzy.

    This was kind of tricky to implement. I had to extract the links out of the content I save on my website, then I submit them to a personal instance of ArchiveBox, when archiving finishes, ArchiveBox posts to a webhook callback on my web app and my web app pulls the archive information (transcripts, htmltotext.txt, etc) and puts that into the database for searching. I also need to regenerate embeddings whenever this happens. But, it works!

    Say I’m looking at my recipe for “InstantPot White Rice“. My app should tell me other recipes that are similar:

    • Stove Top White Rice
    • InstantPot White Rice
    • Oven Fried Rice
    • InstantPot Brown Rice
    • Mango Sticky Rice
    • Kimchi Fried Rice

    All these recipes are somewhat related to each other, either because they’re white rice recipes, or derived from white rice. Other times, recipes might be related by cooking type or a special ingredient.

    With embeddings, you can actually see all the “rice” recipes clustered in the bottom right, near korean-kimbab and other Asian recipes.

    Hard to use? Try visiting it directly in WizMap.

    So what I did was for each recipe, just show all the recipes that have the “closest” embedding to them.

    I’m looking at the “Sea Bass a la Michelle” by Chef John from FoodWishes.com and my app recommends: baked fish, steamed fish, crab cerviche tostada, sea bass and fish sauce fried rice, shrimp, and peruvian tuna salad.

    Demo

    That’s it! You can see the web app in read-only mode at https://recipes.href.cat/recipes.

    I also dumped some embedding visualizations in Quick Definitions for the non-Machine Learning folks.

    Wish List and TODOs

    I cut out a bunch of stuff because I don’t need the features. My app works good enough! None-the-less, they still seem like good ideas, just not worth the effort anymore.

    OCR for Image Searchability

    Sometimes I take a picture of a recipe in a book, or someone sends me a hand-written recipe. It’d be nice if I could search for the text in images that I’ve uploaded.

    This turned out to be more difficult than I thought it would be. Word embeddings are super easy. You shove words into a model and it spits out embeddings. OCR models seem trained either on hand-writing or text, so you have to use both models to handle both cases. It does seem like the Donut model can handle both. But these models specialize single-line text, so you need to submit images cropped to a single line or word, which requires another model.

    Alternatively, I could use tessaract.js which seems a little slow but could work well since I’m already using Node and feature extraction is usually a background job. The more popular, recommended, and efficient option is PaddleOCR but that requires python.

    Label images using AI

    I wish I could just upload pictures of recipes I’ve cooked and then I could search “peppers” or “broccoli” to find the recipe.

    Next.js really got in the way here. With limited runtime allocated to free tier and no native background job support, I just couldn’t justify spending so much time implementing something I don’t really need. I’ve only uploaded like 4 photos to my recipes. Everything is possible with more time but this feature was more cool than useful.

    Combine TF-IDF With Embedding Pooling

    I’m currently using a BERT model with average pooling, which averages the embeddings of each token (or word) to generate one for the sentence. In my case, I concatenate all the sentences from the title, notes, and linked content to make one super long sentence and then I get a pooled average embedding for that to represent the whole recipe. Every word is equal weight in this average.

    I already weigh the recipe name and the words I write more heavily than the linked content, mostly because linked content can be a little spammy. If I also use TF-IDF, then the embeddings for “saffron” would weigh more heavily than “and” or “cook”. I think this would give me much more interesting results, but I also find really good results with what I currently have.

    Sort front page of inspiration by maximum distance between recipe embeddings

    This would give more diversity in the semantic meaning of the items. For example, “Fried Rice” shows up first on the list. Don’t show related recipes like “White Rice”, “Fried Noodles”, or “Coconut Rice” until later down the list. Showing them together is less inspiring and diverse.

    I think, in theory, I would cluster the embeddings and then some simple leetcode style algorithm to spread out the clusters based on frequency. But I’m happy with purely random too so this is as far as I go.

    Deduplicate Linked Content

    I used ArchiveBox for link content extraction, but one weird situation is that it uses multiple methods so if I concatenate them all, I might get duplicate results which weighs it heavier. However, I need to consider all the extraction methods because some work better than others for specific content. For example, DOM dumps of YouTube are basically useless, but yt-dlp output is super valuable.

    Next.js, was it worth it?

    As part of this endevour, I decided to pick up Next.js and with it, Tailwind CSS and React. TLDR: I wouldn’t do it again specifically because of Next.js. It just feels like a very young framework with no batteries included. I think I’d stick to Django for the backend, but use Tailwind CSS and React (or Svelte) for the frontend. IDK, web dev is kind of a mess.

    Pros – Benefits of Next.js

    • The development flow is really cool. I can make a commit on a branch and they’ll have a subdomain pointing to a deploy of that branch. Push auto-deploys in seconds (or however long your builds take). You can easily push a change and get a domain to test against very easily. It’s really interesting!
    • Server Actions are really interesting. You basically don’t need to build out an API at all. It auto-generates endpoints for whatever functions you mark as “server actions” and it creates an HTTP based RPC call from the client side to that function. Feature building becomes really really easy because you don’t have to think super hard about what API form you want and how to lock it down (CSRF, auth, etc). It just does. The ergonomics are really good too, you just put the function handle as the “action” in your form or whatever and it’ll do the right thing.
    • Biphasic programming with Server Side Rendering (SSR) is a new-ish React feature, not specific to Next.js, but is super interesting nonetheless. You can write a component as either server- or client-side and they can mix-and-match throughout the tree. A server component can access server resources like databases, internal APIs, and server hardware without restrictions. A client component can access all client APIs and maintain client state info like clicks, typing, input, filesystem for better interactivity. All of this happens pretty transparently!
    • They have an insane amount of caching and it’s pretty good and fast.
    • Edge runtime is kind of a cool concept, to run specific parts of your app like routing at edge to speed things up.
    • Partial Pre-Rendering (PPR) is cool too, to pre-render and statically generate as much of the page as possible, until you encounter dynamic code. I honestly don’t know if the speedup is good, but the concept is cool.

    Cons – My Struggles with Next.js

    • 6 second request timeouts on Vercel’s platform means I can’t do longer-running tasks in a straight-forward manner. This pushed me to self-host.
    • If you self-host, you lose like half of the pros, unless you use OpenNext. Most of all, you lose the cool development flow. The caching and edge runtime is kind of whatever to me.
    • Next.js implemented Middleware hella weirdly. They crippled middleware by forcing only one single middleware ever. It runs in the very restricted Edge Runtime (no db access). There is no opt out.
    • Auth is hella weird. I tried to use auth.js which is Next.js’ official auth solution. Middleware mid-ness really holds back auth. You can work around this by using an oauth service, but you can’t have any of your users, roles, or permissions stored in your personal database. A third party auth service MUST handle scoping and permissions too.
    • Invaliding caches is really manual and you need it often. What would be better? Declaring reactivity behind caches and data sources. It’s exhausting to invalidate all the caches for all the things you need. In a complex app, you’ll inevitably miss a spot and the app will just behave strangely. Next.js caches pretty much everything so it’s something you’ll run into and have to think about pretty quickly. No, reactive caches aren’t a thing AFAIK, but it sounds good, right?
    • No indicators for when links are loading or forms are submitting. When you submit forms or click links, the browser shows indicators that it’s in progress. Since Next.JS pushes EVERYTHING into JS, there are no indicators. The linter aggressively pushes the Next.js Link component. Prefetching is nice if you’re on a powerful machine but it gives no indication when you click, it’s just a slow page. Submitting forms? Gotta implement your own indicator too because it’s just a stuck page for like 1 second.
    • No obvious way to handle background tasks, and they acknowledge it

    Source Code

    Interested in any particular implementation? Check out the source code on GitHub.

    Feel free to ask me any questions and I’ll try my best to answer.

    Special shoutout to transformers.js, which allowed me to run machine learning models in Javascript in the browser and in Node on the server. Crazy how far we’ve come.

    Are you hiring?

    Context: I’m looking for a job. I built this app as part of my year away from capitalism. Airtable laid me off in September 2023 (14 months ago) and spent that time taking art classes, teaching nutrition to elementary school kids, building all the side-projects and personal apps that I’ve been itching to work on, and some traveling. However, capitalism is a reality of my life and I need to pay rent.

    About me: I’m a generalist software engineer, 10 years into my career, primarily experienced in backend python and javascript/typescript. I have some light experience with frontend dev so you can consider me a backend-leaning fullstack engineer. I love building things and digging through layers. If you’re looking for someone to gain deep expertise in some system, or someone to understand how systems fit together, I’m your person. I’ve worked from operating systems up to client apps and I know a lot about a lot of stuff. I’m someone who loves learning! I’ve worked at companies with 25 employees, up to Apple with 15k+ engineers.

    About you: I am staying in San Francisco so either you’re local or you’re okay with remote work. My other preferences are flexible but they fall along:

    • Small-ish with fewer than 500 employees but more than 10
    • Works in AI-ish stuff
    • Has cool people working on stuff
    • Encourages wearing many hats or supports team changes or working cross functionally
    • I tend to value cash compensation and liquid stocks over private equity
    • Start work in January or you’re okay with me taking all of December off

    If this sounds like a decent match, reach out to m.hire.rx[at]href.cat or drop a comment here or wherever I posted this and I’ll be in touch! I might reply in January depending on how my personal life flows.

  • Back to the Roots – Microgreens Review

    Back to the Roots – Microgreens Review

    Got a few boxes to try out. We got a variety to see how they all compare. They all claim to be ready for harvest after 7 days and just need water. Very true! Super easy!

    Day 1 – Mar 1, 2024

    Hydrate the soil which is kind of fun.

    Then just sprinkle and spread.

    Day 2 – Mar 2, 2024

    On the second day, I leave it alone… except to take a picture and check how things are going. Most seeds have not sprouted, but the broccoli seems to be doing well. Pretty much everything is still seeds.

    Day 3 – Mar 3, 2024

    On the third day, I take off the lid and add more water.

    Everything has sprouted! Tiny little sprouts, they haven’t really shot out roots yet but they’re there!

    Day 4 – Mar 4, 2024

    Things are finally standing up!

    Day 5 – Mar 5, 2024

    No more updates though… we’ve handed them off to the teachers to continue growing and sharing with students. 🙂

    Day 6

    They clearly lean towards light so I just rotate them a bit. Still only watering about 2-3 tbsp because it’s flooded otherwise.

  • Review of Imitation Codfish Fillet (素香魚排) by Yang Kee Trading (楊記素食) — 4/5 Fried, 5/5 Steamed

    Review of Imitation Codfish Fillet (素香魚排) by Yang Kee Trading (楊記素食) — 4/5 Fried, 5/5 Steamed

    We found “Imitation Codfish Fillet” sold at International Produce Market (formerly Duc Loi) and decided to go for it, not knowing what it is or how to cook it. It’s sold as $15.99 for 180g of protein. It’s pretty heafty, weighing over 2.6 pounds. Basically you’re buying a pretty big fish.

    The only reference I could find of it on the internet was a cooking review from Jaane Fong which didn’t mention much other than they pan fried it. Looks good though!

    https://www.instagram.com/p/CVedn-rFjtZ

    I think this is pretty hard to cook. It comes frozen as one giant piece, but I would probably serve this over 3 or 4 meals. I’m cooking for both me and my partner so I used just under half of it, or 8 out of the 20 pieces. However, to do that, I had to use a butter knife and wedge it between the individual slices of “fillets” to separate what I needed. It’s pretty hard cause it’s hella frozen.

    With the remainder, I just froze it in three pieces to make it easier in the future to separate them further for individual frying.

    I caramelized some onions, cauliflowers, and bell peppers to accompany it.

    Pan fry the fish for ~2 minutes each side on medium-high until golden-ish. It cooks way faster than I expected. I think I could have stopped here and served with a dipping sauce. That’s my recommendation.

    Instead, I tossed in the hong shao yu sauce from Woks of Life. The fish soaked up all the sauce! Be warned, it absorbs all sauce so it will become very salty if you’re not careful. If you mess up, add water and make a “soup” instead. I think next time I’d make a soup instead of a braise.

    Mix everything together!

    Round Two — Steamed!

    This time, I tried to steam it like I would a normal fish. I flowered out the steaks and steamed it for ~15-20 minutes because they were quite frozen and on top of each other. If they weren’t on top of each other, I’d probably go for 10 minutes. I then drizzled the sauce from https://thewoksoflife.com/steamed-whole-fish/ on top after setting down on the table.

    I served it with Potato Floss Stir Fry and an Italian Broad Bean + Chinese Sausage (lap cheong) stir fry.

  • Purely Elizabeth’s Blueberry Hemp Granola Review – Not Recommended

    Purely Elizabeth’s Blueberry Hemp Granola Review – Not Recommended

    I don’t like this granola because it’s too salty and the blueberries are too hard. We eat this granola with yogurt or in smoothies and it’s shocking how we can still cover it and still find it too salty. The dried blueberries taste so stale that it hurts our teeth chewing.

  • Frozen BBQ Eel  / Unagi Comparison

    Frozen BBQ Eel / Unagi Comparison

    We’ve tried like 5 different brands of frozen unagi from various stores and brands. Some are great, others were terrible. I’ll leave my summary of good and bad brands here as I find them, kind of like for my tofu!

    OceanKist – Very Good

    Unagi, Blistered Shishito Peppers, and Sautéed Chayote Squash for dinner

    Not overly saucy, but well flavorful and delicious.

    It took quite a bit longer than the instructions listed to defrost. Instructions said 6-8 minutes but it took us about 15 minutes. We had our freezer set to the coldest it can go. We cooked until ~130F internal and then broiled for 1 minute and it was delicious. Weirdly the instructions said to cover it but I found it didn’t cook at all when covered, so I just uncovered it and it was great!

    Skin was surprisingly crispy. I cooked it in a glass Pyrex which I think helps. The “head” part of the eel had thick tough chewy skin but it’s a small portion of the body and I really like the chew.

    Very easy cleanup with the glass, probably would have been fine on a metal tray. I think the low amount of sauce is really nice here.

  • The Best Tofu – A Review

    Here’s a list of tofus that I’ve tried in the US — mostly west coast California.

    I generally cook my tofu in two ways: boiled in salt water or crispy fried with corn starch. Both tend to make really good results if the tofu is silky. The surprising thing is many tofus that look crumbly when raw turn gelatinous when boiled, making for almost a custard or pudding texture that I love!

    When I review the tofus, it’s with the above cooking styles. No promises on other styles. I personally don’t eat raw tofu, it’s kind of weird to me. I also don’t eat big chunks of tofu.

    🚫 House Tofu – No

    I don’t like it. It’s extremely crumbly and firm.

    👍🏽 Mitsuwa Brand – Yes

    This one boiled into a delicious smooth silky jello.

    🚫 Fong Kee Tofu Co. Firm is mid

    I tried the firm version and it was just very firm. Not a big fan, but kind of acceptable. I ate it and it was decent but I think most people would not like it. It’s so dense! I pan-fried it using the “spider” method.

    👍🏽 Fong Kee Tofu Co. Soft is amazing, very good

    On Nov 1 2023, I tried the soft version and it’s amazingly delicious, grassy, and tender. I highly recommend it.

    🚫 K town Soft Tofu — Mid

    Surprisingly firm, it’s okay, but not great. Not what I expect out of soft tofu.

    👍🏽 Golden Gate Tofu Soft – Hella good

    Soft, jello, pudding but still firm enough to cut. Amazing in soup with a slight grassy taste. 10/10

    👍🏽 Jay one Soft Tofu – decent but a little firm

    Slightly “chunky” with Swiss cheese texture but I don’t notice it when eating, just visuals. Not as soft as I like but definitely on the soft end. It’s in between a soft-medium in my opinion. It’s easy to cut without falling apart. Flavor while raw is pretty neutral. I think it’s a decent tofu.

    👍🏽 Hodo Marinated Tofu – Firm but delicious, good for stir fry or salad

    👍🏽 Hodo Miso Tofu – yes! But Make it saltier and is a medium-firm

    Not very salty, tastes kind of like miso. Much smoother consistency than the braised five spice one. I like this!

    👍🏽 Azumaya Silken is pretty good for soups and pudding

    I got the Silken on Feb 29 2024 and it’s very smooth, I like it! No extra liquid, just tofu

    👍🏽 House Foods Soft Tofu — Good

    Jenny’s mom highly recommends it, available in many places but Costco is cheapest in 4 pack.

    Her mom cooked it in mushroom, fish tofu, and tofu soup. W cabbage.

    Aug 4 2024 — Good texture and flavor. Made it with mushrooms and chicken gravy.

    👍🏽 House Foods Firm Tofu — Good

    Made on Oct 11 2024 for tofu caprese salad skewers. We substituted mozzarella cheese with tofu and it was great! Boiled them in salt water before skewering for better flavor.

    👍🏽 House Foods Bulk Organic Tofu Super Firm

    Hecka good for stir fries.

    From Rainbow, $4.99 for 2lbs of tofu, good price for tofu. Currently, I expect like $3+ for 16oz/1lbs. Cooked on Jan 6 2024.

    👍🏽 Hodo Extra Firm Tofu Plain — Good for firm, low flavor

    Very firm. Needs to be marinated. Slice thin or else it’s too chewy. Pretty good with just salt, better with miso. Overnight. Put into spring rolls or fry independently.

    👍🏽 Wo Chong Tofu Soft — Very good

    Feb 26 2024 cooked in a Mexican / Grey Squash base with scallions and chicken broth. Very smooth. When raw, tastes like soy milk and has a slight drying sensation.

    May 12 2024 Good again, we’re making in tomato mushroom tofu soup. Very soft and slight tofu flavor. Slightly gritty when raw, but turns gelatinous when cooked.

    July 13 2024 — Made it again as a cold tofu salad with furikake, pork sung, and oyster sauce on top. Pretty nice. Pretty creative.

    👍🏽 Nasoya Organic Tofu Extra Firm – Crumbly but okay. Wet and more like a medium-firm

    Very crumbly, has cracks. Isn’t hard to cut or eat. Actually tastes decent. Has a slightly grainy texture but flavor is good. It’s. just very crumbly. Is more like a medium than an extra firm. Very wet.

    👍🏽 Hodo Yuba Sheets / Noodles — YESSSSS

    Either separate first or cook for a bit with liquid to separate.

    🚫 Raw Nature Natures Tofu Made with Nigari Soft — Pretty mid, more like medium

    More like a medium firm. Has a good crumb. Very smooth none the less. More for salads and stir fries than soups but okay none the less. Apr 14, 2024

    Cooked in soup this time and it really is lacking in flavor. Apr 22, 2024.

    👍🏽 AFC Organic Tofu Soft – Hella good

    From MOM (Manila Oriental Market) for $1.99 on Apr 30, 2024. Super soft! Delicious flavor. I feel like I don’t need to cook it in salt water at all, but we’ll see… we’re cooking it in mapo tofu.

    July 25 2024 — Unknown, check Jenny’s phone

    👍🏽 Nijiya Organic Tofu きぬごし Soft Hella good

    June 22 2024 – made miso soup and it was good!

    most soy milk taste ever. Very smooth. Very consistent, like pudding.

    July 27 2024 — Unknown, check Jenny’s phone

    👍🏽 Sunrise 日昇 — Decent. Soft, silky, a little soy flavor.

    Product of Canada, but pretty decent. If I didn’t have many other options, this is a good one. It’s a little lacking in the soy flavor (unlike Nijiya, Golden Gate, or AFC) but still pretty good consistency.

    Super cheap, $1.49 (on sale) at Sunset Super on Aug 5 2024.

  • Mashed Cassava

    Mashed Cassava

    I ate mashed cassava for the first time and it’s pretty amazing! I was expecting something pretty similar to American style mashed potatoes, but with a little Costa Rican twist. It’s savory and fun to eat, but it also inspired me to learn a bit more about cassava and the history of Costa Rica.

    Me with a huge smile serving a fork with a bit of mashed cassava on top.

    While I was expecting something like mashed potatoes, mashed cassava is surprisingly gummy and soft in a way that reminds me of warm mochi (mashed glutenous rice) and poi (mashed taro). It feels just a little bit sticky and chewy but still very easy to eat bite by bite.

    My experience with cassava is very Vietnamese oriented because, well, I’m half Viet. San Jose, California has the largest concentration of Vietnamese outside of their home country which gave my childhood a strong sense of my ancestral culture and cuisine. Cassava is a pretty foundational carb in Vietnam. In chè (sweet desert drink), cassava is chunky and starchy like real taro milk teas. In bánh khoai mì nướng (cassava cakes), it acts as the foundational starch forming a cake vaguely resembling butter mochi when it’s extra crispy but with a warm stickiness.

    That’s why when I found out this little Costa Rican restaurant served mashed cassava, I was pretty interested and confused! I thought it was just a root vegetable grown in the tropical South East Asia. Is this restaurant trying to explore new flavors and textures by including some foreign tastes? Maybe there’s some Asian immigration that brought it over. I know there’s been lots of Asian immigration throughout the world, where Chinese fled the cultural revolution, Vietnamese fled after the fall of Saigon, and Thai intentionally sent out their culinary diplomats.

    What tripped me up here is discovering that cassava and yuca are the same! That’s right, those yuca fries that are all deep fried and served in all those health oriented hipster restaurants I’ve been eating all this time are actually the same starchy root vegetable that I’ve always grown up with! Suddenly things make sense, like how yuca fries were so commonly served with tostones (fried smashed plantains) in the Puerto Rican parts of Chicago.

    Then it just took a little bit more for me to realize tapioca is just the starch of cassava! Those tapioca pearls in boba, tapioca starch used in noodles… it’s all over the place! It’s interesting to take a step back away from food and just look at constitutes it. So rolled cassava starch makes boba and rolled palm starch makes sago. But then we have Northern Africa rolling wheat flour to make couscous! Same idea but a totally different application. Should we start putting couscous in milk teas too?

    A lot of the world cuisine and culture is through various amounts of globalism and colonialism, with Costa Rica being no exception. Why does Costa Rica speak Spanish? Because Spain colonized it. Why is Costa Rica’s currency colón? Because Christopher Columbus is Cristóbal Colón in Spanish. Why is it called Costa Rica? Because Christopher Columbus landed first on a beach here and notice natives wearing lots of gold jewelry and believed that this was a coast of riches. Cassava originated from somewhere around this part of America. Europe imported it and, through vast global trade, cassava eventually made its way to South East Asia.

    Steamed white sea bass served on top of mashed cassava and smothered in seafood gravy. Ribbons of carrots balance on top of a slice of grey squash.

    I like eating food because it makes me think and learn a lot, not only about culture and history, but also about what I want to incorporate into my life. It kicks me out of my routine. I’m always hunting for new inspiration for what to cook either on a regular basis or for parties. Parties in particular make me excited because I get to share my experience with other people.

    The ribbons of carrots on top of a single slice of squash also really interested me. Obviously, there’s an aesthetic appeal to the looping tower of root but I think this style lends itself to be cooked VERY quickly. It’s extremely noticeable how fast Costa Rican food comes out after being ordered. Usually, we wait at most 10 or 15 minutes, versus most places in the United States we can easily wait up to 45 minutes. Is it a cultural thing here to get served fast food? I’m not really sure, but it’s definitely something noticeable.

    Also, the seafood gravy — another inspiration bit. If I make anything with shrimp, I peel it and boil the shells in some water to make a shrimp broth, leaving the meat for whatever I originally intended (paella, fried chicken eggs, tacos). Normally, I just boil the shrimp shells for a while, add some salt, and then mix in a bit of dissolved corn starch to thicken it. This is similar to a Chinese style of making any type of sauce or gravy. On the other hand, Kiré served it european style where you make a roux from frying flour in butter and then using that to thicken the seafood stock. Perhaps this is an indication of Spanish colonialism? While it was overly salty in my opinion, the texture really goes well with the dish, strongly resembling a traditional American mashed potato with turkey gravy.

    Beyond the difference in texture and consistency, the gravies here also seem to be fairly spiced or even spicy. Maybe it’s the Caribbean influence or maybe it’s the South American influence, in either case, this is another dimension of gravies I’ve never explored and it’s opening up a whole new world of culinary ideas! Gravies are always savory yet kind of bland in a very French European way. It’s a meat reduction with butter and flour. Can we add spices? Can we add more herbs? Can we make it sweet instead of savory? Butter, flour, and milk is foundational to pastries and gravies so I don’t think it’s too far off.

    All in all, I found this dish to be super interesting and I learned a lot about colonialism and Costa Rican culture while digging into this. I hope this excites you too! Want to try it? Go visit Kiré located in Koora Hotel in Monteverde, Costa Rica or invite me to your next potluck.

    Happy travels y pura vida!

    Update Oct 17: I should have waited to write about this because apparently yuca cakes are a thing here too! Remember how I talked about cassava cakes on Vietnamese cuisine? They’re pretty similar! This particular yuca cake is served with condensed milk and is fairly chunky, whereas the Vietnamese one is much less sweet and has a thicker bite. While the Vietnamese cassava cakes are a snack, these Costa Rican yuca cakes are like a dessert—soft, warm, fluffy, sweet.

    Top left are “yuca cakes” as described by our nature guide. They served this with fried plantains and recommended to eat with the cheese in the same bite.