Born in Ipswich, Suffolk, Williams was on the books of local club Ipswich Town from the age of 10. He was later named captain of the U18s team, but was released from the club in the summer of 2008 without being offered a professional contract. Williams became part of the Glenn Hoddle Academy in Spain, before returning to England to sign for Conference North club Stafford Rangers helping them to move into the top half of the table. In February 2010, he returned to Spain to play for Jerez Industrial as part of his development. Williams joined Conference South club Chelmsford City in February 2011, signing a short-term contract until the end of the 2010–11 season. He made seven league appearances for the club, before being released at the end of the season. In September 2011, he joined Conference Premier club A.F.C. Telford United on deadline day. A week later he was sent out on loan to Northern Premier League Premier Division club Buxton, making his debut against Nantwich Town. Following his release, Williams played for a short time in South Africa.
In 2012, Williams joined Isthmian League Premier Division club Lowestoft Town, later signing a contract in January 2013 through to the end of the 2013–14 season. He made his debut for the club in a 3–2 away win over Enfield Town on 1 December 2012. Williams suffered a hamstring injury during the warm-up before a 1–0 away win over Kingstonian on 25 March 2013, missing four games before making a return to the starting lineup in a 2–0 away win over Canvey Island on 6 April 2013. He went on to make a total of 23 league appearances, scoring once in a 4–1 home win over Cray Wanderers on 9 April 2013. He helped Lowestoft to finish in second position in the league table, thus qualifying for the Isthmian League Premier Division play-offs after a 1–0 home win over Hendon on 27 April 2013. Williams played in the play-off semi-final, as Lowestoft earned a 1–0 win over East Thurrock United on 1 May 2013 to advance to the play-off final. Williams and his Lowestoft teammates suffered a 2–1 defeat to Concord Rangers on 6 May 2013, resulting in the club being defeated in three successive play-off finals. During the 2013–14 season, Williams made 33 league appearances, including three assists. He helped Lowestoft to keep 17 clean sheets in the games he was involved in, as the club once again qualified for the Isthmian LeaguePremier Division play-offs after a 3–0 home win over Harrow Borough on 26 April 2014. However, Williams suffered a setback during the game as he clattered into the advertising boards, injuring his shoulder and had to be replaced. As a result of the injury, he missed the 2–1 play-off semi-final win over Bognor Regis Town on 30 April 2014. Williams also missed the 3–0 play-off final win over A.F.C. Hornchurch on 5 May 2014, as Lowestoft were finally promoted to the Conference North after three successive play-off final defeats.
On 15 May 2014, Williams was signed by League Two club Luton Town on a two-year professional contract, after manager John Still had been tracking his progress at Lowestoft. He made his Luton debut in a 1–0 home win over Cheltenham Town on 13 September 2014. He made his second successive appearance in a 0–0 draw with York City on 16 September 2014, followed by a third successive appearance in a 1–0 away win over Cambridge United on 20 September 2014. However, Williams suffered an injury after 27 minutes and was replaced by Andy Drury. Thereafter, he continued to struggle with injuries throughout the season, failing to make any further appearances and was placed on the transfer list in May 2015. Despite being placed on the transfer list, Williams remained with Luton for the entirety of the 2015–16 season, failing to make a single appearance and was an unused substitute on five occasions. On 10 May 2016, it was announced that Williams would not have his contract renewed and would leave the club at the end of his contract.
Dagenham & Redbridge
Williams signed a one-year contract with newly relegated National League club Dagenham & Redbridge on 6 June 2016, with the option of a further year. He debuted on the opening day of 2016–17 in a 3–0 win at home to Southport. After starting the first five matches of the season, Williams sustained a knee injury that would rule him out until March. He made his return to the team in the starting lineup at home to York City on 25 March 2017, which resulted in a 1–0 win. Williams started in the second leg of the play-off semi-final defeat to Forest Green Rovers, losing 3–1 on aggregate, and finished the season with 11 appearances. He was released by Dagenham & Redbridge when his contract expired at the end of 2016–17.