Minimal Tauri 2 desktop MVP for local-first lecture sessions.
- Tauri 2
- React
- TypeScript
- Vite
- Rust command backend
- JSON-file session persistence
- Tauri Store plugin for lightweight recent state
- Session list page
- Recording page
- Start, pause, resume, and stop controls
- Local microphone or macOS system-audio capture
- Local transcript generation after stop using
whisper.cpp - Session detail page
- Session-level resource manager plus a Settings sheet for app resources, models, storage, and background tasks
- Observable model downloads and transcription jobs with progress and cancellation
- Processing quality presets, chunked transcription, and configurable Whisper thread count
- Local persistence without a database
-
Install dependencies:
pnpm install
-
Make sure your Rust toolchain is at least
1.77.2because the Tauri Store plugin requires it. -
Release builds bundle
whisper-cli; for local development, either add thewhisper-cli-<target-triple>sidecar undersrc-tauri/binaries/, provide a downloadable runtime asset, or install the Homebrew fallback. Models are downloaded automatically on first transcription when missing, or you can override paths with:LECLOG_WHISPER_PATHLECLOG_WHISPER_RUNTIME_URLLECLOG_WHISPER_RUNTIME_SHA256LECLOG_WHISPER_MODEL_PATHLECLOG_WHISPER_LANGUAGELECLOG_WHISPER_PROMPT
Example on macOS:
brew install whisper-cpp
Leclog defaults to Whisper language auto-detection. For Japanese lectures, these settings usually help:
export LECLOG_WHISPER_LANGUAGE=ja export LECLOG_WHISPER_PROMPT='授業 講義 先生 学生 発表'
-
Start the app:
pnpm tauri dev
The app now exposes runtime checks in the Settings sheet:
- app local data directory is writable
ffmpegcan be resolved from the bundled sidecar,LECLOG_FFMPEG_PATH, orPATHwhisper-clican be resolved fromLECLOG_WHISPER_PATH, Homebrew paths, orPATH- at least one local Whisper model is available
- interrupted
processingsessions and partial model downloads are visible
Release builds include whisper-cli. If it is missing in a development build, recording and imports still create local session files, and the final transcription task tries to download an app-managed runtime before transcribing. If no model is installed, the same task automatically downloads the recommended app-managed model.
The app should own as much of the runtime as is practical:
ffmpeg: bundled as a Tauri sidecar for macOS Apple Silicon releases.whisper-cli: bundled as a Tauri sidecar in release builds; app-managed download, Homebrew, andPATHremain development/fallback paths.- Whisper models: downloaded into the local app data directory on first transcription when none is installed, keeping the installer small while avoiding manual setup.
First-run guidance appears on the New Session screen when a required runtime piece is missing. The same checks are always available under Settings → Overview.
Settings → Overview also includes a startup update-check preference. When enabled, Leclog quietly checks the GitHub Releases updater channel on launch and only shows an in-app badge when a newer version is available.
The session detail view manages per-session resources. The Settings sheet manages app-level resources under the app local data directory:
- session folders and captured audio segments
- normalized audio and transcript artifacts
- app-managed Whisper models and partial downloads
- current background tasks
- failed task command summaries and stderr excerpts, with revealable logs under app data
Deletion is restricted to managed app resources. Imported source files outside the app data directory are never deleted.
Processing settings are available from Settings:
Fast: smaller model preference and shorter chunksBalanced: default preset for stable local transcriptionAccurate: larger model preference and wider overlapCustom: manual chunk length, overlap, thread count, and refresh interval
This repository is set up to build and publish a GitHub Release with GitHub Actions.
Current scope:
- macOS Apple Silicon (
aarch64-apple-darwin) - Tauri app bundles:
.appand.dmg - Tauri updater artifacts:
latest.jsonplus signed update archives - GitHub Release assets uploaded automatically by
.github/workflows/release.yml - Signed and notarized macOS releases only
- In-app update checks from Settings use the latest GitHub Release channel
Required GitHub Secrets:
APPLE_CERTIFICATE: base64-encodedDeveloper ID Application.p12APPLE_CERTIFICATE_PASSWORD: password used when exporting the.p12APPLE_SIGNING_IDENTITY: exact signing identity name fromsecurity find-identity -v -p codesigningAPPLE_API_KEY: App Store Connect API Key IDAPPLE_API_ISSUER: App Store Connect API Issuer IDAPPLE_API_KEY_P8: contents of the downloadedAuthKey_<KEYID>.p8TAURI_SIGNING_PRIVATE_KEY: private updater signing key generated bypnpm tauri signer generateTAURI_SIGNING_PRIVATE_KEY_PASSWORD: optional updater key password; leave unset for an unencrypted key
The release workflow now fails fast if:
- the tag version does not match
package.json,src-tauri/Cargo.toml, andsrc-tauri/tauri.conf.json - any required Apple signing, notarization, or updater signing secret is missing
Release flow:
-
Keep the app version aligned in:
package.jsonsrc-tauri/Cargo.tomlsrc-tauri/tauri.conf.json
-
Commit and push the version change.
-
Create and push a tag that matches the version:
git tag v0.3.0 git push origin v0.3.0
-
GitHub Actions will build the signed and notarized macOS package, create updater artifacts, and publish the GitHub Release automatically.
You can also run the workflow manually from the GitHub Actions page with workflow_dispatch.
If you later want Intel macOS, Windows, or Linux release artifacts, add the matching ffmpeg-<target-triple> and whisper-cli-<target-triple> binaries under src-tauri/binaries/ first, then expand the workflow matrix.