diff --git a/packages/app/src/main.tsx b/packages/app/src/main.tsx
index cc565f3..7619d15 100644
--- a/packages/app/src/main.tsx
+++ b/packages/app/src/main.tsx
@@ -1,10 +1,30 @@
+import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { StrictMode } from "react";
import { createRoot } from "react-dom/client";
+import { Toaster, toast } from "sonner";
import { App } from "./app";
import "./styles.css";
-createRoot(document.getElementById("root")!).render(
-
-
- ,
-);
+function main() {
+ const queryClient = new QueryClient({
+ defaultOptions: {
+ mutations: {
+ onError: (error) => {
+ console.error(error);
+ toast.error(error.message);
+ },
+ },
+ },
+ });
+
+ createRoot(document.getElementById("root")!).render(
+
+
+
+
+
+ ,
+ );
+}
+
+main();
diff --git a/packages/app/src/worker.ts b/packages/app/src/worker.ts
deleted file mode 100644
index f71b368..0000000
--- a/packages/app/src/worker.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-// Worker: messaging and the browser host for the Rust/WASM separation flow.
-// Input is a SeparateRequest verbatim; output is the WorkerResponse union.
-import {
- separate,
- type ProgressEvent,
- type SeparatedStem,
- type SeparateRequest,
-} from "./lib/audio/separate";
-
-export type WorkerResponse =
- | { type: "progress"; event: ProgressEvent; at: number }
- | { type: "done"; outputs: SeparatedStem[] }
- | { type: "error"; message: string };
-
-self.onmessage = async (e: MessageEvent
) => {
- const post = (m: WorkerResponse, t?: Transferable[]) =>
- (self as unknown as Worker).postMessage(m, t ?? []);
- try {
- const outputs = await separate(e.data, {
- onProgress: (event) => post({ type: "progress", event, at: Date.now() }),
- });
- const transfers = outputs.flatMap((o) => [o.left.buffer, o.right.buffer]);
- post({ type: "done", outputs }, transfers);
- } catch (err) {
- post({ type: "error", message: String(err) });
- }
-};
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 4428bee..18b0c1f 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -20,6 +20,9 @@ importers:
packages/app:
dependencies:
+ '@tanstack/react-query':
+ specifier: ^5.101.2
+ version: 5.101.2(react@19.2.7)
lucide-react:
specifier: ^0.562.0
version: 0.562.0(react@19.2.7)
@@ -29,6 +32,9 @@ importers:
react-dom:
specifier: ^19.2.3
version: 19.2.7(react@19.2.7)
+ sonner:
+ specifier: ^2.0.7
+ version: 2.0.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
zod:
specifier: ^4.4.3
version: 4.4.3
@@ -1052,6 +1058,14 @@ packages:
peerDependencies:
vite: ^5.2.0 || ^6 || ^7 || ^8
+ '@tanstack/query-core@5.101.2':
+ resolution: {integrity: sha512-hH5MLoJhF7KaIGd7q3xTXGXvslI+GYlM1Z/35aSHHWaCJWB7XvTSHYuV3eM7tw+aE0mT/xMro4M4Q9rCGHT0lw==}
+
+ '@tanstack/react-query@5.101.2':
+ resolution: {integrity: sha512-seDkr6kzGzX1okaaTtZPtgA688CDPlXUz1C6xSg0ESqn04Vuc8tlrYms1s3de+znBqhPVxFRfpAfUf+6XvfPWg==}
+ peerDependencies:
+ react: ^18 || ^19
+
'@testing-library/dom@10.4.1':
resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==}
engines: {node: '>=18'}
@@ -1711,6 +1725,12 @@ packages:
resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==}
engines: {node: '>=18'}
+ sonner@2.0.7:
+ resolution: {integrity: sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w==}
+ peerDependencies:
+ react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc
+ react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-rc
+
source-map-js@1.2.1:
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
engines: {node: '>=0.10.0'}
@@ -2522,6 +2542,13 @@ snapshots:
tailwindcss: 4.3.2
vite: 8.1.4(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.0)
+ '@tanstack/query-core@5.101.2': {}
+
+ '@tanstack/react-query@5.101.2(react@19.2.7)':
+ dependencies:
+ '@tanstack/query-core': 5.101.2
+ react: 19.2.7
+
'@testing-library/dom@10.4.1':
dependencies:
'@babel/code-frame': 7.29.7
@@ -3117,6 +3144,11 @@ snapshots:
mrmime: 2.0.1
totalist: 3.0.1
+ sonner@2.0.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7):
+ dependencies:
+ react: 19.2.7
+ react-dom: 19.2.7(react@19.2.7)
+
source-map-js@1.2.1: {}
stackback@0.0.2: {}