Your assets and information should be understandable at a glance.
中文说明 · Architecture · Changelog · License
Note
Velvet 0.0.4 is a Workbench foundation release. The React shell, revisioned layout model, native Tauri window boundary, external plugin lifecycle, persisted operations and Preview source locations are in place; the asset indexer and production extensions are still being built.
Velvet is a Rust and Tauri desktop workbench for organizing assets and information in one adaptable workspace. Its Chinese name is 白翎.
The first built-in workspaces are:
- Asset Manager for images, RAW files, video, audio, documents and 3D models.
- Feed Workbench for subscriptions, messages and reading material.
The interface follows the spatial ideas of VS Code and JetBrains IDEs. Each region has one clear job, so users can understand where a feature belongs without learning a plugin-specific layout.
Activity Bar switch between built-in workspaces
Primary Sidebar navigation, libraries, sources and collections
Workspace Area grids, previews, comparisons and editors
Auxiliary Sidebar inspectors, metadata and third-party tools
Operations Panel jobs, logs, sync and terminal-like operations
Status Bar current state and progress
The initial extension zones are fixed by purpose:
navigationfor workspace and library navigation;contextualfor metadata, inspection and preview tools;operationsfor jobs, logs and operational tools.
Extensions can customize content inside their allowed zone. A contribution cannot move across zones in the initial architecture.
Velvet treats preview as a host-managed capability rather than a separate full-screen viewer for every file format.
- Quick shows a clean, fast preview.
- Inspect shows useful file and metadata information.
- Analyze exposes specialist tools such as RAW histograms, RGB curves, color information or 3D material controls.
The preview system separates primary renderers from augmentations:
ContentKindProvider recognizes a file kind
PreviewProvider renders the main preview
InspectorContribution adds metadata and analysis sections
PreviewTool adds interactive commands
AnalysisJob performs expensive background work
A 3D or RAW extension can provide a renderer, thumbnails, metadata and analysis. A metadata-only extension can add information to the Auxiliary Sidebar without replacing the main preview.
An extension manifest declares its contributions and permissions. The host validates the zone before registration.
- Navigation extensions use library, source and workspace APIs.
- Contextual extensions use asset, metadata and preview APIs.
- Operations extensions use jobs, logs and explicitly granted process or network APIs.
Third-party extensions are designed for isolated WASM or sidecar runtimes. Built-in adapters may run in-process, but they use the same public contribution model. Extensions communicate through stable protocol types and do not depend on internal Vue or React component types.
The Rust plugin host starts declared external runners through an isolated child process boundary, grants only zone-validated permissions, and reports runtime state through the core extension query. A failed start or crash removes that extension's contributions while leaving the Workbench usable; recovery is an explicit host operation that starts a fresh process.
The native app scans app_data_dir/plugins for JSON manifests on startup.
The inspect-plugin CoreTransport command parses a package before any files
are copied. The native Workbench shows its manifest, requested zone
permissions, target app, runtime and host API compatibility in the Extensions
dialog. A compatible package then goes through the install-plugin transaction;
an existing extension must provide a newer numeric version and is staged as an
upgrade. Activation and frontend projection complete the transaction with
commit-plugin-install; any activation or projection failure calls
rollback-plugin-install to remove a new package or restore the previous
package and runtime state. Invalid files are isolated in the discovery report
and do not block valid extensions. Each installed extension can be enabled,
disabled, recovered after a failure, or uninstalled with a native confirmation;
uninstall stops its runtime and removes its installed package directory. On
startup the host scans for abandoned .staging-* and .rollback-* directories
left by a client crash. Affected extensions stay inactive until the Extensions
dialog offers resume, keep new, restore previous or discard actions.
Failed recovery actions remain available for retry, while stale or invalid
transaction directories are cleaned on startup. The host keeps a bounded
recovery log in the application plugin directory and the dialog shows recent
attempts and cleanup results. The same Rust-owned log is projected into the
global Operations panel, where users can filter by plugin, status or action,
clear the bounded history, and export a JSON snapshot through a native save
dialog.
The first release uses a local-first, single-process topology:
Tauri webview
│ CoreTransport
▼
Rust ApplicationCore
├── layout state and migrations
├── preview resolver
├── plugin host
├── persistence
└── jobs and indexing
The frontend owns rendering and interaction. Rust owns durable state, permissions, plugin lifecycle, preview selection and background work. The Tauri adapter stays thin so a future local daemon or remote transport can implement the same protocol.
The desktop frontend follows an application-first organization inspired by vben's separation of runnable apps, reusable capabilities and tooling, while keeping the first client self-contained:
apps/desktop/src/
app/ startup and dependency composition
platform/ CoreTransport and Tauri-facing adapters
workbench/ layout, parts, views, previews and zones
workspaces/ Asset Manager and Feed Workbench product modules
The workbench stays independent of Vue and React. A renderer consumes its public descriptors, while a future frontend package is extracted only when a second client or independently versioned SDK needs it.
Install Rust through rustup, then run:
cargo test --workspace
cargo fmt --all -- --checkcd apps/desktop
npm install
npm run typecheck
npm run testThe native desktop boundary can be checked independently from the repository workspace:
cargo test --manifest-path apps/desktop/src-tauri/Cargo.tomlThe current desktop package contains the app composition root, platform transport types, framework-independent Workbench, two built-in workspace descriptors, preview host, view registry, zone policy and plugin client interfaces. The Tauri command/event boundary, native global shortcut entry and app-data-backed layout recovery are now wired to the React shell; production UI and domain features remain incremental work.
crates/
application-core/ Rust state owner and request dispatcher
workbench-protocol/ commands, queries, events and transport seam
layout-model/ Parts, zones and versioned layout state
preview-core/ intents, providers, resolver and fallback
plugin-api/ manifests, contributions and permissions
plugin-host/ registration, activation and zone validation
persistence/ layout storage seam
job-system/ background job model
tauri-adapter/ Tauri-facing transport adapter
apps/desktop/
src/app/ desktop composition root
src/platform/ framework-independent core transport types
src/workbench/ layout and extension host infrastructure
src/workspaces/ Asset Manager and Feed Workbench modules
src-tauri/ Tauri command/event and native shortcut boundary
Velvet is distributed under the Apache License 2.0.