Supernote is a premium, lightweight, cross-platform note-taking application built with Tauri v2 and Vite. It features a dynamic, runtime-extensible plugin architecture and integrates powerful backend sidecars (Bun and Python) to perform local computations beyond the standard frontend sandbox.
- Tauri v2 Desktop Shell: High performance, small binary footprint, native OS dialogs, notifications, and system hooks.
- Dynamic Plugin System: Extends UI controls and editor behavior at runtime. Plugins are dynamically downloaded, loaded, and initialized from the registry server (Superhub).
- Native Sidecars:
- Bun Sidecar (
src-bun): Run fast server-side JavaScript/TypeScript workflows locally. - Python Sidecar (
src-python): Run scriptable scripts, data analysis, and helper automations.
- Bun Sidecar (
- Unified UI Styling: Sleek jQuery-driven UI featuring glassmorphic designs, micro-animations, customizable dark theme support, and a dragging-enabled custom window header.
- Cross-Platform Targets: Compile to Windows, macOS, Linux, and Android.
supernote/
βββ docs/ # Documentation files (e.g., setup instructions)
βββ scripts/ # Utility scripts for sidecars, release packaging, and key generation
β βββ build-sidecars.js # Compiles Bun and Python sidecars
β βββ create-tag.js # Prepares Git tags & release metadata
β βββ setup.ps1 / setup.sh # Installs dependencies (Rust, Bun, Python, PyInstaller)
β βββ secrets/ # EXCLUDED FROM GIT - holds signing and updater private keys
βββ src/ # Frontend application code
β βββ Services/ # Core business services
β β βββ Framework/ # Framework initialization
β β βββ Network/ # REST and WebSocket network modules
β β βββ Plugin/ # Plugin loader, cache management, and dynamically-imported registry links
β β βββ Runtime/ # Application runtime states
β β βββ Storage/ # Application persistence/storage configuration
β βββ Sources/ # UI components, layouts, custom styles, and core sidecar-spawning routines
β β βββ main.css # Styling rules, color palettes, variables
β β βββ main.js # Core page layout, sidecar buttons, and service interactions
β βββ main.css # Global application loader stylesheet
β βββ main.js # Core entry point (bootstrap sequence)
βββ src-sidecars/ # Sidecar codebases
β βββ src-bun/ # TypeScript-based Bun sidecar source code
β βββ src-python/ # Python sidecar script codebase
βββ src-tauri/ # Rust code and Tauri packaging configurations
β βββ src/ # Main Rust file (commands, setup, resize hooks)
β βββ tauri.conf.json # Tauri target build configuration
βββ info.json # Git release versioning and download URLs
βββ package.json # Frontend dependencies & run scripts
Ensure you have the following installed on your machine:
- Node.js (v18+)
- Rust/Cargo
- Bun
- Python 3
Execute the platform-specific setup script to verify environments and install requirements (e.g., PyInstaller, Node packages, dependencies):
- Windows (PowerShell):
.\scripts\setup.ps1
- macOS / Linux (Bash):
chmod +x ./scripts/setup.sh ./scripts/setup.sh
Compile the sidecars into executable binaries placed inside src-tauri with the target triple name:
node scripts/build-sidecars.jsStart the client application in development mode:
npm run devBuild and package the production installer:
npm run buildSupernote loads plugins dynamically using the PluginService located under src/Services/Plugin/PluginService.js.
- Registry URL: By default, Supernote looks for the registry on
http://localhost:3001. You can configure a custom server URL directly from the application's UI settings. - Plugin Loading: On startup, it reads the default plugin manifest
plugin-package.jsand requests corresponding files from the registry server. - Sandboxing & Dynamic Import: It imports ES modules dynamically using
import(/* @vite-ignore */ url)and appends related style assets dynamically into the document<head>.
- Supernote now consumes plugin metadata with
exports.logic,exports.template, andexports.styles. - Plugin package entries can define default variants:
{ slug: 'button', version: '1.0.1', variants: ['primary', 'secondary', 'danger'] }- Variant selection is hybrid:
- default variants from
plugin-package.js - optional runtime variant override per load call
- default variants from
- UI code now creates widget instances directly from plugin logic exports.
- The button helper wrapper in the source page has been removed; components instantiate the loaded widget class directly.
Refer to scripts/README.md for advanced commands regarding:
- Tauri updater key generation (
generate-updater-keys.js). - Android release key configurations (
createSecrets.ps1). - Tagging releases and preparing automatic update jsons (
create-tag.js).