Skip to content
OdradekAIPublic

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Repository files navigation

Velvet

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.

One workbench, two starting points

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.

A layout that explains itself

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:

  1. navigation for workspace and library navigation;
  2. contextual for metadata, inspection and preview tools;
  3. operations for jobs, logs and operational tools.

Extensions can customize content inside their allowed zone. A contribution cannot move across zones in the initial architecture.

Preview at the depth you need

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.

Extend by capability

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.

Architecture

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.

Build from source

Rust workspace

Install Rust through rustup, then run:

cargo test --workspace
cargo fmt --all -- --check

Desktop TypeScript skeleton

cd apps/desktop
npm install
npm run typecheck
npm run test

The native desktop boundary can be checked independently from the repository workspace:

cargo test --manifest-path apps/desktop/src-tauri/Cargo.toml

The 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.

Repository layout

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

Project documents

License

Velvet is distributed under the Apache License 2.0.

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages