Williams was born in
Middlesbrough, England.
Middlesbrough Williams made his league debut on 28 December 2009, coming on as a substitute. In doing so, Williams became the youngest Middlesbrough player in over a century, aged just 16 years and 200 days. Williams made his first Middlesbrough start against
Coventry City. On 13 May 2010, it was announced that Williams had secured a professional four-year contract with Middlesbrough. He scored his first goal for Middlesbrough on 21 August 2012, a long range goal in the 88th minute in a 3–2 win against
Burnley. He scored his second goal for Middlesbrough on 15 September, in a 2–0 win against
Ipswich Town.
Hartlepool United (loan) On 23 January 2014, Williams joined
Hartlepool United on a one-month loan deal, playing a central-attacking midfield role. The loan was extended but Williams ended up being recalled by Middlesbrough due to his excellent form for the
League Two club.
Scunthorpe United On 23 October 2014 Williams signed for
Scunthorpe United on a one-month loan deal. He made his debut against
Notts County. On 2 July 2015, Williams completed a permanent move to
Scunthorpe for an undisclosed fee. He went out on loan to fellow
League One side
Northampton Town where he made eight appearances for the club. Injuries meant that he only played twice in the 2017–18 season – both in the latter part of the season. Williams was released by the club in June 2018.
Hartlepool United Williams signed for
National League side
Hartlepool United in July 2018. Due to injury, Williams failed to make a single appearance in his first season with the club. On 30 October 2020, Williams signed a new deal at Hartlepool. In March 2021, Williams made his first league start in almost four years in a 1–0 victory against
Woking. Williams was released by Hartlepool at the end of the 2020–21 season. His time at Hartlepool was ravaged due to injuries and, as a result, Williams only made 11 league appearances for the club in his three years with the club – 10 of which were as a substitute. He scored once for Pools, in a
FA Trophy defeat against
Halifax Town in December 2020.
Gateshead Williams signed for
National League North side
Gateshead in August 2021 on a short-term contract. Williams was sent off on his debut against
Chester. Following this, Williams was dealt the blow days later of suffering another injury which would see him out for up to seven weeks. He scored his first goal for the club on 8 December 2021 in a 2–0 win against
York City. He departed the club on 14 January 2022.
Víkingur On 28 July 2022, Williams joined Icelandic side
Víkingur on a deal until the end of the season. In his third season with the club, Williams was made club captain.
Return to Scunthorpe On 14 November 2024, Williams signed for former club Scunthorpe United on non-contract terms. He signed with the
National League North club after having trained with the team for six weeks.
Spennymoor Town On 16 January 2026, it was announced that Williams had signed for National League North side
Spennymoor Town on a deal until the end of the season. The following day, he scored on his debut for Spennymoor in a 3–2 defeat against
Radcliffe. He left Spennymoor at the end of the 2025–26 season following the expiration of his short-term contract. ==International career==