diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 00000000..a547bf36
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/app/.vscode/extensions.json b/app/.vscode/extensions.json
new file mode 100644
index 00000000..24d7cc6d
--- /dev/null
+++ b/app/.vscode/extensions.json
@@ -0,0 +1,3 @@
+{
+ "recommendations": ["tauri-apps.tauri-vscode", "rust-lang.rust-analyzer"]
+}
diff --git a/app/index.html b/app/index.html
new file mode 100644
index 00000000..ff93803b
--- /dev/null
+++ b/app/index.html
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+ Tauri + React + Typescript
+
+
+
+
+
+
+
diff --git a/app/package.json b/app/package.json
new file mode 100644
index 00000000..0b8a5c7e
--- /dev/null
+++ b/app/package.json
@@ -0,0 +1,26 @@
+{
+ "name": "learn-anything",
+ "private": true,
+ "version": "0.1.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "tsc && vite build",
+ "preview": "vite preview",
+ "tauri": "tauri"
+ },
+ "dependencies": {
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "@tauri-apps/api": ">=2.0.0-rc.0",
+ "@tauri-apps/plugin-shell": ">=2.0.0-rc.0"
+ },
+ "devDependencies": {
+ "@types/react": "^18.2.15",
+ "@types/react-dom": "^18.2.7",
+ "@vitejs/plugin-react": "^4.2.1",
+ "typescript": "^5.2.2",
+ "vite": "^5.3.1",
+ "@tauri-apps/cli": ">=2.0.0-rc.0"
+ }
+}
diff --git a/app/public/tauri.svg b/app/public/tauri.svg
new file mode 100644
index 00000000..31b62c92
--- /dev/null
+++ b/app/public/tauri.svg
@@ -0,0 +1,6 @@
+
diff --git a/app/public/vite.svg b/app/public/vite.svg
new file mode 100644
index 00000000..e7b8dfb1
--- /dev/null
+++ b/app/public/vite.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/src-tauri/.gitignore b/app/src-tauri/.gitignore
new file mode 100644
index 00000000..b21bd681
--- /dev/null
+++ b/app/src-tauri/.gitignore
@@ -0,0 +1,7 @@
+# Generated by Cargo
+# will have compiled files and executables
+/target/
+
+# Generated by Tauri
+# will have schema files for capabilities auto-completion
+/gen/schemas
diff --git a/app/src-tauri/Cargo.toml b/app/src-tauri/Cargo.toml
new file mode 100644
index 00000000..cee495a8
--- /dev/null
+++ b/app/src-tauri/Cargo.toml
@@ -0,0 +1,22 @@
+[package]
+name = "learn-anything"
+version = "0.1.0"
+description = "A Tauri App"
+authors = ["you"]
+edition = "2021"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[lib]
+name = "learn_anything_lib"
+crate-type = ["lib", "cdylib", "staticlib"]
+
+[build-dependencies]
+tauri-build = { version = "2.0.0-rc", features = [] }
+
+[dependencies]
+tauri = { version = "2.0.0-rc", features = [] }
+tauri-plugin-shell = "2.0.0-rc"
+serde = { version = "1", features = ["derive"] }
+serde_json = "1"
+
diff --git a/app/src-tauri/build.rs b/app/src-tauri/build.rs
new file mode 100644
index 00000000..d860e1e6
--- /dev/null
+++ b/app/src-tauri/build.rs
@@ -0,0 +1,3 @@
+fn main() {
+ tauri_build::build()
+}
diff --git a/app/src-tauri/capabilities/default.json b/app/src-tauri/capabilities/default.json
new file mode 100644
index 00000000..3bb4cc49
--- /dev/null
+++ b/app/src-tauri/capabilities/default.json
@@ -0,0 +1,10 @@
+{
+ "$schema": "../gen/schemas/desktop-schema.json",
+ "identifier": "default",
+ "description": "Capability for the main window",
+ "windows": ["main"],
+ "permissions": [
+ "core:default",
+ "shell:allow-open"
+ ]
+}
diff --git a/app/src-tauri/icons/128x128.png b/app/src-tauri/icons/128x128.png
new file mode 100644
index 00000000..6be5e50e
Binary files /dev/null and b/app/src-tauri/icons/128x128.png differ
diff --git a/app/src-tauri/icons/128x128@2x.png b/app/src-tauri/icons/128x128@2x.png
new file mode 100644
index 00000000..e81becee
Binary files /dev/null and b/app/src-tauri/icons/128x128@2x.png differ
diff --git a/app/src-tauri/icons/32x32.png b/app/src-tauri/icons/32x32.png
new file mode 100644
index 00000000..a437dd51
Binary files /dev/null and b/app/src-tauri/icons/32x32.png differ
diff --git a/app/src-tauri/icons/Square107x107Logo.png b/app/src-tauri/icons/Square107x107Logo.png
new file mode 100644
index 00000000..0ca4f271
Binary files /dev/null and b/app/src-tauri/icons/Square107x107Logo.png differ
diff --git a/app/src-tauri/icons/Square142x142Logo.png b/app/src-tauri/icons/Square142x142Logo.png
new file mode 100644
index 00000000..b81f8203
Binary files /dev/null and b/app/src-tauri/icons/Square142x142Logo.png differ
diff --git a/app/src-tauri/icons/Square150x150Logo.png b/app/src-tauri/icons/Square150x150Logo.png
new file mode 100644
index 00000000..624c7bfb
Binary files /dev/null and b/app/src-tauri/icons/Square150x150Logo.png differ
diff --git a/app/src-tauri/icons/Square284x284Logo.png b/app/src-tauri/icons/Square284x284Logo.png
new file mode 100644
index 00000000..c021d2ba
Binary files /dev/null and b/app/src-tauri/icons/Square284x284Logo.png differ
diff --git a/app/src-tauri/icons/Square30x30Logo.png b/app/src-tauri/icons/Square30x30Logo.png
new file mode 100644
index 00000000..62197002
Binary files /dev/null and b/app/src-tauri/icons/Square30x30Logo.png differ
diff --git a/app/src-tauri/icons/Square310x310Logo.png b/app/src-tauri/icons/Square310x310Logo.png
new file mode 100644
index 00000000..f9bc0483
Binary files /dev/null and b/app/src-tauri/icons/Square310x310Logo.png differ
diff --git a/app/src-tauri/icons/Square44x44Logo.png b/app/src-tauri/icons/Square44x44Logo.png
new file mode 100644
index 00000000..d5fbfb2a
Binary files /dev/null and b/app/src-tauri/icons/Square44x44Logo.png differ
diff --git a/app/src-tauri/icons/Square71x71Logo.png b/app/src-tauri/icons/Square71x71Logo.png
new file mode 100644
index 00000000..63440d79
Binary files /dev/null and b/app/src-tauri/icons/Square71x71Logo.png differ
diff --git a/app/src-tauri/icons/Square89x89Logo.png b/app/src-tauri/icons/Square89x89Logo.png
new file mode 100644
index 00000000..f3f705af
Binary files /dev/null and b/app/src-tauri/icons/Square89x89Logo.png differ
diff --git a/app/src-tauri/icons/StoreLogo.png b/app/src-tauri/icons/StoreLogo.png
new file mode 100644
index 00000000..45563882
Binary files /dev/null and b/app/src-tauri/icons/StoreLogo.png differ
diff --git a/app/src-tauri/icons/icon.icns b/app/src-tauri/icons/icon.icns
new file mode 100644
index 00000000..12a5bcee
Binary files /dev/null and b/app/src-tauri/icons/icon.icns differ
diff --git a/app/src-tauri/icons/icon.ico b/app/src-tauri/icons/icon.ico
new file mode 100644
index 00000000..b3636e4b
Binary files /dev/null and b/app/src-tauri/icons/icon.ico differ
diff --git a/app/src-tauri/icons/icon.png b/app/src-tauri/icons/icon.png
new file mode 100644
index 00000000..e1cd2619
Binary files /dev/null and b/app/src-tauri/icons/icon.png differ
diff --git a/app/src-tauri/src/lib.rs b/app/src-tauri/src/lib.rs
new file mode 100644
index 00000000..291bed73
--- /dev/null
+++ b/app/src-tauri/src/lib.rs
@@ -0,0 +1,14 @@
+// Learn more about Tauri commands at https://tauri.app/v1/guides/features/command
+#[tauri::command]
+fn greet(name: &str) -> String {
+ format!("Hello, {}! You've been greeted from Rust!", name)
+}
+
+#[cfg_attr(mobile, tauri::mobile_entry_point)]
+pub fn run() {
+ tauri::Builder::default()
+ .plugin(tauri_plugin_shell::init())
+ .invoke_handler(tauri::generate_handler![greet])
+ .run(tauri::generate_context!())
+ .expect("error while running tauri application");
+}
diff --git a/app/src-tauri/src/main.rs b/app/src-tauri/src/main.rs
new file mode 100644
index 00000000..b3b324bd
--- /dev/null
+++ b/app/src-tauri/src/main.rs
@@ -0,0 +1,6 @@
+// Prevents additional console window on Windows in release, DO NOT REMOVE!!
+#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
+
+fn main() {
+ learn_anything_lib::run()
+}
diff --git a/app/src-tauri/tauri.conf.json b/app/src-tauri/tauri.conf.json
new file mode 100644
index 00000000..d77455e8
--- /dev/null
+++ b/app/src-tauri/tauri.conf.json
@@ -0,0 +1,34 @@
+{
+ "productName": "learn-anything",
+ "version": "0.1.0",
+ "identifier": "xyz.learn-anything",
+ "build": {
+ "beforeDevCommand": "bun run dev",
+ "devUrl": "http://localhost:1420",
+ "beforeBuildCommand": "bun run build",
+ "frontendDist": "../dist"
+ },
+ "app": {
+ "windows": [
+ {
+ "title": "learn-anything",
+ "width": 800,
+ "height": 600
+ }
+ ],
+ "security": {
+ "csp": null
+ }
+ },
+ "bundle": {
+ "active": true,
+ "targets": "all",
+ "icon": [
+ "icons/32x32.png",
+ "icons/128x128.png",
+ "icons/128x128@2x.png",
+ "icons/icon.icns",
+ "icons/icon.ico"
+ ]
+ }
+}
diff --git a/app/tsconfig.json b/app/tsconfig.json
new file mode 100644
index 00000000..a7fc6fbf
--- /dev/null
+++ b/app/tsconfig.json
@@ -0,0 +1,25 @@
+{
+ "compilerOptions": {
+ "target": "ES2020",
+ "useDefineForClassFields": true,
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
+ "module": "ESNext",
+ "skipLibCheck": true,
+
+ /* Bundler mode */
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "noEmit": true,
+ "jsx": "react-jsx",
+
+ /* Linting */
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noFallthroughCasesInSwitch": true
+ },
+ "include": ["src"],
+ "references": [{ "path": "./tsconfig.node.json" }]
+}
diff --git a/app/tsconfig.node.json b/app/tsconfig.node.json
new file mode 100644
index 00000000..42872c59
--- /dev/null
+++ b/app/tsconfig.node.json
@@ -0,0 +1,10 @@
+{
+ "compilerOptions": {
+ "composite": true,
+ "skipLibCheck": true,
+ "module": "ESNext",
+ "moduleResolution": "bundler",
+ "allowSyntheticDefaultImports": true
+ },
+ "include": ["vite.config.ts"]
+}
diff --git a/app/vite.config.ts b/app/vite.config.ts
new file mode 100644
index 00000000..f74d1b2d
--- /dev/null
+++ b/app/vite.config.ts
@@ -0,0 +1,32 @@
+import { defineConfig } from "vite";
+import react from "@vitejs/plugin-react";
+
+// @ts-expect-error process is a nodejs global
+const host = process.env.TAURI_DEV_HOST;
+
+// https://vitejs.dev/config/
+export default defineConfig(async () => ({
+ plugins: [react()],
+
+ // Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build`
+ //
+ // 1. prevent vite from obscuring rust errors
+ clearScreen: false,
+ // 2. tauri expects a fixed port, fail if that port is not available
+ server: {
+ port: 1420,
+ strictPort: true,
+ host: host || false,
+ hmr: host
+ ? {
+ protocol: "ws",
+ host,
+ port: 1421,
+ }
+ : undefined,
+ watch: {
+ // 3. tell vite to ignore watching `src-tauri`
+ ignored: ["**/src-tauri/**"],
+ },
+ },
+}));
diff --git a/web/next.config.mjs b/web/next.config.mjs
index b61fb549..ad4fd4e6 100644
--- a/web/next.config.mjs
+++ b/web/next.config.mjs
@@ -1,14 +1,14 @@
// not sure if good approach
-const TAURI_DEV = true
+const TAURI_DEV = false
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: false,
output: TAURI_DEV ? "export" : undefined,
- typescript: {
- // TODO: hacky for tauri
- ignoreBuildErrors: TAURI_DEV ? true : false
- },
+ // typescript: {
+ // // TODO: hacky for tauri
+ // ignoreBuildErrors: TAURI_DEV ? true : false
+ // },
images: {
// TODO: hacky for tauri
unoptimized: TAURI_DEV ? true : false,