{"id":50646202,"url":"https://github.com/GeiserX/DeclaRenta","last_synced_at":"2026-06-24T09:01:07.206Z","repository":{"id":350530916,"uuid":"1207185051","full_name":"GeiserX/DeclaRenta","owner":"GeiserX","description":"Convierte informes de brokers extranjeros en declaraciones fiscales españolas: Modelo 100 (Renta), Modelo 720, Modelo 721 (cripto) y D-6. 100% gratuito, privado y self-hosted.","archived":false,"fork":false,"pushed_at":"2026-06-20T21:04:47.000Z","size":5887,"stargazers_count":39,"open_issues_count":32,"forks_count":4,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-06-20T23:04:51.164Z","etag":null,"topics":["aeat","browser","capital-gains","degiro","dividends","fifo","hacienda","ibkr","interactive-brokers","irpf","modelo-100","modelo-720","open-source","privacy","renta","self-hosted","spain","tax","trade-republic","typescript"],"latest_commit_sha":null,"homepage":"https://declarenta.com","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/GeiserX.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":"ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"geiserx","patreon":"geiser","buy_me_a_coffee":"geiser","thanks_dev":"u/gh/geiserx"}},"created_at":"2026-04-10T17:05:17.000Z","updated_at":"2026-06-20T21:04:49.000Z","dependencies_parsed_at":"2026-06-20T23:03:12.214Z","dependency_job_id":null,"html_url":"https://github.com/GeiserX/DeclaRenta","commit_stats":null,"previous_names":["geiserx/declarenta"],"tags_count":181,"template":false,"template_full_name":null,"purl":"pkg:github/GeiserX/DeclaRenta","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GeiserX%2FDeclaRenta","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GeiserX%2FDeclaRenta/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GeiserX%2FDeclaRenta/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GeiserX%2FDeclaRenta/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/GeiserX","download_url":"https://codeload.github.com/GeiserX/DeclaRenta/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GeiserX%2FDeclaRenta/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34724743,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-24T02:00:07.484Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aeat","browser","capital-gains","degiro","dividends","fifo","hacienda","ibkr","interactive-brokers","irpf","modelo-100","modelo-720","open-source","privacy","renta","self-hosted","spain","tax","trade-republic","typescript"],"created_at":"2026-06-07T13:00:29.298Z","updated_at":"2026-06-24T09:01:07.200Z","avatar_url":"https://github.com/GeiserX.png","language":"TypeScript","funding_links":["https://github.com/sponsors/geiserx","https://patreon.com/geiser","https://buymeacoffee.com/geiser","https://thanks.dev/u/gh/geiserx","https://github.com/sponsors/GeiserX"],"categories":["ERP y Contabilidad"],"sub_categories":["Radar COVID"],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/images/banner.png\" alt=\"DeclaRenta banner\" width=\"100%\"/\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eDeclaRenta\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eHerramienta fiscal gratuita para inversores con brokers internacionales.\u003c/strong\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://declarenta.com\"\u003e\u003cimg src=\"https://img.shields.io/badge/DeclaRenta-declarenta.com-DC2626?style=flat-square\u0026logo=data:image/svg%2bxml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0id2hpdGUiIGQ9Ik02IDlDMiA5IDAgOCAwIDVWMUMxIDAgMiAxIDMgM1Y2QzMgOCA1IDggOCA4VjlaIi8+PHBhdGggZmlsbD0id2hpdGUiIGQ9Ik0xOCA5QzIyIDkgMjQgOCAyNCA1VjFDMjMgMCAyMiAxIDIxIDNWNkMyMSA4IDE5IDggMTYgOFY5WiIvPjxwYXRoIGZpbGw9IndoaXRlIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik01IDhDNSA3IDggNiAxMiA2QzE2IDYgMTkgNyAxOSA4VjE3QzE5IDIxIDE2IDIzIDEyIDIzQzcgMjMgNSAyMSA1IDE3Wk03IDEwSDExVjEzSDdaTTEzIDEwSDE3VjEzSDEzWiIvPjxyZWN0IHg9IjExIiB5PSIxMSIgd2lkdGg9IjIiIGhlaWdodD0iMSIgcng9Ii41IiBmaWxsPSJ3aGl0ZSIvPjxjaXJjbGUgY3g9IjEwIiBjeT0iMTkiIHI9Ii44IiBmaWxsPSJ3aGl0ZSIvPjxjaXJjbGUgY3g9IjE0IiBjeT0iMTkiIHI9Ii44IiBmaWxsPSJ3aGl0ZSIvPjwvc3ZnPgo=\u0026logoColor=white\" alt=\"DeclaRenta\"/\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/GeiserX/DeclaRenta/blob/main/LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/github/license/GeiserX/DeclaRenta?style=flat-square\u0026color=dc2626\" alt=\"License\"/\u003e\u003c/a\u003e\n  \u003ca href=\"https://codecov.io/gh/GeiserX/DeclaRenta\"\u003e\u003cimg src=\"https://img.shields.io/codecov/c/github/GeiserX/DeclaRenta?style=flat-square\u0026color=f59e0b\" alt=\"Codecov\"/\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/GeiserX/DeclaRenta/actions\"\u003e\u003cimg src=\"https://img.shields.io/github/actions/workflow/status/GeiserX/DeclaRenta/ci.yml?style=flat-square\u0026label=CI\" alt=\"CI\"/\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/GeiserX/DeclaRenta/stargazers\"\u003e\u003cimg src=\"https://img.shields.io/github/stars/GeiserX/DeclaRenta?style=flat-square\u0026color=f59e0b\" alt=\"Stars\"/\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/GeiserX/awesome-spain#readme\"\u003e\u003cimg src=\"https://img.shields.io/badge/listed%20on-awesome--spain-c60b1e?style=flat-square\u0026logo=data:image/svg%2bxml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIxNCIgdmlld0JveD0iMCAwIDIwIDE0Ij48cmVjdCB3aWR0aD0iMjAiIGhlaWdodD0iMTQiIGZpbGw9IiNjNjBiMWUiLz48cmVjdCB5PSIzLjUiIHdpZHRoPSIyMCIgaGVpZ2h0PSI3IiBmaWxsPSIjZmZjNDAwIi8+PC9zdmc+\u0026labelColor=ffc400\" alt=\"awesome-spain\"/\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://declarenta.com\"\u003e\u003cstrong\u003edeclarenta.com\u003c/strong\u003e\u003c/a\u003e — Úsalo gratis, sin registro\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  IBKR · Degiro · Flatex · Scalable Capital · eToro · Freedom24 · Trade Republic · Revolut · Lightyear · Coinbase · Binance · Kraken · Trading 212 → Modelo 100 · Modelo 720 · Modelo 721 · D-6\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  Self-hosted · Privacidad total · Tus datos no salen de tu equipo\n\u003c/p\u003e\n\n---\n\n## Despliegue rápido\n\n[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/GeiserX/DeclaRenta)\n[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/GeiserX/DeclaRenta)\n[![Deploy on Railway](https://railway.com/button.svg)](https://railway.com/template/from?repoUrl=https://github.com/GeiserX/DeclaRenta)\n\nDeclaRenta es una web estática (Vite) — funciona en cualquier hosting de archivos estáticos. También disponible como imagen Docker: `drumsergio/declarenta:web`.\n\n---\n\n## El problema\n\nSi inviertes con un broker extranjero, hacer la renta es un infierno:\n\n- **Renta Web no importa datos** de brokers extranjeros — todo manual\n- **FIFO obligatorio** con tipos ECB oficiales (no los del broker)\n- **Regla anti-churning** (2 meses cotizados / 1 año no cotizados) que nadie detecta automáticamente\n- **Doble imposición** internacional que hay que calcular a mano\n- **Modelo 720** obligatorio si tus activos en el extranjero superan 50.000 EUR\n- **Modelo D-6** solo obligatorio si tu participación es ≥10% del capital o derechos de voto (Orden ICT/1408/2021)\n\nDeclaRenta automatiza todo esto.\n\n## Brokers soportados\n\n| Broker | Formato | Notas |\n|---|---|---|\n| Interactive Brokers | Flex Query XML | Trades, dividendos, corporate actions, posiciones |\n| Degiro | CSV (transacciones + cartera) | Delimitador auto-detectado (coma/punto y coma) |\n| Flatex | CSV (Depotumsätze + Kontoumsätze) | Dos ficheros: operaciones y movimientos de caja (dividendos/comisiones) |\n| Scalable Capital | CSV (14 columnas) | Incluye savings plans y distribuciones |\n| eToro | XLSX (cuenta completa) | Posiciones cerradas + dividendos + CFDs, 6+ versiones de cabeceras |\n| Freedom24 | JSON (report export) | Trades, dividendos, retenciones |\n| Revolut | XLSX (Trading Account Statement) | Posiciones cerradas (acciones y cripto) con PnL y comisiones |\n| Lightyear | CSV (Transaction Report) | Compras, ventas, dividendos, distribuciones, intereses |\n| Trade Republic | CSV (Actividad) | Operaciones de compraventa y dividendos |\n| Trading 212 | CSV (Historial de transacciones) | Operaciones de compraventa y dividendos |\n| Coinbase | CSV (historial de transacciones) | Crypto trades y conversiones |\n| Binance | CSV (historial de transacciones) | Spot trades, conversiones e ingresos cripto |\n| Kraken | CSV (trades/ledger) | Crypto trades y staking |\n\nSe pueden combinar ficheros de varios brokers en una sola ejecución para FIFO cruzado.\n\n## Modelos fiscales\n\n| Modelo | Descripción | Formato |\n|---|---|---|\n| **Modelo 100** (IRPF) | Casillas 0328, 0331, 1633, 1637, 0029, 0027, 0588 (pérdidas bloqueadas: informativo) | JSON, CSV, PDF (con tipos ECB) |\n| **Modelo 720** | Declaración de bienes en el extranjero (\u003e50.000 EUR), tipos A/M/C | Fixed-width AEAT (validado contra spec BOE) |\n| **Modelo 721** | Revisión orientativa de criptomonedas en el extranjero (\u003e50.000 EUR) | Generación oficial pendiente: AEAT exige XML |\n| **Modelo D-6** | Guía orientativa para participaciones significativas (Banco de España / AFORIX) | JSON o guía paso a paso |\n\n## Casillas del Modelo 100\n\n| Casilla | Concepto |\n|---|---|\n| 0328 | Valor de transmisión — acciones negociadas (importe total de ventas) |\n| 0331 | Valor de adquisición — acciones negociadas (coste total FIFO con tipos ECB) |\n| 1633 | Valor de transmisión — otros elementos (opciones, cripto, fondos no cotizados) y divisa (FX) |\n| 1637 | Valor de adquisición — otros elementos y divisa (FX) |\n| 0029 | Dividendos brutos de acciones extranjeras |\n| 0027 | Intereses de cuentas, depósitos y activos financieros (Art. 25.2 LIRPF) |\n| — | Intereses pagados al broker (margen, no deducible — informativo) |\n| — | Pérdidas bloqueadas por regla anti-churning (Art. 33.5.f/g) — informativo, no hay casilla agregada en Renta Web |\n| 0588 | Deducción por doble imposición internacional |\n\n\u003e La casilla **0327** es un campo de texto (denominación de los valores), no un importe. Las ganancias por tipo de cambio (Art. 33.1 LIRPF) se declaran junto a los «otros elementos patrimoniales» en las casillas 1633/1637.\n\n## Interfaz web\n\nLa web incluye:\n\n- **Wizard guiado**: subida de ficheros → revisión de datos → resultados con casillas detalladas\n- **Guías por broker**: instrucciones paso a paso para obtener el informe de cada broker\n- **Perfil fiscal**: NIF, nombre, CCAA y teléfono para generar 720/D-6 correctamente\n- **Secciones dedicadas**: Modelo 100, Modelo 720, Modelo D-6 con navegación lateral\n- **Gráficas interactivas**: distribución por activo, G/P mensual, composición de divisas, retenciones por país\n- **Comparativa interanual**: guarda informes en localStorage y compara variaciones año a año\n- **Detalle de casillas**: desplegable con explicación de cada casilla y su normativa\n- **PWA instalable**: funciona offline tras la primera visita\n- **Tema claro/oscuro**\n- **5 idiomas**: español, inglés, catalán, euskera, gallego\n\n## Inicio rápido\n\n### Web (recomendado)\n\nVisita [declarenta.com](https://declarenta.com) — arrastra tus ficheros y listo.\n\nSoporta `.xml`, `.csv`, `.json` y `.xlsx`. Se pueden subir varios ficheros a la vez para FIFO cruzado entre brokers.\n\n### Docker\n\n```bash\n# Web (nginx)\ndocker run -p 8080:80 drumsergio/declarenta:web\n\n# CLI\ndocker run --rm -v $(pwd):/data drumsergio/declarenta convert --input /data/flex_query.xml --year 2025\n```\n\n### CLI\n\n```bash\ngit clone https://github.com/GeiserX/DeclaRenta.git\ncd DeclaRenta \u0026\u0026 npm install \u0026\u0026 npm run build\n\n# Informe Modelo 100 (JSON a stdout)\nnode dist/cli.js convert --input flex_query.xml --year 2025\n\n# Varios ficheros de distintos brokers\nnode dist/cli.js convert --input ibkr.xml --input degiro.csv --input etoro.xlsx --year 2025\n\n# Exportar en CSV\nnode dist/cli.js convert --input flex_query.xml --year 2025 --format csv --output detalle.csv\n\n# Exportar en PDF\nnode dist/cli.js convert --input flex_query.xml --year 2025 --format pdf --output informe.pdf\n\n# Con compensación de pérdidas de años anteriores (Art. 49 LIRPF)\nnode dist/cli.js convert --input flex_query.xml --year 2025 --prior-losses perdidas.json\n\n# Modelo 720\nnode dist/cli.js modelo720 --input flex_query.xml --year 2025 --nif 12345678A --name \"APELLIDOS, NOMBRE\"\n\n# Modelo 720 con tipos A/M/C (comparando con declaración del año anterior)\nnode dist/cli.js modelo720 --input flex_query.xml --year 2025 --nif 12345678A --name \"APELLIDOS, NOMBRE\" --previous-720 720_2024.txt\n\n# Modelo D-6 (guía AFORIX)\nnode dist/cli.js d6 --input flex_query.xml --year 2025 --nif 12345678A --name \"APELLIDOS, NOMBRE\"\n\n# Modelo D-6 con detección de bajas (comparando con año anterior)\nnode dist/cli.js d6 --input flex_query.xml --year 2025 --nif 12345678A --name \"APELLIDOS, NOMBRE\" --previous-d6 d6_2024.json --format json\n```\n\nEl broker se auto-detecta a partir del contenido del fichero. Se puede forzar con `--broker \u003cnombre\u003e`.\n\n## Motor fiscal\n\n- **FIFO estricto** con tipos de cambio ECB oficiales por fecha de operación\n- **Todos los tipos de activo**: acciones, ETFs, opciones, futuros, forex, bonos, CFDs y criptomonedas\n- **Regla anti-churning** (Art. 33.5.f/g LIRPF): bloqueo **proporcional** de la pérdida si se recompra el mismo valor en 2 meses (cotizados en mercado regulado) o 1 año (no cotizados/cripto) — solo se difiere la parte correspondiente a la cantidad recomprada. La pérdida diferida no se suma al coste: se reintegra al transmitir los valores recomprados. Excluye derivados y forex\n- **Doble imposición** (Art. 80 LIRPF): deducción por retenciones en origen, desglosado por país\n- **Stock splits**: forward y reverse, con liquidación de fracciones (cash-in-lieu)\n- **Corporate actions**: fusiones (transferencia de coste) y spin-offs (distribución proporcional)\n- **Compensación de pérdidas** (Art. 49 LIRPF): ventana de 4 años con compensación cruzada del 25%\n- **Validador Modelo 720**: verificación contra la especificación BOE del formato de registro\n\n## Observabilidad: traza del motor de divisas (FX)\n\nPara auditar o depurar cómo se construye una cifra de divisa (casillas 1633/1637), DeclaRenta puede emitir una **traza completa de los movimientos internos del motor FX**: el libro mayor `acquire → park → unpark → discard → profit → dispose`, con el saldo del *pool* gastable y del principal aparcado tras cada paso. Permite reconstruir lote a lote, con tus propios datos, cómo se llegó a cada importe. Es una herramienta para usuarios avanzados y asesores; disponible desde la v0.52.0.\n\nEstá **desactivada por defecto** y nunca aparece en la interfaz normal (coste cero cuando está apagada).\n\n### En la web (modo diagnóstico)\n\nEl modo diagnóstico se activa de dos formas:\n\n- Añadiendo `#debug` a la URL: **`https://declarenta.com/#debug`**\n- O, de forma persistente, en la consola del navegador: `localStorage.declarenta_debug = \"1\"` y recargar.\n\n**El orden importa:** la traza solo se calcula si el modo diagnóstico está activo *al generar* el informe. Receta fiable:\n\n1. Entra directamente en `https://declarenta.com/#debug`.\n2. Sube tus ficheros y genera el informe.\n3. Pulsa **«Descargar traza de cálculo FX (diagnóstico)»** → se descarga `declarenta_fxtrace_\u003caño\u003e.csv`.\n\n\u003e En modo monodivisa, o si no hay movimientos de divisa, el botón avisa de que «no hay movimientos FX que trazar».\n\n### En la CLI\n\n```bash\n# Traza a un fichero, en CSV\nnode dist/cli.js convert --input flex_query.xml --year 2025 --fx-trace traza.csv --fx-trace-format csv\n\n# Traza a stderr (sin ruta), en JSONL (por defecto)\nnode dist/cli.js convert --input flex_query.xml --year 2025 --fx-trace\n```\n\n- `--fx-trace [fichero]` — sin valor vuelca a *stderr*; con una ruta, escribe el fichero (nunca contamina la salida estándar del informe).\n- `--fx-trace-format jsonl|csv` — `jsonl` (por defecto: una línea JSON por evento, ideal para máquinas/tests) o `csv` (tabla legible).\n\n### Formato de la traza\n\nCada fila es un movimiento del motor, con estas columnas:\n\n| Columna | Significado |\n|---|---|\n| `seq` | Número de orden del movimiento |\n| `date` | Fecha del evento |\n| `kind` | Tipo de movimiento (ver abajo) |\n| `currency` | Divisa (p. ej. USD) |\n| `trigger` | Origen del movimiento (conversión, dividendo, interés, compra/venta de valor…) |\n| `quantityFcy` | Cantidad de divisa movida |\n| `rate` | Tipo de cambio aplicado (EUR por 1 unidad de divisa) |\n| `costBasisEur` | Valor de adquisición en EUR |\n| `proceedsEur` | Valor de transmisión en EUR |\n| `gainLossEur` | Ganancia/pérdida FX realizada (solo en `dispose`) |\n| `poolBalanceFcy` | Saldo de divisa «gastable» tras el movimiento |\n| `parkedBalanceFcy` | Saldo de principal aparcado (en posiciones aún abiertas) |\n| `positionKey` | Posición a la que pertenece el principal aparcado |\n| `lotId` | Identificador del lote consumido (`UNKNOWN` = sin lote previo suficiente → ganancia FX forzada a 0). **Es un contador de orden de creación, compartido entre divisas — NO indica el orden FIFO.** |\n| `lotAcquireDate` | Fecha de adquisición original del lote consumido. **Esta es la prueba del FIFO:** en `dispose` consecutivos de una misma divisa es no decreciente (se consume siempre el dólar más antiguo primero). |\n| `note` | Aclaración del movimiento |\n\n\u003e **Por qué `lotId` (FX-N) no va en orden ascendente:** el número de lote se asigna al **crearse** el lote y es único para todas las divisas. Cuando vendes un valor en divisa, su principal vuelve a la *pool* conservando su **fecha de adquisición original** (antigua) pero con un número de lote **nuevo** (distinto, no necesariamente mayor), e insertado en su posición por fecha — así que una conversión puede consumir `FX-5` antes que `FX-2` si `FX-5` es más antiguo por fecha. Eso es FIFO correcto. La columna que hay que mirar para verificarlo es **`lotAcquireDate`**, no `lotId`.\n\nTipos de movimiento (`kind`):\n\n| `kind` | Qué representa |\n|---|---|\n| `acquire` | Entra divisa al *pool* (conversión EUR→divisa, dividendo o interés recibido) |\n| `dispose` | Sale divisa y se **realiza** la ganancia/pérdida FX (conversión divisa→EUR) |\n| `park` | Una compra de valor en divisa consume divisa del *pool* y aparca su coste de adquisición |\n| `unpark` | Una venta re-añade al *pool* el principal aparcado, a su coste original |\n| `discard` | Principal perdido en una venta con minusvalía (esa divisa nunca se convirtió a EUR) |\n| `profit` | El beneficio de una venta entra como divisa nueva, al tipo de la fecha de venta |\n\n## Privacidad\n\n- **Self-hosted**: los datos se procesan en tu equipo. La única conexión externa de la app es al API del BCE para tipos de cambio (datos públicos).\n- Sin analytics, sin tracking, sin telemetría.\n- La web guarda perfil fiscal y resúmenes interanuales en `localStorage` del navegador para evitar subir datos a servidores. Puedes borrarlos desde la comparativa interanual o limpiando los datos del sitio.\n- La interfaz web muestra la versión y commit exacto desplegado — puedes verificar que coincide con el código fuente en GitHub.\n\n## Desarrollo\n\n```bash\ngit clone https://github.com/GeiserX/DeclaRenta.git\ncd DeclaRenta\nnpm install\n\nnpm test              # Ejecuta la suite de tests\nnpm run dev           # Servidor web de desarrollo\nnpm run build         # Build completo (lib + web)\nnpm run lint          # ESLint\nnpm run typecheck     # TypeScript\nnode dist/cli.js convert --input test.xml --year 2025\n```\n\n## Comunidad y soporte\n\n- [**GitHub Issues**](https://github.com/GeiserX/DeclaRenta/issues) — bugs, feature requests, preguntas técnicas (preferido)\n- [**Telegram @declarenta**](https://t.me/declarenta) — canal de novedades y discusión\n\n## Contribuir\n\nLas contribuciones son bienvenidas. Áreas donde más ayuda se necesita:\n\n- **Parsers de brokers**: XTB, MyInvestor\n- **Reglas fiscales**: casos edge de FIFO, convenios de doble imposición por país\n- **Tests**: más fixtures con operaciones reales anonimizadas\n- **Traducciones**: las traducciones a catalán, euskera y gallego son automáticas — se necesita revisión por hablantes nativos\n\n## Sponsor\n\nSi DeclaRenta te ahorra tiempo (y dinero), considera apoyar el proyecto:\n\n[![GitHub Sponsors](https://img.shields.io/badge/Sponsor-♥-ea4aaa?style=flat-square)](https://github.com/sponsors/GeiserX)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FGeiserX%2FDeclaRenta","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FGeiserX%2FDeclaRenta","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FGeiserX%2FDeclaRenta/lists"}