Rinse 1 pound dried navy beans and remove and discard split, broken, or discolored beans.
Place the beans and 4 cups hot water in a large, heavy pot or Dutch oven.
Bring to a boil over medium-high heat. Boil for 2 minutes, then remove the pot from heat.
Cover and let soak for 1 hour.
Meanwhile, finely chop 1 medium yellow onion (1 ½ to 2 cups), 1 large carrot (½ cup), and 1 medium celery stalk (½ cup).
Finely chop 2 garlic cloves.
Dice 8 ounces thick-cut cooked ham (1 cup).
When the beans are done soaking, pour through a colander to drain. Wipe the pot clean.
Heat 2 tablespoons olive oil in the same pot over medium heat until shimmering.
Add the onion, carrot, and celery, and cook, stirring occasionally, until fragrant and begin to soften, about 3 minutes.
Add the ham, garlic, 2 bay leaves, 2 teaspoons black pepper, 1 teaspoon kosher salt, ½ teaspoon dried thyme, and ½ teaspoon dried rosemary.
Sauté until fragrant, about 1 minute.
Add the beans and stir to combine.
If desired, nestle 1 smoked ham hock into the bean mixture.
Add 6 cups low-sodium chicken broth and bring to a boil over high heat.
Reduce the heat to medium-low and simmer gently, stirring occasionally, until the beans are tender, 1 hour 30 minutes to 1 hour 45 minutes.
Remove the ham hock.
Add 2 tablespoons unsalted butter and stir until melted.
Taste and season with more kosher salt as needed.
