{"id":"aeed3127-f5d0-4329-9bc4-da3d0fedd0fc","slug":"rikdom","kind":"skill","name":"rikdom","summary":"Portable, local-first wealth portfolio schema + storage toolkit.","owner":"ricardocabral","repoUrl":"https://github.com/ricardocabral/rikdom","license":"MIT","licenseTier":"permissive","trust":"community","stars":9,"match":null,"fewStars":false,"format":"skill","createdAt":"2026-04-20T20:09:59.000Z","addedAt":"2026-10-21T22:58:06.131Z","logoUrl":"https://avatars.githubusercontent.com/u/38954?u=b7e254d33c7c1e8e1d5d4f1f0de69a4fa1b60313&v=4","linkOnly":false,"collection":null,"skillPath":null,"categories":["data-analytics"],"tags":["finance","finance-management","investing","investment-analysis","investment-portfolio","personal-finance","portfolio","stock"],"runtime":"python","local":true,"cloudCapable":false,"cloudCapability":"unknown","cloudReadyOnPlatform":false,"needsApiKey":false,"reviewed":false,"syncedAt":"2026-10-25T17:21:16.943Z","sample":false,"url":"https://conduits.dev/tools/rikdom","language":"Python","transports":["stdio"],"install":{"pypi":"rikdom"},"requirements":{"env":[],"upstreamMayCharge":false},"tools":null,"readme":"# rikdom\n\n[![OpenSSF Best Practices](https://www.bestpractices.dev/projects/12618/badge)](https://www.bestpractices.dev/projects/12618)\n[![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/ricardocabral/rikdom/badge)](https://scorecard.dev/viewer/?uri=github.com/ricardocabral/rikdom)\n[![CI](https://github.com/ricardocabral/rikdom/actions/workflows/ci.yml/badge.svg)](https://github.com/ricardocabral/rikdom/actions/workflows/ci.yml)\n[![CodeQL](https://github.com/ricardocabral/rikdom/actions/workflows/codeql.yml/badge.svg)](https://github.com/ricardocabral/rikdom/actions/workflows/codeql.yml)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n[![Python](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/downloads/)\n[![Code style: ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)\n[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](CONTRIBUTING.md)\n\nPortable, local-first wealth portfolio schema + storage toolkit.\n\n`rikdom` is designed so your portfolio data can last for years as plain JSON files, independent of any broker app or SaaS dashboard.\n\n## Why The Name \"rikdom\"\n\n`rikdom` is a Norwegian word meaning \"wealth\" (or \"riches\").\nThe name reflects the project goal: treat wealth data as durable, long-lived information, not a locked product database.\n\n## Why Now\n\nWith coding agents and LLMs, it is much easier to build your own asset management software and adapt it to your needs over time.\n`rikdom` focuses on the durable layer beneath that iteration: a solid foundation for storing and evolving financial data, plus a plugin system you can extend with coding agents and enrich with reusable open-source plugins.\n\n## What It Solves\n\n- Define a portfolio for a person or company.\n- Track holdings across stocks, REITs, funds, real estate, cash equivalents, digital assets and cryptocurrencies.\n- Model recurring operations (monthly/yearly tasks) and keep an auditable \"last done\" history.\n- Extend asset types with country-specific classes, metadata, and typed instrument attributes.\n- Persist data in simple disk files (`JSON` + `JSONL`).\n- Archive or transfer data with checksum-verified [`rikdom-export`](docs/reference/export-format.md) bundles.\n- Generate static dashboard and deep-dive reports for allocation and progress over time.\n- Ingest provider statements through community plugins.\n- Query external market data through optional connector plugins, with provider\n  rules and authentication handled by each adapter.\n\n## Core Principles\n\n- Local-first: data stays in your folder.\n- Durable formats: JSON schema and line-delimited snapshots.\n- Extensible by design: `metadata` and `extensions` fields.\n- Agent-friendly: explicit schema + instructions for Codex/Claude.\n\n## How rikdom differs from Ghostfolio and Wealthfolio\n\n`rikdom` is not trying to be another full investment app.\nIt is a schema + CLI + plugin foundation focused on durability, portability, and auditable local files.\n\n| Project                                                | Primary shape                                          | Storage model                                                      | Core focus                                                                        |\n| ------------------------------------------------------ | ------------------------------------------------------ | ------------------------------------------------------------------ | --------------------------------------------------------------------------------- |\n| [rikdom](https://github.com/ricardocabral/rikdom)      | Python CLI toolkit + JSON schema + plugin engine       | Plain `JSON` + append-only `JSONL` in your repo/workspace          | Long-term, local-first data durability and machine-readable portfolio workflows   |\n| [Ghostfolio](https://github.com/ghostfolio/ghostfolio) | Full web app (Angular + NestJS) for portfolio tracking | Server stack (`PostgreSQL` + `Redis`) with optional cloud offering | Operational wealth dashboard with rich UI, analytics, and continuous app runtime  |\n| [Wealthfolio](https://github.com/afadil/wealthfolio)   | Desktop investment tracker (Tauri + React + Rust)      | Local `SQLite` database                                            | Beautiful local desktop experience with performance analytics and addon ecosystem |\n\nPractical difference:\n\n- Choose `rikdom` when you want open contracts and file-level control first.\n- Choose Ghostfolio/Wealthfolio when you want a ready-made end-user app experience first.\n- Combine them when needed: keep `rikdom` as your canonical data layer and export/sync to other tools via plugins.\n\n## Information Flow\n\n```mermaid\nflowchart TD\n  U[\"User input\"] --> C[\"CLI commands\"]\n  S[\"Provider statements\"] --> P[\"Plugins\"]\n  P --> C\n\n  D[\"External data services\"] --> DC[\"Connector plugins\"]\n  C -->|Explicit connector query| DC\n  DC --> Q[\"JSON with acquisition provenance\"]\n\n  C --> V[\"Schema validation\"]\n  V --> E[\"Event ledger activities\"]\n  E --> T[\"Current state portfolio\"]\n  E --> R[\"Projections\"]\n  T --> R\n\n  R --> Z[\"Visualization dashboard\"]\n  E --> L[\"LLM reasoning\"]\n  R --> L\n  T --> L\n  Q -->|User or agent supplies external context| L\n\n  L --> A[\"Insights planning and next actions\"]\n```\n\nConnector JSON gives users, scripts, and coding agents external evidence with\nthe connector plugin identity and retrieval time. The LLM reasoning step represents\nanalysis performed by an external agent; Rikdom does not invoke an LLM or feed\nquery results into portfolio calculations automatically.\n\n## Repository Structure\n\n- `schema/` JSON schemas and default asset types\n- `data/` local workspace files (`portfolio.json`, `snapshots.jsonl`, `fx_rates.jsonl`, `import_log.jsonl`), gitignored\n- `data/portfolio_registry.json` optional multi-portfolio registry (`main`, `paper`, `retirement`, etc.)\n- `data/portfolios/<name>/` per-portfolio isolated data files when registry mode is used\n- `data-sample/` tracked starter templates for workspace bootstrapping (see [storage layout](docs/reference/storage-layout.md#tracked-starter-templates))\n- `src/rikdom/` Python package (CLI, validation, import pipeline, visualization)\n- `docs/` schema, storage, plugin docs, and execution plans\n- `plugins/` local plugin implementations and manifests\n- `scripts/` helper automation scripts (e.g., GitHub issue publishing)\n- `tests/` unit and integration tests\n- `out/` generated artifacts (e.g., dashboard/report output)\n- `.codex/` Codex instruction files\n- `.claude/` Claude instruction files\n- `ROADMAP.md` phased roadmap and execution priorities\n\n## Quick Start\n\n1. Install [`uv`](https://docs.astral.sh/uv/getting-started/installation/).\n2. Sync dependencies and bootstrap a sample workspace:\n\n   ```bash\n   make sync\n   make bootstrap\n   ```\n\n3. Validate, snapshot, and visualize:\n\n   ```bash\n   make validate\n   make snapshot\n   make viz\n   ```\n\n   Open `out/dashboard.html` in a browser.\n\nFor a guided walkthrough see the [first portfolio tutorial](docs/tutorials/first-portfolio.md).\n\n## External data connectors\n\nUse an `external/connector` plugin to query market data independently of your\nportfolio files. Each plugin owns its provider operations, authentication,\nand REST or Model Context Protocol (MCP) client. Queries return JSON with\nacquisition provenance without importing transactions or updating holdings.\nThe [brapi plugin](plugins/brapi/README.md) is one example; its capabilities,\nconfiguration, and usage are documented in its own directory.\n\nSee [query external data](docs/how-to/query-external-data.md) for the workflow\nand [connector architecture](docs/explanation/plugin-architecture.md#external-connectors)\nfor the boundary between acquisition and planned normalized enrichment.\n\n## Documentation\n\nFull documentation is organized along the [Diataxis](https://diataxis.fr/) framework at [`docs/index.md`](docs/index.md):\n\n- **Tutorials** — [your first portfolio](docs/tutorials/first-portfolio.md), [author your first plugin](docs/tutorials/first-plugin.md).\n- **How-to guides** — [import a statement](docs/how-to/import-a-statement.md), [query external data](docs/how-to/query-external-data.md), [run a migration](docs/how-to/run-a-migration.md), [compute performance](docs/how-to/compute-performance.md), and more.\n- **Reference** — [CLI](docs/reference/cli.md), [schemas](docs/reference/schemas.md), [plugin manifest & hooks](docs/reference/plugin-manifest.md), [export bundle format](docs/reference/export-format.md).\n- **Explanation** — [schema design](docs/explanation/schema-design.md), [plugin architecture](docs/explanation/plugin-architecture.md), [calculation trust](docs/explanation/calculation-trust.md), [storage durability](docs/explanation/storage-durability.md).\n\n## Common Dev Tasks\n\n```bash\nmake lint\nuv run python -m unittest tests.test_cli_reconcile -v\n```\n\nRun focused tests locally and use the pull request's CI run for the full suite.\nSee [Contributing](CONTRIBUTING.md#testing-expectations) for testing guidance.\n\n### Community plugin showcase\n\n| Use case                  | Plugin                                                                 | Description                                                                                                  |\n| ------------------------- | ---------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ |\n| Importing statements      | [`csv-generic`](plugins/csv-generic/README.md)                         | Imports holdings and activities from a generic CSV statement.                                                |\n| Importing statements      | [`ghostfolio_export_json`](plugins/ghostfolio_export_json/README.md)   | Imports holdings and activities from Ghostfolio JSON export files.                                           |\n| Importing statements      | [`ibkr_flex_xml`](plugins/ibkr_flex_xml/README.md)                     | Imports activities from Interactive Brokers Flex XML statements.                                             |\n| Importing statements      | [`charles-schwab`](plugins/charles-schwab/README.md)                   | Imports account metadata, holdings, cash balances, and activities from Charles Schwab CSV statement exports. |\n| Importing statements      | [`b3-consolidado-mensal`](plugins/b3-consolidado-mensal/README.md)     | Imports holdings from B3 consolidated monthly XLSX reports.                                                  |\n| Asset type enrichment     | [`asset-types-br-catalog`](plugins/asset-types-br-catalog/README.md)   | Brazilian asset-type catalog for FIIs, public/private debt, BDRs, COEs, and special funds.                   |\n| External market data      | [`brapi`](plugins/brapi/README.md)                                  | Example external data connector.                                                                            |\n| Storage sync / analytics  | [`duckdb-storage`](plugins/duckdb-storage/README.md)                   | Mirrors rikdom canonical JSON data into DuckDB for local analytics workflows.                                |\n| Reporting / visualization | [`quarto-portfolio-report`](plugins/quarto-portfolio-report/README.md) | Renders portfolio graphics and reports through Quarto.                                                       |\n\nPlugin quick commands:\n\n```bash\nmake plugins-list\nmake import-sample\nmake viz\nmake storage-sync\n```\n\nPortfolio view plugin (`quarto-portfolio-report`) preview:\n\n![Rikdom portfolio view plugin preview 1](docs/assets/portfolio-view-plugin-1.png)\n![Rikdom portfolio view plugin preview 2](docs/assets/portfolio-view-plugin-2.png)\n\n## Trust, source boundaries, and manual corrections\n\nImports preview changes, history coverage, and quality findings before writing.\nAdd `--reconcile` to a successful import for JSON/Markdown trust artifacts.\n[Manual events and immutable corrections](docs/how-to/enter-and-correct-activities.md)\nwork through validated local JSON. Correction-bearing portfolios use schema 2.0.0;\nuncorrected 1.x remains readable. Older raw-ledger calculators are not supported\nfor corrected data.\n\nCore calculations require an explicit reporting currency and consume normalized\nsource facts. Plugins own provider operations, regional identifiers and catalog\nrules, parsing conventions, and report presentation. Cached FX is the default;\nacquisition requires an explicitly selected connector, for example\n`rikdom snapshot --fx-provider frankfurter`.\n\n## AI Agent Skills\n\n- `.codex/SKILL.md`\n- `.codex/skills/rikdom-portfolio-analyst/SKILL.md`\n- `.codex/skills/rikdom-extensibility-engineer/SKILL.md`\n- `.claude/CLAUDE.md`\n\nThese files guide coding agents to safely analyze and evolve your data model.\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for development setup, testing expectations, and pull request guidelines.\n\nProject roadmap: [ROADMAP.md](ROADMAP.md)\n\n## License\n\nMIT (see `LICENSE`).\n"}