wealthfolio/wealthfolio
GitHub: wealthfolio/wealthfolio
一款开源、本地优先的隐私个人理财追踪器,支持投资组合、净资产、支出管理和财务模拟。
Stars: 8252 | Forks: 581
## 简介
**Wealthfolio** 是一款开源、私密的投资组合追踪器 — 涵盖投资、净资产、支出和模拟。您的所有数据都本地存储在设备上:没有云数据库,无需注册账号,永久免费。
如需自动同步券商账户(支持 30 多家机构,只读)以及加密的多设备同步功能,可以使用
**[Wealthfolio Connect](https://wealthfolio.app/connect?utm_source=github&utm_medium=readme)**
— 这是一项可选订阅服务,旨在覆盖券商数据连接的实际成本。本应用绝不强制要求订阅:手动追踪和 CSV 导入永久免费。
请访问我们的网站
[wealthfolio.app](https://wealthfolio.app/?utm_source=github&utm_medium=readme)。

### ✨ 核心功能
- **📊 投资组合追踪** - 跨多个账户和资产类型追踪您的投资
- **📈 绩效分析** - 真实的时间加权和资金加权收益率、基准对比以及历史分析
- **💰 活动管理** - 导入并管理您所有的交易活动
- **🎯 目标规划** - 通过资产配置管理来设定和追踪财务目标
- **🔒 本地数据** - 所有数据均存储在本地,不依赖云服务
- **🔄 可选的券商同步** - 通过
[Wealthfolio Connect](https://wealthfolio.app/connect?utm_source=github&utm_medium=readme)
自动同步 30 多家券商(只读,完全可选)
- **🧩 可扩展性** - 强大的插件系统,支持自定义功能
- **🌍 多货币** - 支持多种货币及汇率管理
- **📱 跨平台** - 桌面端、iOS 以及自托管的 Docker/Web 版
### 🧩 插件系统
Wealthfolio 具有一个强大的插件系统,允许开发者扩展应用功能:
- **🔌 易于开发** - 提供具备完整类型安全性和热重载功能的 TypeScript SDK
- **🔒 安全可靠** - 全面的权限系统,需经用户明确同意
- **⚡ 高性能** - 经过性能优化,开销极小
- **🎨 UI 集成** - 可添加自定义页面、导航项和组件
- **📡 实时事件** - 监听投资组合更新、市场同步和用户操作
- **🗄️ 完整数据访问** - 访问账户、持仓、交易活动和市场数据
- **🔐 密钥管理** - 为 API key 和敏感数据提供安全的存储
**开始构建插件:** 请参阅
[插件文档中心](docs/addons/index.md)
所有活动类型的文档(包括必填的表单字段)可在
[docs/activities/activity-types.md](docs/activities/activity-types.md) 中查看。
## 路线图
请参阅 [ROADMAP.md](./ROADMAP.md)。
## 📖 文档
### 核心应用
- **[活动类型](docs/activities/activity-types.md)** - 所有受支持的活动类型及其必填字段的完整指南
- **[路线图](ROADMAP.md)** - 未来计划和开发路线图
### 架构
- **[适配器系统](docs/architecture/adapters.md)** - 针对桌面/Web 构建版本的编译时环境检测
### 插件开发
- **[插件文档中心](docs/addons/index.md)** - 插件开发的主入口
- **[快速上手](docs/addons/addon-getting-started.md)** - 插件开发入门指南
- **[API 参考](docs/addons/addon-api-reference.md)** - 包含示例的完整 API 文档
- **[架构设计](docs/addons/addon-architecture.md)** - 设计模式和架构指南
### 快速链接
- 💡 **官方插件** - 在
[官方插件仓库](https://github.com/wealthfolio/wealthfolio-addons/tree/main/official)中浏览维护的插件示例
- 🧩 **社区插件** - 在
[社区插件目录](https://github.com/wealthfolio/wealthfolio-addons/tree/main/community)中浏览由社区分享的插件
- 🛠️ **[开发工具](packages/addon-dev-tools/)** - 用于插件开发的 CLI 工具
## 快速开始
### 前置条件
请确保您的计算机上已安装以下内容:
- [Node.js](https://nodejs.org/)
- [pnpm](https://pnpm.io/)
- [Rust](https://www.rust-lang.org/)
- [Tauri](https://tauri.app/)
### 从源码构建
1. **克隆代码仓库**:
git clone https://github.com/wealthfolio/wealthfolio.git
cd wealthfolio
2. **使用 pnpm 安装依赖**:
pnpm install
3. **配置环境变量**:
复制环境模板并根据您的配置进行修改:
cp .env.example .env
根据需要更新 `.env` 文件中的数据库路径及其他配置:
# 数据库位置
DATABASE_URL=../db/wealthfolio.db
4. **在开发模式下运行**:
使用 Tauri 构建并运行桌面应用程序:
```
pnpm tauri dev
```
#### 插件开发模式
插件热重载服务器现在仅会在您明确选择开启时才会启动。
**使用 Tauri 进行桌面端开发:**
```
VITE_ENABLE_ADDON_DEV_MODE=true pnpm tauri dev
```
**仅用于浏览器开发(仅限 Vite,无 Tauri):**
```
pnpm dev:addons
```
您也可以在 `.env` 文件中设置 `VITE_ENABLE_ADDON_DEV_MODE=true` 以保留该设置。
5. **为生产环境构建**:
构建用于生产环境的应用程序:
```
pnpm tauri build
```
### Web 模式(浏览器 + REST API 服务器)
只需一条命令即可通过本地 Axum 服务器运行 Web 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_DB_PATH` - SQLite 数据库路径或目录(默认:`./db/app.db`)
- 如果提供的是目录,则会在其中使用 `app.db`
- `WF_CORS_ALLOW_ORIGINS` - 允许的 CORS 来源的逗号分隔列表
(默认:`*`)。**启用身份验证时必填** — 通配符 `*` 会被拒绝。
- 示例:`https://wealthfolio.example.com`
- `WF_REQUEST_TIMEOUT_MS` - 请求超时时间(以毫秒为单位,默认:`30000`)
- `WF_STATIC_DIR` - 提供前端静态资源的目录(默认:
`dist`)
- `WF_SECRET_KEY` - **必填** 32 字节密钥,用于密钥加密和 JWT 签名
- 可使用以下命令生成:`openssl rand -base64 32`
- `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(发现请求会访问
`
/.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 token 中的 `email` / `sub` 声明进行匹配。如果
两者均未设置,服务器将**拒绝启动**,除非同时设置了 `WF_OIDC_ALLOW_ANY=true` —
缺失允许名单绝不能默认让所有 IdP 用户获得访问权限。只有当 IdP 声明
`email_verified=true` 时,`email` 才会被接受;`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-Initiated
Logout);否则仅为本地登出。设置此项可在登出后返回应用 —
它必须在 IdP 中**注册**(例如 Keycloak 的 "Valid post logout redirect URIs")。如果未设置,IdP 将显示其自己的已登出页面。
- `WF_OIDC_RP_LOGOUT` - **可选**,默认 `true`。设置为 `false` 可强制执行
仅本地登出,即使 IdP 支持 RP-Initiated Logout 也是如此。
- `WF_COOKIE_SECURE` - 控制会话 cookie 上的 `Secure` 属性
(默认:`auto`)
- `auto` - 仅当存在 `X-Forwarded-Proto: https` 时设置 `Secure`
(推荐用于大多数反向代理设置)
- `true` - 始终设置 `Secure`(在保证 TLS 但缺少该 header 时使用)
- `false` - 永不设置 `Secure`(不带反向代理的纯 HTTP)
- `WF_SECRET_FILE` - **可选** 密钥存储文件的路径(默认:
`/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 App 之前输入密码。
您可以使用在线工具(例如
[argon2.online](https://argon2.online))或 CLI(`argon2-utils` 包)生成该哈希值:
printf 'your-password' | argon2 yoursalt16chars! -id -e
将完整的输出(以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`)。登录
endpoint 会自动设置会话 cookie — 客户端 JavaScript 无法获取 token。默认情况下,会话有效期为 60 分钟(参见
`WF_AUTH_TOKEN_TTL_MINUTES`)。
- **反向代理 (HTTPS):** 如果您的反向代理终止了 TLS,请确保它
转发 `X-Forwarded-Proto: https`,以便服务器正确设置 `Secure` cookie
属性。或者,将 `WF_COOKIE_SECURE=true` 设置为始终启用
`Secure`。请参见上文的 `WF_COOKIE_SECURE`。
#### 注意事项
- 服务器在启动时会记录实际生效的数据库路径
- `dev:web` 脚本会自动加载 `.env.web` 中的
环境变量
- 使用 Ctrl+C 停止,以优雅地关闭这两个进程
### 仅服务器
仅运行 HTTP 服务器而不运行 Vite 开发服务器(从代码库根目录):
```
cargo run --manifest-path apps/server/Cargo.toml
```
该服务器接受上文 [Web 模式配置](#configuration) 部分中记录的相同 `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 模式配置](#configuration) 以获取受支持环境变量的完整列表。
## Docker
您可以拉取官方 Docker 镜像,也可以在本地自行构建。
### 使用预构建镜像
最新的服务器构建版本已发布到 Docker Hub。
```
docker pull wealthfolio/wealthfolio:latest
```
拉取后,在下面的运行命令中使用 `wealthfolio/wealthfolio:latest`。
如果您在本地构建了镜像,请将镜像名称替换回 `wealthfolio`。
### 构建镜像
直接从源码构建 Docker 镜像(无需预构建):
```
docker build -t wealthfolio .
```
构建过程:
1. 从源码构建前端资源(`pnpm install` + `pnpm vite build`)
2. 从源码编译 Rust 后端(`cargo build --release`)
3. 创建仅包含运行时产物的最小化 Alpine 镜像
最终镜像包含:
- 位于 `/app/dist` 中的已编译前端资源
- 位于 `/usr/local/bin/wealthfolio-server` 的 `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` 时使用此方法。
**使用 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 模式配置](#configuration) 部分中记录的所有 `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` - 必填的 32 字节密钥,用于加密和 JWT 签名
### 卷
- `/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](https://www.docker.com/)
- [Visual Studio Code](https://code.visualstudio.com/)
- [Remote - Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)
VS Code 扩展
#### 功能特点
- 预配置的 Tauri 开发环境
- 带有 VNC 访问权限(端口 5900)的 X11 虚拟显示器
- 完整的 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. **启动 DevContainer**:
- 按 `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
您的插件将被自动发现并加载,同时支持热重载!
### 插件特性
- **🎨 UI 集成**:添加自定义页面和导航项
- **📊 数据访问**:完全访问投资组合、账户和市场数据
- **📡 实时事件**:对投资组合更新和用户操作做出响应
- **🔐 安全存储**:安全地存储 API key 和敏感数据
- **⚡ 热重载**:无缝的开发体验
- **🔒 权限系统**:通过用户授权实现透明的安全机制
### 官方插件
请查看
[官方插件仓库](https://github.com/wealthfolio/wealthfolio-addons/tree/main/official)
以获取受维护的插件示例,包括:
- **目标进度追踪器**:具有类似日历界面的可视化目标追踪
- **投资费用追踪器**:追踪并分析投资费用
- **Swingfolio**:追踪波段交易表现和未平仓位
### 资源
- **[快速上手指南](docs/addons/addon-getting-started.md)** - 了解开始构建插件所需的一切信息
- **[API 参考](docs/addons/addon-api-reference.md)** - 完整的 API 文档
- **[架构指南](docs/addons/addon-architecture.md)** - 设计模式和最佳实践
## 使用的技术
### 前端
- **React**:用于构建用户界面的 JavaScript 库。
- **React Router**:React 的声明式路由。
- **Tailwind CSS**:实用优先的 CSS 样式框架。
- **Radix 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 linting 工具。
- **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](https://github.com/wealthfolio/wealthfolio-addons)
仓库中。
### 安全与数据存储
#### 本地数据存储
您的所有财务数据均使用 SQLite 数据库进行本地存储,不依赖任何云服务:
- 投资组合持仓和表现数据
- 交易活动和交易历史
- 账户信息和设置
- 目标和缴款限额
#### API 密钥与机密
API 凭证通过 `keyring` crate 安全地存储在操作系统的密钥环中:
- **核心应用**:使用 `set_secret` 和 `get_secret` 命令处理外部服务
- **插件**:使用 Secrets API (`ctx.api.secrets`) 处理特定于插件的敏感数据
- **不写入磁盘**:密钥绝不写入磁盘或配置文件中
#### 权限系统
插件在全面的权限系统下运行:
- 安装期间进行自动代码分析
- 访问数据需要用户同意
- 基于风险的安全警告
- 透明的权限声明
## 贡献
欢迎您的贡献!请遵循以下步骤:
1. Fork 该代码仓库。
2. 创建一个新分支 (`git checkout -b feature-branch`)。
3. 进行修改。
4. 提交您的更改 (`git commit -m 'Add some feature'`)。
5. 推送到该分支 (`git push origin feature-branch`)6. 发起一个 Pull Request。
## 许可证
本项目基于 AGPL-3.0 许可证授权。有关详细信息,请参阅 `LICENSE` 文件。
`assets/brand/` 中的品牌资产均为商标;请参见
[TRADEMARKS.md](TRADEMARKS.md)。
Wealthfolio 和 Wealthfolio 徽标是 Teymz Inc. 的商标。代码基于 AGPL-3.0 授权;商标不在该许可证授权范围内。
## 🌟 Star 历史
## [](https://star-history.com/#wealthfolio/wealthfolio&Date)
享受使用 **Wealthfolio** 管理您的财富吧!🚀 标签:Docker, HTTP 参数枚举, iOS, 个人理财, 可视化界面, 安全防御评估, 投资追踪, 本地优先, 桌面应用, 请求拦截, 通知系统