Curo is a powerful, modern Dart library for performing instalment credit financial calculations - from simple loans to complex leasing and hire-purchase agreements.
This is a complete ground-up rewrite (version 3.0.0+) of the original curo package, now aligned with the latest Dart conventions and fully compatible in design and accuracy with its sister project, curo-python.
Explore the API documentation, try it live in the Curo Calculator app (built with this library), or browse the examples.
Curo goes beyond basic financial functions, offering features typically found only in commercial software:
- Solve for unknown payment/instalment amounts (
solveValue) - Compute implicit effective rates or regulatory APRs (
solveRate) - Support for multiple global day count conventions (US, EU, UK)
- Precise amortisation schedules and APR proof tables
- Weighted unknowns, charges, capitalised interest, and flexible series
Perfect for loan pricing, regulatory compliance (e.g., EU CCD, UK CONC, US Reg Z), leasing, or investment analysis.
Add Curo to your project:
dart pub add curo
# or
flutter pub add curoimport 'package:curo/curo.dart';
void main() async {
final calculator = Calculator(precision: 2)
..add(SeriesAdvance(amount: 10000.0, label: 'Loan'))
..add(SeriesPayment(numberOf:6, amount: null, label: 'Instalment'));
final convention = const US30U360();
final value = await calculator.solveValue(
convention: convention,
interestRate: 0.12); // => 1708.4
final rate = await calculator.solveRate(
convention: convention); // => 0.12000094629126792
final schedule = calculator.buildSchedule(convention: convention, interestRate: rate);
schedule.prettyPrint(convention: convention);
}Output:
post_date label amount capital interest capital_balance
---------------------------------------------------------------------------------------
2026-01-15 Loan -10,000.00 -10,000.00 0.00 -10,000.00
2026-01-15 Instalment 1,708.40 1,708.40 0.00 -8,291.60
2026-02-15 Instalment 1,708.40 1,625.48 -82.92 -6,666.12
2026-03-15 Instalment 1,708.40 1,641.74 -66.66 -5,024.38
2026-04-15 Instalment 1,708.40 1,658.16 -50.24 -3,366.22
2026-05-15 Instalment 1,708.40 1,674.74 -33.66 -1,691.48
2026-06-15 Instalment 1,708.40 1,691.48 -16.92 0.00import 'package:curo/curo.dart';
void main() async {
final calculator = Calculator(precision: 2)
..add(SeriesAdvance(amount: 10000.0, label: 'Loan'))
..add(SeriesPayment(numberOf: 6, amount: 1708.40, label: 'Instalment'));
final irr = await calculator.solveRate(convention: const US30U360());
// => 0.1200009462912679 ~ 0.12 or 12.0% (matches the input rate within precision)
final apr = await calculator.solveRate(convention: EU200848EC());
// => 0.1268260858796374 ~ 0.127 or 12.7% (regulatory APR under EU rules)
}Day count conventions determine how time intervals between cash flows are measured. Curo supports a wide range of conventions to meet global financial standards:
| Convention | Description |
|---|---|
| Actual ISDA | Uses actual days, accounting for leap and non-leap year portions. |
| Actual/360 | Counts actual days, assuming a 360-day year. |
| Actual/365 | Counts actual days, assuming a 365-day year. |
| EU 30/360 | Assumes 30-day months and a 360-day year, per EU standards. |
| EU 2023/2225 | Compliant with EU Directive 2023/2225 for APR calculations in consumer credit. |
| UK CONC App | Supports UK APRC calculations for consumer credit, secured or unsecured. |
| US 30/360 | Default for many US calculations, using 30-day months and a 360-day year. |
| US 30U/360 | Like US 30/360, but treats February days uniformly as 30 days. |
| US Appendix J | Implements US Regulation Z, Appendix J for APR in closed-end credit. |
Most conventions default to period-by-period timing. For XIRR-style calculations (time from first advance), pass useXirrMethod: true in the constructor. Actual365(useXirrMethod: true) matches Excel’s XIRR() exactly.
Cash flow diagrams visually represent the timing and direction of financial transactions. For example, a €10,000 loan repaid in 6 monthly instalments would look like this:
- Down arrows: Money received (e.g., loan advance).
- Up arrows: Money paid (e.g., instalments).
- Time line: Represents the contract term, divided into compounding periods.
Copyright © 2026, Andrew Murphy. Released under the MIT License.
- Examples: Dive into practical use cases in the documentation examples.
- Documentation: Refer to the code documentation for detailed class and method descriptions.
- Issues & Contributions: Report bugs or contribute on GitHub.
