diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7fb1fbe91a458992c3a94549e838437b124094de..29b96e5d0d6c4ca00c2a27976763ba071ddaafa5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,7 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 ### Added
 
-*
+* Support for Zip file in Web frontend
 
 ### Changed
 
diff --git a/frontends/web/package.json b/frontends/web/package.json
index 9827d355d64641282765ae13af01316fe5dfbd65..eb9e9644fae4015b4f66722c51f57651b7a5a658 100644
--- a/frontends/web/package.json
+++ b/frontends/web/package.json
@@ -23,8 +23,10 @@
         "@types/react-dom": "^18.2.11",
         "@typescript-eslint/eslint-plugin": "^6.7.4",
         "@typescript-eslint/parser": "^6.7.4",
+        "buffer": "^6.0.3",
         "emukit": "^0.9.2",
         "eslint": "^8.51.0",
+        "jszip": "^3.10.1",
         "nodemon": "^3.0.1",
         "parcel": "^2.9.3",
         "prettier": "^3.0.3",
diff --git a/frontends/web/ts/gb.ts b/frontends/web/ts/gb.ts
index b77a7474a77b8d8acc844a1e3f5bd1b00851edba..a7a5a68ee9f9e04b85b14bfd0da476817cbebd53 100644
--- a/frontends/web/ts/gb.ts
+++ b/frontends/web/ts/gb.ts
@@ -1,3 +1,4 @@
+import { loadAsync } from "jszip";
 import {
     AudioSpecs,
     base64ToBuffer,
@@ -594,7 +595,7 @@ export class GameboyEmulator extends EmulatorBase implements Emulator {
     }
 
     get romExts(): string[] {
-        return ["gb", "gbc"];
+        return ["gb", "gbc", "zip"];
     }
 
     get pixelFormat(): PixelFormat {
@@ -785,6 +786,19 @@ export class GameboyEmulator extends EmulatorBase implements Emulator {
         this.gameBoy?.key_lift(keyCode);
     }
 
+    async buildRomData(file: File): Promise<Uint8Array> {
+        const arrayBuffer = await file.arrayBuffer();
+        let romData = new Uint8Array(arrayBuffer);
+
+        if (file.name.endsWith(".zip")) {
+            const zip = await loadAsync(romData);
+            const firstFile = Object.values(zip.files)[0];
+            romData = await firstFile.async("uint8array");
+        }
+
+        return romData;
+    }
+
     serializeState(): Uint8Array {
         if (!this.gameBoy) throw new Error("Unable to serialize state");
         return StateManager.save(this.gameBoy, SaveStateFormat.Bos);