Skip to main content
Yanked

This release has been yanked by its maintainers, and will be ignored by installers, except when explicitly specified.
Consider using release 0.5.1 instead.

Cadrumo logo

Cadrumo: turn Spanish tax records into locally verified filing artifacts

Apache 2.0 license Project status: beta

Cadrumo turns local financial records into calculated, checked, and exportable artifacts for supported Spanish tax forms. It keeps the calculation path deterministic and preserves each result's sources.

Use Cadrumo to prepare a filing workspace, review the figures, and export a local file. You remain responsible for deciding what to file.

[!IMPORTANT] Cadrumo never submits a filing. Review every result, then file through official Agencia Estatal de Administración Tributaria (AEAT) channels.

Cadrumo is independent from AEAT and isn't affiliated with or endorsed by the authority. It doesn't provide tax, legal, accounting, or financial advice.

Public publishing remains blocked while package, repository, marketplace, domain, executable, and trademark gates are unresolved. Install Cadrumo only from an authorized source checkout.

Understand the names

  • Cadrumo is the product. Its package, distribution, repository, and plugin use the machine identifier cadrumo. Its permanent command-line interface (CLI) command is aeat.
  • AEAT is Spain's tax authority. The name remains in official portals, credentials, evidence, citations, and legal terminology.
  • A profile isolates one taxpayer's local settings, records, and filing workspaces.
  • A modelo is a Spanish tax form. A casilla is one registered field in that form.
  • A verified calculation revision is a saved calculation for which Cadrumo recorded a complete verification report. It isn't proof of filing or AEAT acceptance.

Run Cadrumo from source

Cadrumo requires Python 3.13 or later and uses uv for its local environment.

From an authorized source checkout, run:

python --version
uv sync
uv run aeat --version
uv run aeat --help

The aeat --version command verifies that aeat launches the Cadrumo CLI and reports CADRUMO followed by the installed version. The aeat --help command displays the Cadrumo command tree and options.

If you choose encrypted file storage, or Cadrumo falls back to it, the first command that opens local storage asks for a master-key passphrase. That passphrase unlocks the locally encrypted records. Operating-system-backed secret stores use their own unlock flow.

Don't install from the Python Package Index or a public plugin marketplace yet. A successful local build doesn't clear Cadrumo's publication gates.

Complete one local filing path

The following example uses fictional data to prepare Modelo 130 for the first quarter of 2026. It writes a local fichero-BOE, an AEAT-compatible, fixed-width filing file with the .boe extension. BOE stands for Boletín Oficial del Estado.

Long PowerShell commands use backticks for line continuation. Copy each complete block, including every backtick.

1. Create a profile

uv run aeat config profile create demo `
  --quiet --accept-defaults `
  --entity-type natural_person `
  --tax-id 12345678Z --name Ana --surnames "García López" `
  --activity consultoria --activity-start-date 2026-01-01 `
  --irpf-income-categories actividad_economica `
  --tax-residence-ccaa madrid

The profile becomes active. It is the storage authority for records you create or change and for the filing workspace. Read-only commands inspect that profile without creating records. Export writes the cleartext .boe file to the path you choose with --output.

2. Add two classified records

uv run aeat app ledger add `
  --date 2026-02-10 --amount 1210 --direction INCOMING `
  --description venta --classification BUSINESS `
  --taxable-base 1000 --iva-rate 0.21 --iva-amount 210

uv run aeat app ledger add `
  --date 2026-02-11 --amount 500 --direction OUTGOING `
  --description compra --classification BUSINESS `
  --category-id material_oficina --taxable-base 500

uv run aeat app ledger list

--amount is the transaction total. The fictional income records its taxable base and value-added tax (IVA) breakdown.

The fictional expense claims no deductible IVA quota. Its amount and Impuesto sobre la Renta de las Personas Físicas (IRPF) expense base are therefore both 500.

3. Create and calculate the filing workspace

The --binding options supply calculation inputs that don't come from these two ledger records.

uv run aeat app modelo work create --modelo 130 --year 2026 --period 1T

uv run aeat app modelo work calculate `
  --modelo 130 --year 2026 --period 1T `
  --binding modelo-130-resultados-negativos-anteriores=0 `
  --binding modelo-130-pagos-fraccionados-anteriores=0 `
  --binding irpf.previous_year_economic_activity_net_income=0

uv run aeat app modelo work revision --modelo 130 --year 2026 --period 1T

The two modelo-130-* bindings declare that this fictional first-quarter filing has no negative result or fractional payment carried from an earlier quarter.

irpf.previous_year_economic_activity_net_income=0 is different. It supplies the prior-year economic-activity income used to determine the low-income reduction; it isn't a quarterly carry.

4. Verify the calculation revision and export

uv run aeat app modelo work verify --modelo 130 --year 2026 --period 1T

uv run aeat app modelo export `
  --modelo 130 --year 2026 --period 1T `
  --output ./modelo-130-2026-1T.boe

Verification is local. It saves a report tied to the calculation revision and grants Verificado completo only when granted_verificado_completo is true.

Export selects that verified calculation revision and refuses an unverified draft. Before writing the file, it also checks the profile, required bindings, earlier-period state, saved ledger evidence, and evidence for any deductible IVA claimed.

For this input, the deterministic calculation reports:

casilla 03  500.00  net result
casilla 04  100.00  instalment amount
casilla 19    0.00  final result

The export command reports the output path, byte size, and 256-bit Secure Hash Algorithm (SHA-256) digest. The .boe file is cleartext and remains on your computer. It's a local AEAT-compatible artifact, not official filing evidence.

Official evidence comes from AEAT after filing. A justificante is AEAT's receipt confirming submission. A filed-declaration query shows AEAT's record of the filing.

A cotejo checks a document's authenticity using its Código Seguro de Verificación (CSV). Here, CSV is a security code, not a comma-separated-values file.

This result demonstrates the workflow, not the correct tax treatment for your circumstances. Review the full revision and resolve every blocker before using an export.

Choose a deeper route

Goal Documentation
Work through the longer tutorial Quickstart
Find task-specific commands How-to guides
Configure read-only AEAT access Authenticate with AEAT
Inspect the command tree Command-line interface (CLI) reference
Integrate Python code Application programming interface (API) entry point
Understand records, formulas, and provenance From records to figures
Determine which modelos apply and inspect support Choose a modelo
Understand architecture and boundaries Architecture
Diagnose a local problem Troubleshooting

The CLI and Python modules use the same deterministic application and calculation services.

Protect your data

  • Cadrumo encrypts app-managed financial records and evidence at rest in the active profile's local storage.
  • Original imported files stay at their source paths. Local exports are cleartext at the paths you choose.
  • Authenticated AEAT retrieval runs only when you invoke it. Those operations are read-only and cannot submit a filing.
  • Optional cloud classifiers receive the words, figures, and transaction fields you send to their providers.
  • Evidence text reaches a cloud classifier only after profile permission and invocation confirmation. Image evidence uses a local Ollama workflow.

Before using real data, read the filing boundary, security policy, and full disclaimer.

Get help or contribute

The repository remains private during the beta. If you have access, use these routes to report defects, handle security concerns, set up a workstation, and review changes:

Don't publish vulnerability details in an issue. A public support channel and guaranteed confidential contact aren't available yet.

Status, license, and disclaimer

Cadrumo is beta software. Behavior, schemas, commands, and persisted state may change without compatibility support before 1.0.

Cadrumo is available under the Apache License 2.0. It's provided as-is, without warranties or guarantees.

You are responsible for reviewing calculations, meeting deadlines, and filing through official AEAT channels. Read the full disclaimer for the advice, affiliation, responsibility, and liability boundaries.

Metadata

Release files for cadrumo 0.4.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for cadrumo 0.4.0
File Size Uploaded
cadrumo-0.4.0.tar.gz 60.2 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for cadrumo 0.4.0
File Interpreter ABI Platform
cadrumo-0.4.0-py3-none-any.whl Python 3 none any Details

Total release size: 135.6 MB

Release files / cadrumo-0.4.0.tar.gz

Download URL cadrumo-0.4.0.tar.gz
Size 60.2 MB
Tags Source
SHA-256 checksum
How to use checksums
933d94c69ff3e775bd09745c549ead3953ff3bd40a2458bfad3d7320aff57ce9
BLAKE2b-256 checksum
How to use checksums
cc7fda577b2abe8842a792ae88371b51958c6702e2f9cfaa7d12ead2fcc02058
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.9 {"installer":{"name":"uv","version":"0.12.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / cadrumo-0.4.0-py3-none-any.whl

Download URL cadrumo-0.4.0-py3-none-any.whl
Size 75.4 MB
Tags Python 3
SHA-256 checksum
How to use checksums
db258e6471e3433ddee717fa2ad48919767a9669ce300a663836528fc7d9c01d
BLAKE2b-256 checksum
How to use checksums
da4e4a7e02b0091e64b6beb4b84d68cd76c4d25641b7af2712d9807adf6ddd95
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.9 {"installer":{"name":"uv","version":"0.12.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release history Release notifications | RSS feed

0.5.1

2 release files

This release

0.4.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page