Multi-Language Project Publishing, Beautifully Simplified.
English · 简体中文 · 日本語 · 한국어 · Español · Português · Français · Deutsch
OnePublish is a cross-platform desktop application that gives you a beautiful, productive GUI for publishing software projects. Instead of remembering and typing complex CLI commands, you select a repository, configure parameters through an intelligent form, and publish with a single click.
One tool. Multiple languages. .NET · Rust (cargo) · Go · Java (Gradle) — all from the same unified interface.
- 🎯 Multi-Language Support — .NET (
dotnet publish), Rust (cargo build --release), Go (go build), Java/Gradle — with more coming - 🧠 Schema-Driven Parameters — 100% parameter expressiveness: every CLI flag, env var, and argument is represented and validated, not hardcoded
- 📋 Command Import — paste any CLI command and OnePublish reverse-engineers it into structured parameters
- 📊 Execution History — local timeline of your recent runs (20 by default, configurable) with one-click re-run
- 🔍 Environment Diagnostics — automatic detection of missing toolchains (SDKs, runtimes) with guided fixes
- 🎨 Geist Design System — Vercel-inspired token-driven UI with wide-gamut P3 colors, precise typography, and shadcn/ui components
- 🌐 Internationalized — full Chinese (简体中文) and English support
- 🌓 Dark & Light Themes — follows your system preference
- 🔄 Auto-Update — Tauri updater pipeline with GitHub Releases integration
- ⌨️ Keyboard-First — global shortcuts for frequent actions; publish without touching the mouse
- 📦 One-Click GitHub Release —
pnpm release -v 1.0.0syncs versions, generates release notes, commits, tags, pushes, and waits for CI
Screenshots coming soon. In the meantime, check the design philosophy and the Geist design spec.
| Required | Version | Purpose |
|---|---|---|
| Node.js | ≥ 20.19 | Frontend runtime |
| pnpm | latest | Package manager |
| Rust | ≥ 1.77 | Tauri backend compilation |
| Target SDK | varies | At least one of: .NET SDK / Rust / Go / Java (Gradle) |
# Xcode Command Line Tools (required for Tauri on macOS)
xcode-select --install
# Node.js & pnpm
brew install node pnpm
# Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh# Ubuntu/Debian
sudo apt install libwebkit2gtk-4.1-dev build-essential curl wget file \
libxdo-dev libssl-dev libayatana-appindicator3-dev librsvg2-dev
# Fedora
sudo dnf install webkit2gtk4.1-devel openssl-devel libappindicator-gtk3-devel \
librsvg2-devel# With Chocolatey
choco install nodejs pnpm rust
# Or via official installers: nodejs.org, rustup.rs# Clone
git clone https://github.com/sperictao/one-publish.git
cd one-publish
# Install dependencies
pnpm install
# Development mode (hot-reload)
pnpm dev
# Production build
pnpm build
# Output: src-tauri/target/release/bundle/one-publish/
├── src/ # React Frontend (TypeScript)
│ ├── components/
│ │ ├── ui/ # shadcn/ui primitives (Button, Dialog, Select...)
│ │ ├── layout/ # Layout: panels, resize handles, sidebar
│ │ ├── publish/ # Publish config: parameter editors, command import
│ │ ├── release/ # Release checklist wizard
│ │ └── environment/ # Environment diagnostics UI
│ ├── features/ # Domain logic: publish, repository, provider, environment
│ ├── hooks/ # React hooks: useI18n, useAppState, useShortcuts...
│ ├── stores/ # Zustand state slices
│ ├── lib/ # Utilities: store API, paths, preflight, artifacts
│ ├── i18n/ # Translations: zh.json, en.json
│ ├── generated/ # ts-rs generated contracts (CI drift check)
│ ├── types/ # Shared TypeScript types
│ ├── test/ # Vitest setup
│ ├── __tests__/ # Frontend unit tests
│ └── index.css # Geist design tokens + utilities
│
├── src-tauri/ # Rust Backend (Tauri)
│ ├── src/
│ │ ├── main.rs # Entry point
│ │ ├── lib.rs # Plugin registration + command handler
│ │ ├── provider/ # Language provider trait + implementations
│ │ │ └── providers/ # dotnet.rs, cargo.rs, go.rs, java_gradle.rs
│ │ ├── commands/ # Tauri IPC commands (publish, repository, updater)
│ │ ├── environment/ # Environment checks per language
│ │ ├── compiler.rs # Spec → ExecutionPlan compiler
│ │ ├── spec.rs # PublishSpec (language-agnostic data model)
│ │ ├── plan.rs # ExecutionPlan (ordered steps)
│ │ ├── parameter.rs # ParameterSchema + validation
│ │ ├── store/ # Persistence (JSON file storage)
│ │ ├── config_export.rs # Config import/export
│ │ ├── shortcuts.rs # Global hotkey registration
│ │ └── tray.rs # System tray
│ ├── Cargo.toml # Rust dependencies
│ └── tauri.conf.json # Tauri window, bundle, updater config
│
├── tests/e2e/ # Playwright e2e tests
├── scripts/ # Build/Release automation scripts
├── docs/ # Documentation
│ ├── design-philosophy.md # Product & engineering philosophy
│ ├── updater/SETUP.md # Updater configuration guide
│ └── release/GITHUB_RELEASE.md # Release pipeline docs
├── DESIGN.md # Geist design system — Light theme (canonical tokens + spec)
├── design.dark.md # Geist design system — Dark theme
├── package.json
├── vite.config.ts
├── tailwind.config.cjs
└── tsconfig.json
PublishSpec → ExecutionPlan → Execute
- Select a repository — Auto-detected from local files (
.sln,Cargo.toml,go.mod,build.gradle, etc.) - Configure publish parameters — Use presets, a schema-driven form, or paste a raw CLI command
- Preflight check — Validates output paths, environment readiness, branch status
- Execute — Streams live
stdout/stderrinto the UI with cancel support - Review — History timeline stores every run; re-run with one click, export diagnostics, or generate CI handoff snippets
| Layer | Technology |
|---|---|
| Frontend Framework | React 19 + TypeScript |
| Build Tool | Vite 7 |
| Styling | Tailwind CSS 3 + shadcn/ui (Radix UI) |
| Design System | Vercel Geist (design tokens, P3 wide-gamut colors, dark & light themes) |
| State Management | Zustand 5 |
| Icons | Lucide React |
| Notifications | Sonner |
| Desktop Framework | Tauri 2.x (Rust) |
| Persistence | JSON file storage (~/.one-publish/config.json) |
| Type Bridging | ts-rs (Rust ↔ TypeScript contract generation) |
| Unit Testing | Vitest (frontend) + Rust #[cfg(test)] (backend) |
| E2E Testing | Playwright |
| Package Manager | pnpm |
# Development
pnpm dev # Full Tauri dev (frontend + backend)
pnpm dev:renderer # Vite dev server only (frontend)
# Build
pnpm build # Production Tauri bundle
pnpm build:renderer # Frontend build only
# Quality
pnpm typecheck # TypeScript type check + contract validation
pnpm lint # ESLint
pnpm format # Prettier code formatting (write)
pnpm format:check # Prettier formatting check (CI gate)
pnpm test # Vitest unit tests
pnpm test:ui # Vitest UI
pnpm test:watch # Vitest watch mode
pnpm e2e # Playwright e2e tests
pnpm e2e:ui # Playwright UI mode
pnpm check:i18n # i18n key coverage (zh/en)
pnpm check:design # Geist design compliance check
pnpm generate:contracts # Regenerate ts-rs contracts after Rust type changes
pnpm check:contracts # Contracts drift check
# Release
pnpm release -v 0.8.0 # Full release pipeline
pnpm release -v 0.8.0 -d # Dry-run (preview only)
# Utilities
pnpm doctor # Run react-doctor for code health
pnpm build:updater # Generate updater production configOnePublish supports 简体中文 and English out of the box. Switch in-app via Settings, or programmatically:
// The app reads localStorage('app-language')
// Values: 'zh' (default) or 'en'Translation files: src/i18n/zh.json | src/i18n/en.json (~776 keys each, organized by feature domain).
| Layer | Tool | Coverage |
|---|---|---|
| Frontend unit | Vitest + Testing Library | Components, hooks, stores, lib |
| Backend unit | Rust #[cfg(test)] |
Provider compilation, store migrations, plan generation |
| E2E | Playwright (12 specs) | App boot, repo panel, provider selection, publish presets, custom config, preflight, publish flow, contracts smoke |
| Quality gates | TypeScript strict + ts-rs contracts |
Enforced at build & CI |
OnePublish is evolving from a .NET publish GUI into a commercial-grade, multi-language publishing product. The master plan spans 11 phases:
| Phase | Theme | Status |
|---|---|---|
| 0 | Engineering foundation (testing, CI) | ✅ Done |
| 1 | Publish core abstraction (Spec, Plan, Logging) | ✅ Done |
| 2 | Language providers (Rust/Go/Java) | ✅ Done |
| 3 | 100% parameter expressiveness (schema editor) | ✅ Done |
| 4 | Commercial features (import/export, env checks, signing) | ✅ Done |
| 5 | Release operations UX (checklist wizard, preflight) | ✅ Done |
| 6 | Multi-provider UX bridge | ✅ Done |
| 7 | Execution reliability & DevEx (streaming, cancel, snapshots) | ✅ Done |
| 8 | Run intelligence & recovery (history, re-run, failure grouping) | ✅ Done |
| 9 | Diagnostics deepening & team handoff | ✅ Done |
| 10 | Collaboration signal & timeline intelligence | ✅ Done |
| 11 | Team workflow integration | 🚧 In Progress |
- Fork the repository
- Create a feature branch (
git checkout -b feat/amazing-feature) - Run the local quality gates:
pnpm typecheck && pnpm lint && pnpm test && pnpm check:i18n && pnpm check:design. If you change Rust code, also runcargo clippy --manifest-path src-tauri/Cargo.toml -- -D warnings && cargo test --manifest-path src-tauri/Cargo.toml. (CI additionally runs the contracts drift checkpnpm check:contractsandcargo audit.) A pre-commit hook (installed viapnpm install) auto-formats staged TS/TSX/JS/JSON files with Prettier andeslint --fix; runpnpm formatto format the whole tree manually. - Commit with descriptive messages
- Push and open a Pull Request
MIT © 2026 Eric Tao — see LICENSE for details.
Made with ❤️ by Eric Tao