[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-5571":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":16,"stars7d":16,"stars30d":16,"stars90d":16,"forks30d":16,"starsTrendScore":16,"compositeScore":17,"rankGlobal":10,"rankLanguage":10,"license":18,"archived":19,"fork":19,"defaultBranch":20,"hasWiki":19,"hasPages":19,"topics":21,"createdAt":10,"pushedAt":10,"updatedAt":25,"readmeContent":26,"aiSummary":27,"trendingCount":16,"starSnapshotCount":16,"syncStatus":28,"lastSyncTime":10,"discoverSource":29},5571,"wealthfolio","afadil\u002Fwealthfolio","afadil","A Beautiful Private and Secure Desktop Investment Tracking Application","https:\u002F\u002Fwealthfolio.app",null,"Rust",7380,482,7371,228,0,39.05,"GNU Affero General Public License v3.0",false,"main",[22,23,24],"macos-app","portfolio-tracker","tauri-app","2026-06-12 02:01:12","\u003Cdiv align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fafadil\u002Fwealthfolio\">\n    \u003Cimg src=\"apps\u002Ffrontend\u002Fpublic\u002Flogo.svg\" alt=\"Logo\" width=\"80\" height=\"80\">\n  \u003C\u002Fa>\n\n  \u003Ch3 align=\"center\">Wealthfolio\u003C\u002Fh3>\n\n  \u003Cp align=\"center\">\n    A Beautiful and Boring Desktop Investment Tracker\n    \u003Cbr \u002F>\n    \u003Cbr \u002F>\n    \u003Ca href=\"https:\u002F\u002Fwealthfolio.app\">Website\u003C\u002Fa>\n    ·\n    \u003Ca href=\"https:\u002F\u002Fdiscord.gg\u002FWDMCY6aPWK\">Discord\u003C\u002Fa>\n    ·\n    \u003Ca href=\"https:\u002F\u002Fx.com\u002Fintent\u002Ffollow?screen_name=WealthfolioApp\">Twitter\u003C\u002Fa>\n    ·\n    \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fafadil\u002Fwealthfolio\u002Freleases\">Releases\u003C\u002Fa>\n  \u003C\u002Fp>\n\u003C\u002Fdiv>\n\u003Cdiv align=\"center\">\n\n[\u003Cimg src=\".\u002Fapps\u002Ffrontend\u002Fpublic\u002Fbutton-buy-me-a-coffee.png\" width=\"180\" alt=\"Buy me a coffee button\"\u002F>](https:\u002F\u002Fwww.buymeacoffee.com\u002Fafadil)\n\n\u003C\u002Fdiv>\n\n\u003Cdiv align=\"center\">\n\u003Ca href=\"https:\u002F\u002Fnews.ycombinator.com\u002Fitem?id=41465735\">\n  \u003Cimg\n    alt=\"Featured on Hacker News\"\n    src=\"https:\u002F\u002Fhackerbadge.now.sh\u002Fapi?id=41465735\"\n    style=\"width: 250px; height: 55px;\" width=\"250\" height=\"55\"\n  \u002F>\n\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fwww.producthunt.com\u002Fposts\u002Fwealthfolio?embed=true&amp;utm_source=badge-featured&amp;utm_medium=badge&amp;utm_souce=badge-wealthfolio\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fapi.producthunt.com\u002Fwidgets\u002Fembed-image\u002Fv1\u002Ffeatured.svg?post_id=461640&amp;theme=light\" alt=\"Wealthfolio - A boring, Local first, desktop Investment Tracking app | Product Hunt\" class=\"h-[55px] w-[250px]\" width=\"250\" height=\"55\">\u003C\u002Fa>\n\n  \u003Ca href=\"https:\u002F\u002Ftrendshift.io\u002Frepositories\u002F11701\" target=\"_blank\">\n  \u003Cimg src=\"https:\u002F\u002Ftrendshift.io\u002Fapi\u002Fbadge\u002Frepositories\u002F11701\" alt=\"afadil%2Fwealthfolio | Trendshift\" style=\"width: 250px; height: 55px;\" width=\"250\" height=\"55\"\u002F>\u003C\u002Fa>\n\n\u003C\u002Fdiv>\n\n## Introduction\n\n**Wealthfolio App** is a Beautiful and Boring Investment Tracker, with Local\nData Storage. No Subscriptions, No Cloud.\n\nVisit the app website at [Wealthfolio App](https:\u002F\u002Fwealthfolio.app\u002F).\n\n![Screenshot](apps\u002Ffrontend\u002Fpublic\u002Fscreenshot.webp)\n\n### ✨ Key Features\n\n- **📊 Portfolio Tracking** - Track your investments across multiple accounts\n  and asset types\n- **📈 Performance Analytics** - Detailed performance metrics and historical\n  analysis\n- **💰 Activity Management** - Import and manage all your trading activities\n- **🎯 Goal Planning** - Set and track financial goals with allocation\n  management\n- **🔒 Local Data** - All data stored locally with no cloud dependencies\n- **🧩 Extensible** - Powerful addon system for custom functionality\n- **🌍 Multi-Currency** - Support for multiple currencies with exchange rate\n  management\n- **📱 Cross-Platform** - Available on Windows, macOS, and Linux\n\n### 🧩 Addon System\n\nWealthfolio features a powerful addon system that allows developers to extend\nfunctionality:\n\n- **🔌 Easy Development** - TypeScript SDK with full type safety and hot reload\n- **🔒 Secure** - Comprehensive permission system with user consent\n- **⚡ High Performance** - Optimized for speed with minimal overhead\n- **🎨 UI Integration** - Add custom pages, navigation items, and components\n- **📡 Real-time Events** - Listen to portfolio updates, market sync, and user\n  actions\n- **🗄️ Full Data Access** - Access to accounts, holdings, activities, and market\n  data\n- **🔐 Secrets Management** - Secure storage for API keys and sensitive data\n\n**Get started building addons:** See the\n[Addon Documentation Hub](docs\u002Faddons\u002Findex.md)\n\nDocumentation for all Activity types, including the required form fields, is\navailable in\n[docs\u002Factivities\u002Factivity-types.md](docs\u002Factivities\u002Factivity-types.md).\n\n## Roadmap\n\nSee [ROADMAP.md](.\u002FROADMAP.md).\n\n## 📖 Documentation\n\n### Core Application\n\n- **[Activity Types](docs\u002Factivities\u002Factivity-types.md)** - Complete guide to\n  all supported activity types and their required fields\n- **[Roadmap](ROADMAP.md)** - Future plans and development roadmap\n\n### Architecture\n\n- **[Adapter System](docs\u002Farchitecture\u002Fadapters.md)** - Compile-time environment\n  detection for Desktop\u002FWeb builds\n\n### Addon Development\n\n- **[Addon Documentation Hub](docs\u002Faddons\u002Findex.md)** - Main entry point for\n  addon development\n- **[Getting Started](docs\u002Faddons\u002Faddon-getting-started.md)** - Guide to get\n  started with addon development\n- **[API Reference](docs\u002Faddons\u002Faddon-api-reference.md)** - Complete API\n  documentation with examples\n- **[Architecture](docs\u002Faddons\u002Faddon-architecture.md)** - Design patterns and\n  architecture guide\n\n### Quick Links\n\n- 💡 **[Example Addons](addons\u002F)** - Browse sample addons in the repository\n- 🛠️ **[Development Tools](packages\u002Faddon-dev-tools\u002F)** - CLI tools for addon\n  development\n\n## Getting Started\n\n### Prerequisites\n\nEnsure you have the following installed on your machine:\n\n- [Node.js](https:\u002F\u002Fnodejs.org\u002F)\n- [pnpm](https:\u002F\u002Fpnpm.io\u002F)\n- [Rust](https:\u002F\u002Fwww.rust-lang.org\u002F)\n- [Tauri](https:\u002F\u002Ftauri.app\u002F)\n\n### Building from Source\n\n1. **Clone the repository**:\n\n   ```bash\n   git clone https:\u002F\u002Fgithub.com\u002Fafadil\u002Fwealthfolio.git\n   cd wealthfolio\n   ```\n\n2. **Install dependencies using pnpm**:\n\n   ```bash\n   pnpm install\n   ```\n\n3. **Setup environment configuration**:\n\n   Copy the environment template and configure it for your setup:\n\n   ```bash\n   cp .env.example .env\n   ```\n\n   Update the `.env` file with your database path and other configuration as\n   needed:\n\n   ```bash\n   # Database location\n   DATABASE_URL=..\u002Fdb\u002Fwealthfolio.db\n   ```\n\n4. **Run in Development Mode**:\n\nBuild and run the desktop application using Tauri:\n\n```bash\npnpm tauri dev\n```\n\n#### Addon Development Mode\n\nAddon hot reload servers now start only when you explicitly opt in.\n\n**For desktop development with Tauri:**\n\n```bash\nVITE_ENABLE_ADDON_DEV_MODE=true pnpm tauri dev\n```\n\n**For browser-only development (Vite only, no Tauri):**\n\n```bash\npnpm dev:addons\n```\n\nYou can also set `VITE_ENABLE_ADDON_DEV_MODE=true` in your `.env` file to\npersist the setting.\n\n5. **Build for Production**:\n\nBuild the application for production:\n\n```bash\npnpm tauri build\n```\n\n### Web Mode (Browser + REST API server)\n\nRun the web UI with a local Axum server with one command.\n\n#### Quick Start\n\n1. **Setup environment** (optional but recommended):\n\n   Copy the example environment file and customize it for your setup:\n\n   ```bash\n   cp .env.web.example .env.web\n   ```\n\n   Edit `.env.web` to configure database path, ports, and other settings as\n   needed.\n\n2. **Start both backend and Vite dev server**:\n\n   ```bash\n   pnpm run dev:web\n   ```\n\n   The Vite dev server runs at `http:\u002F\u002Flocalhost:1420` and proxies API calls to\n   the Axum backend server.\n\n#### Configuration\n\nAll configuration is done via environment variables in `.env.web`.\n\n**Server Configuration (WF\\_\\* variables)**:\n\n- `WF_LISTEN_ADDR` - Server bind address (default: `0.0.0.0:8080`)\n- `WF_DB_PATH` - SQLite database path or directory (default: `.\u002Fdb\u002Fapp.db`)\n  - If a directory is provided, `app.db` will be used inside it\n- `WF_CORS_ALLOW_ORIGINS` - Comma-separated list of allowed CORS origins\n  (default: `*`). **Required when auth is enabled** — wildcard `*` is rejected.\n  - Example: `https:\u002F\u002Fwealthfolio.example.com`\n- `WF_REQUEST_TIMEOUT_MS` - Request timeout in milliseconds (default: `30000`)\n- `WF_STATIC_DIR` - Directory for serving static frontend assets (default:\n  `dist`)\n- `WF_SECRET_KEY` - **Required** 32-byte key used for secrets encryption and JWT\n  signing\n  - Generate with: `openssl rand -base64 32`\n- `WF_AUTH_PASSWORD_HASH` - Argon2id PHC string enabling password-only\n  authentication for web mode\n- `WF_AUTH_TOKEN_TTL_MINUTES` - Optional JWT access token expiry in minutes\n  (default `60`)\n- `WF_AUTH_REQUIRED` - Set to `false` to allow starting on non-loopback\n  addresses without authentication (e.g. when a reverse proxy handles auth)\n- `WF_COOKIE_SECURE` - Controls the `Secure` attribute on session cookies\n  (default: `auto`)\n  - `auto` - set `Secure` only when `X-Forwarded-Proto: https` is present\n    (recommended for most reverse-proxy setups)\n  - `true` - always set `Secure` (use when TLS is guaranteed but the header is\n    absent)\n  - `false` - never set `Secure` (plain HTTP without a reverse proxy)\n- `WF_SECRET_FILE` - **Optional** path to secrets storage file (default:\n  `\u003Cdata-root>\u002Fsecrets.json`)\n- `WF_ADDONS_DIR` - **Optional** path to addons directory (default: derived from\n  database path)\n\n**Vite Configuration**:\n\n- `VITE_API_TARGET` - Backend API URL for Vite proxy (default:\n  `http:\u002F\u002F127.0.0.1:8080`)\n\n#### Authentication (Web Mode)\n\n- Set `WF_AUTH_PASSWORD_HASH` to an Argon2id PHC string to require a password\n  before accessing the Web App.\n\n  You can generate the hash with online tools like\n  [argon2.online](https:\u002F\u002Fargon2.online) or the CLI (`argon2-utils` package):\n\n  ```bash\n  printf 'your-password' | argon2 yoursalt16chars! -id -e\n  ```\n\n  > **Tips:**\n  >\n  > - The first argument is the **salt** (use 16+ characters); the password is\n  >   read from stdin.\n  > - Use `printf` instead of `echo -n` to avoid hidden newline issues.\n  > - For Docker Compose `.env` \u002F `--env-file`, single-quote the hash or double\n  >   every `$` (`$$argon2id$$...`).\n\n  Copy the full output (starting with `$argon2id$...`) into `.env.web`.\n\n  **Dollar-sign (`$`) escaping cheat-sheet** — Argon2 hashes contain `$`\n  characters that shells and Compose interpret as variable references:\n\n  | Context                            | Syntax                                  | Notes                                            |\n  | ---------------------------------- | --------------------------------------- | ------------------------------------------------ |\n  | `.env.web` \u002F app-loaded dotenv     | `WF_AUTH_PASSWORD_HASH=$argon2id$...`   | Loaded by the app; no Compose interpolation      |\n  | Docker Compose `.env`\u002F`--env-file` | `WF_AUTH_PASSWORD_HASH='$argon2id$...'` | Single quotes prevent Compose interpolation      |\n  | Docker Compose `.env`\u002F`--env-file` | `WF_AUTH_PASSWORD_HASH=$$argon2id$$...` | Alternative: double every `$`                    |\n  | Docker Compose YAML inline         | `HASH: '$$argon2id$$v=19$$...'`         | Double every `$` to escape Compose interpolation |\n  | `docker run` (single quotes)       | `-e HASH='$argon2id$...'`               | Single quotes prevent shell expansion            |\n  | `docker run` (double quotes)       | `-e HASH=\"\\$argon2id\\$...\"`             | Backslash-escape each `$`                        |\n\n- Sessions are cookie-based (`HttpOnly`, `SameSite=Lax`, `Path=\u002Fapi`). The login\n  endpoint sets the session cookie automatically — no token is exposed to\n  client-side JavaScript. Sessions last 60 minutes by default (see\n  `WF_AUTH_TOKEN_TTL_MINUTES`).\n\n- **Reverse proxy (HTTPS):** If your reverse proxy terminates TLS, ensure it\n  forwards `X-Forwarded-Proto: https` so the server sets the `Secure` cookie\n  attribute correctly. Alternatively, set `WF_COOKIE_SECURE=true` to always set\n  `Secure`. See `WF_COOKIE_SECURE` above.\n\n#### Notes\n\n- The server logs the effective database path on startup\n- Environment variables from `.env.web` are loaded automatically by the\n  `dev:web` script\n- Stop with Ctrl+C to shut down both processes gracefully\n\n### Server Only\n\nRun just the HTTP server without the Vite dev server (from repo root):\n\n```bash\ncargo run --manifest-path apps\u002Fserver\u002FCargo.toml\n```\n\nThe server accepts the same `WF_*` environment variables as documented in the\n[Web Mode Configuration](#configuration) section above. You can set them inline\nor via `.env.web`:\n\n```bash\nWF_LISTEN_ADDR=127.0.0.1:8080 WF_DB_PATH=.\u002Fdb\u002Fapp.db cargo run --manifest-path apps\u002Fserver\u002FCargo.toml\n```\n\nSee [Web Mode Configuration](#configuration) for a complete list of supported\nenvironment variables.\n\n## Docker\n\nYou can either pull the official Docker image or build it yourself locally.\n\n### Using the Pre-built Image\n\nThe latest server build is published to Docker Hub.\n\n```bash\ndocker pull afadil\u002Fwealthfolio:latest\n```\n\nAfter pulling, use `afadil\u002Fwealthfolio:latest` in the run commands below. If you\nbuild the image locally, swap the image name back to `wealthfolio`.\n\n### Building the Image\n\nBuild the Docker image directly from source (no pre-build required):\n\n```bash\ndocker build -t wealthfolio .\n```\n\nThe build process:\n\n1. Builds frontend assets from source (`pnpm install` + `pnpm vite build`)\n2. Compiles Rust backend from source (`cargo build --release`)\n3. Creates minimal Alpine-based image with only the runtime artifacts\n\nThe final image includes:\n\n- Compiled frontend assets in `\u002Fapp\u002Fdist`\n- `wealthfolio-server` binary at `\u002Fusr\u002Flocal\u002Fbin\u002Fwealthfolio-server`\n- Alpine Linux base (small footprint)\n\n### Configuration\n\nYou can configure the container using either:\n\n1. **Environment variables** (inline with `-e` flag)\n2. **Environment file** (using `--env-file` flag)\n\n**Option 1: Create an environment file** (recommended for production):\n\n```bash\n# Create a Docker-specific environment file\ncat > .env.docker \u003C\u003C 'EOF'\nWF_LISTEN_ADDR=0.0.0.0:8088\nWF_DB_PATH=\u002Fdata\u002Fwealthfolio.db\nWF_SECRET_KEY=\u003Cgenerate-with-openssl-rand>\nWF_CORS_ALLOW_ORIGINS=https:\u002F\u002Fwealthfolio.example.com\nWF_REQUEST_TIMEOUT_MS=30000\nWF_STATIC_DIR=dist\nEOF\n```\n\nGenerate and add your secret key:\n\n```bash\necho \"WF_SECRET_KEY=$(openssl rand -base64 32)\" >> .env.docker\n```\n\n**Option 2: Use inline environment variables** (simpler for testing):\n\nSee examples below for inline configuration.\n\n### Running the Container\n\nAll examples below use the published image (`afadil\u002Fwealthfolio:latest`). If you\nbuilt locally, substitute your local tag (e.g., `wealthfolio`).\n\n**Using environment file** (recommended):\n\n```bash\ndocker run --rm -d \\\n  --name wealthfolio \\\n  --env-file .env.docker \\\n  -p 8088:8088 \\\n  -v wealthfolio-data:\u002Fdata \\\n  afadil\u002Fwealthfolio:latest\n```\n\n**Basic usage** (inline environment variables):\n\n```bash\ndocker run --rm -d \\\n  --name wealthfolio \\\n  -e WF_LISTEN_ADDR=0.0.0.0:8088 \\\n  -e WF_DB_PATH=\u002Fdata\u002Fwealthfolio.db \\\n  -p 8088:8088 \\\n  -v wealthfolio-data:\u002Fdata \\\n  afadil\u002Fwealthfolio:latest\n```\n\n**Development mode** (with CORS for local Vite dev server):\n\n```bash\ndocker run --rm -it \\\n  --name wealthfolio \\\n  -e WF_LISTEN_ADDR=0.0.0.0:8088 \\\n  -e WF_DB_PATH=\u002Fdata\u002Fwealthfolio.db \\\n  -e WF_CORS_ALLOW_ORIGINS=http:\u002F\u002Flocalhost:1420 \\\n  -p 8088:8088 \\\n  -v wealthfolio-data:\u002Fdata \\\n  afadil\u002Fwealthfolio:latest\n```\n\n**Production with encryption** (recommended):\n\n```bash\ndocker run --rm -d \\\n  --name wealthfolio \\\n  -e WF_LISTEN_ADDR=0.0.0.0:8088 \\\n  -e WF_DB_PATH=\u002Fdata\u002Fwealthfolio.db \\\n  -e WF_SECRET_KEY=$(openssl rand -base64 32) \\\n  -p 8088:8088 \\\n  -v wealthfolio-data:\u002Fdata \\\n  afadil\u002Fwealthfolio:latest\n```\n\n### Environment Variables\n\nThe container supports all `WF_*` environment variables documented in the\n[Web Mode Configuration](#configuration) section. Key variables:\n\n- `WF_LISTEN_ADDR` - Bind address (**must use `0.0.0.0:PORT` for Docker**, not\n  `127.0.0.1`)\n- `WF_DB_PATH` - Database path (typically `\u002Fdata\u002Fwealthfolio.db`)\n- `WF_CORS_ALLOW_ORIGINS` - CORS origins (set for dev\u002Ffrontend access)\n- `WF_SECRET_KEY` - Required 32-byte key used for secrets encryption and JWT\n  signing\n\n### Volumes\n\n- `\u002Fdata` - Persistent storage for database and secrets\n  - Database: `\u002Fdata\u002Fwealthfolio.db`\n  - Secrets: `\u002Fdata\u002Fsecrets.json` (encrypted with `WF_SECRET_KEY`)\n\n### Ports\n\n- `8088` - HTTP server (serves both API and static frontend)\n\nAccess the application at `http:\u002F\u002Flocalhost:8088` after starting the container.\n\n**Important:** The server must bind to `0.0.0.0` (all interfaces) inside the\ncontainer to be accessible from your host machine. Binding to `127.0.0.1` will\nmake the app only accessible from within the container.\n\n### Development with DevContainer\n\nFor a consistent development environment across all platforms, you can use the\nprovided DevContainer configuration. This method requires fewer manual setup\nsteps and provides an isolated environment with all necessary dependencies.\n\n#### Prerequisites\n\n- [Docker](https:\u002F\u002Fwww.docker.com\u002F)\n- [Visual Studio Code](https:\u002F\u002Fcode.visualstudio.com\u002F)\n- [Remote - Containers](https:\u002F\u002Fmarketplace.visualstudio.com\u002Fitems?itemName=ms-vscode-remote.remote-containers)\n  VS Code extension\n\n#### Features\n\n- Pre-configured Tauri development environment\n- X11 virtual display with VNC access (port 5900)\n- Complete Rust development setup\n- GPU support (via Docker's --gpus=all flag)\n- Persistent data and build caches\n- Essential VS Code extensions pre-installed\n\n#### Starting Development with DevContainer\n\n1. **Clone the repository** (if you haven't already):\n   ```bash\n   git clone https:\u002F\u002Fgithub.com\u002Fafadil\u002Fwealthfolio.git\n   cd wealthfolio\n   ```\n2. **Open in VS Code**:\n   - Open VS Code\n   - Go to File > Open Folder\n   - Select the wealthfolio directory\n\n3. **Launch DevContainer**:\n   - Press `F1` or `Ctrl+Shift+P`\n   - Type \"Remote-Containers: Reopen in Container\"\n   - Press Enter\n\n4. **Wait for container build**:\n   - VS Code will build and configure the development container\n   - This may take a few minutes on first run\n\n5. **Start Development**:\n   - Once the container is ready, you can start development\n   - All necessary tools and dependencies will be available\n\n## Addon Development\n\nWealthfolio supports a powerful addon ecosystem that allows developers to extend\nfunctionality with custom features.\n\n### Quick Start with Addons\n\n1. **Create a new addon**:\n\n   ```bash\n   npx @wealthfolio\u002Faddon-dev-tools create my-addon\n   cd my-addon\n   npm install\n   ```\n\n2. **Start development server**:\n\n   ```bash\n   npm run dev:server\n   ```\n\n3. **Start Wealthfolio in addon development mode** (in another terminal):\n   ```bash\n   VITE_ENABLE_ADDON_DEV_MODE=true pnpm tauri dev\n   ```\n\nYour addon will be automatically discovered and loaded with hot reload support!\n\n### Addon Features\n\n- **🎨 UI Integration**: Add custom pages and navigation items\n- **📊 Data Access**: Full access to portfolio, accounts, and market data\n- **📡 Real-time Events**: React to portfolio updates and user actions\n- **🔐 Secure Storage**: Store API keys and sensitive data securely\n- **⚡ Hot Reload**: Seamless development experience\n- **🔒 Permission System**: Transparent security with user consent\n\n### Example Addons\n\nCheck out the [addons\u002F](addons\u002F) directory for sample addons including:\n\n- **Goal Progress Tracker**: Visual goal tracking with calendar like interface\n- **Investment Fees Tracker**: Track and analyze investment fees\n\n### Resources\n\n- **[Getting Started Guide](docs\u002Faddons\u002Faddon-getting-started.md)** - Everything\n  you need to know to start building addons\n- **[API Reference](docs\u002Faddons\u002Faddon-api-reference.md)** - Full API\n  documentation\n- **[Architecture Guide](docs\u002Faddons\u002Faddon-architecture.md)** - Design patterns\n  and best practices\n\n## Technologies Used\n\n### Frontend\n\n- **React**: JavaScript library for building user interfaces.\n- **React Router**: Declarative routing for React.\n- **Tailwind CSS**: Utility-first CSS framework for styling.\n- **Radix UI\u002FShadcn**: Accessible UI components.\n- **Recharts**: Charting library built with React.\n- **React Query**: Data-fetching library for React.\n- **Zod**: TypeScript-first schema declaration and validation library.\n\n### Backend\n\n- **Tauri**: Framework for building tiny, secure, and fast desktop applications.\n- **Rust**: Systems programming language for core backend functionality.\n- **SQLite**: Embedded database for local data storage.\n- **Diesel**: Safe, extensible ORM and query builder for Rust.\n\n### Addon System\n\n- **@wealthfolio\u002Faddon-sdk**: TypeScript SDK for addon development with full\n  type safety.\n- **@wealthfolio\u002Faddon-dev-tools**: CLI tools and development server for hot\n  reload.\n- **@wealthfolio\u002Fui**: Shared UI component library for consistent styling.\n\n### Development Tools\n\n- **Vite**: Next-generation frontend tooling.\n- **TypeScript**: Typed superset of JavaScript.\n- **ESLint**: Pluggable linting utility for JavaScript and JSX.\n- **Prettier**: Code formatter.\n- **pnpm**: Fast, disk space efficient package manager.\n- **Turborepo**: High-performance build system for JavaScript and TypeScript\n  codebases.\n\n## Folder Structure\n\n```\nwealthfolio\u002F\n├── apps\u002F                        # Application packages\n│   ├── frontend\u002F                # React frontend application\n│   │   ├── src\u002F                 # Source code\n│   │   │   ├── adapters\u002F        # Environment adapters (Tauri\u002FWeb)\n│   │   │   ├── addons\u002F          # Addon system runtime\n│   │   │   ├── components\u002F      # React components\n│   │   │   ├── features\u002F        # Feature modules (self-contained)\n│   │   │   ├── pages\u002F           # Application pages and routes\n│   │   │   ├── hooks\u002F           # Custom React hooks\n│   │   │   └── lib\u002F             # Utility libraries and helpers\n│   │   ├── public\u002F              # Static assets\n│   │   ├── index.html           # HTML entry point\n│   │   └── vite.config.ts       # Vite build config\n│   ├── tauri\u002F                   # Tauri desktop\u002Fmobile app (Rust IPC commands)\n│   └── server\u002F                  # Axum HTTP server for web mode\n├── crates\u002F                      # Rust crates (shared backend logic)\n│   ├── core\u002F                    # Core business logic, services, models\n│   ├── storage-sqlite\u002F          # SQLite storage layer (Diesel ORM)\n│   ├── market-data\u002F             # Market data providers\n│   ├── connect\u002F                 # External service integrations\n│   └── device-sync\u002F             # Device sync functionality\n├── addons\u002F                      # Example addons\n│   ├── goal-progress-tracker\u002F   # Goal tracking addon\n│   ├── investment-fees-tracker\u002F # Fees tracking addon\n│   └── swingfolio\u002F              # Trading addon\n├── packages\u002F                    # Shared TypeScript packages\n│   ├── addon-sdk\u002F               # Addon SDK for developers\n│   ├── addon-dev-tools\u002F         # CLI and dev server for addons\n│   └── ui\u002F                      # Shared UI components (@wealthfolio\u002Fui)\n├── docs\u002F                        # Documentation\n│   ├── addons\u002F                  # Addon development docs\n│   ├── activities\u002F              # Activity types docs\n│   └── architecture\u002F            # Architecture docs\n├── e2e\u002F                         # End-to-end tests\n├── scripts\u002F                     # Build and dev scripts\n├── Cargo.toml                   # Rust workspace config\n├── package.json                 # Node.js dependencies\n├── pnpm-workspace.yaml          # pnpm workspace config\n└── tsconfig.json                # TypeScript config\n```\n\n### Security & Data Storage\n\n#### Local Data Storage\n\nAll your financial data is stored locally using SQLite database with no cloud\ndependencies:\n\n- Portfolio holdings and performance data\n- Trading activities and transaction history\n- Account information and settings\n- Goals and contribution limits\n\n#### API Keys & Secrets\n\nAPI credentials are securely stored using the operating system keyring through\nthe `keyring` crate:\n\n- **Core App**: Use `set_secret` and `get_secret` commands for external services\n- **Addons**: Use the Secrets API (`ctx.api.secrets`) for addon-specific\n  sensitive data\n- **No Disk Storage**: Keys never written to disk or configuration files\n\n#### Permission System\n\nAddons operate under a comprehensive permission system:\n\n- Automatic code analysis during installation\n- User consent required for data access\n- Risk-based security warnings\n- Transparent permission declarations\n\n## Contributing\n\nContributions are welcome! Please follow these steps:\n\n1. Fork the repository.\n2. Create a new branch (`git checkout -b feature-branch`).\n3. Make your changes.\n4. Commit your changes (`git commit -m 'Add some feature'`).\n5. Push to the branch (`git push origin feature-branch`).\n6. Open a pull request.\n\n## License\n\nThis project is licensed under the AGPL-3.0 license. See the `LICENSE` file for\ndetails.\n\nBrand assets in `assets\u002Fbrand\u002F` are trademarks; see\n[TRADEMARKS.md](TRADEMARKS.md).\n\n---\n\nWealthfolio and the Wealthfolio logo are trademarks of Teymz Inc. The code is\nlicensed under AGPL-3.0; trademarks are not granted under that license.\n\n## 🌟 Star History\n\n## [![Star History Chart](https:\u002F\u002Fapi.star-history.com\u002Fsvg?repos=afadil\u002Fwealthfolio&type=Timeline)](https:\u002F\u002Fstar-history.com\u002F#afadil\u002Fwealthfolio&Date)\n\nEnjoy managing your wealth with **Wealthfolio**! 🚀\n","Wealthfolio是一款美观且注重隐私的桌面投资跟踪应用。它使用Rust语言开发，具备投资组合追踪、性能分析、交易活动管理以及目标规划等核心功能，并支持多币种和本地数据存储，无需订阅或依赖云端服务。此外，Wealthfolio拥有强大的插件系统，允许开发者轻松扩展自定义功能。这款应用适合需要跨平台（Windows、macOS、Linux）管理和跟踪个人投资组合的用户，在确保数据安全的同时提供高效的投资管理体验。",2,"top_language"]