桌面软件 活跃维护

wealthfolio

wealthfolio/wealthfolio

一个美观、私密、以本地优先的个人理财追踪工具。投资、净资产、支出和模拟。

9239
Stars 标星
769
Forks 分支
37
Watchers 关注
531
Open Issues
Rust
主要语言
AGPL-3.0
开源协议
190.2 MB
仓库大小
15 小时前
最后推送
一键安装扩展 / 插件指令
dsh plugin --profile web add github:wealthfolio/wealthfolio
git clone https://github.com/wealthfolio/wealthfolio.git
git clone git@github.com:wealthfolio/wealthfolio.git
README.md main

英文原文正文为项目原始 README(英文),本站后续会翻译为中文,当前仅剔除图片与无关章节并统一排版。

财富档案

开源的私人投资组合跟踪器——投资、净资产、支出和模拟。
本地优先:您的数据保存在您的设备上。

网站 · Discord · 推特 · 发布

⬇️  下载 macOS · Windows · Linux 版本  ·  📱 iOS App  ·  🐳 Docker

简介

Wealthfolio 是一个开源的私人投资组合追踪器——涵盖投资、净资产、支出和模拟。您的所有数据都存储在本地设备上:无需云数据库,无需账户,永久免费。

对于自动经纪同步(30 家机构,只读)和加密多设备同步,有 Wealthfolio Connect——这是一个可选订阅,用于覆盖经纪数据连接的实际成本。该应用从不强制要求使用:手动追踪和 CSV 导入永久免费。

访问网站:wealthfolio.app。

✨ 主要功能

  • 📊 投资组合跟踪 - 跨多个账户和资产类型跟踪您的投资
  • 📈 业绩分析 - 真正的时间加权和货币加权收益,基准比较以及历史分析
  • 💰 活动管理 - 导入并管理所有交易活动
  • 🎯 目标规划 - 设置并跟踪财务目标,管理资产分配
  • 🔒 本地数据 - 所有数据存储在本地,无需云依赖
  • 🔄 可选经纪同步 - 使用 Wealthfolio Connect 自动同步 30 家经纪公司(只读,完全可选)
  • 🧩 可扩展 - 强大的插件系统,可实现自定义功能
  • 🌍 多货币 - 支持多种货币及汇率管理
  • 📱 跨平台 - 桌面(Windows、macOS、Linux)、iOS,以及自托管 Docker/网页

Wealthfolio 3.7 需要 macOS 12 或更高版本,以及 iOS/iPadOS 16 或更高版本。macOS 12 安装应应用当前 macOS 和 Safari 更新,以确保系统 WKWebView 满足 Safari 16 浏览器要求。Windows 使用长青 WebView2 运行时;Linux 和自托管安装应保持 WebKitGTK 或浏览器更新。

🧩 插件系统

Wealthfolio 拥有强大的插件系统,允许开发者扩展功能:

  • 🔌 简单开发 - 提供 TypeScript SDK,具有完整类型安全和热重载功能
  • 🔒 安全 - 全面的权限系统,需用户同意
  • ⚡ 高性能 - 优化速度,开销最小
  • 🎨 UI 集成 - 添加自定义页面、导航项和组件
  • 📡 实时事件 - 收听投资组合更新、市场同步和用户操作
  • 🗄️ 完整数据访问 - 访问账户、持仓、活动和市场数据
  • 🔐 秘密管理 - 安全存储 API 密钥和敏感数据
  • 📦 私有资产 - 为隔离的插件沙箱打包图像、字体、媒体、配置和 Wasm

开始构建插件: 请参阅 插件文档中心

所有活动类型的文档,包括所需的表单字段,可在 docs/activities/activity-types.md 查阅。

路线图

请参阅 ROADMAP.md。

📖 文档

核心应用

  • 活动类型 - 完整指南,涵盖所有支持的活动类型及其必填字段
  • 路线图 - 未来计划和开发路线图

建筑

  • 凭证存储 - 原生后端,服务器加密,安卓备份和恢复
  • 安卓测试 - 设置、模拟器/设备命令、APK 构建和冒烟测试
  • 适配器系统 - 桌面/网页构建的编译时环境检测

插件开发

快速链接

快速开始

先决条件

确保您的计算机上已安装以下内容:

从源代码构建

  1. 克隆仓库:

    git clone https://github.com/wealthfolio/wealthfolio.git
    cd wealthfolio
  2. 使用 pnpm 安装依赖:

    pnpm install
  3. 设置环境配置:

    复制环境模板并为您的设置进行配置:

    cp .env.example .env

    有关可选的 Connect 设置,请参见 源代码构建中的 Wealthfolio Connect。

    桌面开发使用单独的应用程序标识和配置文件目录。在 macOS 上,默认布局如下:

    ~/Library/Application Support/com.teymz.wealthfolio.dev/
    ├── profiles.json
    └── profiles/<uuid>/app.db

    在桌面开发过程中,如果要选择其他配置文件目录,请在 .env 中将 WF_DATA_DIR 设置为 .env.example 中描述的绝对路径。保持未设置状态以使用默认的开发应用数据目录。请使用专门的开发目录;此设置选择注册表及其配置文件,而不是单个数据库文件。现有的根目录级 app.db 仅在首次配置文件初始化时被采纳。

    如果你的旧 .env 中包含 DATABASE_URL,请将其删除:pnpm tauri dev 会忽略它,包括首次启动时。使用 WF_DATA_DIR 来选择开发目录。打包后的桌面应用不会附带 .env 文件。

  4. 以开发模式运行:

pnpm tauri dev

该命令会自动应用 apps/tauri/tauri.dev.conf.json,该文件设置了 com.teymz.wealthfolio.dev 和 Wealthfolio (Development)。当提供额外的 --config 覆盖时,该身份仍然有效,包括运行 pnpm tauri dev --release 时。生产构建(pnpm tauri build)保留生产身份。对于独立打包的调试构建,请明确选择相同的配置:

pnpm tauri build --debug --config apps/tauri/tauri.dev.conf.json

凭证遵循所选的应用身份,而不是调试/发布模式。生产钥匙串名称保持不变。开发有单独的凭证,因此如有需要,请登录并将其注册为单独的同步设备;之后的开发运行会重复使用这些凭证。配置文件和附加组件在每个环境中保留其现有的作用域。移动命令保留其配置的身份。

要将现有数据填充到开发环境中,请使用支持的备份/导出和还原流程。加密的生产数据库的原始副本仍然需要其原始加密密钥;开发不会复制或回退到生产凭证。切勿将开发指向正在运行的生产配置文件目录。

分发打包

如果包管理器提供更新,请将 WEALTHFOLIO_UPDATE_EXPLANATION 设置为用户在构建时应看到的信息:

WEALTHFOLIO_UPDATE_EXPLANATION="Update Wealthfolio with your package manager." pnpm tauri build

桌面应用仍然会显示新版本及其更新说明,但会显示此消息而不是“立即更新”按钮,并且拒绝自行安装更新。启动器脚本可以在运行时设置相同的变量。Flatpak 安装以及未通过二进制 dpkg 或 rpm 安装的 .deb/.rpm 构建在没有此变量的情况下也能被检测到。

插件开发模式

插件热重载服务器现在仅在您明确选择加入时启动。

用于 Tauri 桌面开发:

VITE_ENABLE_ADDON_DEV_MODE=true pnpm tauri dev

仅用于浏览器的开发(仅限 Vite,不包括 Tauri):

pnpm dev:addons

你也可以在你的 .env 文件中设置 VITE_ENABLE_ADDON_DEV_MODE=true 来保持该设置。

  1. 为生产环境构建:

为生产环境构建应用程序:

pnpm tauri build

网页模式(浏览器 REST API 服务器)

使用本地 Axum 服务器通过一个命令运行网页 UI。

快速开始

  1. 设置环境(可选但推荐):

    复制示例环境文件并根据你的设置进行自定义:

    cp .env.web.example .env.web

    编辑 .env.web 来根据需要配置数据库路径、端口和其他设置。

  2. 启动后端和 Vite 开发服务器:

    pnpm run dev:web

    Vite 开发服务器运行在 http://localhost:1420,并将 API 调用代理到 Axum 后端服务器。

配置

所有配置均通过 .env.web 中的环境变量完成。

*服务器配置(WF_ 变量)**:

  • WF_LISTEN_ADDR - 服务器绑定地址(默认:0.0.0.0:8088)
  • WF_DATA_DIR - 可选目录,用于存放配置文件注册表、配置数据库和默认加密保险库。对于 pnpm dev:web,在 .env.web 或 shell 中设置;桌面版 .env 值会被屏蔽。相对路径使用工作目录;~ 不会被展开。
  • WF_DB_PATH - 支持的旧版数据库文件路径(默认:./db/app.db)。当未设置 WF_DATA_DIR 时,其父目录决定安装位置。仅设置 WF_DATA_DIR 时,旧版候选路径为 <WF_DATA_DIR>/app.db。如果两者都设置,则其目录必须一致。现有注册表保持其保存的数据库路径;两种设置都不会移动数据。有关 Docker 和升级行为,请参见安装目录配置。
  • WF_CORS_ALLOW_ORIGINS - 允许的 CORS 来源,用逗号分隔(默认:*)。当启用认证时为必填 — 通配符 * 将被拒绝。
    • 示例:https://wealthfolio.example.com
  • WF_REQUEST_TIMEOUT_MS - 请求超时(毫秒)(默认:300000)
  • WF_STATIC_DIR - 用于提供静态前端资源的目录(默认:dist)
  • WF_SECRET_KEY - 用于加密机密和 JWT 签名的 32 字节密钥(除非设置了 WF_SECRET_KEY_FILE,否则必填)
    • 生成方式:openssl rand -base64 32
  • WF_SECRET_KEY_FILE - 可选主密钥文件;请参见设置和挂载说明
  • WF_AUTH_PASSWORD_HASH - Argon2id PHC 字符串,用于 Web 模式的密码认证
  • WF_AUTH_TOKEN_TTL_MINUTES - 可选 JWT 访问令牌的过期时间(分钟)(默认 60)
  • WF_AUTH_REQUIRED - 设置为 false 以允许在非回环地址上启动服务而无需认证(例如,当反向代理处理认证时)
  • OIDC / SSO(可选)- 通过任意 OpenID Connect 提供者(Authentik、PocketID、Authelia、Keycloak 等)登录。可以与 WF_AUTH_PASSWORD_HASH 一起使用或替代;成功的 SSO 登录会生成相同的会话 cookie。当同时设置 WF_OIDC_ISSUER_URL 和 WF_OIDC_CLIENT_ID 时启用。
    • WF_OIDC_ISSUER_URL - 提供者基础 URL(发现请求命中
      <issuer>/.well-known/openid-configuration)
    • WF_OIDC_CLIENT_ID - 通过 IdP 注册的客户 ID
    • WF_OIDC_CLIENT_SECRET - 可选客户端秘密(PKCE始终使用)
    • WF_OIDC_REDIRECT_URL- 启用OIDC时需填写;必须在IdP中注册,例如:https://your.host/api/v1/auth/oidc/callback
    • WF_OIDC_SCOPES- 可选空间分离示波器(默认)
      openid email profile)
    • WF_OIDC_ALLOWED_EMAILS / WF_OIDC_ALLOWED_SUBS——逗号分隔的允许列表,匹配ID令牌的email/sub申索。如果这两个选项都没有设置,服务器拒绝启动除非WF_OIDC_ALLOW_ANY=true
      同时也设定了——缺失的允许列表绝不能无声地授予每个 IdP 用户访问权限。 email只有当 IdP 断言
      email_verified=true;WF_OIDC_ALLOWED_SUBS 是更强的控制(稳定且针对发行人范围),推荐用于共享/多租户的 IDP。
    • WF_OIDC_ALLOW_ANY - 可选,默认false。设置为true以允许
      任何用户在未配置允许列表时由IdP认证。仅在专用单用户IdP上安全;在共享/多租户IdP中,这会允许所有人访问。启用时启动时会记录警告。
    • WF_OIDC_POST_LOGOUT_REDIRECT_URL- 可选。当 IdP 宣布end_session_endpoint时,登出也会终止 IdP 会话(RP 发起)
      登出);否则登出仅限本地。设置此后返回应用——必须在 IdP 中注册(例如 Keycloak 的“Valid post logout redirect URI”)。如果未设置,IdP 会显示自己的登出页面。
    • WF_OIDC_RP_LOGOUT - 可选,默认true。设置为false,即使 IdP 支持 RP 发起登出,也强制本地仅注销。
  • WF_COOKIE_SECURE - 控制会话 Cookie 的 Secure 属性(默认:auto )
    • auto - 仅在X-Forwarded-Proto: https存在时设置Secure(大多数反向代理设置推荐)
    • true - 始终设置Secure(当TLS有保证但头部缺失时使用)
    • false - 永远不设置Secure(纯 HTTP 但没有反向代理)
  • WF_SECRET_FILE- 可选秘密存储文件路径(默认:<data-root>/secrets.json)
  • WF_ADDONS_DIR - 可选附加组件目录路径(默认:源自数据库路径)

Vite 配置:

  • VITE_API_TARGET - Vite 代理的后端 API URL(默认值:http://127.0.0.1:8088)

认证(Web 模式)

  • 将 WF_AUTH_PASSWORD_HASH 设置为 Argon2id PHC 字符串,以在访问 Web 应用前要求输入密码。

    你可以使用在线工具如 argon2.online 或 CLI(argon2-utils 包)生成该哈希:

    printf 'your-password' | argon2 yoursalt16chars! -id -e

    提示:

    • 第一个参数是盐(使用16个字符);密码是
      从标准输入读取。
    • 使用 printf 而不是 echo -n 来避免隐藏的换行问题。
    • 对于 Docker Compose .env / --env-file,将哈希用单引号或双引号括起
      每个 $ ($$argon2id$$...)。

    将完整输出(以 $argon2id$... 开头)复制到 .env.web 中。

    美元符号 ($) 转义速查表 — Argon2 哈希包含 $ 字符,shell 和 Compose 会将其解释为变量引用:

上下文 语法 备注
.env.web / 应用加载的 dotenv WF_AUTH_PASSWORD_HASH=$argon2id$... 由应用加载;不进行 Compose 插值
Docker Compose .env/--env-file WF_AUTH_PASSWORD_HASH='$argon2id$...' 单引号防止 Compose 插值
Docker Compose .env/--env-file WF_AUTH_PASSWORD_HASH=$$argon2id$$... 替代方法:将每个 $ 双写
Docker Compose YAML 内联 HASH: '$$argon2id$$v=19$$...' 将每个 $ 双写以转义 Compose 插值
docker run(单引号) -e HASH='$argon2id$...' 单引号防止 shell 扩展
docker run(双引号) -e HASH="\$argon2id\$..." 用反斜杠转义每个 $
  • 会话基于 cookie(HttpOnly,SameSite=Lax,Path=/api)。登录端点会自动设置会话 cookie — 客户端 JavaScript 不会暴露任何令牌。会话默认持续 60 分钟(参见 WF_AUTH_TOKEN_TTL_MINUTES)。

  • 反向代理(HTTPS): 如果您的反向代理终止 TLS,请确保它转发 X-Forwarded-Proto: https,以便服务器正确设置 Secure cookie 属性。或者,设置 WF_COOKIE_SECURE=true 来始终设置 Secure。参见上文 WF_COOKIE_SECURE。

备注

  • 服务器启动时会记录实际数据库路径
  • .env.web 中的环境变量会由 dev:web 脚本自动加载
  • 使用 Ctrl C 停止以优雅关闭两个进程

仅限服务器

仅运行 HTTP 服务器而不启动 Vite 开发服务器(从仓库根目录):

cargo run --manifest-path apps/server/Cargo.toml

服务器接受与上面Web 模式配置部分中记录的相同的 WF_* 环境变量。你可以在行内设置它们,或者通过 .env.web 设置:

WF_LISTEN_ADDR=127.0.0.1:8088 WF_DB_PATH=./db/app.db cargo run --manifest-path apps/server/Cargo.toml

请参阅 Web 模式配置 获取支持的环境变量的完整列表。

Docker

您可以拉取官方 Docker 镜像或在本地自行构建。

使用预构建的镜像

最新的服务器构建已发布到 Docker Hub。

docker pull wealthfolio/wealthfolio:latest

拉取后,在下面的运行命令中使用 wealthfolio/wealthfolio:latest。如果你在本地构建镜像,请将镜像名称换回 wealthfolio。

旧版镜像: 同样的构建也被镜像到 afadil/wealthfolio,所以现有的 compose.yml 文件仍然可以使用。新的部署应优先使用
wealthfolio/wealthfolio。

构建镜像

直接从源代码构建 Docker 镜像(无需预构建):

docker build -t wealthfolio .

构建过程:

  1. 从源代码构建前端资源(pnpm install pnpm vite build)
  2. 从源代码编译 Rust 后端(cargo build --release)
  3. 创建仅包含运行时工件的最小 Alpine 镜像

最终镜像包括:

  • 编译后的前端资源位于 /app/dist
  • wealthfolio-server 二进制文件位于 /usr/local/bin/wealthfolio-server
  • Alpine Linux 基础镜像(体积小)

配置

你可以通过以下方式配置容器:

  1. 环境变量(使用 -e 标志行内设置)
  2. 环境文件(使用 --env-file 标志)

选项 1:创建 Docker Compose 环境文件(推荐用于生产环境)

SECRET=$(openssl rand -base64 32)
HASH=$(printf 'your-password' | argon2 yoursalt16chars! -id -e)

cat > .env.docker << EOF
WF_LISTEN_ADDR=0.0.0.0:8088
WF_DB_PATH=/data/wealthfolio.db
WF_SECRET_KEY='${SECRET}'
WF_AUTH_PASSWORD_HASH='${HASH}'
WF_CORS_ALLOW_ORIGINS=http://localhost:8088
WF_REQUEST_TIMEOUT_MS=30000
WF_STATIC_DIR=dist
EOF

将 WF_CORS_ALLOW_ORIGINS 设置为您将在浏览器中使用的确切 URL,例如 http://192.168.1.10:8088 或 https://wealthfolio.example.com。

选项 2:使用内联环境变量(测试更简单):

请参见下面的内联配置示例。

运行容器

以下所有示例均使用已发布的镜像(wealthfolio/wealthfolio:latest)。如果您是在本地构建的,请替换为本地标签(例如,wealthfolio)。

Docker Compose(推荐):

docker compose --env-file .env.docker up -d

默认情况下,这会将应用发布在 http://localhost:8088。设置 WF_PORT 以更改主机端口:

WF_PORT=8090 docker compose --env-file .env.docker up -d

Docker Compose 在反向代理后:

docker compose --env-file .env.docker -f compose.yml -f compose.proxy.yml up -d

当代理运行在相同的 Docker 网络上并将流量转发到 http://wealthfolio:8088 时使用此方法。

将 WF_CORS_ALLOW_ORIGINS 设置为公共 HTTP(S) 源,包括任何自定义端口。即使代理重写了 Host,配置文件启动也接受该显式源;通配符 * 不授权此回退。详见 反向代理和配置文件启动。

使用 Docker CLI 环境文件:

Docker CLI 的 --env-file 会保持 $ 字符原样,因此使用未经 Compose 转义的原始值:

SECRET=$(openssl rand -base64 32)
HASH=$(printf 'your-password' | argon2 yoursalt16chars! -id -e)

cat > .env.docker-run << EOF
WF_LISTEN_ADDR=0.0.0.0:8088
WF_DB_PATH=/data/wealthfolio.db
WF_SECRET_KEY=${SECRET}
WF_AUTH_PASSWORD_HASH=${HASH}
WF_CORS_ALLOW_ORIGINS=http://localhost:8088
WF_REQUEST_TIMEOUT_MS=30000
WF_STATIC_DIR=dist
EOF
docker run --rm -d \
  --name wealthfolio \
  --env-file .env.docker-run \
  -p 8088:8088 \
  -v wealthfolio-data:/data \
  wealthfolio/wealthfolio:latest

基本用法(内联环境变量,仅用于测试):

docker run --rm -d \
  --name wealthfolio \
  -e WF_LISTEN_ADDR=0.0.0.0:8088 \
  -e WF_DB_PATH=/data/wealthfolio.db \
  -e WF_SECRET_KEY="$(openssl rand -base64 32)" \
  -e WF_AUTH_REQUIRED=false \
  -p 8088:8088 \
  -v wealthfolio-data:/data \
  wealthfolio/wealthfolio:latest

开发模式(用于本地 Vite 开发服务器的 CORS,无内置认证)

docker run --rm -it \
  --name wealthfolio \
  -e WF_LISTEN_ADDR=0.0.0.0:8088 \
  -e WF_DB_PATH=/data/wealthfolio.db \
  -e WF_CORS_ALLOW_ORIGINS=http://localhost:1420 \
  -e WF_SECRET_KEY="$(openssl rand -base64 32)" \
  -e WF_AUTH_REQUIRED=false \
  -p 8088:8088 \
  -v wealthfolio-data:/data \
  wealthfolio/wealthfolio:latest

带加密的生产(推荐):

docker run --rm -d \
  --name wealthfolio \
  -e WF_LISTEN_ADDR=0.0.0.0:8088 \
  -e WF_DB_PATH=/data/wealthfolio.db \
  -e WF_SECRET_KEY="$(openssl rand -base64 32)" \
  -e WF_AUTH_PASSWORD_HASH="$(printf 'your-password' | argon2 yoursalt16chars! -id -e)" \
  -e WF_CORS_ALLOW_ORIGINS=https://wealthfolio.example.com \
  -p 8088:8088 \
  -v wealthfolio-data:/data \
  wealthfolio/wealthfolio:latest

环境变量

该容器支持 Web 模式配置 部分中记录的所有 WF_* 环境变量。主要变量有:

  • WF_LISTEN_ADDR - 绑定地址(Docker 必须使用 0.0.0.0:PORT,不能使用 127.0.0.1)
  • WF_DB_PATH - 数据库路径(通常为 /data/wealthfolio.db)
  • WF_CORS_ALLOW_ORIGINS - CORS 来源(设置用于开发/前端访问)
  • WF_SECRET_KEY - 用于加密秘密和 JWT 签名的 32 字节密钥(除非设置了 WF_SECRET_KEY_FILE,否则为必需)
  • WF_SECRET_KEY_FILE - 可选的主密钥文件;请参阅安装和挂载说明

卷册

现有的保险库文件保留其所有权、权限、ACL、符号链接和文件挂载。更新写入现有文件;创建新保险库时只需可写的父目录。文件创建使用现有操作系统权限和 umask 行为。每个保险库使用一个服务器进程,如前所述。备份加密文件时,将匹配的主密钥单独保护。损坏或错误密钥的保险库在访问秘密且未被静默重置时报告错误;其他服务器功能仍可启动。现有文件更新保留其之前的原地写入行为,且不会崩溃。

  • /data - 数据库和机密的持久存储
    • 数据库:/data/wealthfolio.db
    • 机密:/data/secrets.json(使用 WF_SECRET_KEY 加密)

移植版本

  • 8088 - HTTP 服务器(同时提供 API 和静态前端)

启动容器后,通过 http://localhost:8088 访问应用程序。

重要: 服务器在容器内部必须绑定到 0.0.0.0(所有接口),才能从主机访问。绑定到 127.0.0.1 将使应用仅能从容器内部访问。

与 DevContainer 的开发

为了在所有平台上实现一致的开发环境,可以使用提供的 DevContainer 配置。这种方法需要更少的手动设置步骤,并且提供了一个具有所有必要依赖的隔离环境。

前提条件

功能

  • 预配置的 Tauri 开发环境
  • 带 VNC 访问的 X11 虚拟显示(端口 5900)
  • 完整的 Rust 开发设置
  • GPU 支持(通过 Docker 的 --gpus=all 标志)
  • 持久化数据和构建缓存
  • 预安装的必要 VS Code 扩展

使用 DevContainer 开始开发

  1. 克隆代码库(如果你还没有这样做):

    git clone https://github.com/wealthfolio/wealthfolio.git
    cd wealthfolio
  2. 在 VS Code 中打开:

    • 打开 VS Code
    • 转到 文件 > 打开文件夹
    • 选择 wealthfolio 目录
  3. 启动开发容器:

    • 按 F1 或 Ctrl+Shift+P
    • 输入 "Remote-Containers: Reopen in Container"
    • 按回车
  4. 等待容器构建:

    • VS Code 将构建并配置开发容器
    • 首次运行可能需要几分钟
  5. 开始开发:

    • 容器准备好后,你可以开始开发
    • 所有必要的工具和依赖将可用

插件开发

Wealthfolio 支持一个强大的插件生态系统,允许开发者通过自定义功能扩展功能。

插件快速入门

  1. 创建一个新的插件:

    npx @wealthfolio/addon-dev-tools create my-addon
    cd my-addon
    npm install
  2. 启动开发服务器:

    npm run dev:server
  3. 在插件开发模式下启动 Wealthfolio(在另一个终端中):

    VITE_ENABLE_ADDON_DEV_MODE=true pnpm tauri dev

您的插件将被自动发现并加载,并支持热重载!

插件功能

  • 🎨 界面集成:添加自定义页面和导航项
  • 📊 数据访问:全面访问投资组合、账户和市场数据
  • 📡 实时事件:响应投资组合更新和用户操作
  • 🔐 安全存储:安全存储 API 密钥和敏感数据
  • ⚡ 热重载:流畅的开发体验
  • 🔒 权限系统:用户同意下的透明安全
  • 📦 私有资产:沙盒安全的打包图像、字体、媒体和 Wasm

官方插件

查看 官方插件仓库 获取维护的插件示例,包括:

  • 目标进度追踪器:类似日历界面的可视化目标追踪
  • 投资费用追踪器:追踪和分析投资费用
  • Swingfolio:跟踪波段交易表现和未平仓头寸

资源

使用的技术

前端

  • React:用于构建用户界面的 JavaScript 库。
  • React Router:React 的声明式路由。
  • Tailwind CSS:以实用为先的 CSS 框架,用于样式设计。
  • Base UI/shadcn:可访问的 UI 组件。
  • Recharts:基于 React 的图表库。
  • React Query:React 的数据获取库。
  • Zod:以 TypeScript 为优先的模式声明和验证库。

后端

  • Tauri:用于构建小型、安全、快速桌面应用的框架。
  • Rust:用于核心后端功能的系统编程语言。
  • SQLite:用于本地数据存储的嵌入式数据库。
  • Diesel:安全、可扩展的 Rust ORM 和查询构建器。

插件系统

  • @wealthfolio/addon-sdk:用于插件开发的 TypeScript SDK,提供完整类型安全。
  • @wealthfolio/addon-dev-tools:用于热重载的 CLI 工具和开发服务器。
  • @wealthfolio/ui:共享 UI 组件库,确保样式一致性。

开发工具

  • Vite:下一代前端工具。
  • TypeScript:JavaScript 的类型化超集。
  • ESLint:用于 JavaScript 和 JSX 的可插拔代码检查工具。
  • Prettier:代码格式化工具。
  • pnpm:快速且节省磁盘空间的包管理器。
  • Turborepo:用于 JavaScript 和 TypeScript 代码库的高性能构建系统。

文件夹结构

wealthfolio/
├── apps/                        # Application packages
│   ├── frontend/                # React frontend application
│   │   ├── src/                 # Source code
│   │   │   ├── adapters/        # Environment adapters (Tauri/Web)
│   │   │   ├── addons/          # Addon system runtime
│   │   │   ├── components/      # React components
│   │   │   ├── features/        # Feature modules (self-contained)
│   │   │   ├── pages/           # Application pages and routes
│   │   │   ├── hooks/           # Custom React hooks
│   │   │   └── lib/             # Utility libraries and helpers
│   │   ├── public/              # Static assets
│   │   ├── index.html           # HTML entry point
│   │   └── vite.config.ts       # Vite build config
│   ├── tauri/                   # Tauri desktop/mobile app (Rust IPC commands)
│   └── server/                  # Axum HTTP server for web mode
├── crates/                      # Rust crates (shared backend logic)
│   ├── core/                    # Core business logic, services, models
│   ├── storage-sqlite/          # SQLite storage layer (Diesel ORM)
│   ├── market-data/             # Market data providers
│   ├── connect/                 # External service integrations
│   └── device-sync/             # Device sync functionality
├── packages/                    # Shared TypeScript packages
│   ├── addon-sdk/               # Addon SDK for developers
│   ├── addon-dev-tools/         # CLI and dev server for addons
│   └── ui/                      # Shared UI components (@wealthfolio/ui)
├── docs/                        # Documentation
│   ├── addons/                  # Addon development docs
│   ├── activities/              # Activity types docs
│   └── architecture/            # Architecture docs
├── e2e/                         # End-to-end tests
├── scripts/                     # Build and dev scripts
├── Cargo.toml                   # Rust workspace config
├── package.json                 # Node.js dependencies
├── pnpm-workspace.yaml          # pnpm workspace config
└── tsconfig.json                # TypeScript config

官方和社区插件源存放在单独的 wealthfolio-addons 仓库中。

安全与数据存储

本地数据存储

所有财务数据都使用 SQLite 数据库存储在本地,无需云依赖:

  • 投资组合持仓和表现数据
  • 交易活动和交易历史
  • 账户信息和设置
  • 目标和贡献限制

API 密钥与秘密

API 凭证通过操作系统钥匙环使用 keyring 库安全存储:

  • 核心应用:对外部服务使用 set_secret 和 get_secret 命令
  • 插件:对插件特定的敏感数据使用 Secrets API (ctx.api.secrets)
  • 无磁盘存储:密钥从不写入磁盘或配置文件

权限系统

插件在全面的权限系统下运行:

  • 安装时自动代码分析
  • 数据访问需用户同意
  • 基于风险的安全警告
  • 透明的权限声明

贡献

欢迎贡献!请按照以下步骤操作:

  1. 分叉仓库。
  2. 创建一个新分支(git checkout -b feature-branch)。
  3. 进行你的更改。
  4. 提交你的更改(git commit -m 'Add some feature')。
  5. 推送到该分支(git push origin feature-branch)。
  6. 打开一个拉取请求。

许可证

本项目根据 AGPL-3.0 许可证授权。详情请参阅 LICENSE 文件。

assets/brand/ 中的品牌资产为商标;详情请参阅 TRADEMARKS.md。


Wealthfolio 和 Wealthfolio 标志是 Teymz Inc. 的商标。该代码根据 AGPL-3.0 许可;商标不在该许可下授予。

🌟 星标历史

尽情享受使用 Wealthfolio 管理您的财富吧!🚀

本站来源与版权声明
  • 本文标题:wealthfolio - 一个美观
  • 本文链接:https://www.cn121.com/desktop/wealthfolio-wealthfolio.html
  • 原项目:wealthfolio/wealthfolio 版权归原作者 wealthfolio 及贡献者所有
  • 收录信息:本站于 2026-10-23 收录本项目,本页所列协议与仓库指标均为收录当时的状态;该日期之后原项目的版本更新与协议变更,本页不作同步。
  • 开源协议:收录时本项目采用 AGPL-3.0(查看 LICENSE 原文),本站转载其原始文档(未改动文字,仅剔除图片与无关章节);使用、修改、分发请以该仓库 LICENSE 原文为准。基于本页内容形成的衍生作品, 须同样以该协议发布。
  • 站点出处:本文首发于 OneTwoOne,收录自 GitHub 开源项目 wealthfolio/wealthfolio。
  • 内容说明:本页正文为原项目 README 原文(英文),本站后续会翻译为中文(当前尚未译出,仅将二级标题译为中文,便于按栏目定位;标题原文可在下方原仓库中查看),仅剔除了图片与赞助等无关章节、并把相对链接改为绝对地址;页首简介为机器翻译自仓库描述。
  • 引用声明:商业转载、第三方聚合或 AI 检索训练引用时,请务必保留以上来源出处、本文永久链接,以及原项目的版权声明与许可信息。
  • 下架通道:若原项目此后变更或收紧了许可协议、或作者/权利人认为本站的收录方式(译文、排版适配、简介翻译等)超出其授权范围,请通过 xyd3302001@163.com 发送下架通知,并附上项目地址与本页链接。本站核实后将第一时间删除本页内容,或改为不复制原文的目录性收录;署名更正等其他要求可一并提出。