In a large bowl, combine warm milk, yeast, and granulated sugar. Let stand 5–10 minutes until foamy.
Whisk in the egg, melted butter, and orange zest. Add flour and salt; stir until a shaggy dough forms.
Knead on a lightly floured surface 6–8 minutes (or in a stand mixer 5 minutes) until smooth and elastic, adding only enough flour to prevent sticking.
Place dough in a greased bowl, cover, and let rise in a warm spot until doubled in size, about 60–90 minutes.
For the filling, mix brown sugar, granulated sugar, cinnamon, and orange zest in a small bowl. If using fresh cranberries, chop roughly. If the mixture seems dry, stir in orange juice; to thicken, sprinkle in cornstarch.
Punch down risen dough and roll into a 14x9-inch rectangle. Spread softened butter evenly over the surface, leaving a small border.
Sprinkle the cinnamon-sugar mixture evenly over the dough and scatter cranberries on top.
Starting from a long edge, roll the dough into a tight log and pinch the seam to seal.
Use unflavored dental floss or a sharp knife to cut into 9–12 rolls. Arrange in a greased 9x13-inch baking dish.
Cover and let rise again until puffy, 30–45 minutes. Meanwhile, preheat oven to 350°F (175°C).
Bake 22–25 minutes, until tops are golden and centers are cooked through. Tent with foil if browning too quickly.
Make the frosting: Beat cream cheese and butter until smooth. Add powdered sugar, vanilla, and orange juice (or milk) and beat until creamy.
Cool rolls slightly, then spread frosting over warm rolls. Serve and enjoy.
Make-ahead option: Assemble rolls in the pan, cover, and refrigerate overnight. Bring to room temperature while the oven preheats, then bake as directed.