diff --git a/.eslintrc.js b/.eslintrc.js
new file mode 100644
index 00000000..02c4f0b2
--- /dev/null
+++ b/.eslintrc.js
@@ -0,0 +1,5 @@
+/** @type {import("eslint").Linter.Config} */
+module.exports = {
+ root: true,
+ extends: ["@opendaw/eslint-config/index.js"],
+};
diff --git a/.gitignore b/.gitignore
index 85e7c1df..73b0db25 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,20 @@
-/.idea/
+.DS_Store
+.turbo
+.idea
+.env
+.cache
+*.log
+*.local
+node_modules
+dist
+dist-ssr
+server/dist
+public/dist
+public/build-info.json
+lerna-debug.log
+/packages/lib/box-forge/test/gen/**
+/packages/studio/boxes/src/**
+/packages/studio/adapters/src/index.ts
+/packages/app/studio/public/build-info.json
+/packages/app/localhost.pem
+/packages/app/localhost-key.pem
diff --git a/README.md b/README.md
index 3a61f0fa..294cb7d3 100644
--- a/README.md
+++ b/README.md
@@ -17,6 +17,21 @@ We are committed to transparency and community-driven development.
The source code for openDAW is available under GPL3 (links below).
+### Built on Trust and Transparency
+
+**openDAW stands for radical simplicity and respect.**
+
+- **No SignUp**
+- **No Tracking**
+- **No Cookie Banners**
+- **No User Profiling**
+- **No Terms & Conditions**
+- **No Ads**
+- **No Paywalls**
+- **No Data Mining**
+
+**Just a free, open-source DAW in your browser.**
+
## Huge Shoutout To The Incredible openDAW Community!
To everyone who has contributed feedback, reported bugs, suggested improvements, or helped spread the word — thank you!
@@ -35,10 +50,8 @@ Huge thanks to our [ambassadors](https://opendaw.org/ambassadors), whose dedicat
## And big hugs to all our supporters!
-### openDAW Top Supporter — $100.00
-- Polarity
-
### openDAW Visionary — $25.00
+- Polarity
- kanaris
- Stephen Tai
- Thad Guidry
@@ -71,15 +84,46 @@ Huge thanks to our [ambassadors](https://opendaw.org/ambassadors), whose dedicat
### openDAW Custom Pledge
- lokomotywa ($2.47)
-**Let’s keep building together!**
-
---
### Repositories
* [openDAW](https://github.com/andremichelle/opendaw)
-* [openDAW · studio](https://github.com/andremichelle/opendaw-studio)
-* [openDAW · library (submodule)](https://github.com/andremichelle/opendaw-lib)
+
+### Prepare, Clone, Installation, and Run
+
+openDAW tries to avoid external libraries and frameworks. Following is a list of the internal core libraries and their
+dependencies. This is a list of the external libraries we currently use in the web studio:
+
+* [jszip](https://www.npmjs.com/package/jszip) (for openDAW project bundle file)
+* [markdown-it](https://www.npmjs.com/package/markdown-it) + [markdown-it-table](https://www.npmjs.com/package/markdown-it-table) (for help pages)
+
+Before starting, ensure you have the following installed on your system:
+
+- [Git](https://git-scm.com/) is required for cloning the repository and managing submodules.
+- [mkcert](https://github.com/FiloSottile/mkcert#installation) is required to create a certificate for developing with
+ https protocol.
+- [Node.js](nodejs.org) version **>= 23**. This is necessary for running the development server and installing
+ dependencies.
+- [Sass](https://sass-lang.com/) While Sass is handled internally during the development process, you will need to
+ ensure you have the
+ binaries available in your environment if used outside the build system.
+- [TypeScript](https://www.typescriptlang.org/)
+- [OpenSSL](https://chocolatey.org/) For generating local development certificates (), OpenSSL needs to be installed on
+ your system. Most Linux/macOS systems have OpenSSL pre-installed.
+
+### Clone
+
+`git clone https://github.com/andremichelle/opendaw.git && cd opendaw`
+
+### Installation
+
+* `npm run cert` (only for the very first time)
+* `npm run clean` (to revert to clean slate, removes all `node_modules` and `dist` folders)
+* `npm install` (for the first time and after `npm run clean`)
+* `npm run build` (for the first time and after `npm run clean`)
+* `npm run dev:studio` | `npm run dev:headless` (start dev server)
+* Navigate to https://localhost:8080 (port is important > cors sample api)
---
@@ -92,6 +136,19 @@ Watch Polarity's Video *"there's a new FREE DAW in town"*
We welcome contributions from developers, musicians, educators, and enthusiasts. To learn more about how you can
participate, visit our [Contribute](https://opendaw.org/contribute) page.
+### What We Are Looking For:
+
+1. **Offline desktop build (e.g., via Tauri) or a standalone installable PWA** — offer offline capability.
+2. **Cloud-agnostic project storage** — a facade layer that lets users plug in different cloud services (e.g., Drive,
+ S3, Dropbox) for projects and sample libraries.
+3. **Live remote collaboration** — real-time session sharing and sync so multiple users can edit the same project
+ concurrently.
+4. **AI manual assistant** — an embedded agent that answers context-aware questions and guides users through features as
+ they work.
+5. **AI-powered stem splitting** — integrated source-separation to extract vocals, drums, and other stems directly
+ inside the DAW.
+6. **Import and Export** - Contribute every possible file format IO
+
## Links
* [opendaw.studio (prototype)](https://opendaw.studio)
diff --git a/lerna.json b/lerna.json
new file mode 100644
index 00000000..26ee9f6e
--- /dev/null
+++ b/lerna.json
@@ -0,0 +1,12 @@
+{
+ "$schema": "node_modules/lerna/schemas/lerna-schema.json",
+ "version": "independent",
+ "npmClient": "npm",
+ "command": {
+ "publish": {
+ "conventionalCommits": true,
+ "registry": "http://localhost:4873/"
+ }
+ },
+ "packages": ["packages/**"]
+}
\ No newline at end of file
diff --git a/package.json b/package.json
new file mode 100644
index 00000000..bcfbbca1
--- /dev/null
+++ b/package.json
@@ -0,0 +1,39 @@
+{
+ "name": "opendaw",
+ "private": true,
+ "license": "LGPL-3.0-or-later",
+ "scripts": {
+ "cert": "bash ./scripts/cert.sh",
+ "clean": "bash ./scripts/clean.sh",
+ "build": "turbo build",
+ "dev:studio": "turbo run dev --filter=@opendaw/app-studio",
+ "dev:headless": "turbo run dev --filter=@opendaw/app-headless",
+ "dev": "turbo run dev",
+ "test": "turbo run test",
+ "lint": "turbo run lint",
+ "format": "prettier --write \"**/*.{ts,tsx,md}\"",
+ "publish-sdk": "lerna publish"
+ },
+ "devDependencies": {
+ "@typescript-eslint/eslint-plugin": "^7.1.0",
+ "@typescript-eslint/parser": "^7.1.0",
+ "eslint": "^8.57.0",
+ "eslint-config-prettier": "^9.1.0",
+ "lerna": "^8.2.3",
+ "prettier": "^3.6.2",
+ "turbo": "^2.5.4",
+ "typescript": "^5.8.3",
+ "vitest": "^3.1.3"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/andremichelle/opendaw"
+ },
+ "packageManager": "npm@11.4.2",
+ "workspaces": [
+ "packages/**/*"
+ ],
+ "dependencies": {
+ "@opendaw/studio-core": "^0.0.0"
+ }
+}
diff --git a/packages/app/headless/.eslintrc.cjs b/packages/app/headless/.eslintrc.cjs
new file mode 100644
index 00000000..02c4f0b2
--- /dev/null
+++ b/packages/app/headless/.eslintrc.cjs
@@ -0,0 +1,5 @@
+/** @type {import("eslint").Linter.Config} */
+module.exports = {
+ root: true,
+ extends: ["@opendaw/eslint-config/index.js"],
+};
diff --git a/packages/app/headless/CHANGELOG.md b/packages/app/headless/CHANGELOG.md
new file mode 100644
index 00000000..e10c00f3
--- /dev/null
+++ b/packages/app/headless/CHANGELOG.md
@@ -0,0 +1,32 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+## [0.0.7](https://github.com/andremichelle/opendaw-turbo/compare/@opendaw/app-headless@0.0.6...@opendaw/app-headless@0.0.7) (2025-07-11)
+
+**Note:** Version bump only for package @opendaw/app-headless
+
+## [0.0.6](https://github.com/andremichelle/opendaw-turbo/compare/@opendaw/app-headless@0.0.5...@opendaw/app-headless@0.0.6) (2025-07-11)
+
+**Note:** Version bump only for package @opendaw/app-headless
+
+## [0.0.5](https://github.com/andremichelle/opendaw-turbo/compare/@opendaw/app-headless@0.0.4...@opendaw/app-headless@0.0.5) (2025-07-11)
+
+**Note:** Version bump only for package @opendaw/app-headless
+
+## [0.0.4](https://github.com/andremichelle/opendaw-turbo/compare/@opendaw/app-headless@0.0.3...@opendaw/app-headless@0.0.4) (2025-07-11)
+
+**Note:** Version bump only for package @opendaw/app-headless
+
+## [0.0.3](https://github.com/andremichelle/opendaw-turbo/compare/@opendaw/app-headless@0.0.2...@opendaw/app-headless@0.0.3) (2025-07-11)
+
+**Note:** Version bump only for package @opendaw/app-headless
+
+## [0.0.2](https://github.com/andremichelle/opendaw-turbo/compare/@opendaw/app-headless@0.0.1...@opendaw/app-headless@0.0.2) (2025-07-11)
+
+**Note:** Version bump only for package @opendaw/app-headless
+
+## 0.0.1 (2025-07-11)
+
+**Note:** Version bump only for package @opendaw/app-headless
diff --git a/packages/app/headless/index.html b/packages/app/headless/index.html
new file mode 100644
index 00000000..0b136736
--- /dev/null
+++ b/packages/app/headless/index.html
@@ -0,0 +1,13 @@
+
+
+
+ )
+}
\ No newline at end of file
diff --git a/packages/app/headless/src/features.ts b/packages/app/headless/src/features.ts
new file mode 100644
index 00000000..95c06dea
--- /dev/null
+++ b/packages/app/headless/src/features.ts
@@ -0,0 +1,12 @@
+import {requireProperty} from "@opendaw/lib-std"
+
+export const testFeatures = async (): Promise => {
+ requireProperty(Promise, "withResolvers")
+ requireProperty(window, "indexedDB")
+ requireProperty(window, "AudioWorkletNode")
+ requireProperty(navigator, "storage")
+ requireProperty(navigator.storage, "getDirectory")
+ requireProperty(crypto, "randomUUID")
+ requireProperty(crypto, "subtle")
+ requireProperty(crypto.subtle, "digest")
+}
\ No newline at end of file
diff --git a/packages/app/headless/src/main.ts b/packages/app/headless/src/main.ts
new file mode 100644
index 00000000..54c55f12
--- /dev/null
+++ b/packages/app/headless/src/main.ts
@@ -0,0 +1,62 @@
+import "./style.css"
+import {assert} from "@opendaw/lib-std"
+import {PPQN} from "@opendaw/lib-dsp"
+import {AnimationFrame, Browser} from "@opendaw/lib-dom"
+import {Promises} from "@opendaw/lib-runtime"
+import {Project, Worklets} from "@opendaw/studio-core"
+import MeterProcessorUrl from "@opendaw/studio-core/meter-processor.js?url"
+import EngineProcessorUrl from "@opendaw/studio-core/engine-processor.js?url"
+import RecordingProcessorUrl from "@opendaw/studio-core/recording-processor.js?url"
+import {testFeatures} from "./features"
+import {MainThreadAudioLoaderManager} from "./MainThreadAudioLoaderManager"
+
+(async () => {
+ console.debug("openDAW -> headless")
+ console.debug("Agent", Browser.userAgent)
+ console.debug("isLocalHost", Browser.isLocalHost())
+ assert(crossOriginIsolated, "window must be crossOriginIsolated")
+ console.debug("booting...")
+ document.body.textContent = "booting..."
+ {
+ const {status, error} = await Promises.tryCatch(testFeatures())
+ if (status === "rejected") {
+ document.querySelector("#preloader")?.remove()
+ alert(`Could not test features (${error})`)
+ return
+ }
+ }
+ const context = new AudioContext({latencyHint: 0})
+ console.debug(`AudioContext state: ${context.state}, sampleRate: ${context.sampleRate}`)
+ {
+ const {status, error} = await Promises.tryCatch(Worklets.install(context, {
+ meter: MeterProcessorUrl,
+ engine: EngineProcessorUrl,
+ recording: RecordingProcessorUrl
+ }))
+ if (status === "rejected") {
+ alert(`Could not install Worklets (${error})`)
+ return
+ }
+ }
+ {
+ const audioManager = new MainThreadAudioLoaderManager(context)
+ const project = Project.load({audioManager}, await fetch("subset.od").then(x => x.arrayBuffer()))
+ const worklet = Worklets.get(context).createEngine(project)
+ await worklet.isReady()
+ while (!await worklet.queryLoadingComplete()) {}
+ worklet.connect(context.destination)
+ worklet.isPlaying().setValue(true)
+ AnimationFrame.add(() => {
+ const ppqn = worklet.position().getValue()
+ const {bars, beats} = PPQN.toParts(ppqn)
+ document.body.textContent = `${bars + 1}:${beats + 1}`
+ })
+ }
+ if (context.state === "suspended") {
+ window.addEventListener("click",
+ async () => await context.resume().then(() =>
+ console.debug(`AudioContext resumed (${context.state})`)), {capture: true, once: true})
+ }
+ AnimationFrame.start()
+ document.querySelector("#preloader")?.remove()
+})()
\ No newline at end of file
diff --git a/packages/app/headless/src/style.css b/packages/app/headless/src/style.css
new file mode 100644
index 00000000..12320801
--- /dev/null
+++ b/packages/app/headless/src/style.css
@@ -0,0 +1,97 @@
+:root {
+ font-family: Inter, Avenir, Helvetica, Arial, sans-serif;
+ font-size: 16px;
+ line-height: 24px;
+ font-weight: 400;
+
+ color-scheme: light dark;
+ color: rgba(255, 255, 255, 0.87);
+ background-color: #242424;
+
+ font-synthesis: none;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-text-size-adjust: 100%;
+}
+
+a {
+ font-weight: 500;
+ color: #646cff;
+ text-decoration: inherit;
+}
+a:hover {
+ color: #535bf2;
+}
+
+body {
+ margin: 0;
+ display: flex;
+ place-items: center;
+ min-width: 320px;
+ min-height: 100vh;
+}
+
+h1 {
+ font-size: 3.2em;
+ line-height: 1.1;
+}
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+ text-align: center;
+}
+
+.logo {
+ height: 6em;
+ padding: 1.5em;
+ will-change: filter;
+}
+.logo:hover {
+ filter: drop-shadow(0 0 2em #646cffaa);
+}
+.logo.vanilla:hover {
+ filter: drop-shadow(0 0 2em #f7df1eaa);
+}
+
+.card {
+ padding: 2em;
+}
+
+.read-the-docs {
+ color: #888;
+}
+
+button {
+ border-radius: 8px;
+ border: 1px solid transparent;
+ padding: 0.6em 1.2em;
+ font-size: 1em;
+ font-weight: 500;
+ font-family: inherit;
+ background-color: #1a1a1a;
+ cursor: pointer;
+ transition: border-color 0.25s;
+}
+button:hover {
+ border-color: #646cff;
+}
+button:focus,
+button:focus-visible {
+ outline: 4px auto -webkit-focus-ring-color;
+}
+
+@media (prefers-color-scheme: light) {
+ :root {
+ color: #213547;
+ background-color: #ffffff;
+ }
+ a:hover {
+ color: #747bff;
+ }
+ button {
+ background-color: #f9f9f9;
+ }
+}
diff --git a/packages/app/headless/src/vite-env.d.ts b/packages/app/headless/src/vite-env.d.ts
new file mode 100644
index 00000000..11f02fe2
--- /dev/null
+++ b/packages/app/headless/src/vite-env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/packages/app/headless/tsconfig.json b/packages/app/headless/tsconfig.json
new file mode 100644
index 00000000..13ed5c02
--- /dev/null
+++ b/packages/app/headless/tsconfig.json
@@ -0,0 +1,6 @@
+{
+ "extends": "@opendaw/typescript-config/vite.json",
+ "include": [
+ "src"
+ ]
+}
diff --git a/packages/app/headless/vite.config.ts b/packages/app/headless/vite.config.ts
new file mode 100644
index 00000000..bd93d763
--- /dev/null
+++ b/packages/app/headless/vite.config.ts
@@ -0,0 +1,31 @@
+import {defineConfig} from "vite"
+import crossOriginIsolation from "vite-plugin-cross-origin-isolation"
+import {readFileSync} from "fs"
+import {resolve} from "path"
+
+export default defineConfig({
+ resolve: {
+ alias: {
+ "@": resolve(__dirname, "./src")
+ }
+ },
+ server: {
+ port: 8080,
+ host: "localhost",
+ https: {
+ key: readFileSync("../localhost-key.pem"),
+ cert: readFileSync("../localhost.pem")
+ },
+ headers: {
+ "Cross-Origin-Opener-Policy": "same-origin",
+ "Cross-Origin-Embedder-Policy": "require-corp"
+ },
+ fs: {
+ // Allow serving files from the entire workspace
+ allow: [".."]
+ }
+ },
+ plugins: [
+ crossOriginIsolation()
+ ]
+})
\ No newline at end of file
diff --git a/packages/app/studio/.eslintrc.cjs b/packages/app/studio/.eslintrc.cjs
new file mode 100644
index 00000000..02c4f0b2
--- /dev/null
+++ b/packages/app/studio/.eslintrc.cjs
@@ -0,0 +1,5 @@
+/** @type {import("eslint").Linter.Config} */
+module.exports = {
+ root: true,
+ extends: ["@opendaw/eslint-config/index.js"],
+};
diff --git a/packages/app/studio/CHANGELOG.md b/packages/app/studio/CHANGELOG.md
new file mode 100644
index 00000000..cde60b1b
--- /dev/null
+++ b/packages/app/studio/CHANGELOG.md
@@ -0,0 +1,32 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+## [0.0.7](https://github.com/andremichelle/opendaw-turbo/compare/@opendaw/app-studio@0.0.6...@opendaw/app-studio@0.0.7) (2025-07-11)
+
+**Note:** Version bump only for package @opendaw/app-studio
+
+## [0.0.6](https://github.com/andremichelle/opendaw-turbo/compare/@opendaw/app-studio@0.0.5...@opendaw/app-studio@0.0.6) (2025-07-11)
+
+**Note:** Version bump only for package @opendaw/app-studio
+
+## [0.0.5](https://github.com/andremichelle/opendaw-turbo/compare/@opendaw/app-studio@0.0.4...@opendaw/app-studio@0.0.5) (2025-07-11)
+
+**Note:** Version bump only for package @opendaw/app-studio
+
+## [0.0.4](https://github.com/andremichelle/opendaw-turbo/compare/@opendaw/app-studio@0.0.3...@opendaw/app-studio@0.0.4) (2025-07-11)
+
+**Note:** Version bump only for package @opendaw/app-studio
+
+## [0.0.3](https://github.com/andremichelle/opendaw-turbo/compare/@opendaw/app-studio@0.0.2...@opendaw/app-studio@0.0.3) (2025-07-11)
+
+**Note:** Version bump only for package @opendaw/app-studio
+
+## [0.0.2](https://github.com/andremichelle/opendaw-turbo/compare/@opendaw/app-studio@0.0.1...@opendaw/app-studio@0.0.2) (2025-07-11)
+
+**Note:** Version bump only for package @opendaw/app-studio
+
+## 0.0.1 (2025-07-11)
+
+**Note:** Version bump only for package @opendaw/app-studio
diff --git a/packages/app/studio/index.html b/packages/app/studio/index.html
new file mode 100644
index 00000000..c5070ae9
--- /dev/null
+++ b/packages/app/studio/index.html
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 🎧openDAW.studio
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/app/studio/package.json b/packages/app/studio/package.json
new file mode 100644
index 00000000..2f3c867d
--- /dev/null
+++ b/packages/app/studio/package.json
@@ -0,0 +1,37 @@
+{
+ "name": "@opendaw/app-studio",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite --clearScreen false",
+ "build": "tsc && vite build",
+ "preview": "vite preview",
+ "lint": "eslint \"src/**/*.ts\""
+ },
+ "dependencies": {
+ "@opendaw/lib-box": "^0.0.0",
+ "@opendaw/lib-dom": "^0.0.0",
+ "@opendaw/lib-dsp": "^0.0.0",
+ "@opendaw/lib-jsx": "^0.0.0",
+ "@opendaw/lib-runtime": "^0.0.0",
+ "@opendaw/lib-std": "^0.0.0",
+ "@opendaw/studio-adapters": "^0.0.0",
+ "@opendaw/studio-boxes": "^0.0.0",
+ "@opendaw/studio-core": "^0.0.0",
+ "@opendaw/studio-enums": "^0.0.0",
+ "jszip": "^3.10.1",
+ "markdown-it": "^14.1.0",
+ "markdown-it-table": "^4.1.1"
+ },
+ "devDependencies": {
+ "@opendaw/eslint-config": "^0.0.0",
+ "@opendaw/typescript-config": "^0.0.0",
+ "@types/markdown-it": "^14.1.2",
+ "@types/node": "^22.15.18",
+ "eslint": "^8.57.0",
+ "sass": "^1.88.0",
+ "vite": "^7.0.2",
+ "vite-plugin-cross-origin-isolation": "^0.1.6"
+ }
+}
diff --git a/packages/app/studio/public/.htaccess b/packages/app/studio/public/.htaccess
new file mode 100644
index 00000000..066d397d
--- /dev/null
+++ b/packages/app/studio/public/.htaccess
@@ -0,0 +1,32 @@
+# openDAW
+# prototype
+
+# CORS Headers
+Header set Access-Control-Allow-Origin "https://localhost:8080"
+Header set Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, DELETE"
+Header set Access-Control-Allow-Headers "Authorization, Content-Type, X-Requested-With"
+Header set Access-Control-Allow-Credentials "true"
+Header set Cross-Origin-Opener-Policy "same-origin"
+Header set Cross-Origin-Embedder-Policy "require-corp"
+
+# Enable Brotli Compression for supported files, only if they exist
+RewriteEngine On
+
+# Serve .br files if the client supports Brotli
+RewriteCond %{HTTP:Accept-Encoding} br
+RewriteCond %{REQUEST_FILENAME}.br -f
+RewriteRule ^(.*)$ $1.br [QSA,L]
+
+# Set Content-Encoding header only for actual Brotli-compressed files
+
+ Header set Content-Encoding br
+
+
+# URL rewriting (if needed)
+RewriteBase /
+RewriteCond %{REQUEST_FILENAME} !-f
+RewriteCond %{REQUEST_FILENAME} !-d
+RewriteRule ^ index.html [QSA,L]
+
+# Redirect /manuals/ to root index.html for SPA handling
+RewriteRule ^manuals/$ /index.html [L]
\ No newline at end of file
diff --git a/packages/app/studio/public/become_a_patron_button.png b/packages/app/studio/public/become_a_patron_button.png
new file mode 100644
index 00000000..291b7bcf
Binary files /dev/null and b/packages/app/studio/public/become_a_patron_button.png differ
diff --git a/packages/app/studio/public/cover.png b/packages/app/studio/public/cover.png
new file mode 100644
index 00000000..5965e823
Binary files /dev/null and b/packages/app/studio/public/cover.png differ
diff --git a/packages/app/studio/public/favicon.svg b/packages/app/studio/public/favicon.svg
new file mode 100644
index 00000000..c5a39337
--- /dev/null
+++ b/packages/app/studio/public/favicon.svg
@@ -0,0 +1,8 @@
+
diff --git a/packages/app/studio/public/fonts/OpenSans-Regular.ttf b/packages/app/studio/public/fonts/OpenSans-Regular.ttf
new file mode 100644
index 00000000..67803bb6
Binary files /dev/null and b/packages/app/studio/public/fonts/OpenSans-Regular.ttf differ
diff --git a/packages/app/studio/public/fonts/rubik.woff2 b/packages/app/studio/public/fonts/rubik.woff2
new file mode 100644
index 00000000..9237ec3b
Binary files /dev/null and b/packages/app/studio/public/fonts/rubik.woff2 differ
diff --git a/packages/app/studio/public/grid16.svg b/packages/app/studio/public/grid16.svg
new file mode 100644
index 00000000..28192e69
--- /dev/null
+++ b/packages/app/studio/public/grid16.svg
@@ -0,0 +1,3 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/images/meta.jpg b/packages/app/studio/public/images/meta.jpg
new file mode 100644
index 00000000..11dc61cb
Binary files /dev/null and b/packages/app/studio/public/images/meta.jpg differ
diff --git a/packages/app/studio/public/logo.png b/packages/app/studio/public/logo.png
new file mode 100644
index 00000000..ba6cb5bd
Binary files /dev/null and b/packages/app/studio/public/logo.png differ
diff --git a/packages/app/studio/public/manuals/browser-support.md b/packages/app/studio/public/manuals/browser-support.md
new file mode 100644
index 00000000..91a60269
--- /dev/null
+++ b/packages/app/studio/public/manuals/browser-support.md
@@ -0,0 +1,17 @@
+# Browser Support Manuals
+
+openDAW is tested on the latest version of all modern browsers, such as Chrome, Firefox, and Safari.
+
+However, there are differences in which web APIs are supported by each browser.
+
+| Feature | Chrome | Firefox | Safari |
+|---------------------|--------|------------------------------|--------|
+| Select Audio-Output | Yes | No | No |
+| Midi Devices | Yes | [Yes](/manuals/firefox-midi) | No |
+| File Api | Yes | ⚠️ | ⚠️ |
+
+## Legend
+
+### ⚠️ Workaround
+This symbol indicates a temporary solution or alternative approach to bypass a limitation, bug, or
+missing feature. It is not a permanent fix but allows functionality until an official resolution is available.
\ No newline at end of file
diff --git a/packages/app/studio/public/manuals/dev-log.md b/packages/app/studio/public/manuals/dev-log.md
new file mode 100644
index 00000000..296a1a29
--- /dev/null
+++ b/packages/app/studio/public/manuals/dev-log.md
@@ -0,0 +1,243 @@
+# Development
+
+## TODO
+
+* PianoModePanel
+ * Show timeline navigation?
+ * Different note labels for different countries (Global Switch)
+ * ~~dialog? to disable note tracks~~
+ * ~~Control to show and edit signature~~
+ * ~~Scroll Y should change engine position (FW, RW)~~
+ * ~~Rename to PianoModePanel~~
+ * ~~Transpose~~
+ * ~~Go back to the timeline view~~
+ * ~~Open MidiFall view (or Piano Tutorial Mode?)~~
+ * ~~labels on falling notes (~~Hide when note is too short~~ clip)~~
+ * ~~control to adjust visible time range~~
+ * ~~active piano colors~~
+ * ~~different keyboard layouts https://familypiano.com/blog/piano-keys-faq/~~
+ * ~~time signature / octave (C, F) grid~~
+* ~~Playfield bug: Samples appear louder when polyphone~~
+* Attach a CurveBox to ValueEventBox (enables having different curve shapes in future)
+* Make effect-bypass parameter automatable
+* Add SoundFont device
+* Polish audio playback -> will have unwanted sounds when start/stop audio segments
+* AcceptingType for audio-unit should be a set?
+* Admin sample management (rename, edit, delete)
+* Do not use an unknown track for busses. This must be handled by the timeline view.
+* https://bungee.parabolaresearch.com/
+* Audio/Midi Recording
+ * Solid state for recording in main-thread (none, running, cancel, abort)
+ * Listen to all incoming midi-signals and create track, region, notes and automation (revertible process)
+ * Record audio to memory and create track and region (revertible process)
+ * Preview / update peaks
+ * ~~Count in~~
+ * ~~Global shuffle~~
+ * ~~Midi generator effects should continue to run when transport is stopped~~
+ * ~~Time-Manipulation Midi-Effects~~
+ * ~~clamp pitch 0-127~~
+ * ~~release notes when changing midi effect chain~~
+ * ~~release notes when pausing~~
+ * ~~Sending notes to broadcaster~~
+ * ~~Revive regions/clips~~
+ * ~~groove unipolar (percentage)~~
+ * ~~Replace event-targets with NoteEventSource~~
+ * ~~NoteEvent~~
+ * ~~Remove chance, playCount, playCurve (not needed in processing)~~
+* Playfield
+ * ~~Panics when replacing synth with Playfield and undo~~
+ * ~~Remember~~
+ * ~~sample in edit mode~~
+ * ~~octave index~~
+ * ~~cache editor~~
+ * Fix envelope (not in prototype)
+ * Fix loop discontinuations with fades (not in prototype)
+ * Update start & end while playing (not in prototype)
+ * ~~Reset Playfield and delete samples~~
+ * ~~Automation~~
+ * ~~Exclusion group~~
+ * ~~Gate-mode selector (Off, On, Loop)~~
+ * ~~Monophone / Polyphone switcher~~
+* Stereo Tool
+ * Stereo Widthing is not really working (not in prototype < no easy fix)
+ * ~~Interpolate matrix~~
+ * ~~swap channels~~
+* PointerLock Api
+* Midi Pitch-bend
+* List all midi connections and edit (range, remove, etc..)
+* Name constraints (min, max)
+* Find a modifier key to always select
+* Offline Tauri version
+* Offline PWA version
+* studio header > peak-meter
+* peak-meter > hold-value | rms < PeakBroadcaster
+* Implement presets for devices and complete device-chain
+* Preview midi notes (https://discord.com/channels/1241019312328675399/1337837099302391849)
+* Different schedule switch-times for clips
+* Double-click the input name in the track-header to rename
+* [kurp] Making region bounds in content-editor fully operational
+* Timeline navigation in other workspace views (mixer)
+* Spotlight
+* Flatten ValueRegion
+* Flatten AudioRegion
+* Absolute time display
+* Pre- & Post-gain FX / Gain-stage
+
+### Optimisation
+
+* Only produce and stream values in the audio-engine if there is a visible consumer in the user-interface
+
+### Misc Bugs
+
+* Setting a pointer to two different targets in one modification breaks undo
+
+### Panel Management
+
+* Resizers are only working on the adjacent elements.
+* Resizers do not open/close panels while dragging to increase/decrease space
+* Resizers on min-size and max-size should remember their size in pixels, not flex (example: Browser).
+* No indicator that a panel reached min- or max-size
+* Switching screen will rebuild ALL panels (should be reused if the screen contains the same panel-states)
+
+## Done
+
+* ~~Learn Midi Device~~
+ * ~~Keys~~
+ * ~~Control~~
+ * ~~Store midi connections and reload when loading project~~
+ * ~~Copy on 'Save As'~~
+* ~~DEL to delete track~~
+* ~~Having extra space to drop new content below tracks~~
+* ~~Long labels can blow layouts~~
+* ~~Table of contents for manual~~
+* ~~Reset Parameter Option~~
+* ~~Piano Roll: Velocity represented by Opacity~~
+* ~~Auto-scroll on text-element~~
+* ~~List local projects in dashboard~~
+* ~~Bake colours and remove filter~~
+* ~~Audio Output Device Selector~~
+* ~~Choose region color hue~~
+* ~~[kurp] Creating notes and value-nodes should appear on the second pointer-down not release~~
+* ~~Change song length~~
+* ~~Changing hash in url throws error~~
+* ~~checkboxes do not show automated state~~
+* ~~Note Editor Properties are not editible anymore~~
+* ~~[Polarity] Simple Sampler~~
+* ~~[kurp] arrow keys do not do anything~~
+* ~~Add description, tags and cover to project's metadata~~
+* ~~Add new effect to chain (right to the instrument or last device)~~
+* ~~Move audio-units within bounds~~
+* ~~Drag'n'drop devices in chain~~
+* ~~Add message to error handler to deactivate extensions~~
+* ~~Recovery Mode~~
+* ~~Drag & Drop inside app to create and sort~~
+* ~~[Polarity] Add + button to create a tape and add a sample in one go~~
+* ~~[razcore-rad] Revamp EQ-enable control has no automation menu~~
+* ~~Update Manual with shortcuts (like undo/redo & scissor)~~
+* ~~[razcore-rad] Dropdown triangle (note editor > property selector)~~
+* ~~Value-Clips~~
+* ~~When deleting samples check existing projects, if they will break~~
+* ~~Waiting state not working on clips when starting column~~
+* ~~Follow playback cursor~~
+* ~~List selection~~
+* ~~Multiple samples dragging into the timeline (changed to context-menu)~~
+* ~~Show Playback-Timestamp indicator~~
+* ~~Converting clip to region~~
+* ~~Midi Transposing (https://discord.com/channels/1241019312328675399/1337836390628462614)~~
+* ~~Sample Preview~~
+* ~~Show insert marker when adding sample~~
+* ~~Ask for replacement for deleted or incomplete local samples~~
+* ~~Drag mulitple files~~
+* ~~Change name & bpm for samples~~
+* ~~Drag & Drop Files directly onto the timeline~~
+* ~~Import custom samples~~
+* ~~Parameter-Knob has too many control state indicators~~
+* ~~Show clip-area when new clip is added (e.g. convert to clip)~~
+* ~~Import / Export zip-package~~
+* ~~[Coral] Killing all buffers (on stop) can still reintroduce feedback out of the blue when delay has 100% fb~~
+* ~~[Jetdarc] Missing automation state for channelstrips controls (track & timeline)~~
+* ~~[2L&L] Possible to create a region with negative position~~
+* ~~[Polarity] Seen that an automation on Revamp (freq) were not updating the curve~~
+* ~~[Jetdarc] Apparently you can set the bpm to 9999999~~
+* ~~[raii] Selected notes with higher pitch are not captured with higher priority~~
+* ~~[Polarity] search sample names within the string not just the beginning~~
+* ~~[Polarity] Sample Browser Search~~
+* ~~Implement Clips DSP~~
+ * ~~Better visual state for playing clips (hard to distinguish from non-playing clips)~~
+ * ~~Drag sample on clip-area~~
+ * ~~One-shot playback~~
+ * ~~Do not allow dropping clips on mismatching track~~
+ * ~~Double stop must stop all playing clips~~
+* ~~[kurp] 0% in gain mapping is not silent~~
+* ~~[kurp] overlapping region when creating in too smaller gaps~~
+* ~~ADD Donation Link!~~
+* ~~Show Update Banner~~
+* ~~Wav-Preview in sample-browser (better than nothing)~~
+* ~~[kurp] Always play from the last *set* position~~
+* ~~swap devices in chain~~
+* ~~_Cannot have panel open in multiple location_ when adding a hash to url~~
+* ~~[Truls] Playing notes from the piano-roll~~
+* ~~[Truls] Restart audio-engine if errored out~~
+* ~~Export must open FileDialog with a new user-interaction (security issue)~~
+* ~~[Truls] When the play head is moved during playback, playing notes should be released~~
+* ~~[Truls] note region preview is a little unpredictable for short notes~~
+* ~~Solution for output device chain automation in timeline~~
+* ~~Option to auto open content editor when the region is already in edit-mode~~
+* ~~[Truls] Channelstrip at the end of the device-chain~~
+* ~~[Truls] ValueRegionEditor does not allow dragging loop-duration~~
+* ~~ValueRegion must hold value when ended~~
+* ~~Channelstrip text overflow fix~~
+* ~~Select new region after flatten~~
+* ~~Indices of AudioUnits can be broken after deletion~~
+* ~~Error handling like Sentry~~
+* ~~Still something wrong with the track indices~~
+* ~~ArpeggioDeviceProcessor & PitchDeviceProcessor UpdateClock~~
+* ~~Kill all buffers and reset all devices on double-stop~~
+* ~~Delete Bus (2 channels without output) > Create new output > ERROR (dub-techno)~~
+* ~~Create a test all pointer targets entry in app-menu for debugging~~
+* ~~Proper solution for ordering instrument and bus tracks~~
+* ~~Allow F12 & Reload with modal dialogs~~
+* ~~Minimized device version (collapse)~~
+* ~~Check audio-unit "bus" behaviour in timeline (creates an empty track)~~
+* ~~The content-editor does not show its scroller (no much content in header)~~
+* ~~Label has "unassigned" in ValueHeader and missing in track header~~
+* ~~Automation track are not being deleted when deleting the device~~
+* ~~DelayDeviceProcessor cross missing~~
+* ~~Show control state on revamp ui~~
+* ~~Introduce mapping in ValueTrackHeader~~
+* ~~Show format value in ValueTrackHeader~~
+* ~~Make the ProjectInfo page nicer too~~
+* ~~Make Revamp parameters automatable~~
+* ~~No modular views available should be nicer~~
+* ~~'Finish' Revamp DSP (BiquadStack order)~~
+* ~~Disable track~~
+* ~~Keyboard Shortcut for Play/Pause at least~~
+* ~~'Finish' Delay DSP > Filter~~
+* ~~'Finish' Vaporisateur DSP > Bandlimited Osc?~~
+* ~~Make this part of the running studio: https://localhost:8080/issues~~
+* ~~Channelstrip Solo~~
+* ~~[BUG] Index on delete audio-unit seems to be wrong (optic glitch)~~
+* ~~Load Midi~~
+* ~~'Finish' sample management (cache)~~
+* ~~Audio region drag-preview in timeline~~
+* ~~Create Tape if sample is dropped below tracks~~
+* ~~Do we need TrackAssignmentBox for anything other than value-automation?~~
+* ~~Audio region drag > clip~~
+* ~~Connect all(?) AudioFileBoxes to RootBox~~
+* ~~Either make Clips working fully or hide them~~
+* ~~Default color region type~~
+* ~~Do not allow dropping regions on different track types~~
+* ~~Pimp dashboard~~
+* ~~Pimp publish page~~
+* ~~Progress dialog~~
+* ~~Implement 'enabled' for effects (bypass)~~
+* ~~Device icon colers~~
+* ~~No cut-indicator when outside region~~
+* ~~Play many audio-tracks~~
+* ~~Fix audio region split~~
+* ~~Create new track for audio-unit (note or audio, depending on type)~~
+* ~~Temp remove tape parameter controls~~
+* ~~Simple dialog layering~~
+* ~~Revamp DSP~~
+* ~~ValueTrackHeader~~
+* ~~Export2wav~~
\ No newline at end of file
diff --git a/packages/app/studio/public/manuals/firefox-midi.md b/packages/app/studio/public/manuals/firefox-midi.md
new file mode 100644
index 00000000..6d78a56e
--- /dev/null
+++ b/packages/app/studio/public/manuals/firefox-midi.md
@@ -0,0 +1,32 @@
+# Request Midi Access On Firefox Does Not Work
+
+This is a known issue with Firefox's MIDI implementation. Unlike Chrome, which allows requesting MIDI access even if no
+devices are currently connected, Firefox denies access outright if **no MIDI devices are detected** at the time of the
+request.
+
+### Solutions
+
+1. **Restart Firefox**
+ - If you connected the MIDI device after starting Firefox, restart the browser and try again.
+
+2. **Check Firefox Permissions**
+ - Open `about:config` in a new tab.
+ - Search for `dom.webmidi.enabled`.
+ - Ensure it is set to `true`. If not, double-click to enable it.
+ - Search for `privacy.resistFingerprinting` (if enabled, it can block MIDI access).
+ - Set `privacy.resistFingerprinting` to `false` if you trust the site.
+
+3. **Verify Device Detection**
+ - Check if your OS detects the MIDI device.
+ - On macOS: Open `Audio MIDI Setup` > `MIDI Studio` and ensure your device is listed.
+ - On Windows: Check `Device Manager` under "Sound, video and game controllers."
+
+4. **Force Firefox to Recognize the Device**
+ - Connect your MIDI device before starting Firefox.
+ - Restart the browser with the device already connected.
+
+5. **Use Chrome or Edge**
+ - If Firefox's handling of MIDI is problematic, you might consider using a Chromium-based browser for MIDI-related
+ tasks.
+
+(ChatGPT Feb. 2025)
\ No newline at end of file
diff --git a/packages/app/studio/public/manuals/index.md b/packages/app/studio/public/manuals/index.md
new file mode 100644
index 00000000..109e4cbc
--- /dev/null
+++ b/packages/app/studio/public/manuals/index.md
@@ -0,0 +1,18 @@
+# openDAW Manuals
+
+Please join our [discord community](https://discord.com/invite/ZRm8du7vn4) for updates and news!
+
+## Known Issues
+
+**openDAW is in an early prototype stage and NOT ready for production use!**
+
+### General
+
+* Some features in openDAW may be unpolished or not functional yet.
+* No backward compatibility guaranteed. New studio versions may invalidate old project files.
+
+### Audio Engine
+
+* Not optimised.
+* Clicks & Pops can occur, since there are no fadings to avoid discontinuities.
+* Fast automation or value changes can potentially crash the dsp, since there is no interpolation.
\ No newline at end of file
diff --git a/packages/app/studio/public/manuals/keyboard-shortcuts.md b/packages/app/studio/public/manuals/keyboard-shortcuts.md
new file mode 100644
index 00000000..c6db0bb3
--- /dev/null
+++ b/packages/app/studio/public/manuals/keyboard-shortcuts.md
@@ -0,0 +1,29 @@
+# Keyboard Shortcuts
+
+## Misc
+
+* SPACE: Toggle Playback
+* ⌘Z Undo
+* ⌘⇧Z Redo
+
+## Views
+
+* ⇧0: Show Dashboard
+* ⇧1: Show Classic View
+* ⇧2: Show Mixer
+* ⇧3: Show Modular Systems
+* ⇧4: Show Project Info
+
+## Panels
+
+* B: Toggle **B**rowser
+* E: Toggle **E**ditor
+* D: Toggle **D**evices
+* M: Toggle **M**ixer
+
+## Timeline
+
+* Hold ⌘ and click to cut a region
+* Hold ⌥ and drag to copy a region / clip
+* Hold ⌥⇧ and drag to copy a region / clip as mirrored
+* Click track header and hit ⌫ to delete track
\ No newline at end of file
diff --git a/packages/app/studio/public/manuals/permissions.md b/packages/app/studio/public/manuals/permissions.md
new file mode 100644
index 00000000..ce873dca
--- /dev/null
+++ b/packages/app/studio/public/manuals/permissions.md
@@ -0,0 +1,3 @@
+# Browser Permissions
+
+openDAW requires grand access to your microphone. tbc...
\ No newline at end of file
diff --git a/packages/app/studio/public/manuals/private-file-system.md b/packages/app/studio/public/manuals/private-file-system.md
new file mode 100644
index 00000000..853ce770
--- /dev/null
+++ b/packages/app/studio/public/manuals/private-file-system.md
@@ -0,0 +1,23 @@
+# openDAW File System
+
+openDAW stores your projects and samples in the
+[Origin private file system](https://developer.mozilla.org/en-US/docs/Web/API/File_System_API/Origin_private_file_system) (
+OPFS).
+
+## Why Samples?
+
+openDAW uses the OPFS to store user-imported samples because modern browsers do not retain
+information about the file origins of imported local files due to security restrictions. This means that once a user
+imports a file, the browser has no way to automatically reload it the next time openDAW starts. To ensure persistent
+access to user samples, openDAW copies every imported sample into OPFS, allowing the application to manage and retrieve
+these files securely without relying on external file paths.
+
+## Granting OPFS Storage Permission in Firefox
+In Firefox, storing data in OPFS requires explicit user approval due to its privacy settings. Without permission, openDAW may not be able to retain imported samples across sessions. To allow persistent storage for openDAW in Firefox, follow these steps:
+
+* Open Firefox Settings
+* Navigate to Privacy & Security
+* Scroll down to Permissions and find Storage Permissions
+* Click Exceptions and enter the openDAW studio URL `https://opendaw.studio`
+* Select Allow and confirm the changes
+* Restart Firefox for the settings to take effect
\ No newline at end of file
diff --git a/packages/app/studio/public/manuals/tech-stack.md b/packages/app/studio/public/manuals/tech-stack.md
new file mode 100644
index 00000000..093801bf
--- /dev/null
+++ b/packages/app/studio/public/manuals/tech-stack.md
@@ -0,0 +1,44 @@
+# Tech-Stack
+
+## Toolchain
+
+* [Vite](https://vite.dev)
+* [Typescript](https://www.typescriptlang.org)
+* [Sass](https://sass-lang.com)
+
+## Libraries
+
+openDAW uses minimal external dependencies, avoiding hidden behaviors from bulky UI frameworks.
+
+Each in-house library has a clear, focused purpose. [github repository](https://github.com/andremichelle/opendaw-lib)
+
+### Dependency Table
+
+| Library | Dependencies |
+|---------------|-------------------------------------|
+| **std** | none |
+| **dsp** | std |
+| **dom** | std |
+| **jsx** | std, dom |
+| **runtime** | std |
+| **box** | std, dom, runtime |
+| **box-forge** | std, dom, box |
+| **fusion** | std, dom, box, runtime (all peered) |
+
+### In-House Runtime
+
+* std (Core)
+* dsp (DSP & Sequencing)
+* dom (DOM Integration)
+* jsx ([JSX](https://en.wikipedia.org/wiki/JSX_(JavaScript)) Integration)
+* runtime (Runtime and Scheduling)
+
+### In-House Data Management
+
+* box (Runtime Immutable Data Graph)
+* box-forge (Box Code Generator)
+
+### External
+
+* [jszip](https://www.npmjs.com/package/jszip) (Pack & Unpack Zip-Files)
+* [markdown-it](https://www.npmjs.com/package/markdown-it) (Markdown parser)
\ No newline at end of file
diff --git a/packages/app/studio/public/templates/BMX_LiquidDrums.od b/packages/app/studio/public/templates/BMX_LiquidDrums.od
new file mode 100644
index 00000000..3b8be3b2
Binary files /dev/null and b/packages/app/studio/public/templates/BMX_LiquidDrums.od differ
diff --git a/packages/app/studio/public/templates/BMX_Playfield.od b/packages/app/studio/public/templates/BMX_Playfield.od
new file mode 100644
index 00000000..bd1f85c2
Binary files /dev/null and b/packages/app/studio/public/templates/BMX_Playfield.od differ
diff --git a/packages/app/studio/public/templates/BMX_Skyence_buryme_Remix.od b/packages/app/studio/public/templates/BMX_Skyence_buryme_Remix.od
new file mode 100644
index 00000000..8e3352b0
Binary files /dev/null and b/packages/app/studio/public/templates/BMX_Skyence_buryme_Remix.od differ
diff --git a/packages/app/studio/public/templates/Ben.od b/packages/app/studio/public/templates/Ben.od
new file mode 100644
index 00000000..70ffcf7c
Binary files /dev/null and b/packages/app/studio/public/templates/Ben.od differ
diff --git a/packages/app/studio/public/templates/Breeze.od b/packages/app/studio/public/templates/Breeze.od
new file mode 100644
index 00000000..f18d9a24
Binary files /dev/null and b/packages/app/studio/public/templates/Breeze.od differ
diff --git a/packages/app/studio/public/templates/BuryMe.od b/packages/app/studio/public/templates/BuryMe.od
new file mode 100644
index 00000000..291fecde
Binary files /dev/null and b/packages/app/studio/public/templates/BuryMe.od differ
diff --git a/packages/app/studio/public/templates/Dub-Techno.od b/packages/app/studio/public/templates/Dub-Techno.od
new file mode 100644
index 00000000..f1e7b46c
Binary files /dev/null and b/packages/app/studio/public/templates/Dub-Techno.od differ
diff --git a/packages/app/studio/public/templates/Fatso.od b/packages/app/studio/public/templates/Fatso.od
new file mode 100644
index 00000000..b1066a32
Binary files /dev/null and b/packages/app/studio/public/templates/Fatso.od differ
diff --git a/packages/app/studio/public/templates/Release.od b/packages/app/studio/public/templates/Release.od
new file mode 100644
index 00000000..c0004845
Binary files /dev/null and b/packages/app/studio/public/templates/Release.od differ
diff --git a/packages/app/studio/public/templates/SeekDeeper.od b/packages/app/studio/public/templates/SeekDeeper.od
new file mode 100644
index 00000000..b65e60fc
Binary files /dev/null and b/packages/app/studio/public/templates/SeekDeeper.od differ
diff --git a/packages/app/studio/public/templates/Shafted.od b/packages/app/studio/public/templates/Shafted.od
new file mode 100644
index 00000000..8b081474
Binary files /dev/null and b/packages/app/studio/public/templates/Shafted.od differ
diff --git a/packages/app/studio/public/templates/Sunset.od b/packages/app/studio/public/templates/Sunset.od
new file mode 100644
index 00000000..cc6ab174
Binary files /dev/null and b/packages/app/studio/public/templates/Sunset.od differ
diff --git a/packages/app/studio/public/update.html b/packages/app/studio/public/update.html
new file mode 100644
index 00000000..aa928e11
--- /dev/null
+++ b/packages/app/studio/public/update.html
@@ -0,0 +1,100 @@
+
+
+
+
+
+
+
+
+
+
+
+ 🎧openDAW.studio
+
+
+
+
+
+ updating
+
+
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-000.svg b/packages/app/studio/public/viscious-speed/abstract-000.svg
new file mode 100644
index 00000000..d7af1902
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-000.svg
@@ -0,0 +1,3 @@
+
diff --git a/packages/app/studio/public/viscious-speed/abstract-001.svg b/packages/app/studio/public/viscious-speed/abstract-001.svg
new file mode 100644
index 00000000..00c73fdf
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-001.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-002.svg b/packages/app/studio/public/viscious-speed/abstract-002.svg
new file mode 100644
index 00000000..f70fb952
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-002.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-003.svg b/packages/app/studio/public/viscious-speed/abstract-003.svg
new file mode 100644
index 00000000..339973c3
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-003.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-004.svg b/packages/app/studio/public/viscious-speed/abstract-004.svg
new file mode 100644
index 00000000..8bd91766
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-004.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-005.svg b/packages/app/studio/public/viscious-speed/abstract-005.svg
new file mode 100644
index 00000000..58249328
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-005.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-006.svg b/packages/app/studio/public/viscious-speed/abstract-006.svg
new file mode 100644
index 00000000..4163dfd8
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-006.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-007.svg b/packages/app/studio/public/viscious-speed/abstract-007.svg
new file mode 100644
index 00000000..9de373c7
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-007.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-008.svg b/packages/app/studio/public/viscious-speed/abstract-008.svg
new file mode 100644
index 00000000..5c7eef2f
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-008.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-009.svg b/packages/app/studio/public/viscious-speed/abstract-009.svg
new file mode 100644
index 00000000..36660395
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-009.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-010.svg b/packages/app/studio/public/viscious-speed/abstract-010.svg
new file mode 100644
index 00000000..c5d4164f
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-010.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-011.svg b/packages/app/studio/public/viscious-speed/abstract-011.svg
new file mode 100644
index 00000000..ae61e361
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-011.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-012.svg b/packages/app/studio/public/viscious-speed/abstract-012.svg
new file mode 100644
index 00000000..564093ba
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-012.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-013.svg b/packages/app/studio/public/viscious-speed/abstract-013.svg
new file mode 100644
index 00000000..bc5abb42
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-013.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-014.svg b/packages/app/studio/public/viscious-speed/abstract-014.svg
new file mode 100644
index 00000000..a11465ef
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-014.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-015.svg b/packages/app/studio/public/viscious-speed/abstract-015.svg
new file mode 100644
index 00000000..08070265
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-015.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-016.svg b/packages/app/studio/public/viscious-speed/abstract-016.svg
new file mode 100644
index 00000000..e1ac9390
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-016.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-017.svg b/packages/app/studio/public/viscious-speed/abstract-017.svg
new file mode 100644
index 00000000..18a11285
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-017.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-018.svg b/packages/app/studio/public/viscious-speed/abstract-018.svg
new file mode 100644
index 00000000..a5965d26
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-018.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-019.svg b/packages/app/studio/public/viscious-speed/abstract-019.svg
new file mode 100644
index 00000000..e8fe525a
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-019.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-020.svg b/packages/app/studio/public/viscious-speed/abstract-020.svg
new file mode 100644
index 00000000..ef1c69e5
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-020.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-021.svg b/packages/app/studio/public/viscious-speed/abstract-021.svg
new file mode 100644
index 00000000..72d0e2b5
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-021.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-022.svg b/packages/app/studio/public/viscious-speed/abstract-022.svg
new file mode 100644
index 00000000..bcbc20bf
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-022.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-023.svg b/packages/app/studio/public/viscious-speed/abstract-023.svg
new file mode 100644
index 00000000..0bf4ce79
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-023.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-024.svg b/packages/app/studio/public/viscious-speed/abstract-024.svg
new file mode 100644
index 00000000..e751071e
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-024.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-025.svg b/packages/app/studio/public/viscious-speed/abstract-025.svg
new file mode 100644
index 00000000..4b757aa5
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-025.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-026.svg b/packages/app/studio/public/viscious-speed/abstract-026.svg
new file mode 100644
index 00000000..9f12e0ce
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-026.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-027.svg b/packages/app/studio/public/viscious-speed/abstract-027.svg
new file mode 100644
index 00000000..28dfcb28
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-027.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-028.svg b/packages/app/studio/public/viscious-speed/abstract-028.svg
new file mode 100644
index 00000000..8e9d2d18
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-028.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-029.svg b/packages/app/studio/public/viscious-speed/abstract-029.svg
new file mode 100644
index 00000000..873b57cf
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-029.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-030.svg b/packages/app/studio/public/viscious-speed/abstract-030.svg
new file mode 100644
index 00000000..ad248f9c
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-030.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-031.svg b/packages/app/studio/public/viscious-speed/abstract-031.svg
new file mode 100644
index 00000000..13451876
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-031.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-032.svg b/packages/app/studio/public/viscious-speed/abstract-032.svg
new file mode 100644
index 00000000..b87548ea
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-032.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-033.svg b/packages/app/studio/public/viscious-speed/abstract-033.svg
new file mode 100644
index 00000000..cd0bd604
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-033.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-034.svg b/packages/app/studio/public/viscious-speed/abstract-034.svg
new file mode 100644
index 00000000..c436a37b
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-034.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-035.svg b/packages/app/studio/public/viscious-speed/abstract-035.svg
new file mode 100644
index 00000000..ef90f0bd
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-035.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-036.svg b/packages/app/studio/public/viscious-speed/abstract-036.svg
new file mode 100644
index 00000000..43eaf5b0
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-036.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-037.svg b/packages/app/studio/public/viscious-speed/abstract-037.svg
new file mode 100644
index 00000000..8682ef64
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-037.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-038.svg b/packages/app/studio/public/viscious-speed/abstract-038.svg
new file mode 100644
index 00000000..ea75e189
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-038.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-039.svg b/packages/app/studio/public/viscious-speed/abstract-039.svg
new file mode 100644
index 00000000..82cde8b1
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-039.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-040.svg b/packages/app/studio/public/viscious-speed/abstract-040.svg
new file mode 100644
index 00000000..52cc601e
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-040.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-041.svg b/packages/app/studio/public/viscious-speed/abstract-041.svg
new file mode 100644
index 00000000..4453d2f5
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-041.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-042.svg b/packages/app/studio/public/viscious-speed/abstract-042.svg
new file mode 100644
index 00000000..e1175dc9
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-042.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-043.svg b/packages/app/studio/public/viscious-speed/abstract-043.svg
new file mode 100644
index 00000000..5424a731
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-043.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-044.svg b/packages/app/studio/public/viscious-speed/abstract-044.svg
new file mode 100644
index 00000000..827044e5
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-044.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-045.svg b/packages/app/studio/public/viscious-speed/abstract-045.svg
new file mode 100644
index 00000000..c9ca8a47
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-045.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-046.svg b/packages/app/studio/public/viscious-speed/abstract-046.svg
new file mode 100644
index 00000000..a045d208
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-046.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-047.svg b/packages/app/studio/public/viscious-speed/abstract-047.svg
new file mode 100644
index 00000000..2ed49640
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-047.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-048.svg b/packages/app/studio/public/viscious-speed/abstract-048.svg
new file mode 100644
index 00000000..efc430ef
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-048.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-049.svg b/packages/app/studio/public/viscious-speed/abstract-049.svg
new file mode 100644
index 00000000..b83dec48
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-049.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-050.svg b/packages/app/studio/public/viscious-speed/abstract-050.svg
new file mode 100644
index 00000000..76673d90
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-050.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-051.svg b/packages/app/studio/public/viscious-speed/abstract-051.svg
new file mode 100644
index 00000000..1620752c
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-051.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-052.svg b/packages/app/studio/public/viscious-speed/abstract-052.svg
new file mode 100644
index 00000000..25bb67b7
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-052.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-053.svg b/packages/app/studio/public/viscious-speed/abstract-053.svg
new file mode 100644
index 00000000..85a93e4b
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-053.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-054.svg b/packages/app/studio/public/viscious-speed/abstract-054.svg
new file mode 100644
index 00000000..e6767bf6
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-054.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-055.svg b/packages/app/studio/public/viscious-speed/abstract-055.svg
new file mode 100644
index 00000000..80ca5ff2
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-055.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-056.svg b/packages/app/studio/public/viscious-speed/abstract-056.svg
new file mode 100644
index 00000000..da035a76
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-056.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-057.svg b/packages/app/studio/public/viscious-speed/abstract-057.svg
new file mode 100644
index 00000000..b22a5d56
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-057.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-058.svg b/packages/app/studio/public/viscious-speed/abstract-058.svg
new file mode 100644
index 00000000..58d4cb7e
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-058.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-059.svg b/packages/app/studio/public/viscious-speed/abstract-059.svg
new file mode 100644
index 00000000..3fc4d3d9
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-059.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-060.svg b/packages/app/studio/public/viscious-speed/abstract-060.svg
new file mode 100644
index 00000000..f803b8af
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-060.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-061.svg b/packages/app/studio/public/viscious-speed/abstract-061.svg
new file mode 100644
index 00000000..3526e80d
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-061.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-062.svg b/packages/app/studio/public/viscious-speed/abstract-062.svg
new file mode 100644
index 00000000..53cc106b
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-062.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-063.svg b/packages/app/studio/public/viscious-speed/abstract-063.svg
new file mode 100644
index 00000000..3c9dae87
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-063.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-064.svg b/packages/app/studio/public/viscious-speed/abstract-064.svg
new file mode 100644
index 00000000..b33f312f
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-064.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-065.svg b/packages/app/studio/public/viscious-speed/abstract-065.svg
new file mode 100644
index 00000000..f3f26bf5
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-065.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-066.svg b/packages/app/studio/public/viscious-speed/abstract-066.svg
new file mode 100644
index 00000000..2dc64643
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-066.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-067.svg b/packages/app/studio/public/viscious-speed/abstract-067.svg
new file mode 100644
index 00000000..669264b5
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-067.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-068.svg b/packages/app/studio/public/viscious-speed/abstract-068.svg
new file mode 100644
index 00000000..0148e2f3
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-068.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-069.svg b/packages/app/studio/public/viscious-speed/abstract-069.svg
new file mode 100644
index 00000000..50419b09
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-069.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-070.svg b/packages/app/studio/public/viscious-speed/abstract-070.svg
new file mode 100644
index 00000000..9ffacde8
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-070.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-071.svg b/packages/app/studio/public/viscious-speed/abstract-071.svg
new file mode 100644
index 00000000..a71d03a2
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-071.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-072.svg b/packages/app/studio/public/viscious-speed/abstract-072.svg
new file mode 100644
index 00000000..3d533100
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-072.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-073.svg b/packages/app/studio/public/viscious-speed/abstract-073.svg
new file mode 100644
index 00000000..49f319d2
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-073.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-074.svg b/packages/app/studio/public/viscious-speed/abstract-074.svg
new file mode 100644
index 00000000..9eff42c5
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-074.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-075.svg b/packages/app/studio/public/viscious-speed/abstract-075.svg
new file mode 100644
index 00000000..e1e61de4
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-075.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-076.svg b/packages/app/studio/public/viscious-speed/abstract-076.svg
new file mode 100644
index 00000000..d1f9d536
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-076.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-077.svg b/packages/app/studio/public/viscious-speed/abstract-077.svg
new file mode 100644
index 00000000..80d464af
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-077.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-078.svg b/packages/app/studio/public/viscious-speed/abstract-078.svg
new file mode 100644
index 00000000..1f9a4615
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-078.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-079.svg b/packages/app/studio/public/viscious-speed/abstract-079.svg
new file mode 100644
index 00000000..b717721d
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-079.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-080.svg b/packages/app/studio/public/viscious-speed/abstract-080.svg
new file mode 100644
index 00000000..c7960257
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-080.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-081.svg b/packages/app/studio/public/viscious-speed/abstract-081.svg
new file mode 100644
index 00000000..779bcb05
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-081.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-082.svg b/packages/app/studio/public/viscious-speed/abstract-082.svg
new file mode 100644
index 00000000..075573c5
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-082.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-083.svg b/packages/app/studio/public/viscious-speed/abstract-083.svg
new file mode 100644
index 00000000..81aaec5a
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-083.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-084.svg b/packages/app/studio/public/viscious-speed/abstract-084.svg
new file mode 100644
index 00000000..f1c146b1
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-084.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-085.svg b/packages/app/studio/public/viscious-speed/abstract-085.svg
new file mode 100644
index 00000000..36da4594
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-085.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-086.svg b/packages/app/studio/public/viscious-speed/abstract-086.svg
new file mode 100644
index 00000000..f8b9e635
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-086.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-087.svg b/packages/app/studio/public/viscious-speed/abstract-087.svg
new file mode 100644
index 00000000..754634fd
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-087.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-088.svg b/packages/app/studio/public/viscious-speed/abstract-088.svg
new file mode 100644
index 00000000..cc0e07b6
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-088.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-089.svg b/packages/app/studio/public/viscious-speed/abstract-089.svg
new file mode 100644
index 00000000..96346a1d
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-089.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-090.svg b/packages/app/studio/public/viscious-speed/abstract-090.svg
new file mode 100644
index 00000000..36dbec29
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-090.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-091.svg b/packages/app/studio/public/viscious-speed/abstract-091.svg
new file mode 100644
index 00000000..b81c6a37
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-091.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-092.svg b/packages/app/studio/public/viscious-speed/abstract-092.svg
new file mode 100644
index 00000000..e2b79437
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-092.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-093.svg b/packages/app/studio/public/viscious-speed/abstract-093.svg
new file mode 100644
index 00000000..7faf1544
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-093.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-094.svg b/packages/app/studio/public/viscious-speed/abstract-094.svg
new file mode 100644
index 00000000..936de988
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-094.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-095.svg b/packages/app/studio/public/viscious-speed/abstract-095.svg
new file mode 100644
index 00000000..387d2ef3
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-095.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-096.svg b/packages/app/studio/public/viscious-speed/abstract-096.svg
new file mode 100644
index 00000000..3a96ebfb
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-096.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-097.svg b/packages/app/studio/public/viscious-speed/abstract-097.svg
new file mode 100644
index 00000000..3aff8d7c
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-097.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-098.svg b/packages/app/studio/public/viscious-speed/abstract-098.svg
new file mode 100644
index 00000000..9de0cf88
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-098.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-099.svg b/packages/app/studio/public/viscious-speed/abstract-099.svg
new file mode 100644
index 00000000..67094137
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-099.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-100.svg b/packages/app/studio/public/viscious-speed/abstract-100.svg
new file mode 100644
index 00000000..61e75b2a
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-100.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-101.svg b/packages/app/studio/public/viscious-speed/abstract-101.svg
new file mode 100644
index 00000000..0ae9ddc7
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-101.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-102.svg b/packages/app/studio/public/viscious-speed/abstract-102.svg
new file mode 100644
index 00000000..6bc11dd4
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-102.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-103.svg b/packages/app/studio/public/viscious-speed/abstract-103.svg
new file mode 100644
index 00000000..f23cfdb9
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-103.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-104.svg b/packages/app/studio/public/viscious-speed/abstract-104.svg
new file mode 100644
index 00000000..e454c168
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-104.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-105.svg b/packages/app/studio/public/viscious-speed/abstract-105.svg
new file mode 100644
index 00000000..85f25e15
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-105.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-106.svg b/packages/app/studio/public/viscious-speed/abstract-106.svg
new file mode 100644
index 00000000..8d313ab3
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-106.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-107.svg b/packages/app/studio/public/viscious-speed/abstract-107.svg
new file mode 100644
index 00000000..c9fdaa39
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-107.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-108.svg b/packages/app/studio/public/viscious-speed/abstract-108.svg
new file mode 100644
index 00000000..1cf5b14f
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-108.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-109.svg b/packages/app/studio/public/viscious-speed/abstract-109.svg
new file mode 100644
index 00000000..6a8c59a1
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-109.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-110.svg b/packages/app/studio/public/viscious-speed/abstract-110.svg
new file mode 100644
index 00000000..28556a15
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-110.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-111.svg b/packages/app/studio/public/viscious-speed/abstract-111.svg
new file mode 100644
index 00000000..4f8b59a0
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-111.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-112.svg b/packages/app/studio/public/viscious-speed/abstract-112.svg
new file mode 100644
index 00000000..9648636f
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-112.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-113.svg b/packages/app/studio/public/viscious-speed/abstract-113.svg
new file mode 100644
index 00000000..702bdee3
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-113.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-114.svg b/packages/app/studio/public/viscious-speed/abstract-114.svg
new file mode 100644
index 00000000..41a9fb33
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-114.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-115.svg b/packages/app/studio/public/viscious-speed/abstract-115.svg
new file mode 100644
index 00000000..54b4c1e4
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-115.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-116.svg b/packages/app/studio/public/viscious-speed/abstract-116.svg
new file mode 100644
index 00000000..fc2da334
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-116.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-117.svg b/packages/app/studio/public/viscious-speed/abstract-117.svg
new file mode 100644
index 00000000..db3e5d8f
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-117.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-118.svg b/packages/app/studio/public/viscious-speed/abstract-118.svg
new file mode 100644
index 00000000..503b3728
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-118.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-119.svg b/packages/app/studio/public/viscious-speed/abstract-119.svg
new file mode 100644
index 00000000..8a5adee9
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-119.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-120.svg b/packages/app/studio/public/viscious-speed/abstract-120.svg
new file mode 100644
index 00000000..b1d72cf9
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-120.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/public/viscious-speed/abstract-121.svg b/packages/app/studio/public/viscious-speed/abstract-121.svg
new file mode 100644
index 00000000..3293bbb1
--- /dev/null
+++ b/packages/app/studio/public/viscious-speed/abstract-121.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/app/studio/src/AppDialogs.tsx b/packages/app/studio/src/AppDialogs.tsx
new file mode 100644
index 00000000..f9a4ca3a
--- /dev/null
+++ b/packages/app/studio/src/AppDialogs.tsx
@@ -0,0 +1,37 @@
+import {Dialog} from "@/ui/components/Dialog"
+import { IconSymbol } from "@opendaw/studio-adapters"
+import {Surface} from "@/ui/surface/Surface"
+import {Promises} from "@opendaw/lib-runtime"
+import {createElement} from "@opendaw/lib-jsx"
+import {Colors} from "@/ui/Colors"
+
+export const showStoragePersistDialog = (): Promise => {
+ const {resolve, promise} = Promise.withResolvers()
+ const dialog: HTMLDialogElement = (
+
+ )
+ Surface.get().body.appendChild(dialog)
+ dialog.showModal()
+ return promise
+}
\ No newline at end of file
diff --git a/packages/app/studio/src/BuildInfo.ts b/packages/app/studio/src/BuildInfo.ts
new file mode 100644
index 00000000..419f7a7c
--- /dev/null
+++ b/packages/app/studio/src/BuildInfo.ts
@@ -0,0 +1,6 @@
+// This JSON gets created right before building (check ../vite.config.ts) and stored in the public folder.
+export type BuildInfo = {
+ date: number
+ uuid: string
+ env: "production" | "development"
+}
\ No newline at end of file
diff --git a/packages/app/studio/src/ErrorMail.txt b/packages/app/studio/src/ErrorMail.txt
new file mode 100644
index 00000000..0b9a472c
--- /dev/null
+++ b/packages/app/studio/src/ErrorMail.txt
@@ -0,0 +1,17 @@
+Hello openDAW Support,
+
+I'd like to report a bug encountered while using openDAW. Below are the details:
+
+What I did:
+[Briefly describe the steps you performed before the issue occurred.]
+
+What I expected to happen:
+[Explain what you expected to happen instead.]
+
+How to reproduce:
+[List clear steps that can help support reproducing this issue.]
+
+Please let me know if you need any additional information.
+
+Thank you,
+[Your Name]
\ No newline at end of file
diff --git a/packages/app/studio/src/Recovery.ts b/packages/app/studio/src/Recovery.ts
new file mode 100644
index 00000000..6aa475e6
--- /dev/null
+++ b/packages/app/studio/src/Recovery.ts
@@ -0,0 +1,50 @@
+import {Option, Provider, UUID} from "@opendaw/lib-std"
+import {Promises} from "@opendaw/lib-runtime"
+import {Project} from "@opendaw/studio-core"
+import {StudioService} from "@/service/StudioService.ts"
+import {ProjectSession} from "./project/ProjectSession"
+import {OpfsAgent} from "@/service/agents.ts"
+import {ProjectMeta} from "@/project/ProjectMeta.ts"
+
+export class Recovery {
+ static readonly #RESTORE_FILE_PATH = ".backup"
+
+ readonly #service: StudioService
+
+ constructor(service: StudioService) {this.#service = service}
+
+ async restoreSession(): Promise