Skip to content

Latest commit

 

History

672 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

OnePublish Icon

OnePublish

Multi-Language Project Publishing, Beautifully Simplified.

License Tauri 2 React 19 TypeScript Rust

English · 简体中文 · 日本語 · 한국어 · Español · Português · Français · Deutsch


What is OnePublish?

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.

✨ Highlights

  • 🎯 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 Releasepnpm release -v 1.0.0 syncs versions, generates release notes, commits, tags, pushes, and waits for CI

📸 Screenshots

Screenshots coming soon. In the meantime, check the design philosophy and the Geist design spec.


🚀 Quick Start

Prerequisites

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)

macOS — Install Dev Dependencies

# 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

Linux — Install Dev Dependencies

# 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

Windows — Install Dev Dependencies

# With Chocolatey
choco install nodejs pnpm rust
# Or via official installers: nodejs.org, rustup.rs

Build & Run

# 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/

🏗️ Architecture

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

🧩 How It Works

PublishSpec → ExecutionPlan → Execute

  1. Select a repository — Auto-detected from local files (.sln, Cargo.toml, go.mod, build.gradle, etc.)
  2. Configure publish parameters — Use presets, a schema-driven form, or paste a raw CLI command
  3. Preflight check — Validates output paths, environment readiness, branch status
  4. Execute — Streams live stdout/stderr into the UI with cancel support
  5. Review — History timeline stores every run; re-run with one click, export diagnostics, or generate CI handoff snippets

🛠️ Tech Stack

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

📜 Available Scripts

# 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 config

🌍 Internationalization (i18n)

OnePublish 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).


🧪 Testing

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

🗺️ Roadmap

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

🤝 Contributing

  1. Fork the repository
  2. Create a feature branch (git checkout -b feat/amazing-feature)
  3. Run the local quality gates: pnpm typecheck && pnpm lint && pnpm test && pnpm check:i18n && pnpm check:design. If you change Rust code, also run cargo clippy --manifest-path src-tauri/Cargo.toml -- -D warnings && cargo test --manifest-path src-tauri/Cargo.toml. (CI additionally runs the contracts drift check pnpm check:contracts and cargo audit.) A pre-commit hook (installed via pnpm install) auto-formats staged TS/TSX/JS/JSON files with Prettier and eslint --fix; run pnpm format to format the whole tree manually.
  4. Commit with descriptive messages
  5. Push and open a Pull Request

📄 License

MIT © 2026 Eric Tao — see LICENSE for details.


Made with ❤️ by Eric Tao

About

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.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages