Prep the onions. Slice the onions thinly.
Set a skillet over medium heat with butter and olive oil. Add onions and a big pinch of salt. Cook 15–20 minutes, stirring often, until deep golden and jammy.
Don’t rush this step; it builds the backbone of flavor.
Deglaze. Stir in the garlic and cook 30 seconds. Pour in the wine, scraping up the browned bits. Let it bubble for 2–3 minutes to reduce slightly.
If skipping wine, add a splash of broth instead.
Mix the meatballs. In a bowl, combine ground meat, breadcrumbs, egg, 1/2 teaspoon salt, 1/4 teaspoon pepper, and 1 teaspoon Dijon. Mix gently until just combined. Overmixing makes meatballs tough.
Shape and brown (optional but recommended). Roll into 1–1.5 inch meatballs.
Brown them in a lightly oiled skillet for 2–3 minutes per side. This step adds flavor and helps them hold together, but you can skip if you’re short on time.
Load the slow cooker. Add the caramelized onion mixture to the slow cooker. Stir in beef broth, Worcestershire, thyme, and bay leaf.
Nestle the meatballs in gently.
Cook low and slow. Cover and cook on Low for 4–6 hours, or on High for 2–3 hours. The meatballs should be cooked through and very tender, and the onions silky.
Thicken the sauce. Whisk flour with a few tablespoons of cold water to make a slurry (use cornstarch for gluten-free). Stir into the slow cooker.
Cover and cook on High for 10–15 minutes until slightly thickened and glossy.
Finish and serve. Taste and adjust seasoning with salt and pepper. Remove bay leaf. If using cheese, sprinkle Gruyère over the meatballs, cover for 2–3 minutes to melt.
Garnish with parsley or chives.
Choose a base. Serve over mashed potatoes, buttered egg noodles, creamy polenta, or toasted baguette slices to soak up the sauce.