The Good and Not So Good from Week 2 of 49ers OTAs 2025

In this story:
SANTA CLARA -- The 49ers just finished their second and final week of OTAs. Here's who stood out.
THE GOOD
Suited up and practiced for the first time since he injured his ankle last season. When I say that he practiced, he stretched and did drills with the offensive linemen. He did not participate in 11-on-11 team drills because he's not in football shape. He hasn't been here with the rest of the team. But he showed up today and fulfilled his role as a captain. That's a start. Now let's see if he'll practice enough this offseason to get into game shape by Week 1.
2. RB Christian McCaffrey.
He's the Jerry Rice of this team, meaning he never takes practices off. He goes all out in every drill. Today, he was the only older player who participated in 11-on-11s, which means he set the tone today, not George Kittle or Trent Williams or Fred Warner. McCaffrey deserves tremendous credit for going above and beyond. Unfortunately, he still looks a step slower than he did in 2022 and 2023, but that's to be expected at his age after suffering from bilateral Achilles tendonitis. At least he still can run.
3. DE Bryce Huff.
He didn't practice because he has been on the team for just a few days, but he showed up and ran around while wearing a 49ers jersey, which means he probably will participate in minicamp next week. I don't know what I expected to see when I first laid eyes on Huff, but he's no Dee Ford. He seems shorter and less coordinated.
4. QB Brock Purdy.
He threw zero interceptions despite playing without George Kittle, Brandon Aiyuk, Ricky Pearsall and Jauan Jennings (more on him in a minute). Purdy is clearly the best quarterback on the roster. If the 49ers had a quarterback competition, he would win it.
5. LB Dee Winters.
Broke up a deep pass from Purdy on third down that was intended for wide receiver Isaiah Hodgins. Defensive coordinator Robert Saleh brought extra pressure and Winters had to cover a wide receiver man-to-man. No problem. He's having a terrific offseason.
6. LB Nick Martin.
Broke up a pass in the flat from Mac Jones (more on him in a minute). Martin is just as explosive and fast as Winters. Once Martin gets more confident and begins to trigger faster, he might be even better than Winters. They're both good.
7. S Richie Grant.
Broke up back-to-back passes from Purdy over the middle. The first pass was a short throw intended for Ross Dwelley running a shallow cross. During this play, Grant was covering man to man. On the next play, he was playing single-high safety and he broke up a 15-yard pass from Purdy over the middle that was intended for Hodgins.
8. NCB Upton Stout.
The only nickelback who didn't give up any catches today. Both Tre Brown and Chase Lucas got beat while Stout did not. Stout is short, but he doesn't give up much separation. I wouldn't be surprised if he's the starting nickel by Week 1. The other options aren't good.
9. CB Darrell Luter Jr.
The 49ers are counting on Renardo Green to start opposite Deommodore Lenoir, but through two weeks of OTAs, Green has been awful while third-year cornerback Darrell Luter Jr. hasn't given up a catch yet. Luter is interesting because he's just as big and fast as Green -- he just hasn't had an opportunity to play yet. He may get that opportunity this year.
10. CB Jakob Robinson.
Broke up a pass over the middle from Tanner Mordecai that was intended for Jordan Watkins. Robinson is one of the undrafted free-agent rookies who has a legitimate chance to make the 53-man roster one day. Today was a step in the right direction.
11. WR Jordan Watkins.
Played with the starters, beat Deommodore Lenoir for a catch and ran the ball once as well. He might be the most impressive rookie on the field. He's balling.
THE NOT SO GOOD
1. DE Mykel Williams.
Didn't practice today. Suited up and stretched but did not do positional or team drills. Something to monitor.
2. CB Renardo Green.
Got roasted for the second week in a row. This time, he gave up a deep catch to Demarcus Robinson who beat him badly with a simple stutter-go double move. Green seems to be in his head because he's lost out there. In the final period of practice, Luter Jr. replaced him in the starting lineup.
3. QB Mac Jones.
Through an interception directly to cornerback Derrick Canteen and later overthrew a deep pass to an open Jordan Watkins by a cool five yards. If you didn't know better, you would have thought that Jimmy Garoppolo was back on the team. Jones displays none of the confidence that Purdy has.
4. WR Jauan Jennings.
Wasn't here today. The team didn't say why.
Read more
SANTA CLARA -- The 49ers just finished their second and final week of OTAs. Here's who stood out.
THE GOOD
Suited up and practiced for the first time since he injured his ankle last season. When I say that he practiced, he stretched and did drills with the offensive linemen. He did not participate in 11-on-11 team drills because he's not in football shape. He hasn't been here with the rest of the team. But he showed up today and fulfilled his role as a captain. That's a start. Now let's see if he'll practice enough this offseason to get into game shape by Week 1.
2. RB Christian McCaffrey.
He's the Jerry Rice of this team, meaning he never takes practices off. He goes all out in every drill. Today, he was the only older player who participated in 11-on-11s, which means he set the tone today, not George Kittle or Trent Williams or Fred Warner. McCaffrey deserves tremendous credit for going above and beyond. Unfortunately, he still looks a step slower than he did in 2022 and 2023, but that's to be expected at his age after suffering from bilateral Achilles tendonitis. At least he still can run.
3. DE Bryce Huff.
He didn't practice because he has been on the team for just a few days, but he showed up and ran around while wearing a 49ers jersey, which means he probably will participate in minicamp next week. I don't know what I expected to see when I first laid eyes on Huff, but he's no Dee Ford. He seems shorter and less coordinated.
4. QB Brock Purdy.
He threw zero interceptions despite playing without George Kittle, Brandon Aiyuk, Ricky Pearsall and Jauan Jennings (more on him in a minute). Purdy is clearly the best quarterback on the roster. If the 49ers had a quarterback competition, he would win it.
5. LB Dee Winters.
Broke up a deep pass from Purdy on third down that was intended for wide receiver Isaiah Hodgins. Defensive coordinator Robert Saleh brought extra pressure and Winters had to cover a wide receiver man-to-man. No problem. He's having a terrific offseason.
6. LB Nick Martin.
Broke up a pass in the flat from Mac Jones (more on him in a minute). Martin is just as explosive and fast as Winters. Once Martin gets more confident and begins to trigger faster, he might be even better than Winters. They're both good.
7. S Richie Grant.
Broke up back-to-back passes from Purdy over the middle. The first pass was a short throw intended for Ross Dwelley running a shallow cross. During this play, Grant was covering man to man. On the next play, he was playing single-high safety and he broke up a 15-yard pass from Purdy over the middle that was intended for Hodgins.
8. NCB Upton Stout.
The only nickelback who didn't give up any catches today. Both Tre Brown and Chase Lucas got beat while Stout did not. Stout is short, but he doesn't give up much separation. I wouldn't be surprised if he's the starting nickel by Week 1. The other options aren't good.
9. CB Darrell Luter Jr.
The 49ers are counting on Renardo Green to start opposite Deommodore Lenoir, but through two weeks of OTAs, Green has been awful while third-year cornerback Darrell Luter Jr. hasn't given up a catch yet. Luter is interesting because he's just as big and fast as Green -- he just hasn't had an opportunity to play yet. He may get that opportunity this year.
10. CB Jakob Robinson.
Broke up a pass over the middle from Tanner Mordecai that was intended for Jordan Watkins. Robinson is one of the undrafted free-agent rookies who has a legitimate chance to make the 53-man roster one day. Today was a step in the right direction.
11. WR Jordan Watkins.
Played with the starters, beat Deommodore Lenoir for a catch and ran the ball once as well. He might be the most impressive rookie on the field. He's balling.
THE NOT SO GOOD
1. DE Mykel Williams.
Didn't practice today. Suited up and stretched but did not do positional or team drills. Something to monitor.
2. CB Renardo Green.
Got roasted for the second week in a row. This time, he gave up a deep catch to Demarcus Robinson who beat him badly with a simple stutter-go double move. Green seems to be in his head because he's lost out there. In the final period of practice, Luter Jr. replaced him in the starting lineup.
3. QB Mac Jones.
Through an interception directly to cornerback Derrick Canteen and later overthrew a deep pass to an open Jordan Watkins by a cool five yards. If you didn't know better, you would have thought that Jimmy Garoppolo was back on the team. Jones displays none of the confidence that Purdy has.
4. WR Jauan Jennings.
Wasn't here today. The team didn't say why.
Read more

Grant Cohn has covered the San Francisco 49ers daily since 2011. He spent the first nine years of his career with the Santa Rosa Press Democrat where he wrote the Inside the 49ers blog and covered famous coaches and athletes such as Jim Harbaugh, Colin Kaepernick and Patrick Willis. In 2012, Inside the 49ers won Sports Blog of the Year from the Peninsula Press Club. In 2020, Cohn joined FanNation and began writing All49ers. In addition, he created a YouTube channel which has become the go-to place on YouTube to consume 49ers content. Cohn's channel typically generates roughly 3.5 million viewers per month, while the 49ers' official YouTube channel generates roughly 1.5 million viewers per month. Cohn live streams almost every day and posts videos hourly during the football season. Cohn is committed to asking the questions that 49ers fans want answered, and providing the most honest and interactive coverage in the country. His loyalty is to the reader and the viewer, not the team or any player or coach. Cohn is a new-age multimedia journalist with an old-school mentality, because his father is Lowell Cohn, the legendary sports columnist for the San Francisco Chronicle from 1979 to 1993. The two have a live podcast every Tuesday. Grant Cohn grew up in Oakland and studied English Literature at UCLA from 2006 to 2010. He currently lives in Oakland with his wife.
Follow grantcohn