英文原文正文为项目原始 README(英文),本站后续会翻译为中文,当前仅剔除图片与无关章节并统一排版。
简介
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。
📖 文档
核心应用
建筑
插件开发
- 插件文档中心 - 插件开发的主要入口
- 入门指南 - 插件开发入门指南
- API参考 - 完整的API文档及示例
- 架构 - 设计模式与架构指南
- v3.6 到 v3.7 迁移 - 打包资源和兼容性说明
快速链接
快速开始
先决条件
确保您的计算机上已安装以下内容:
从源代码构建
-
克隆仓库:
git clone https://github.com/wealthfolio/wealthfolio.git cd wealthfolio -
使用 pnpm 安装依赖:
pnpm install -
设置环境配置:
复制环境模板并为您的设置进行配置:
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文件。 -
以开发模式运行:
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 来保持该设置。
- 为生产环境构建:
为生产环境构建应用程序:
pnpm tauri build
网页模式(浏览器 REST API 服务器)
使用本地 Axum 服务器通过一个命令运行网页 UI。
快速开始
-
设置环境(可选但推荐):
复制示例环境文件并根据你的设置进行自定义:
cp .env.web.example .env.web编辑
.env.web来根据需要配置数据库路径、端口和其他设置。 -
启动后端和 Vite 开发服务器:
pnpm run dev:webVite 开发服务器运行在
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 注册的客户 IDWF_OIDC_CLIENT_SECRET- 可选客户端秘密(PKCE始终使用)WF_OIDC_REDIRECT_URL- 启用OIDC时需填写;必须在IdP中注册,例如:https://your.host/api/v1/auth/oidc/callbackWF_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 会将其解释为变量引用: - 第一个参数是盐(使用16个字符);密码是
| 上下文 | 语法 | 备注 |
|---|---|---|
.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,以便服务器正确设置Securecookie 属性。或者,设置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 .
构建过程:
- 从源代码构建前端资源(
pnpm installpnpm vite build) - 从源代码编译 Rust 后端(
cargo build --release) - 创建仅包含运行时工件的最小 Alpine 镜像
最终镜像包括:
- 编译后的前端资源位于
/app/dist wealthfolio-server二进制文件位于/usr/local/bin/wealthfolio-server- Alpine Linux 基础镜像(体积小)
配置
你可以通过以下方式配置容器:
- 环境变量(使用
-e标志行内设置) - 环境文件(使用
--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 配置。这种方法需要更少的手动设置步骤,并且提供了一个具有所有必要依赖的隔离环境。
前提条件
- Docker
- Visual Studio Code
- Remote - Containers VS Code 扩展
功能
- 预配置的 Tauri 开发环境
- 带 VNC 访问的 X11 虚拟显示(端口 5900)
- 完整的 Rust 开发设置
- GPU 支持(通过 Docker 的 --gpus=all 标志)
- 持久化数据和构建缓存
- 预安装的必要 VS Code 扩展
使用 DevContainer 开始开发
-
克隆代码库(如果你还没有这样做):
git clone https://github.com/wealthfolio/wealthfolio.git cd wealthfolio -
在 VS Code 中打开:
- 打开 VS Code
- 转到 文件 > 打开文件夹
- 选择 wealthfolio 目录
-
启动开发容器:
- 按
F1或Ctrl+Shift+P - 输入 "Remote-Containers: Reopen in Container"
- 按回车
- 按
-
等待容器构建:
- VS Code 将构建并配置开发容器
- 首次运行可能需要几分钟
-
开始开发:
- 容器准备好后,你可以开始开发
- 所有必要的工具和依赖将可用
插件开发
Wealthfolio 支持一个强大的插件生态系统,允许开发者通过自定义功能扩展功能。
插件快速入门
-
创建一个新的插件:
npx @wealthfolio/addon-dev-tools create my-addon cd my-addon npm install -
启动开发服务器:
npm run dev:server -
在插件开发模式下启动 Wealthfolio(在另一个终端中):
VITE_ENABLE_ADDON_DEV_MODE=true pnpm tauri dev
您的插件将被自动发现并加载,并支持热重载!
插件功能
- 🎨 界面集成:添加自定义页面和导航项
- 📊 数据访问:全面访问投资组合、账户和市场数据
- 📡 实时事件:响应投资组合更新和用户操作
- 🔐 安全存储:安全存储 API 密钥和敏感数据
- ⚡ 热重载:流畅的开发体验
- 🔒 权限系统:用户同意下的透明安全
- 📦 私有资产:沙盒安全的打包图像、字体、媒体和 Wasm
官方插件
查看 官方插件仓库 获取维护的插件示例,包括:
- 目标进度追踪器:类似日历界面的可视化目标追踪
- 投资费用追踪器:追踪和分析投资费用
- Swingfolio:跟踪波段交易表现和未平仓头寸
资源
- 入门指南 - 开始构建插件所需的一切
- API 参考 - 完整的 API 文档
- 架构指南 - 设计模式和最佳实践
- v3.6 到 v3.7 迁移指南 - 资产打包和兼容性
使用的技术
前端
- 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) - 无磁盘存储:密钥从不写入磁盘或配置文件
权限系统
插件在全面的权限系统下运行:
- 安装时自动代码分析
- 数据访问需用户同意
- 基于风险的安全警告
- 透明的权限声明
贡献
欢迎贡献!请按照以下步骤操作:
- 分叉仓库。
- 创建一个新分支(
git checkout -b feature-branch)。 - 进行你的更改。
- 提交你的更改(
git commit -m 'Add some feature')。 - 推送到该分支(
git push origin feature-branch)。 - 打开一个拉取请求。
许可证
本项目根据 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 发送下架通知,并附上项目地址与本页链接。本站核实后将第一时间删除本页内容,或改为不复制原文的目录性收录;署名更正等其他要求可一并提出。