diff --git a/README.md b/README.md
index fa36c24..db4c8d7 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,9 @@
 # Rock Paper Scissors Card Game
+Play [now](https://codebymrfinchum.pyscriptapps.com/rock-paper-scissors-card-game/latest/).
 
 A little game to play the classic Rock Paper Scissors game with a twist.
 Instead of freely selecting between Rock, Paper, and Scissors, you get a hand of three cards, potentially with only rocks.
 It is a semi-random 52-card deck with an unbalanced distribution of cards, meaning some cards are less likely to occur. For example, only 5 out of 52 cards are stones, so it is very unlikely the other player has a stone. Selecting scissors gives a higher chance of winning.
 
-This project is in its early stages. Some features are planned, but currently, it just runs in the terminal, and you can select cards. The *AI* selects a card completely at random. If there is a draw, you continue with the cards you started with. If one player wins, new cards are dealt.
+At the moment, there are two versions: a Python version for local usage (terminal), `local.py`, and a PyScript version, `main.py`.
+The PyScript version can actually be accessed and played [online](https://codebymrfinchum.pyscriptapps.com/rock-paper-scissors-card-game/) on my [PyScript profile](https://pyscript.com/@codebymrfinchum).
diff --git a/src/index.html b/src/index.html
new file mode 100644
index 0000000..45b4a23
--- /dev/null
+++ b/src/index.html
@@ -0,0 +1,44 @@
+<!doctype html>
+<html>
+    <head>
+        <meta charset="utf-8" />
+        <meta name="viewport" content="width=device-width, initial-scale=1" />
+        <title>Rock Paper Scissors Card Game</title>
+        <link
+            rel="stylesheet"
+            href="https://pyscript.net/releases/2025.3.1/core.css"
+        />
+        <script
+            type="module"
+            src="https://pyscript.net/releases/2025.3.1/core.js"
+        ></script>
+    </head>
+    <body>
+        <h1>Rock Paper Scissors Card Game</h1>
+        <p>
+            Play Rock Paper Scissors with a twist! Use a 52-card deck with an
+            uneven distribution of cards. Both you and the AI get three cards,
+            and the AI selects randomly. The rules follow the classic game, but
+            with an added element of chance!
+        </p>
+        <p>Select a card to play against the AI! Best out of 5 game mode.</p>
+
+        <h3>Score</h3>
+        <p>
+            You: <span id="user-score">0</span> - AI:
+            <span id="ai-score">0</span>
+        </p>
+
+        <h3 id="result">Waiting for your move...</h3>
+
+        <div id="card-buttons">
+            <button id="card-0" index="0" py-click="game.play_card">?</button>
+            <button id="card-1" index="1" py-click="game.play_card">?</button>
+            <button id="card-2" index="2" py-click="game.play_card">?</button>
+        </div>
+        <p></p>
+        <button id="reset-game" py-click="game.reset_game">Reset Game</button>
+
+        <script type="py" src="./main.py"></script>
+    </body>
+</html>
diff --git a/src/local.py b/src/local.py
new file mode 100644
index 0000000..b6942fb
--- /dev/null
+++ b/src/local.py
@@ -0,0 +1,98 @@
+import random
+
+class RPSGame:
+    def __init__(self, best_of = 3):
+        self.deck = self.build_deck()
+        self.user_score = 0
+        self.ai_score = 0
+        self.rounds_to_win = (best_of // 2) + 1
+
+    def build_deck(self):
+        cards = [self.rock, self.paper, self.scissors]
+        deck = []
+
+        random.shuffle(cards)
+        for i in range(2):
+            n = random.randint(5, 20)
+            deck = cards[i](deck, n)
+
+        missing_cards = 52 - len(deck)
+        deck = cards[2](deck, missing_cards)
+        random.shuffle(deck)
+        return deck
+
+    def rock(self, lst, n):
+        lst.extend(["Rock"] * n)
+        return lst
+
+    def paper(self, lst, n):
+        lst.extend(["Paper"] * n)
+        return lst
+
+    def scissors(self, lst, n):
+        lst.extend(["Scissors"] * n)
+        return lst
+
+    def give_cards(self):
+        return [self.deck.pop(0) for _ in range(3)], [self.deck.pop(0) for _ in range(3)]
+
+    def battle(self, user_card, ai_card):
+        if user_card == ai_card:
+            return 0
+        if (user_card == "Rock" and ai_card == "Scissors") or \
+           (user_card == "Paper" and ai_card == "Rock") or \
+           (user_card == "Scissors" and ai_card == "Paper"):
+            return 1
+        return -1
+
+    def play_cards(self, user_hand, ai_hand):
+        while user_hand and ai_hand:
+            print(f"\nYour cards: {user_hand}")
+
+            while True:
+                try:
+                    user_choice = int(input(f"Select a card (1-{len(user_hand)}): ")) - 1
+                    if 0 <= user_choice < len(user_hand):
+                        break
+                except ValueError:
+                    pass
+                print("Invalid choice. Try again.")
+
+            user_card = user_hand.pop(user_choice)
+            ai_card = ai_hand.pop(random.randint(0, len(ai_hand) - 1))
+
+            print(f"You played: {user_card}, AI played: {ai_card}")
+
+            result = self.battle(user_card, ai_card)
+            if result == 1:
+                print("You win this round!")
+                return 1
+            elif result == -1:
+                print("AI wins this round!")
+                return -1
+            else:
+                print("It's a tie! Play again with remaining cards.")
+
+        print("No cards left, this round is a draw.")
+        return 0
+
+    def play_game(self):
+        while self.user_score < self.rounds_to_win and self.ai_score < self.rounds_to_win and len(self.deck) >= 6:
+            user_hand, ai_hand = self.give_cards()
+            round_result = self.play_cards(user_hand, ai_hand)
+
+            if round_result == 1:
+                self.user_score += 1
+            elif round_result == -1:
+                self.ai_score += 1
+
+            print(f"Score - You: {self.user_score}, AI: {self.ai_score}")
+
+        if self.user_score > self.ai_score:
+            print("\nšŸŽ‰ You won the match!")
+        else:
+            print("\nšŸ¤– AI won the match!")
+
+if __name__ == "__main__":
+    game = RPSGame(best_of = 3)
+    game.play_game()
diff --git a/src/main.py b/src/main.py
index ba02a17..75450b3 100644
--- a/src/main.py
+++ b/src/main.py
@@ -1,103 +1,136 @@
 import random
+from pyscript import document
 
-def rock(lst, n):
-    for _ in range(n):
-        lst.append("Rock")
-    return lst
+class RPSGame:
+    def __init__(self, best_of = 3):
+        self.user_score = 0
+        self.ai_score = 0
+        self.deck = self.build_deck()
+        self.user_hand, self.ai_hand = self.give_cards()
+        self.rounds_to_win = (best_of // 2) + 1
+        self.update_ui()
 
-def paper(lst, n):
-    for _ in range(n):
-        lst.append("Paper")
-    return lst
+    def build_deck(self):
+        cards = [self.rock, self.paper, self.scissors]
+        deck = []
 
-def scissors(lst, n):
-    for _ in range(n):
-        lst.append("Scissors")
-    return lst
+        random.shuffle(cards)
+        for i in range(2):
+            n = random.randint(5, 20)
+            deck = cards[i](deck, n)
 
-def build_deck():
-    cards = [rock, paper, scissors]
-    deck = []
+        missing_cards = 52 - len(deck)
+        deck = cards[2](deck, missing_cards)
+        random.shuffle(deck)
+        return deck
 
-    random.shuffle(cards)
-    for i in range(2):
-        n = random.randint(5, 20)
-        deck = cards[i](deck, n)
+    def rock(self, lst, n):
+        lst.extend(["Rock"] * n)
+        return lst
 
-    missing_cards = 52 - len(deck)
-    deck = cards[2](deck, missing_cards)
-    random.shuffle(deck)
-    return deck
+    def paper(self, lst, n):
+        lst.extend(["Paper"] * n)
+        return lst
 
-def give_cards(deck):
-    """Give 3 cards to both player and AI, removing them from the deck."""
-    return [deck.pop(0) for _ in range(3)], [deck.pop(0) for _ in range(3)]
+    def scissors(self, lst, n):
+        lst.extend(["Scissors"] * n)
+        return lst
 
-def battle(user_card, ai_card):
-    """Returns 1 if user wins, -1 if AI wins, 0 for a tie."""
-    if user_card == ai_card:
-        return 0
-    if (user_card == "Rock" and ai_card == "Scissors") or \
-       (user_card == "Paper" and ai_card == "Rock") or \
-       (user_card == "Scissors" and ai_card == "Paper"):
-        return 1
-    return -1
+    def give_cards(self):
+        return [self.deck.pop(0) for _ in range(3)], [self.deck.pop(0) for _ in range(3)]
 
-def play_cards(user_hand, ai_hand):
-    """Handles playing cards until a winner is determined or cards run out."""
-    while user_hand and ai_hand:  # Keep playing until hands are empty
-        print(f"\nYour cards: {user_hand}")
+    def battle(self, user_card, ai_card):
+        if user_card == ai_card:
+            return 0
+        if (user_card == "Rock" and ai_card == "Scissors") or \
+           (user_card == "Paper" and ai_card == "Rock") or \
+           (user_card == "Scissors" and ai_card == "Paper"):
+            return 1
+        return -1
 
-        while True:
-            try:
-                user_choice = int(input(f"Select a card (1-{len(user_hand)}): ")) - 1
-                if 0 <= user_choice < len(user_hand):
-                    break
-            except ValueError:
-                pass
-            print("Invalid choice. Try again.")
+    def refresh_hand(self):
+        self.user_hand, self.ai_hand = self.give_cards()
+        print("New cards")
+        print(f"AI cards: {self.ai_hand}")
 
-        user_card = user_hand.pop(user_choice)
-        ai_choice = random.randint(0, len(ai_hand) - 1)
-        ai_card = ai_hand.pop(ai_choice)
+    def play_card(self, event):
+        index = int(event.target.getAttribute("index"))
+        #print(f"Button {index} clicked!")  # Debugging
+        if index >= len(self.user_hand):
+            return
 
-        print(f"You played: {user_card}, AI played: {ai_card}")
+        user_card = self.user_hand.pop(index)
+        ai_card = self.ai_hand.pop(random.randint(0, len(self.ai_hand) - 1))
 
-        result = battle(user_card, ai_card)
+        result = self.battle(user_card, ai_card)
         if result == 1:
-            print("You win this round!")
-            return 1  # User wins
+            self.user_score += 1
+            round_result = f"You win! {user_card} beats {ai_card}."
+            self.refresh_hand()
         elif result == -1:
-            print("AI wins this round!")
-            return -1  # AI wins
+            self.ai_score += 1
+            round_result = f"AI wins! {ai_card} beats {user_card}."
+            self.refresh_hand()
         else:
-            print("It's a tie! Play again with remaining cards.")
+            round_result = "It's a tie! Try again"
 
-    print("No cards left, this round is a draw.")
-    return 0  # Round is a draw
+        if not self.user_hand or not self.ai_hand:
+            self.refresh_hand()
+        if self.user_score < self.rounds_to_win and self.ai_score < self.rounds_to_win:
+            pass
+        else:
+            if self.user_score < self.ai_score:
+                round_result = "You lost noob D:"
+                self.update_ui(round_result)
+                self.disable_buttons()
+                #self.reset_game()
+                return
+            else:
+                round_result = "You won great :D"
+                self.update_ui(round_result)
+                self.disable_buttons()
+                #self.reset_game()
+                return
 
-def play_game(best_of = 3):
-    """Main game loop."""
-    my_deck = build_deck()
-    user_score, ai_score = 0, 0
-    rounds_to_win = (best_of // 2) + 1
+        self.update_ui(round_result)
 
-    while user_score < rounds_to_win and ai_score < rounds_to_win and len(my_deck) >= 6:
-        user_hand, ai_hand = give_cards(my_deck)
+    def update_ui(self, result_text="Waiting for your move..."):
+        print("Update UI")
+        document.querySelector("#user-score").innerText = str(self.user_score)
+        document.querySelector("#ai-score").innerText = str(self.ai_score)
+        document.querySelector("#result").innerText = result_text
+        document.querySelector("#reset-game").disabled = False
+        for i in range(3):
+            btn = document.querySelector(f"#card-{i}")
+            if i < len(self.user_hand):
+                btn.innerText = self.user_hand[i]
+                btn.disabled = False
+            else:
+                btn.innerText = "?"
+                btn.disabled = True
 
-        round_result = play_cards(user_hand, ai_hand)
+    def disable_buttons(self):
+        for i in range(3):
+            btn = document.querySelector(f"#card-{i}")
+            btn.innerText = "?"
+            btn.disabled = True
 
-        if round_result == 1:
-            user_score += 1
-        elif round_result == -1:
-            ai_score += 1
+    def reset_game(self, event=None):
+        print("Game Reset")
+        self.user_score = 0
+        self.ai_score = 0
+        self.deck = self.build_deck()
+        self.user_hand, self.ai_hand = self.give_cards()
+        self.deck_overview()
+        self.update_ui("Game reset! Pick a card to start.")
 
-        print(f"Score - You: {user_score}, AI: {ai_score}")
 
-    if user_score > ai_score:
-        print("\nšŸŽ‰ You won the match!")
-    else:
-        print("\nšŸ¤– AI won the match!")
+    def deck_overview(self):
+        #print(f"{len(self.deck)} Cards left")
+        print(f"{self.deck.count('Rock')} Rock cards")
+        print(f"{self.deck.count('Paper')} Paper cards")
+        print(f"{self.deck.count('Scissors')} Scissors cards")
 
-# Run the game
-play_game(best_of = 5)
+# Start the game
+game = RPSGame(5)
+game.deck_overview()
diff --git a/src/pyscript.toml b/src/pyscript.toml
new file mode 100644
index 0000000..0decc8d
--- /dev/null
+++ b/src/pyscript.toml
@@ -0,0 +1 @@
+name = "Rock Paper Scissors"