DOCS · UPDATED 7 SEPTEMBER 2026 · PREVIEW

Put a Valnivo widget on your site

Five pieces of the app, each one an iframe on your page: a projection, a what-if, a goal, a cross-border salary, an inflation table. Your visitor moves the sliders and sees the answer. No account, no key, and nothing about them reaches us.

Status: preview. All five work today at the addresses given, and Valnivo itself is still in testing and not yet intended for public use. Treat them as something to try and to tell us about rather than something to put in front of paying customers this week — and let us know before you rely on one, so we can warn you before anything about it changes.

§ Two lines, and you are done

<iframe
  src="https://valnivo.eu/embed/projection.html?currency=EUR&locale=fr-LU"
  title="Valnivo projection"
  loading="lazy"
  style="width:100%;border:0;height:420px"
></iframe>

Swap projection for any widget below. Each one is running further down this page, in exactly that iframe, with exactly the parameters shown beside it — so what you see is what you get when you copy the line.

§ Parameters every widget takes

NameWhat it doesDefault
currency Any ISO 4217 code — the currency figures are shown in. It changes the labels, not the arithmetic: nothing is converted except where a widget says so. EUR
locale A BCP 47 tag (fr-LU, de-CH, en-GB…) deciding how numbers are grouped and where the currency symbol sits. An unusable tag falls back rather than failing. en-GB

Unknown parameters are ignored, and a number outside a widget's range is clamped into it rather than breaking the page. A name added here later cannot break an embed that does not use it.

§ The five widgets

1 · Projection live

Two sliders — what you have today, what you put aside each month — and the total after 10, 20 and 30 years in both future and today's prices, with the return and inflation assumptions on screen and adjustable.

live · projection

Move the controls — it is the real widget, not a picture.

https://valnivo.eu/embed/projection.html?currency=EUR&locale=fr-LU

Message name: projection. No parameters beyond the two above.

2 · What if one thing changed? live

Two futures from one starting point: the one you are on, and the one where a single habit changes — put aside more, put aside less, or stop altogether. The difference is stated in both nominal and today's prices, over 10, 20 or 30 years.

live · scenario

Move the controls — it is the real widget, not a picture.

https://valnivo.eu/embed/scenario.html?currency=EUR&locale=fr-LU&have=20000&monthly=500&change=200&years=20
NameWhat it doesRangeDefault
haveStarting pot, in whole units.0–200 00020 000
monthlyWhat goes aside each month to begin with.0–3 000500
changeThe size of the change being tried, per month.0–1 000200
yearsWhich of the three horizons opens selected.10, 20 or 3020

Message name: scenario.

3 · What would it take? live

A goal read backwards: an amount, a number of years, what you have towards it, and the monthly figure that gets there — plus how much of the total is what you put in and how much is growth. It says "nothing" when the pot already grows past the target on its own, which is the honest answer.

live · goal

Move the controls — it is the real widget, not a picture.

https://valnivo.eu/embed/goal.html?currency=EUR&locale=fr-LU&target=50000&have=5000&years=10
NameWhat it doesRangeDefault
targetThe figure being aimed at, in whole units.1 000–500 00050 000
haveWhat is already there.0–200 0005 000
yearsHow long there is.1–4010

Message name: goal.

4 · Pay across a border live

A monthly salary in one country, in another country's money, and what each country's own inflation does to it over time. Thirty-seven countries, from Valnivo's bundled reference table.

live · crossborder

Move the controls — it is the real widget, not a picture.

https://valnivo.eu/embed/crossborder.html?locale=fr-LU&from=LU&to=PT&amount=4000&years=10
NameWhat it doesRangeDefault
fromWhere the salary is paid — ISO 3166-1 alpha-2.Any curated countryLU
toWhere it is being lived on.Any curated countryPT
amountMonthly pay, in the origin country's currency.500–20 0004 000
yearsHow far ahead to show the inflation effect.1–3010

Message name: crossborder. currency is ignored here — each side is shown in its own money.

What this one is not. It does not compare the cost of living, and it says so on screen. Rent, tax, childcare and groceries differ between two countries far more than the conversion does, and Valnivo holds no price-level or purchasing-power data to put a number on that. Please do not present it as a "should I move?" calculator.

5 · Inflation by country live

The inflation figures Valnivo actually projects with — the current rate and the long-run rate it glides to — for all thirty-seven curated countries, searchable, with what they do to a fixed sum over time.

live · inflation

Six countries here, so the preview stays short; leave countries off and you get all thirty-seven. Try the search.

https://valnivo.eu/embed/inflation.html?currency=EUR&locale=fr-LU&countries=LU,BE,FR,DE&sum=1000&years=10
NameWhat it doesRangeDefault
countriesA comma-separated list of alpha-2 codes, in your order. Omit it for all of them.Any curated codesall
sumThe sum whose purchasing power is shown.1–1 000 0001 000
yearsOver how many years.1–3010

Message name: inflation. The figures are the bundled reference table with its date shown; a widget never fetches a live figure, so a table on your page cannot change under you. All thirty-seven rows come to roughly 2 000px, so pass countries= unless you want the full list.

§ Letting a widget size itself

An iframe cannot grow to fit its contents, and these get taller as panels open. Each posts its height to your page whenever it changes; apply it and the frame follows, up or down:

<iframe id="valnivo" src="https://valnivo.eu/embed/scenario.html?currency=EUR&locale=fr-LU"
        title="Valnivo what-if" loading="lazy" style="width:100%;border:0;height:420px"></iframe>
<script>
  addEventListener('message', function (e) {
    if (e.origin !== 'https://valnivo.eu') return
    if (!e.data || e.data.source !== 'valnivo' || e.data.widget !== 'scenario') return
    document.getElementById('valnivo').style.height = e.data.height + 'px'
  })
</script>

The message is { source: 'valnivo', widget: '<name>', height: <pixels> } and carries nothing else — no figures, no identifiers. The widget name is given with each widget above, so a page can embed several and tell them apart.

Check e.origin. Any page in any frame can post a message to yours. That one line is what stops you resizing on a stranger's word. The previews on this page do the same thing, except that they compare against location.origin, because here the page and the widgets share an origin and on your site they will not.

§ Fitting your design

§ What it does with your visitor's data

Nothing at all, and that is a design rule rather than a coincidence. A widget:

  • keeps no account and asks for nothing;
  • writes no cookie and no localStorage, so it needs no consent banner from you on our behalf;
  • makes no request of its own once loaded — the numbers are computed in the browser;
  • runs no analytics and no advertising, ever.

Your visitor's browser does fetch the widget from valnivo.eu, which — like any request to any server — means our host sees an IP address and the usual request details. That is the whole extent of it. Our privacy notice says what happens to those. If a future widget ever stores or sends something about a visitor, this page will say so plainly and there will be an agreement to sign before you can use it; it will not change quietly under an existing embed.

§ Conditions of use

A projection is an illustration built on assumptions, and every widget says so inside the frame. Please leave that visible — do not overlay it, clip it out, or place a widget so that the line reads as your own recommendation. Two things follow from the same rule:

§ Changes, and what will not break

§ Still to come

Not built yet. Tell us which is worth doing first.

§ If something is wrong

Write to kabiljbeli011@gmail.com with the page you embedded it on and what you saw, or open an issue in the public feedback repository — that one is public, so keep anything private for the email.