Born in Perth, Australia, Williams is the son of a mother who originates from Mumbai, India and a father who was born in Kent, England, Williams was brought up in a footballing family. Both older brother Rhys and twin brother Aryn are professional footballers. The brothers all started their careers at ECU Joondalup before moving to England.
Club career
Portsmouth
Williams joined Portsmouth in July 2010, signing a scholarship with the clubs' academy side. There were initial issues concerning international clearance, with the FFA failing to release vital paperwork to allow Williams to play, but this was eventually resolved on 12 November. He played his first match for Portsmouth on 6 August 2010, in a friendly against Farnborough. His first competitive academy match for Portsmouth was a 4–1 loss to Chelsea. Williams was promoted to training with Steve Cotterill's first-team upon returning for the 2011–12 season. This cumulated with Williams' making his first appearance with the first-team in a 4–0 win over Havant & Waterlooville, in which he produced a lively display, contributing an assist. He went on to feature against Chelsea and travelled to the USA with the first-team. Cotterill indicated that he was ready to promote Williams to the Portsmouth first-team squad, and Williams was selected to be on the bench for the Championship match against Middlesbrough with the 17 jersey. He made his professional debut in the opening-day match against Middlesbrough, on 6 August 2011, after he came off the bench to replace Hermann Hreiðarsson in the 63rd minute, playing against his older brother Rhys, who scored in the match.
Fulham
On 31 January 2012, Fulham announced the transfer deadline day signing of Williams from Portsmouth for an undisclosed fee, having impressed during a reserve game against Wolverhampton Wanderers the previous night. On 13 May 2014, following the relegation of Fulham and his conclusion to his loan spell, Williams signed a new two-year contract with the club. Williams signed for Gillingham in League Two on a one-month loan deal on 14 February 2013 but failed to make an appearance for the Kent club before being recalled by Fulham. On 3 August 2013, Williams joined Oxford United on loan until 1 January 2014, and made his debut against Portsmouth at Fratton Park. He scored his first senior goal on 28 September 2013 in a League Two win over Hartlepool United. On 19 December 2013, Fulham agreed to extend his loan deal until the end of the season. After making 35 appearances and scoring six times, Williams made his final appearance for the club against relegation battlers Northampton Town. Williams scored his seventh goal of the season to give his team the lead. However, towards the end of the first half he was sent off for kicking Ricky Ravenhill. Northampton Town subsequently took the lead and went on to win 3–1, which led to Northampton Town surviving relegation and Oxford United missing out of the play-offs. After being included in two matches for Fulham at the start of the 2014–15 season, Williams joined Barnsley on an initial one-month loan on 2 October 2014. Williams made his Barnsley debut ten days later on 12 October 2014, in a 3–1 win over Bradford City. Having made seven appearances, Williams' loan spell was extended until 1 January 2015. However, Williams' first team appearances were soon reduced due to his international commitments and he suffered a groin injury before returned to his parent club.
Barnsley
On 26 July 2015, Williams re-joined Barnsley, but this time on a permanent basis for an undisclosed fee. His first and what turned out to be only goal for Barnsley was a late winner in a 4–3 win at Cardiff City.
On 20 June 2017, Williams moved across South Yorkshire to join Rotherham United on a two-year deal. On 30 May 2019 it was announced that he would leave at the end of the season, upon expiry of his contract.
Return to Portsmouth
On 26 June 2019, Williams re-signed for his first club, Portsmouth.
International career
Having previously played for the under-20 and under-23 sides, Williams was called up to the Australia senior squad in May 2019 for the friendly game against South Korea on 7 June. He made his international debut as a second-half substitute in the game.