npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

investsteuer

v0.1.0

Published

Deutsche Kapitalertrag- und Investmentbesteuerung: Abgeltungsteuer inkl. Kirchensteuer, Teilfreistellung, Vorabpauschale und Verlustverrechnungstöpfe. Ohne Abhängigkeiten, mit Fundstelle an jeder Regel.

Readme

investsteuer

Deutsche Kapitalertrag- und Investmentbesteuerung als Bibliothek. Keine Abhängigkeiten, TypeScript-Typen inklusive, und an jeder Regel steht die Fundstelle.

English version

npm install investsteuer

Warum es das gibt

Die Regeln sind bekannt, aber sie werden fast überall zu grob umgesetzt. Drei Beispiele, die in fast jedem selbstgebauten Rechner falsch sind:

  • Kirchensteuer wird aufgeschlagen statt eingerechnet. Wer kirchensteuerpflichtig ist, zahlt nicht 25 % plus Kirchensteuer, sondern den ermäßigten Tarif nach § 32d Abs. 1 Satz 4 EStG: (e − 4q) / (4 + k). Bei 9 % Kirchensteuer sind das 24,45 % statt 25 % — die naive Rechnung liegt rund 0,6 Prozentpunkte zu hoch.
  • Die Vorabpauschale wird ohne ihre beiden Begrenzungen gerechnet. Der Basisertrag ist auf die Wertsteigerung des Jahres gedeckelt (§ 18 Abs. 1 Satz 3 InvStG), und im Erwerbsjahr fällt pro vollem Monat vor dem Kauf ein Zwölftel weg (§ 18 Abs. 4). Ohne beides kommt bei einem Fonds im Minus eine Steuer heraus, die es nicht gibt.
  • Verluste landen in einem Topf. Es sind zwei, mit einer asymmetrischen Regel: Aktienverluste dürfen nur Aktiengewinne mindern, übrige Verluste zusätzlich auch Aktiengewinne — nie andersherum (§ 20 Abs. 6 EStG).

Diese Bibliothek macht es richtig und sagt jeweils dazu, warum.

Verwendung

Abgeltungsteuer inklusive Kirchensteuer und Teilfreistellung

import { computeCapitalGainsTax, CHURCH_TAX_RATES } from "investsteuer";

const ergebnis = computeCapitalGainsTax({
  grossIncome: 5_000,      // Bruttoertrag
  fundType: "equity",      // Aktienfonds → 30 % Teilfreistellung
  allowance: 1_000,        // freier Sparer-Pauschbetrag
  churchTaxRate: CHURCH_TAX_RATES.other, // 9 %
});

ergebnis.teilfreistellungAmount; // 1500
ergebnis.taxBase;                // 2500
ergebnis.totalTax;               // 699.88
ergebnis.effectiveRate;          // 0.1400

Die Reihenfolge ist gesetzlich vorgegeben und nicht beliebig: erst Teilfreistellung (§ 20 InvStG), dann Sparer-Pauschbetrag (§ 20 Abs. 9 EStG) auf den bereits gekürzten Betrag, dann der Tarif.

Vorabpauschale

import { computeVorabpauschale } from "investsteuer";

const ergebnis = computeVorabpauschale({
  yearStartValue: 30_000,  // Rücknahmepreis am ersten Handelstag
  yearEndValue: 33_000,    // am letzten Handelstag
  distributions: 0,        // thesaurierend
  fundType: "equity",
  allowance: 1_000,
  churchTaxRate: 0,
  purchaseMonth: 1,        // 1 = ganzjährig gehalten
  basiszins: 0.032,        // 2026
});

ergebnis.vorabpauschale;       // 672
ergebnis.cappedByValueGrowth;  // false
ergebnis.fundLostValue;        // false
ergebnis.tax.totalTax;         // 0 — Pauschbetrag deckt sie ab

Ein Fonds, der im Jahr an Wert verloren hat, liefert vorabpauschale: 0 — nicht weil es so bequem ist, sondern weil § 18 Abs. 3 InvStG es so vorsieht.

Basiszins-Historie

import { BASISZINS_HISTORY, basiszinsFor, LATEST_BASISZINS } from "investsteuer";

LATEST_BASISZINS;        // { year: 2026, rate: 0.032, bmfLetter: "2026-01-13" }
basiszinsFor(2021);      // { year: 2021, rate: -0.0045, noVorabpauschale: true, … }

Lückenlos ab 2018, jeder Jahrgang mit dem BMF-Schreiben, das ihn festgesetzt hat. 2021 und 2022 waren negativ — in beiden Jahren fiel gar keine Vorabpauschale an, weil ein negativer Basisertrag durch Ausschüttungen nicht unterschritten werden kann.

Verlustverrechnungstöpfe

import { computeLossPoolCarryforward } from "investsteuer";

const jahre = computeLossPoolCarryforward([
  { year: 2024, stockGains: 0, stockLosses: 1_000, generalGains: 1_000, generalLosses: 0 },
]);

jahre[0].generalTaxableGain; // 1000 — Aktienverluste helfen hier NICHT
jahre[0].stockCarryOut;      // 1000 — sie werden vorgetragen

Fundstellen

| Regel | Norm | |---|---| | Abgeltungsteuer 25 % | § 32d Abs. 1 Satz 1 EStG | | Ermäßigter Tarif bei Kirchensteuer | § 32d Abs. 1 Satz 4 EStG | | Sparer-Pauschbetrag 1.000 / 2.000 € | § 20 Abs. 9 EStG | | Teilfreistellung 30 / 15 / 60 / 80 % | § 20 InvStG | | Vorabpauschale, Deckelung, Zwölftelung | § 18 InvStG | | Basiszins | § 18 Abs. 4 InvStG, jährliches BMF-Schreiben | | Verlusttöpfe und Vortrag | § 20 Abs. 6 EStG |

Die Basiszins-Werte für 2025 und 2026 wurden direkt aus den BMF-Schreiben ausgelesen, die älteren Jahrgänge gegen die Fachpresse gegengeprüft.

Grenzen

Bewusst nicht abgebildet: anrechenbare ausländische Quellensteuer (das q in der Tarifformel), Betriebsvermögen und Körperschaften (dort gelten höhere Teilfreistellungssätze), Altbestände vor 2009, sowie alles, was eine individuelle Veranlagung betrifft.

Diese Bibliothek rechnet Regeln nach. Sie ist keine Steuerberatung, und sie kennt deinen Einzelfall nicht.

Mitwirken

Fehler in einer Regel oder eine fehlende Fundstelle sind die wertvollsten Meldungen — bitte als Issue mit Norm und, wenn möglich, einer Beispielrechnung.

Herkunft

Herausgelöst aus Planafolio, einem Portfolio-Tracker mit Altersvorsorge-Planung für deutsche Privatanleger. Dieselbe Logik steht dort hinter den Steuerrechnern. Die Basiszins-Reihe gibt es zusätzlich als offenen Datensatz.

MIT-Lizenz.