Skip to main content

Getting started

Loanly is a loan-management platform for the Icelandic lending market. It originates and services loans on a value-dated ledger, prices them with a calculator validated to the króna against a golden master, and exposes both an operations console (for staff) and a partner API (for originating partners who integrate programmatically).

What's in the box

  • Loan servicing — originate → activate → collect, with payments, prepayments, re-terms, early settlement ("pay up"), delinquency aging, late fees, and IFRS-9 provisions, all posted to a double-entry general ledger.
  • A calculator — annuity and other repayment methods, day-count conventions, borrowing fees, down payments, and grace periods.
  • An operations console — a React admin app for staff to service loans, manage products, borrowers, users, roles, and read the change audit log. See the Console.
  • A partner API — a dedicated, versioned /api/v1 surface so originating partners create and service loans with scoped, revocable API keys. See the Partner API.
  • The every-app plumbing — cookie + bearer + API-key auth, hybrid RBAC, email, background servicing sweeps, and OpenTelemetry — already wired.

The moving parts

Loanly runs as two HTTP hosts over one PostgreSQL database, orchestrated in development by .NET Aspire:

HostServesAuth
Admin APIthe operations console (SPA) + internal /api/* endpoints, and runs the background worker (servicing sweeps, disbursement dispatch)cookie (web) or bearer session (mobile)
Partner APIthe external /api/v1 loan-lifecycle surface — no workerAPI key (pat_…)

A migrator applies the schema and seeds the reference data (permission catalog, the Admin role + admin user, and the Partner service account), then exits; both hosts wait for it.

Run it locally

From backend-server/, start everything with Aspire (Postgres + migrator + both hosts):

dotnet run --project Loanly.AppHost

Open the Aspire dashboard it prints, then the admin console. Sign in with the seeded admin (configurable via Admin:Email / Admin:Password; defaults below):

admin@example.com / Admin123!

For the SPA on its own during development, run the Vite dev server from web-app/:

cd web-app && npm install && npm run dev # http://localhost:5173, proxies /api → :5259
npm run dev -- --mode demo # backend-free demo (MSW) — used for these screenshots

Where to go next