把轻量、可组合、受控的 Widget 带到你的桌面。
一个面向 Windows、macOS 与 Linux 的跨平台桌面浮动组件宿主,使用 Rust、Slint 与 WASM Component Model 构建。
English · 简体中文
Important
Floatile 当前处于 P0 技术可行性验证阶段,尚未发布可供日常使用的稳定版本。 本文中的 🧪 和 🗺️ 项目代表开发中或规划能力,不是已完成承诺。现阶段的目标是用可复现证据 验证跨平台窗口与沙箱插件链路,并如实暴露平台限制。
Floatile 希望提供一块始终在桌面上的轻量画布:时钟、系统状态、倒计时、开发工具或第三方 Widget 可以自由布局,却不能绕过宿主直接读取文件、访问网络、执行命令或控制原生窗口。
- 像桌面的一部分:透明、无边框、置顶的浮动窗口,并为平台不支持的能力提供明确降级。
- 编辑与展示分离:编辑模式负责拖拽、缩放与配置;展示模式隐藏宿主控件并按能力启用点击穿透。
- 插件默认不可信:计划以 WASM Component Model 隔离插件,所有宿主能力统一经过
deny-by-default
PermissionBroker。 - 跨平台但不假装一致:能力由运行时探测驱动;尤其在 Wayland 下会报告限制,而不是静默失败。
- 为插件作者而设计:WIT 是 host/guest 接口的唯一来源,配套 SDK、CLI、manifest 校验和开发示例。
状态图例:✅ 已有基础实现 · 🧪 正在开发/等待完整验证 · 🗺️ 规划中
| 能力 | 状态 | 当前说明 |
|---|---|---|
| Rust workspace 与领域基础类型 | ✅ | 九个 crate 的分层骨架、固定工具链与基础 CI 已建立 |
| 原生参考时钟 | ✅ | 可运行的 Slint 时钟,每秒更新,用作窗口与性能基线 |
| 透明、无边框、置顶窗口 | 🧪 | 已接入 winit 属性;尚无 Windows/macOS/X11/Wayland 完整实测证据 |
| 窗口拖拽 | 🧪 | 已接入窗口管理器拖拽;多平台行为仍待验证 |
| 平台能力探测与降级 | 🧪 | 当前主要根据显示环境保守判断,OS-specific 真实探测待实现 |
| 编辑/展示模式、缩放与多屏布局 | 🗺️ | 包括 DPI、热插拔与原屏缺失时回落到主屏 |
| SQLite 布局持久化 | 🗺️ | 计划保存位置、尺寸、层级、模式与显示器标识 |
.slint + .wasm Widget |
🗺️ | Wasmtime、Component Model、WIT host/guest 链路尚未接入 |
| Permission Broker 与审计 | 🗺️ | 默认零权限、scope/配额、参数脱敏与恶意插件测试尚未实现 |
| 插件 SDK 与打包 CLI | 🗺️ | 计划提供 validate/build/dev、包路径和大小安全校验 |
| 三平台与性能验收 | 🗺️ | 指标仅为目标值,目前不代表已达到或已验证 |
- 透明、无边框、Always-on-top 的 Widget 窗口(🧪)
- Edit / Show 双模式与按平台能力启用的点击穿透(🗺️)
- 拖拽(🧪)、缩放、层级管理和逻辑像素布局(🗺️)
- 多显示器、DPI 缩放、热插拔恢复和显式降级记录(🗺️)
- 内建参考时钟(✅)与后续插件化时钟示例(🗺️)
- WASM Component Model + 版本化 WIT 契约(🗺️)
- Wasmtime fuel、内存上限、调用频率与生命周期预算(🗺️)
- 所有宿主能力必须通过
PermissionBroker,默认拒绝(🗺️) - 存储、计时器、指标与日志能力的 scope、配额和脱敏审计(🗺️)
- 对 manifest、归档路径、Slint、WASM、配置与 WIT 参数进行不可信输入校验(🗺️)
- 面向
wasm32-wasip2的 Rust SDK 和同源 guest bindings(🗺️) .floatile包的 manifest、UI、logic 与 assets 约定(🗺️)floatile validate、floatile build和floatile dev工作流(🗺️)- 原生时钟与 WASM 时钟参考实现(前者 ✅,后者 🗺️)
插件市场、签名/自动更新、主题系统、凭证托管、网络 Broker、跨插件通信和 Sidecar 不在 P0 范围内;它们属于后续阶段的候选能力。
- 已安装
rustup - 可用的桌面图形环境
- Linux 需要满足 Slint/winit 后端的系统依赖;透明效果还取决于显示协议与合成器
仓库通过 rust-toolchain.toml 自动选择 Rust 1.97.1,并安装 wasm32-wasip2 target。
git clone https://github.com/powercess/floatile.git
cd floatile
rustup show
cargo run -p floatile-shell --locked当前程序会启动一个参考时钟浮窗。平台能力尚在开发中,因此窗口透明、置顶或拖拽行为可能按环境 降级;日志会显示探测结果。时钟目前按 UTC 秒数展示,尚未接入本地时区。
查看更详细日志:
RUST_LOG=debug cargo run -p floatile-shell --lockedcargo fmt --all -- --check
cargo check --workspace --all-targets --locked
cargo clippy --workspace --all-targets --locked -- -D warnings
cargo test --workspace --all-targets --lockedflowchart TB
Shell["floatile-shell<br/>画布 · 模式 · 生命周期"]
Runtime["floatile-runtime<br/>Slint · Wasmtime(开发中)"]
Broker["PermissionBroker<br/>授权 · 配额 · 审计(开发中)"]
Services["floatile-services<br/>计时器 · 存储 · 指标(开发中)"]
Store["floatile-store<br/>SQLite(开发中)"]
Platform["floatile-platform<br/>唯一的 OS / 窗口系统边界"]
Plugin["Widget Plugin<br/>.slint + .wasm(开发中)"]
WIT["WIT 单一契约源(开发中)"]
Shell --> Runtime
Shell --> Platform
Runtime --> Plugin
Plugin <--> WIT
Runtime --> Broker
Broker --> Services
Services --> Store
Services --> Platform
插件不能获得宿主原生句柄;所有未来宿主能力都必须经过 Broker。Slint 主线程只运行事件循环, 后台 I/O 与不可信 WASM 计划交给 Tokio/Wasmtime,并通过有界消息通道回投 UI。
| 层级 | 技术 | 状态/用途 |
|---|---|---|
| 语言与工具链 | Rust 2024 · Rust 1.97.1 | ✅ 固定 patch 工具链与 lockfile |
| UI 与窗口 | Slint 1.17 · winit 0.30 | 🧪 参考时钟和基础窗口属性已接入 |
| 插件 ABI | WIT · WASM Component Model · wasm32-wasip2 |
🗺️ 单一版本化 host/guest 契约 |
| 插件运行时 | Wasmtime | 🗺️ 异步组件调用、fuel 与资源限制 |
| 异步运行时 | Tokio | 🗺️ 承载后台 I/O,避免阻塞 Slint 主线程 |
| 持久化 | SQLite · rusqlite (bundled) | 🗺️ 布局、插件 KV 与审计日志 |
| 数据与错误 | serde · serde_json · thiserror | ✅/🧪 逐阶段接入契约与错误模型 |
| 可观测性 | tracing · tracing-subscriber | ✅ 基础日志;结构化审计 🗺️ |
| 工程质量 | rustfmt · Clippy · Cargo test · cargo-deny · GitHub Actions | ✅ 三系统 CI 配置 |
完整版本策略与选型边界见技术栈文档。
| Crate | 职责 | 当前阶段 |
|---|---|---|
floatile-core |
纯领域模型、ID、坐标与权限类型 | 🧪 |
floatile-platform |
平台能力探测与全部 OS 窗口差异 | 🧪 |
floatile-shell |
桌面宿主、画布、模式与应用编排 | 🧪 |
floatile-plugin-api |
WIT host bindings 与契约类型 | 🗺️ |
floatile-runtime |
Slint 动态 UI 与 Wasmtime 执行 | 🗺️ |
floatile-services |
经 Broker 授权的宿主服务 | 🗺️ |
floatile-store |
SQLite、migration 与事务 | 🗺️ |
floatile-sdk |
WASI guest SDK 与 bindings | 🗺️ |
floatile-cli |
插件校验、构建与开发工具 | 🗺️ |
crate 之间的依赖规则不是建议,而是安全与可移植性边界。详情见 Workspace 与 crate 边界。
| 平台 | 目标 | 当前证据 |
|---|---|---|
| Windows | 透明、置顶、点击穿透、编辑/展示模式 | CI 构建配置已存在;运行行为未验证 |
| macOS | 透明、置顶、点击穿透、编辑/展示模式 | CI 构建配置已存在;运行行为未验证 |
| Linux X11 | 依赖合成器的透明窗口与窗口管理器能力 | 基础环境探测已实现;运行行为未验证 |
| Linux Wayland | 能力分级并明确降级,不承诺与 X11 完全一致 | 基础环境探测已实现;纯 Wayland 实测未完成 |
这里的“目标”不是兼容性声明。真实平台证据只记录在 平台能力矩阵中。
- S1 · 浮窗基线(进行中):参考时钟、透明/无边框/置顶、拖拽和真实平台探测
- S2 · 桌面交互(规划中):Edit/Show、点击穿透、缩放、多屏与 DPI 降级
- S3 · 布局持久化(规划中):SQLite migration、恢复与显示器热插拔
- S4 · 插件契约(规划中):WIT 单一源、manifest、SDK 与包校验
- S5 · 沙箱运行时(规划中):Wasmtime、动态 Slint、Broker、配额与恶意插件测试
- P0 验收(规划中):Windows/macOS/X11/Wayland 证据、性能数据、风险复盘与许可 ADR
路线图会随验证证据调整。某项技术不可行但被准确记录和降级,同样是 P0 的有效产出。
Floatile 欢迎问题报告、设计讨论、文档改进和小而完整的实现。不过项目仍处在架构与许可收敛期, 开始编码前请先阅读:
普通变更应从最新 dev 创建单一目标分支,并通过 PR 合回 dev。安全、WIT、平台、持久化或
crate 边界变更需要同步相应契约、测试和架构文档。
当前插件安全边界仍在设计和实现中,请勿运行来源不明的 .slint、WASM 或插件包。发现安全问题时,
请不要公开披露可利用细节;在专用安全联系渠道建立前,请通过仓库所有者的私密联系方式报告。
Warning
仓库当前标记为 PROPRIETARY,且 Slint 分发许可仍待法务与商业路线决策。Floatile 目前不是
已获许可对外分发的开源软件。在许可分析完成并形成 ADR 前,
不得发布二进制、SDK 或 .floatile 包,也不得自行添加开源 LICENSE。
如果 Floatile 的方向对你有吸引力,欢迎留下一个 ⭐ 并关注 P0 的验证进展。