diff --git a/src/Repl.vue b/src/Repl.vue
index 66138ec7..f42cbee7 100644
--- a/src/Repl.vue
+++ b/src/Repl.vue
@@ -91,7 +91,14 @@ function reload() {
   outputRef.value?.reload()
 }
 
-defineExpose({ reload })
+/**
+ * Reset playground files
+ */
+function resetFiles() {
+  props.store.resetFiles()
+}
+
+defineExpose({ reload, resetFiles })
 </script>
 
 <template>
diff --git a/src/store.ts b/src/store.ts
index 5ccf761c..e493fb21 100644
--- a/src/store.ts
+++ b/src/store.ts
@@ -328,6 +328,14 @@ export function useStore(
     )
   }
 
+  const resetFiles = () => {
+    setActive(mainFile.value)
+    setDefaultFile()
+    for (const filename of Object.keys(files.value))
+      if (![mainFile.value, tsconfigFile, importMapFile].includes(filename))
+        delete files.value[filename]
+  }
+
   if (serializedState) {
     deserialize(serializedState)
   } else {
@@ -373,6 +381,7 @@ export function useStore(
     deserialize,
     getFiles,
     setFiles,
+    resetFiles,
   })
   return store
 }
@@ -441,6 +450,7 @@ export interface ReplStore extends UnwrapRef<StoreState> {
   deserialize(serializedState: string): void
   getFiles(): Record<string, string>
   setFiles(newFiles: Record<string, string>, mainFile?: string): Promise<void>
+  resetFiles(): void
 }
 
 export type Store = Pick<
@@ -465,6 +475,7 @@ export type Store = Pick<
   | 'renameFile'
   | 'getImportMap'
   | 'getTsConfig'
+  | 'resetFiles'
 >
 
 export class File {