{"id":"18b602f0-87d2-4631-a396-c73f79f8f8d2","slug":"sextante","kind":"mcp","name":"sextante","summary":"Personal-finance and FIRE calculators for the Spanish tax system, with an aggregated portfolio and a remote MCP server. MIT.","owner":"Fedeparg","repoUrl":"https://github.com/Fedeparg/sextante","license":"MIT","licenseTier":"permissive","trust":"community","stars":0,"match":null,"fewStars":true,"format":"mcp","createdAt":"2026-06-26T18:54:11.000Z","addedAt":"2026-10-29T05:47:44.423Z","logoUrl":"https://avatars.githubusercontent.com/u/28566295?u=9df97799c43d5f165bfd8a8cc9ba2e6b5feb456c&v=4","linkOnly":false,"collection":null,"skillPath":null,"categories":["data-analytics","cloud-infra","utilities"],"tags":["calculator","fire","irpf","nestjs","nextjs","personal-finance","spain","typescript"],"runtime":"binary","local":true,"cloudCapable":false,"cloudCapability":"unknown","cloudReadyOnPlatform":false,"needsApiKey":false,"reviewed":false,"syncedAt":"2026-10-29T05:48:31.803Z","sample":false,"url":"https://conduits.dev/tools/sextante","language":"TypeScript","transports":["stdio"],"install":{},"requirements":{"env":[],"upstreamMayCharge":false},"tools":null,"readme":"<div align=\"center\">\n\n<img src=\"docs/images/logo.svg\" alt=\"Sextante logo\" width=\"88\" height=\"88\">\n\n# Sextante\n\n**Personal-finance and FIRE calculators built around the Spanish tax system,<br>\nplus an aggregated portfolio that your own AI assistant can read and write over MCP.**\n\n[sextante.fpardo.net](https://sextante.fpardo.net) (Spanish) · [English](https://sextante.fpardo.net/en)\n\n[![License: MIT](https://img.shields.io/badge/license-MIT-10b981)](LICENSE)\n[![CI](https://github.com/Fedeparg/sextante/actions/workflows/ci.yml/badge.svg)](https://github.com/Fedeparg/sextante/actions/workflows/ci.yml)\n<br>\n![Next.js 16](https://img.shields.io/badge/Next.js-16-000000?logo=nextdotjs)\n![React 19](https://img.shields.io/badge/React-19-61dafb?logo=react&logoColor=white)\n![NestJS 12](https://img.shields.io/badge/NestJS-12-e0234e?logo=nestjs)\n![PostgreSQL](https://img.shields.io/badge/PostgreSQL-Drizzle-4169e1?logo=postgresql&logoColor=white)\n![TypeScript](https://img.shields.io/badge/TypeScript-strict-3178c6?logo=typescript&logoColor=white)\n![MCP](https://img.shields.io/badge/MCP-OAuth%202.1-4f46e5)\n\n<br>\n\n<picture>\n  <source media=\"(prefers-color-scheme: dark)\" srcset=\"docs/images/landing-dark.png\">\n  <img src=\"docs/images/landing-light.png\" alt=\"Sextante landing page\" width=\"900\">\n</picture>\n\n</div>\n\n## Project status\n\nSextante is live at [sextante.fpardo.net](https://sextante.fpardo.net). The full source code is\nreleased under the [MIT licence](LICENSE), so anyone can study it and reuse it.\n\n> [!WARNING]\n> **Not financial advice.** Sextante computes and explains; it never recommends. Every result\n> is an estimate: check anything that matters with a professional and with the AEAT.\n\n## What it does\n\n| | |\n|---|---|\n| 🧮 **27 calculators** | Compound interest, FIRE with a Monte Carlo simulator over real market history, mortgages, deposits, dividends, DCA, inflation, budget... All run in the browser, need no account and keep every input in the URL. |\n| 🇪🇸 **Spanish tax engine** | IRPF by the AEAT dual-scale method with the regional scale of each common-regime community, Social Security, payroll withholding, self-employed, wealth tax, gift tax and capital gains (FIFO). |\n| 📈 **Aggregated portfolio** | Positions and lots across brokers, prices and FX, P&L, reconstructed history, Trade Republic import and progress towards a FIRE goal. |\n| 🧾 **Tax-return report** | Savings-base figures per tax year in euros at the ECB rate, the two-month rule, dividends and interest, double-taxation credit and the box of the Spanish return (modelo 100) for each figure. |\n| 🤖 **Remote MCP server** | 23 tools over Streamable HTTP with OAuth 2.1: the portfolio, the tax report and saved scenarios, plus two generic tools that run every calculator with the same `@sextante/core` code as the web. |\n| 📚 **Wiki** | Articles and one explainer per calculator, in Markdown, bilingual (es/en). |\n\n## Screenshots\n\n<table>\n  <tr>\n    <td width=\"50%\">\n      <picture>\n        <source media=\"(prefers-color-scheme: dark)\" srcset=\"docs/images/fire-dark.png\">\n        <img src=\"docs/images/fire-light.png\" alt=\"FIRE Monte Carlo simulator with a fan chart of wealth scenarios\">\n      </picture>\n      <p align=\"center\"><sub><b>FIRE Monte Carlo simulator</b>: 5,000 market scenarios</sub></p>\n    </td>\n    <td width=\"50%\">\n      <picture>\n        <source media=\"(prefers-color-scheme: dark)\" srcset=\"docs/images/compound-dark.png\">\n        <img src=\"docs/images/compound-light.png\" alt=\"Compound interest calculator with a growth chart\">\n      </picture>\n      <p align=\"center\"><sub><b>Compound interest</b>: contributions vs. interest over time</sub></p>\n    </td>\n  </tr>\n  <tr>\n    <td colspan=\"2\">\n      <picture>\n        <source media=\"(prefers-color-scheme: dark)\" srcset=\"docs/images/salary-dark.png\">\n        <img src=\"docs/images/salary-light.png\" alt=\"Gross to net salary calculator with Social Security and income tax\">\n      </picture>\n      <p align=\"center\"><sub><b>Gross to net salary</b>: Social Security, IRPF withholding and the personal and family minimum</sub></p>\n    </td>\n  </tr>\n</table>\n\n<p align=\"center\"><sub>Screenshots follow your GitHub theme: switch between light and dark to see both.</sub></p>\n\n## Architecture\n\nA pnpm workspace with three packages that deploy as one stack:\n\n| Path | What |\n|---|---|\n| `/` (root) | Next.js frontend (App Router) and BFF: `rewrites()` proxy `/api/*` and the OAuth routes to the API, so the browser only ever talks to one origin |\n| `apps/api` | NestJS + Drizzle + PostgreSQL. Single source of truth for data and identity |\n| `packages/core` | `@sextante/core`: pure logic shared by both (calculators, projection engine, tax engine, FX, portfolio breakdown and goal) |\n\n```mermaid\nflowchart LR\n  B[Browser] --> W\n  M[MCP client] --> W\n  subgraph W[Next.js · BFF]\n    UI[Calculators · Wiki · Portfolio UI]\n  end\n  W -- \"/api/* · OAuth\" --> A[NestJS API]\n  A --> DB[(PostgreSQL)]\n  UI -. imports .-> C[[\"@sextante/core\"]]\n  A -. imports .-> C\n```\n\nThe calculators and the wiki work with the frontend alone; the API is needed for sign-in, the\nportfolio and MCP.\n\n## Running it locally\n\nRequirements: Node 24 (see `.nvmrc`; 22.13 is the minimum), [pnpm](https://pnpm.io/) and\nDocker (for the API stack and the backend tests).\n\n```bash\npnpm install\ncp .env.example .env                     # frontend\npnpm dev                                 # http://localhost:3000\n\n# Optional, for sign-in / portfolio / MCP:\ncp apps/api/.env.example apps/api/.env\ndocker compose up -d --build             # postgres + one-shot migrate + api (:3001)\n```\n\nDay-to-day commands (each package is checked on its own; CI runs all of them):\n\n| Frontend (root) | Backend |\n|---|---|\n| `pnpm typecheck` · `pnpm lint` | `pnpm --filter @sextante/api typecheck` · `lint` |\n| `pnpm test` · `pnpm test <path>` | `pnpm --filter @sextante/api test` (needs Docker) |\n| `pnpm build` | `pnpm --filter @sextante/api build` |\n\nBackend details (modules, migrations, tests): [`apps/api/README.md`](apps/api/README.md).\nSelf-hosting with Docker Compose, secrets, encrypted backups and analytics:\n[`docs/DEPLOY.md`](docs/DEPLOY.md). What was built and what was decided not to build:\n[`ROADMAP.md`](ROADMAP.md).\n\n## License\n\n[MIT](LICENSE) © 2026 Federico Pardo García.\n"}