Jan & Feb Egg Count

As a Chicken Tender, I raise some of the happiest chickens on the planet.
And as an analytical data tender, I like to track how many eggs have been laid and by whom.

People ask me how many eggs I collect in a week, and I’m a nut about calculating costs too. So I will share monthly updates on how many eggs were gathered and the average cost per dozen. Figuring out these numbers is satisfying. It’ll be interesting to see how the egg count and cost per dozen changes as we approach June where the longer daylight results in more egg laying, and then tapers down as we approach winter solstice.

I currently raise 6 layer hens. They eat organic chicken feed and garden greens, range freely, and slurp up tasty worms like noodles.

Here’s our monthly Egg Count for January and February 2023:

Month (2023)Laying HensEggs per Day (avg)Eggs per WeekDozens per WeekEggs per MonthDozens per MonthFeed CostCost per Dozen
Jan62.719.41.6836.9$ 30.00$ 4.30
Feb63.827.72.31078.9$ 30.00$ 3.33


– Two of the reinas (2+ year old hens) resumed laying when they finished their winter molt (feather shedding and regrowth) in late Jan and early Feb. This increased the Feb egg count.
– The three bebitas (1 year old hens) laid daily last summer, but this tapered down to a rate of 0.8 per hen (or 4 eggs every 5 days) in January. This is to be expected due to short daylight.


The unchangeable “No.”

When someone tells you, “No,”
don’t react emotionally and close control.
“No” may open up a surprising new world to you.
“No” may unexpectedly lead you to good people.
If you begin to push back against the unchangeable “No,”
you will suffer in the process and miss other opportunities.

Your boss asks you to run an errand that has little to do with your job.
Rather than getting annoyed, just do it and let it go.
Do not turn something trivial into a major source of agony
by wasting time and energy thinking about it endlessly.


If I had to summarize the entirety of most people’s lives in a few words,
it would be endless resistance to what is.
As we resist, we are in constant motion trying to adjust,
and yet we still remain unhappy about what is.

If I had to summarize the entirety of an enlightened person’s life in a few words,
it would be complete acceptance of what is.
As we accept what is, our minds are relaxed and composed
while the world changes rapidly around us.

Haemin Sunim 혜민스님, “The things you can see only when you slow down.”

Insightful nugget from one of the best books I’ve read (many times).

Maybe this is why I enjoy being with chickens and in nature.
Chickens are not endlessly stressing about and resisting their circumstance.
They accept and adapt. Sometimes they get pecked. But they pick themselves up and keep eating, searching for grubs, delighting in muddy puddles of rainwater to quench their thirst, roosting every night and rising the next morning, ready to start a new day without existentially wondering about ‘why’ life is an endless cycle of suffering.

There’s been frustrating challenges at work, and through the process I’ve discovered a band of great colleagues who remind me that this workplace has good, hardworking people who care. I wouldn’t have discovered this camaraderie were it not for a stress-inducing process with endless, seemingly unchangeable “No’s” coming from above. I’ve started to let it go and have been resting better.

Plum Salad + Chicken Tenders

Have you ever tried sliced plums in a salad? The arugula and lettuce greens go surprisingly well with the fruit. Here’s a fresh summer meal I’ve enjoyed these last few evenings:

  • Vegan chicken tenders
  • Trader Joe’s Incredisauce (“great with nuggies!”) and Peri Peri hot sauce
  • Salad: baby greens, balsamic vinaigrette, seeds, 1-2 sliced ripe red plums
  • Optional: Any leftover sides, like elote corn kernels or carrots & hummus

One day I discovered Blanqui (the white hen) eating a fallen plum. I looked up and realized the tree straddling the fence line was laden with ripe plums! This discovery inspired this meal. It also feels appropriate, not ironic, that I enjoy the tenders as a loving tender of happy chickens.

Ramsey’s First Eggs – Python Loop Regressions

I’ve been gathering data about my hens’ eggs, like how many eggs are laid per day and by whom. One of my baby hens ‘Ramsey’ started laying eggs on March 21st. I weighed the eggs each day and recorded the data. The weight appears to increase gradually over time.

DayEgg Weight (grams)

I experimented with creating a linear regression (y = mx + b) to find the line of best fit using Python. I plotted the data and could tell this was not linear, so then I constructed a quadratic regression (y = ax^2 + bx + c).

# Set up Quadratic Regression

def calculate_error(a, b, c, point):
  (x_point, y_point) = point
  y = a * x_point**2 + b*x_point + c # Quadratic
  distance = abs(y - y_point)
  return distance

def calculate_all_error(a, b, c, points):
  total_error = 0 # Set initial value before starting loop calculation

  for point in points:
    total_error += calculate_error(a, b, c, point)
  return total_error

I entered the egg weight data as a list (datapoints), and iterated over a range of a, b, and c values to find what combination of a, b, and c would give the smallest error possible (smallest absolute distance between the regression line and actual values). I set initial values of a, b, and c = 0 and smallest_error = infinity and updated (replaced) them each time the error value was smaller than before.

# Ramsey Egg Data
datapoints = [

a_list = list(range(80,100))
possible_as = [num * .001 for num in a_list] #your list comprehension here
b_list = list(range(-10,10))
possible_bs = [num * .001 for num in b_list] #your list comprehension here
c_list = list(range(400,440))
possible_cs = [num * .1 for num in c_list] #your list comprehension here

smallest_error = float("inf")
best_a = 0
best_b = 0
best_c = 0

for a in possible_as:
  for b in possible_bs:
    for c in possible_cs:
      loop_error_calc = calculate_all_error(a, b, c, datapoints)
      if loop_error_calc < smallest_error:
        best_a = a
        best_b = b
        best_c = c
        smallest_error = loop_error_calc

print(smallest_error, best_a, best_b, best_c)
print("y = ",best_a,"x^2 + ",best_b,"x + ", best_c)

Ultimately I got the following results:

y = 0.084 x^2 + -0.01 x + 41.7
Which gives a total error of 19.828.

This error feels big to me. I would like to get it as close to 0 as possible, or within single digits. One thing I may do is remove the data point of day 4, 47grams, which was unusually large.

I plotted the data in an Excel graph and added a quadratic regression line as well. The resulting regression line is y = 0.0972x2 – 0.1281x + 41.525. This is close to my Python quadratic regression, but not the same. I’d like to figure out why these differ when the model is similar. It believe this may have to do with formula of error calculation – I am using Total Absolute Error, whereas the more common standard is to get Mean Squared Error.

Note how the data points do not follow linear growth, hence quadratic time!

Nuggo Bum

Nuggo is my largest hen, an Ameraucana or Easter Egger queen on henopause. She is rotund. Her thick neck, hips and feet waddle from side to side when she walks. She prefers processed chicken feed over digging for live bugs and unabashedly gorges on young layer-hen mash (aka baby chick food).

Nuggo’s derriere, as of late, has been dirty. Crusty, in fact. A crusty bum with caked-on remnants of yesterday’s mash. This may be an indicator of digestive or dietary problems and is unsanitary. Something has to be done.

My helper and I hatched a plan. Catch Nuggo, hold her gently, and moisten her bum with a wet wipe. We repeated this but alas the crust did not wipe off. It was caked onto soft fruffles and wiping them vigorously could cause feathers to be plucked out.

We hatched another plan: Place her gently in a warm bath, use soap-free Summer’s Eve to rinse the affected area (soap-free is key, to avoid removing the necessary natural oils from the feathers). I used scissors to trim off a few crusty feathers for which there was no hope. We were inspired by how dog groomers begin by shaving the fur around the canine’s bum.

This multi-pronged rinse and shave procedure worked! It’s been four days and Nuggo’s bum is streak-free and squeaky clean. Her rear is like a clean clamshell of feathers. Today, she approached me and softly pecked my shoes as I watched the garden. I sense an intimacy that wasn’t there before. The bum bath brought us closer and her tush feels fresher.

“It was traumatic, but I feel better now.”

Rain Harvest

I’ve been working on a new project to collect rainwater. Call me crazy, but getting huge plastic tanks for this is a long-time dream come true. Here’s what I did:

  • Identify an appropriate spot for a 300-gallon IBC tote (a cube container with 3.5-feet long sides). It should be under a rain gutter downspout that gets good flow, and somewhat out of view to reduce the eyesore (ie do not block windows).
  • Obtain two IBC totes from Craigslist. Request delivery (these won’t fit in an SUV). Make sure they are food-grade/food-safe and did not formerly contain toxic chemicals. Water collected in these totes will be used to irrigate vegetable gardens and provide drinking water for chickens. Seller confirmed they are from a dishwashing business and are safe to use.
  • Clean the inside of an IBC tote (or ask seller to do so) with a pressure washer. Empty out the water. Make sure the spout works.
  • Obtain & use a T30 star driver bit to unscrew and remove the top two metal bars of the cage. DeWalt bits are good quality. T30 star bolts are standard on IBC totes. You can look for the letter “T” on the bolt to check.
T30 bolts on tote & T30 driver bit (largest 6-pointed star bit in most bit sets)
  • Remove plastic tote from the metal cage.
  • Set newspaper or cardboard under the plastic tote. Wear a mask to reduce inhalation of paint fumes. Paint the plastic tote so that it is opaque, which will inhibit algae growth. Look for lighter areas & thoroughly coat with paint until light doesn’t shine through. Using “Rustoleum Comfort Grip” or a similar product is optional but makes extended spray paint sessions significantly more comfortable for the hands.

    I used 3 spray paint cans of “Rustoleum 2x Satin Finish” in color Colonial Red to fully coat one tote, and the red color will make the tote blend in slightly with the red brick of the house. I also got the same spray paint in “Claret Wine” (a slightly darker, purpler tone) for the second tote. This one requires 5 cans to fully coat. Who knew some colors take more quantity to cover a surface than others.
  • Let the opaque painted tote cure and dry under a covered, sheltered area for 3-4 days. The longer the better.
  • Set up cinder blocks around the base of the IBC tote’s designated location. 6 blocks set edgewise (so holes are facing up, not the sides) sufficiently form the perimeter. The IBC tote spout is very low so raising it up on blocks will give height clearance to fill a jug and let water flow down hose by gravity better.
  • Insert plastic tote inside of tote cage. Set up tote on top of cinder blocks. Even with 2 people, the tote is heavy!
  • Cut wire mesh screen (the kind used for window screens) and place over the top opening of the tote. Cut a little bigger than needed. Secure with the ring-lid or bands. This screen is fine enough for most debris, and mosquitos cannot enter through the holes and lay eggs in the collected water. (The biggest enemy will be algae. An occasional pressure wash inside will help).
The screen would be better under the black cap, not temporarily secured with rubber bands which will get brittle from the summer sun. The black cap was too tight to unscrew for the time being.
  • Set up rain gutter downspout to flow into the tank through the screen. Pour a jug of water down the spout to test that the downspout is positioned well, secure, and water flows into the screen.
  • Set up an overflow system in case the tote fills up. For example, drill a ~1″ hole on the side, near the top, with a hose through this hole that goes out several feet away from the home and foundation.
  • The IBC spigot is very large and does not fit standard hoses. Set up a coupler and standard hose-size brass spigot.
  • Enjoy collecting and using rainwater! It’s better than city-treated water for watering plants because it has dissolved oxygen and is not treated with chemicals like chlorine and fluoride. This is better for the garden. Total cost including tools was about ~$336 and there are city rebates available. After the initial set up, it also means a free supply of water!
Rainbow after a downpour. Fort Knox Chicken Box in construction in the background.


Before I met my hens, I decided that one would be named Nugget. The most golden-brown one of the flock was a natural fit. I later realized she is the alpha-hen: Top of the pecking order, grunts when someone gets too close while she’s eating, and is by far the largest, fattest, and grandest of them all. She quickly teaches hens their place and hers. Her walk is a sort of waddle, perhaps due to her grandiose size. I started to feel another name arise: Big Nugget, who is now Nuggo.

The Trader Joe’s “Incredi-Sauce” sign reminds me that a more endearing version of “Nugget” exists. Nuggo…how do you feel about “Nuggies”?

Wriggling Grub

“One of my favorite unexpected perks in keeping chickens is the daily lessons they offer in mindfulness.

Chickens live in the moment, thrilling in the conquest of a wriggling grub, squawking in triumph at the delivery of an egg, resting contentedly in a dust bath. They don’t worry about whether they spent too much time in that dust bath, or if they squawked too loudly about that egg, or if they ought to have squirreled away that grub for another day.

They rise with the sun and get to the business of living with a vivaciousness, curiosity, and deliberation we could all learn from. While you may be setting out on your own chicken-raising adventure seeking nourishment for your body, I predict you just might find some for your soul, too.”

from “Keeping Chickens” by Ashley English

This expresses well why I feel content digging trenches and unearthing worms these days!

Fort Knox Chicken Box

Last night I watched Life Below Zero, where subsistence fishers and hunters carve out life in Alaska. Just one episode makes my upcoming project of building an enclosed, walk-in chicken run and secured coop seem much less daunting than it did two days ago. This coop run in this video is my model. I call this project “Fort Knox Chicken Box”.

A pigeon-sized hawk attacked my littlest hen last week and severed her neck. I grieved, then resolved to secure the roofless chicken run. I’m chipping away at the daunting fear with the passage of time, research, watching run build videos, procuring tools, and exploring our premises to see what tools and scrap wood the previous resident left behind. I’m one shovel and YouTube video in. Measurement and wood to come. 50-foot hardware cloth roll and pneumatic staple gun on the way.

I noticed that people with an unenclosed, open-air (roofless) chicken run:
i) often have a dog trained to guard the chickens during the day from hawks, weasels, etc.
ii) accept a non-zero mortality rate of their flock. One book says 5% each year.

In the mean time, I am that guard dog, supervising the hens’ free ranging until it’s their bed time.

This is an ambitious project, but I want the hens to roam safely, and to learn construction along the way rather than getting on Carolina Coop’s 4-month-long wait list for someone else to do this.

Steps I will take:

  1. Measure desired perimeter of enclosed run. Divide border into about 6-8 sections. Mark corners with stones or upright sticks. Mark where door will be positioned.
  2. Measure each section length. These will determine the lengths needed for 2×4 horizontal beams to go about 3-feet up the side and around the top (to hold the roof).
  3. Set up string line around border, anchored beyond stone markers so they don’t interfere when digging holes at the markers. Use extra cotton twine on hand. (Optional: Use leveler to ensure string line is flat.)
  4. Obtain wooden posts. 4″x4″, about 7 feet tall. They will be buried 1 feet and make a 6 foot walk-in height.
    Obtain “quick mix” concrete and a large tray for mixing.
  5. Obtain or find 2×4″ wood pieces around the premises, and cut to correct length in step 2.
  6. Mark depth on wooden posts that they will be buried.
  7. Apply waterproof stain or primer + stain/paint to all wooden posts and side pieces.
  8. Dig holes where there are markers.
  9. Set posts into holes. Check that horizontal section length still matches step 2.
  10. Mix concrete in tub. Can use rake.
  11. Shovel/scoop concrete into holes. Line up posts against the string line.
  12. Check vertical alignment with a leveler.
  13. Use string line and visually check that they are aligned.
  14. Let the concrete dry and set according to instructions.
  15. Install horizontal wood mounts on the posts along top and middle. Mount on corner sides for the corner posts, and on opposite sides for the side posts.

Next steps will involve hardware cloth on the walls and along the floor, choosing roof type and installation, and the entry door. Stay tuned.

To cluck or not to cluck

I’ve been coding! Like the slow erosion of a river forming a canyon, I am steadily pecking away at Python to become a better programmer. Here is a lil project I did today. Why chickens? I’ll explain in a future post. Stay tuned! Bok bok bok!

# Magic 8 Ball - Ask a question, reveal an answer.

import random

name = "Heeju"

question = "Should I get hens this weekend?"

answer = ""
answer_2 = ""

# First question random answer generation
random_number = random.randint(1,10)

if random_number == 1:
  answer = "Yes - definitely."
elif random_number == 2:
  answer = "It is decidedly so."
elif random_number == 3:
  answer = "Without a doubt."
elif random_number == 4:
  answer = "Reply hazy, try again."
elif random_number == 5:
  answer = "Ask again later."
elif random_number == 6:
  answer = "Better not to tell you now."
elif random_number == 7:
  answer = "My sources say no."
elif random_number == 8:
  answer = "Outlook not so good."
elif random_number == 9:
  answer = "Very doubtful."
elif random_number == 10:
  answer = "Don't rush it. Give it some time."
  answer = "Error (number outside of range)"

# Second question random answer generation

random_number_2 = random.randint(1,9)
if random_number_2 == 1:
  answer_2 = "Yes - definitely."
elif random_number_2 == 2:
  answer_2 = "It is decidedly so."
elif random_number_2 == 3:
  answer_2 = "Without a doubt."
elif random_number_2 == 4:
  answer_2 = "Reply hazy, try again."
elif random_number_2 == 5:
  answer_2 = "Ask again later."
elif random_number_2 == 6:
  answer_2 = "Better not to tell you now."
elif random_number_2 == 7:
  answer_2 = "My sources say no."
elif random_number_2 == 8:
  answer_2 = "Outlook not so good."
elif random_number_2 == 9:
  answer_2 = "Very doubtful."
  answer_2 = "Error (number outside of range)"

if question == "":
  print("You didn't ask a question. Please ask one!")
elif name == "":
elif name != "":
  print(name,"asks:", question)
  print(name,"asks:", question)

print("Magic 8-ball's answer:", answer)

print("Is this truly random?", answer_2)

The great reveal: