# Journal.App SvelteKit 5 + Tauri 2 desktop application for Project Journal. ## Tech Stack - **Frontend**: SvelteKit 5, TypeScript, Vite 6 - **Tauri shell**: Rust (Tauri 2), `tokio` async runtime - **Backend bridge**: `Journal.Sidecar.exe` managed as a persistent long-lived child process ## Dev Setup ```powershell npm install npm run dev # SvelteKit dev server at http://localhost:1420 npm run tauri dev # Tauri desktop window (connects to dev server) ``` ## Build Targets | Command | Output | Use case | |---------|--------|----------| | `npm run build` | `Journal.App/build/` | Web bundle for `Journal.WebGateway` | | `.\scripts\publish-app.ps1 -Target web` | `Journal.App/build/` | Same, via script | | `.\scripts\publish-app.ps1 -Target tauri -TauriBundles none` | `src-tauri/target/release/journalapp.exe` | Raw desktop exe | | `.\scripts\publish-app.ps1 -Target tauri -TauriBundles nsis` | NSIS installer | Packaged installer | ## Frontend State Management Svelte stores are the source of truth for all feature state. ### Current Stores | Store file | State exports | Notes | |-----------|---------------|-------| | `src/lib/stores/entries.ts` | `entriesStore` | Entry list, `getDefaultEntry`, `createEntryDraft` | | `src/lib/stores/fragments.ts` | `fragmentsStore` | Fragment CRUD + parse/serialize helpers | | `src/lib/stores/todos.ts` | `todoListsStore`, `todosStore` | Todo list and item CRUD | | `src/lib/stores/lists.ts` | `listsStore` | Generic list CRUD, `createListDraft` | | `src/lib/stores/settings.ts` | `settingsTags`, `settingsFragmentTypes` | Tag/type config | ### Store-First Rule - Components call **store helper functions** for CRUD operations — not inline mutations. - Components should focus on rendering, local form state, and invoking store operations. - Backend calls (`sendCommand`) belong inside store/service helpers, not components. ## Tauri Commands (Rust → Frontend) | Command | Description | |---------|-------------| | `sidecar_command` | Forward a `CommandEnvelope` to `Journal.Sidecar` stdin/stdout and return parsed JSON | | `get_sidecar_root` | Get currently resolved sidecar root path | | `set_sidecar_root` | Override root path (saved to `settings.json`, restarts sidecar) | | `get_ui_settings` | Load tag/fragment-type settings | | `set_ui_settings` | Persist tag/fragment-type settings | | `shutdown` | Stop sidecar, exit app | ## Sidecar Path Resolution The Rust shell looks for `Journal.Sidecar.exe` starting from the auto-detected repository root: 1. `/Journal.Sidecar.exe` 2. `/publish/Journal.Sidecar.exe` 3. `/Journal.Sidecar/bin/Debug/net10.0/Journal.Sidecar.exe` 4. `/Journal.Sidecar/bin/Release/net10.0/win-x64/publish/Journal.Sidecar.exe` 5. Recursive scan of `/Journal.Sidecar/` Build the sidecar before running the Tauri app: ```powershell .\scripts\publish-sidecar.ps1 -Configuration Release -Runtime win-x64 ``` ## Recommended IDE Setup [VS Code](https://code.visualstudio.com/) + [Svelte](https://marketplace.visualstudio.com/items?itemName=svelte.svelte-vscode) + [Tauri](https://marketplace.visualstudio.com/items?itemName=tauri-apps.tauri-vscode) + [rust-analyzer](https://marketplace.visualstudio.com/items?itemName=rust-lang.rust-analyzer)