Caramelize onions: In a large Dutch oven over medium heat, warm olive oil and melt butter. Add sliced onions, a generous pinch of kosher salt, and cook 25–35 minutes, stirring occasionally, until deeply golden and jammy. Add garlic and cook 30–60 seconds until fragrant.
Optional thickening: Sprinkle flour over the onions and stir constantly for 1 minute to toast; this adds gentle body to the broth.
Sear short ribs: Push onions to the sides (or transfer to a plate). Increase heat to medium-high. Pat short ribs dry, season all over with salt and pepper, and sear in batches 6–8 minutes until well browned on all sides.
Build the broth: Return onions to the pot (if removed). Add thyme and bay leaves. Pour in beef broth, scraping up browned bits. Bring to a gentle boil, then reduce to a steady simmer.
Simmer to tender: Partially cover and simmer 1½–2 hours, stirring once or twice, until short ribs are fork-tender and broth tastes rich.
Finish: Remove bay leaves. Transfer short ribs to a board, discard bones if using bone-in, and shred or chunk meat. Return beef to the pot. Stir in apple cider vinegar 1 teaspoon at a time, tasting for a balanced, bright finish. Adjust salt and pepper.
Cheesy tops: Preheat broiler (or 450°F/230°C). Ladle soup into oven-safe bowls on a sheet pan. Top each with a slice of sourdough and a generous blanket of shredded Gruyère.
Melt and serve: Broil or bake until cheese is melted and bubbling with golden spots. Rest 1 minute (cheese is hot!), garnish with parsley or thyme, and serve.