Bready wisdom

/media/images/bread_img_20240501_074729.jpg

I realized that except for when I'm making something specific, I no longer need to follow a recipe when baking bread. This morning I baked a nice loaf of wheatberry fig bread and I thought it might be nice to write about my current process.

I bake with a sourdough starter. I captured my current starter last year (after abandoning my previous 20-year-old starter). I wrote about capturing my starter here but it's basically just feeding a 50:50 mixture of water and wheat flour for a 3-4 days (I use my chlorinated tap water) followed by gradually weening it onto white flour.

/media/images/bread_img_20240504_121003.jpg

I keep the sourdough starter in a small transparent plastic container with straight smooth sides. It's a good idea to keep your starter in a transparent container to see how well it's doing. A living starter will sweat a dark alcoholic water when neglected, and will sit up and blow bubbles when you feed it. Use a container with straight smooth sides, so you can scrape it down with a silicon scraper. A live starter won't grow moldy but if you leave any crust on the sides of the container it will dry out and go bad.

My container isn't perfectly airtight, so I don't have to worry about the jar exploding if I click the lid into place.

I keep my starter in the fridge when I'm not baking. I generally feed it a 50:50 ratio of all-purpose white flour and water. I try to feed it with 10-20g of flour, but it's sometimes hard to give it so little. My old starter was fed with a 50:42 ratio because it made it sit up more, but now I think this was selecting for a dryer yeast, and it made calculating the final dough hydration difficult.

My starter has survived without being fed for 40 days. A neglected starter will look like thick sediment in a pool of black alcohol. Many people throw their starter away when they see it like this, and would be surprised to find it will come to life again with the addition of a little more flour and water.

I currently use about 20-40g of starter in my breads (and sometimes up to 80g when I'm trying to reduce the amount in the container). 20g is about a spoon full. I think I could probably get away with less. I used to bake with 200-400g of starter, but this doesn't help the bread, and keeping that much starter makes feeding it more expensive and means you're more likely to have to throw out the excess. If you only use a spoonful of starter when you bake, you can keep it in a small jar, and when you feed it, it requires only a little flour.

Some recipe books suggest you feed your yeast several times over the course of a day or two before baking to make sure you get the best rise. I bake with unfed yeast or yeast that's been fed a few hours before. I haven't noticed enough of a difference to go to the extra effort.

I use all-purpose flour. Other flours have their uses, but plain all-purpose flour without additives makes the best bread. Acidic dough won't rise well so if I'm baking with pickled ginger or sour fruit I'll use some baking soda cut the acidity.

Basic bread requires just four ingredients: flour, water, starter, and salt. The starter is made with flour and water and the yeast comes for free.

I use a variant of my high-hydration dough recipe for all my breads. That recipe is for an 80% hydration loaf. Going any higher is not worth the effort because 80% hydration dough already needs special care. I usually save the full 80% hydration for simple white breads and I scale it back depending on what I'm making and how much I want to fuss over shaping the loaf. An 80% hydration dough is made from 500g of flour and 400g of water. To reduce the hydration I add more flour, but I don't go above 580g (69% hydration). A dryer dough will rise higher and hold its shape a little better.

I don't spend much time kneading the dough, you can't really with a high hydration mixture, the best you can do is to stretch a bit away from the puddle and let it plop back down again. When you stretch the dough like this you can feel the gluten grow firm. The dough will tighten up, turning from a jelly to a jello. Stretch the dough until it's just about to break and then fold the strand back into the puddle. Turn the bowl to do this to all four sides. Use a dry scraper and make sure your hands are dry. You will be tempted to work the dough with wet or oily hands, but this is a mistake. I stretch the dough three times with 15-minute intervals, and then I cover it with some plastic and let it sit out on the counter all day to develop a nice sourdough flavor.

/media/images/bread_img_20240504_123331.jpg /media/images/bread_img_20240508_104802.jpg

After resting all day, gather the dough into a ball, while preserving as much air as possible, and move it to a heavily floured couche or proofing basket. I use more flour in the proofing container when the dough is wet because it's heartbreaking when a beautifully risen dough sticks to your proofing container. Sprinkle the top of the dough with semolina flour or corn meal. The top will be the bottom of the loaf when you put it into your pan and the heavier flour will give the bottom a nice crust. Put the entire proofing container into a trash bag for the final proof.

Leave the bagged loaf on the counter for another hour or so before putting it in the fridge for another 12 hours.

I bake the loaf right out of the fridge. A cold dough will hold its shape and will let you slash the surface easier. I slash the surface with a lame. The thin curved blade slices better than a sharp knife. After 24 hours your loaf will have a nice sour flavor.

I've been baking my ~500g loaves in a 9-inch cast iron skillet. I bake with my oven's 'roast' setting (where both the top and bottom heating elements are engaged) and I preheat the oven to 450F (232C) with the skillet inside. When the oven is up to heat, I remove the pan, plop the cold dough into it, cut it with my lame, brush hot water over the surface (this gives it a nice brown crust), and then put it back in the oven.

/media/images/bread_img_20240508_105621.jpg /media/images/bread_img_20240508_112435.jpg

I bake at 450F for 29 minutes, but I'll remove it early if I think it's done or leave it in longer if it still feels dense. You can check if a loaf is done by popping it out of the pan and knocking on the bottom. Finished bread will sound hollow. I usually bake until the top is a dark chocolate brown (almost burnt) because this brings out some of the caramelized flavors. Baking until the top is nicely brown is enough for most breads, but I'm still experimenting on how to bake bread with lots of chocolate or other heavy wet fruit.

Additions are fun, but keep in mind the more you add, the worse your dough will rise.

  • Dried fruit of all kinds is good (avoid wet fruit). I just eyeball the amount, but add no more than 200g.
  • All nuts and seeds are good, but I like walnuts because they're cheap, and the bitterness goes away when you bake them.
  • Wheatberries are good and cheap if you can find them, and they add a nice texture to the bread. I don't bother cooking them beforehand even though this means they're drier than you'd get in a loaf of store bought wheat flour. Incidentally Bulger wheat is just expensive pre-cracked wheatberries.
  • Sunflower and Sesame seeds can be stuck to the top of the crust after you brush it with water. I usually don't bother because it makes a mess incommensurate with the additional flavor.

After writing this out it seems like a lot, but it's really pretty simple. Here's a recipe. Start this in the morning, and you will have delicious bread for breakfast the next day.

  • 500-580g flour
  • 400g water
  • A spoonful of salt (about 10g)
  • A spoonful or two of starter (fed or unfed)
  • Other additions like nuts, seeds, berries, or dried fruit
  • Mix until it comes together and move it to a bowl
  • Stretch and fold 3 times with 15 minute intervals
  • Let sit covered all day
  • Before bed move the dough to a couche/proofing basket/towel lined colander, cover this with plastic, and put it into the fridge
  • Put a cast iron skillet into the oven and preheat to 450F (230C)
  • Put the loaf into the pan, slash the top, brush with water, and bake for a half hour (or until the bottom sounds hollow).

Baking on a 24-hour schedule like this is more convenient than preparing a loaf of bread with bakers yeast over 4-6 hours in the middle of the day. Waking up knowing you will have a fresh loaf of baked bread for breakfast is nice.

Finally, homemade bread will go stale faster than store bought bread. As soon as it's cool, cut your loaf and freeze the bits you don't intend on finishing in the next few days. Freshly baked bread will be almost as good right out of the freezer as it was when it came out of the oven. Don't keep your bread in the fridge, this can make it go stale faster.

/media/images/bread_img_20240504_123732.jpg

Prime partitions

/media/images/bread_cut.jpg

I bake a lot of bread, 2-8 loaves a week, and I'm cutting bread a lot. I usually freeze freshly baked bread to keep it from going immediately stale, and I cut the bread before I freeze it because it's impossible to cut frozen bread.

One of the loaves I like to make is my cranberry pumpkin seed bread. I eat a bit of this bread every day for lunch, and I've been doing this for a decade. In an effort to cut down on (or at least measure) the amount of carbs I'm consuming I've started cutting smaller slices from my baguettes.

The recipe uses 1200g of flour and produces 4 loaves. I cut each of these loaves into 10 pieces which gives me a small (30g of flour) hunk of bread for my lunch each day.

I've noticed when cutting bread that it's more difficult to cut into larger prime partitions:

  • Cutting a piece in 2 is easy, just cut down the center.
  • Cutting a piece into 3 can be measured by eye
  • Cutting a piece into 4 is easy, cut it in half and cut each piece in half again. This is essentially factoring the bread. (2 * 2)
  • Cutting into 5 is getting hard.
  • Cutting into 6 is relatively easy - cut in half and then each piece into thirds. (2 * 3)
  • Cutting into 7 is pretty difficult.
  • Cutting into 8 is easy (2* 2 * 2).
  • Cutting into 9 is relatively easy (3 * 3).
  • Cutting into 10 is as difficult as cutting it into 5 pieces (2 * 5).
  • Cutting into 11 is impossible.
  • Cutting into 12 is easy (2 * 2 * 3)
  • Cutting into 13 is impossible.

Incidentally the multiplicative property of this bread factorization is commutative (2 * 5) = (5 * 2). To cut my loaf into 10 pieces I cut it in half first and then cut each piece into 5, generally cutting out a slice in the center and then cutting the two remaining ends in half. I could cut the large loaf into 5 pieces and then cut each of these into half but for some reason it seems more difficult to do it this way.

I accidentally left my bread proofing overnight and the baguettes were like deflated tires in their couches when I checked on it in the morning, but I baked them anyway, and they turned out alright. While the freshly baked loaves were still cooling on the counter, Amanda asked if she could have a slice and I had to run in to slice it for her because she hadn't read this post, and it was too hard to explain all this from the other room.

Boomer Brain

/media/images/boomer_brain0.jpg

Apparently there is an endless scroll of AI generated pictures on facebook and the boomers are eating it up. I've read that the accounts posting these things are bots so it's possible the likes are also coming from bots, but it still suggests something horrible.

During elsagate youtube had a abundance of strange cartoons and live action plays targeting children featuring elsa and spiderman. Each video was receiving millions of views. The screenplays were procedurally generated using all the keywords young kids were searching for on youtube. They contained things like "Frozen Elsa Dates Spiderman", "Supderman saves Frozen Anna!", "Spiderman & Frozen Elsa vs Joker!", and "Joker Kidnap Frozen Elsa baby e/ Police Baby vs Spiderman Baby Rescue Elsa".

/media/images/elsagate.jpg

The facebook bots are producing things based on what is typically liked on facebook; jesus, veterans, babies, dogs, and nature, and it's like shining a mirror into their brains.

/media/images/boomer_brain8.jpg /media/images/boomer_brain4.jpg /media/images/boomer_brain6.jpg /media/images/boomer_brain5.jpg /media/images/boomer_brain2.jpg /media/images/boomer_brain1.jpg

I never heard what happened to all those young children manipulated by the capitalism driven ai, and I'm not sure what will happen with our older (voting age) generation, but I know as the AI gets better it will begin to creep in from both sides, targeting older children and younger old people.

What happens when the internet is completely full of AI generated content tailored towards your specific interests? Will we crave authenticity, or will we be content?


Update 240503:

/media/images/crab_jesus.jpg

I'm including one more picture I originally left out because it was too creepy. I didn't realize if you squinted you could make out the outline of jesus among the creepy malformed underwater children and chitinous sealife.

linux permissions

/media/images/linux_parent_directories.jpg

I don't have a good image for this subject.


I learned something new about linux permissions. As long as the immediate parent directory is user writable you can write to it, even if that parent directory lives in a non user-writable directory.

For example:

/usr/                # drwxr-xr-x root:root
  /share/            # drwxr-xr-x root:root
    /nas_folder      # drwxr-xr-x na:na    <-free to read and and write by na

All these years I've assumed you needed writeable parents all the way down. This changes how I would organize my web service directories.

Maybe when my sbc explodes and I have to rebuild everything I'll organize things better.

Gitea, TinyTinyRSS, and FreshRSS

/media/images/freshrss2.png

While pushing code to my git server yesterday I realized I wasn't running the latest version and I decided to update.

I was a little nervous about breaking things, but I use a sqlite backing store so I don't have to worry about schema migrations, I can just back up the directory. The upgrade went fine. Apparently the program checks and migrates the schema automatically on boot so I didn't even have to worry about that going wrong. Gitea is pleasant. It's a single binary, comes already cross-compiled for my arm64 sbc, and to setup a reverse proxy you just send it through:

location /git/ {
    proxy_pass http://localhost:3940/;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

I wish all my network apps were as easy.

After the upgrade I started thinking about my feedreader server. My hosted tiny tiny rss feed reader isn't public and hasn't been updated in a while. As a hosted feed reader, ttrss is sufficient. It seems to handle my giant list of feeds without a problem, but it has some irritating rough edges.

The last time I installed it from scratch I discovered they'd deprecated the extension that allowed me to hit a button to advance to the next feed. TTRSS has its own built in shortcuts, but they conflict with my tridactyl settings, and you can't change them. I could use the arrow keys to advance to the next article in the list, but this was super irritating. Stepping through the list with the arrow keys would open each article, but it would continue to show the closed entries in the list above. Eventually the top of the opened article in the list would be a few steps above the bottom of the view and I would have to either refresh the feed (with the mouse), or I would have to use the page down key. As I read a feed, the articles would gradually open lower and lower in the window. Because of the gradual way it degraded I often didn't notice I was missing the bottom of images or the end of paragraphs until I ran into something I really wanted to see, and then I would have to interrupt my train of thought to fix the article position in the window. It made just using the software annoying like having a low grade headache.

It's possible this functionality has been fixed in the latest version of tiny tiny rss, but I don't know because the developer is an asshole. Rather than offering official releases he advises people to just use master HEAD. He tells you you're stupid if you try to run it in anything other than a docker container (which won't run on my arm64 sbc not to mention play nice with all my other nginx reverse proxy settings). Also he requires postgresql as a back end because he considers sqlite a toy database.

Tiny Tiny RSS was my only option when google shut down google reader, but I'm sick of its ethos, so I initiated yet another search of self-hosted feed readers. Unfortunately there arent many options. There is a go-powered hosted RSS reader called yarr but it seems too simplistic for my needs. FreshRSS was another promising option, but it uses a strange reverse proxy layout where you put some of the application in /usr/share, mark it as web readable, and then symlink a subdirectory in this filetree into your hosted directory. The reverse proxy settings also make the assumption you're not acting as a reverse proxy for anything else, and I couldn't get it running the last three times I tried it.

Energized by the asshole energy emanating from the ttrss guys I tackled FreshRSS again and finally got the service running through my reverse proxy only to discover it only gave me the choice of postgresql as a backing store (the docs say sqlite3 is the built-in default). This led to hours of trying to understand how php works. Apparently you can have the php sqlite3 module installed but not enabled. I eventually discovered that my package manager provided the sqlite module for php8.2 but not for 8.1 or 7.4. I don't know why it thinks I need three versions of php installed on my system when two of them are crippled, but the distribution is based on ubuntu, so maybe they just want to charge me for the missing debian packages.

I set it up last night and in the morning when I saw it had pulled down 6600 articles I killed the ttrss updater and replaced the ttrss tab that had been open for more than a decade with freshrss. I'm subscribed to ~300 feeds and I get 500-700 new articles every night. The sqlite database file is 45MB. There is no way in hell this needs postgresql.

/media/images/freshrss_shortcuts.png /media/images/freshrss_sticky_articles.png

FreshRSS encourages you to use sqlite. FreshRSS gives you an option to make your opened articles stick to the top of the window. FreshRSS lets you set different shortcuts. FreshRSS will let you automatically advance to the next unread feed when you exhaust the current one. FreshRSS doesn't tell you you're stupid for trying to install outside of docker. FreshRSS has actual releases and a changelog you can read on it's github page.. These things are a low bar to hit for a hosted service but rss readers never really recovered after google stabbed us in the back to promote its social network. I honestly can't recall the name of that social network now. It was killed a few years later like most google services.

I'm happy with FreshRSS, but I'm still on the market for a hosted feed reader written in go or rust, or anything really, as long as it will run on various architectures, consists of a single binary, and supports a range of databases.

Crazy Chef

/media/images/shop_backdrop.jpg

So I happened to design a card game. You can buy it here if you are so inclined. The price is a bit steep at $46, but you get 230 very nicely finished cards and the game is really fun.

I've been playing variants of this card game with my friends for more than twenty years using several modified UNO decks with alternate rules scribbled on the face. Over the years I clarified our house rules, dropped some of the more crazy ideas, and documented all the edge cases. Since I now have free time to actually pursue my own interests (albeit without income or health insurance, thanks capitalism), I decided to look into creating my own custom deck.

I loaded up inkscape for the first time in years and after a few tutorials (I can recommend LogosbyNick's videos), I started some line art drawings. It was an opportunity to make use of my XP-Pen drawing tablet for a real project.

/media/images/apple.png

I wanted to avoid copyright issues, so I worked out a new theme for the game (namely you're all chefs trying to go home) and I spent a couple months working on the card design. I started by drawing an apple in a line art style I liked and for a while I planned on doing all the images in black and white until I remembered this is a pattern matching game, and it's probably better to have some color. Thankfully it's easy to color a line art drawing in inkscape. Because all my drawing were in SVG it was easy to resize them when I accidentally exported all 60 cards at the wrong size and in theory I could enlarge the images for a poster or t-shirt without losing any quality.

/media/images/cheese.png

Still, I'm not a graphic designer and I hope this isn't too obvious. I know I got better as I went along because I cringe when I look back at my earlier drawings. You might notice some inconsistency in art styles as I tried different approaches to the line art. I originally rendered this slice of cheese in shaded black and white and then had to replace it with different shades of yellow. This sort of thing bothers me but I don't know if you'll notice.

/media/images/potato.png

Some of the drawings, like this potato, took days to complete, but I liked the end result so much I almost went back to make all the other foods similarly whimsical. I only decided against it because it seemed the project might never get done.

Joe, my local board game expert, suggested I look into thegamecrafter.com to have the cards printed, and I discovered they have a pretty nice setup. You send in your designs (in my case ~60 unique card images) and they will print, coat, and cut them for you. They also give you the option to sell the game in their shop and will give you a percentage of the sale.

I'd already achieved my goal of owning a custom card deck for my favorite game, but I figured it wouldn't hurt to also make it available for others to purchase. Unfortunately this involved more work, and for the past several weeks I've been writing and rewriting documentation, assembling marketing material for the websites, and basically doing administrative things.

I got the cards last Tuesday, we played it for the first time on Thursday in a little 3-person game, and then again on Saturday in a massive 11-person game at the aquarium which I'm still kicking myself for not taking more pictures.

I think the new cards are much better than my hacked together deck, but I'm still wondering if the rules are clear enough for someone else to understand and immediately have as much fun as I experience every time I play.

Check out more pictures and buy a copy of the game here.

I will be sending this link to my game groups. Most have shown some interest in buying a copy but they might just be being nice. I don't have any grand aspirations for this game. It's clear I'd have to spend much more effort on marketing to make it a legitimate/successful product, but I'm happy just owning a nice new deck of cards.

/media/images/action_01.jpg