Proof the yeast: In a large bowl, combine warm water and honey.
Sprinkle yeast over the top. Let it sit 5–10 minutes until foamy. If using instant yeast, you can skip the proofing and mix directly into the flour, but still warm the water.
Mix the dough: Add oil and salt to the yeast mixture.
Stir in 2 1/2 cups of whole wheat flour. If using milk, yogurt, or an egg, add it now. Mix until a shaggy dough forms.
Knead: Turn the dough onto a lightly floured surface.
Knead 7–10 minutes, adding more flour a tablespoon at a time as needed. The dough should be slightly tacky but not sticky. If using a stand mixer, knead with a dough hook on medium-low for about 6–8 minutes.
First rise: Shape the dough into a ball and place it in a lightly oiled bowl.
Cover with a clean towel or plastic wrap. Let it rise in a warm spot until doubled, about 1–1 1/2 hours.
Shape: Punch down the dough to release air. Pat it into a rectangle and roll it tightly into a log, pinching the seam.
Tuck the ends under. Place in a greased 8.5 x 4.5-inch or 9 x 5-inch loaf pan.
Second rise: Cover and let it rise again until the dough crowns about 1 inch over the pan, 30–60 minutes. It should spring back slowly when gently poked.
Bake: Preheat the oven to 375°F (190°C).
Bake 30–35 minutes. The top should be golden brown, and the loaf should sound hollow when tapped. Internal temperature should reach about 190–200°F.
Finish and cool: Brush the top with a little butter or oil if you want a softer crust.
Cool the loaf in the pan for 10 minutes, then remove and cool completely on a rack before slicing.