plusui-native
v0.2.106
Published
PlusUI CLI - Build C++ desktop apps modern UI
Readme
PlusUI
Build C++ desktop apps with web tech. Like Tauri, but for C++.
Quick Start
# Install CLI globally
npm install -g plusui-cli
# Create a new project
plusui create myapp
cd myapp
# Install dependencies
npm install
# Run in development mode (with HMR)
npm run dev
# Build for production
npm run buildProject Structure
myapp/
├── src/
│ ├── main.cpp # C++ backend
│ ├── index.html # Frontend entry
│ └── ...
├── plusui-core/ # Framework (git submodule)
├── package.json
└── CMakeLists.txtC++ API
#include <plusui/app.hpp>
int main() {
auto wv = plusui::createApp()
.title("My App")
.width(1024)
.height(768)
.build();
// Navigate to frontend
wv.navigate("file://${CMAKE_CURRENT_SOURCE_DIR}/src/index.html");
// Listen for events from frontend
wv.on("greet", [](const std::string& name) {
std::cout << "Hello, " << name << "!" << std::endl;
});
// Run the app
plusui::createApp().run();
return 0;
}TypeScript API
import { createPlusUI } from '@plusui/core';
const plusui = createPlusUI();
// Call C++ function
const result = await plusui.invoke<number>('add', [1, 2]);
// Listen for events
plusui.on('server-event', (data) => {
console.log('Received:', data);
});
// Emit event to C++
plusui.emit('greet', 'World');
// One-time listener
plusui.once('ready', () => {
console.log('App ready!');
});Events vs Invoke
| Method | Direction | Use Case |
|--------|-----------|----------|
| invoke() | Frontend → Backend | Request/response |
| emit() | Frontend → Backend | Fire-and-forget |
| on() | Bidirectional | Subscriptions |
Configuration
const plusui = createPlusUI({
title: 'My App',
width: 800,
height: 600,
resizable: true,
devtools: true,
});Building
# Development (auto-rebuild + HMR)
npm run dev
# Production build
npm run build
# Run built app
npm run start
# Regenerate connection bindings manually (app-level)
npm run connectConnection generation runs per app project and scans for connect.emit() / connect.on() usage.
dev and all build commands auto-refresh connection bindings first.
Requirements
- Windows: WebView2 Runtime (pre-installed on Win10/11)
- macOS: Xcode Command Line Tools
- Linux: WebKit2GTK (
sudo apt install libwebkit2gtk-4.0-dev)
Architecture
┌─────────────────────────────────────┐
│ Frontend (Web) │
│ React / Vue / Svelte / Vanilla │
└─────────────────┬───────────────────┘
│ Events / Invoke
┌─────────────────▼───────────────────┐
│ TypeScript SDK │
│ @plusui/core │
└─────────────────┬───────────────────┘
│ JSON IPC
┌─────────────────▼───────────────────┐
│ C++ Core │
│ plusui::createApp() │
│ webview.h │
└─────────────────┬───────────────────┘
│
┌─────────────────▼───────────────────┐
│ Native WebView │
│ Windows: WebView2 (Edge) │
│ macOS: WKWebView (WebKit) │
│ Linux: WebKitGTK │
└─────────────────────────────────────┘License
MIT
