Een gratis beleggingsplatform voor Europese particuliere beleggers — live koersen, grafieken met indicatoren, een portefeuille die het rendement wél goed uitrekent, een ETF-index over heel Xetra, en koersalerts. Zonder account, zonder advertenties, zonder tracking, zonder cookiebanner. Gebouwd in zes dagen, in de standaardbibliotheek van Python, zonder ook maar één externe dependency.
Euronext-koersen lopen ±15 minuten achter. Dat staat op elk scherm erbij.
TradeScout is één pagina om je eigen beleggingen bij te houden en de markt eromheen te volgen. Het is gemaakt voor de Europese particuliere belegger — het soort mens dat een paar ETF's aanhoudt bij een Nederlandse of Duitse broker en zou willen weten wat hij nou eigenlijk bezit en wat het werkelijk heeft opgeleverd.
De meeste tools in dit hoekje willen je brokerinloggegevens, willen een abonnement, of zijn zo Amerikaans dat een Euronext-notering ze in de war brengt. TradeScout wil niets van dat alles. Je typt in wat je hebt — of importeert de CSV van je broker — en de rest wordt in je eigen browser uitgerekend.
Het begon op 22 juli 2026 als privégereedschap: iemand wilde een watchlist die Amsterdamse tickers liet zien zonder eerst in te loggen. Zes dagen later zat er een portefeuille in met tijdgewogen rendement, een ETF-index gebouwd op de officiële lijst van Deutsche Börse, een fiscaal jaaroverzicht voor je Box 3-aangifte, en bezoekers uit Duitsland en Italië die het op eigen houtje gevonden hadden.
Dat is de eerlijke ontstaansgeschiedenis, en het verklaart de vorm: het is ongewoon diep op de plekken waar één persoon het echt nodig had, en bewust leeg waar dat niet zo was.
De achterkant is Python zonder één externe package — alleen de standaardbibliotheek, van boven tot onder. HTTP, JSON, HMAC, hashing, CSV-verwerking, XBRL-uitlezen: allemaal stdlib. De voorkant is handgeschreven JavaScript zonder framework en zonder buildstap. De enige meegeleverde code van derden is TradingView Lightweight Charts (Apache-2.0, zelf gehost) voor de hoofdgrafiek; elke andere visualisatie — sparklines, heatmap, vergelijking, RSI- en MACD-panelen, allocatiebalken — is een eigen SVG-component.
Hetzelfde bestand, _portal.py, bedient zowel de lokale ontwikkelserver als de
productieomgeving. Het gratis hostingpakket staat hooguit twaalf functies per project toe,
dus alle 32 API-routes zitten achter één catch-all-functie met een rewrite ervoor.
De cache heeft twee lagen: het geheugen van de eigen instantie, met daarachter een gedeelde Redis. Een koude start leest uit Redis in plaats van bij de bron, en dat is precies wat voorkomt dat de koersbron een datacenter-IP gaat afknijpen. Redis bewaart waarden vijftien minuten langer dan hun houdbaarheidsdatum, zodat een verse instantie tijdens een storing nog steeds de laatst bekende koers kan tonen — een kapotte pagina is erger dan een koers van een kwartier oud.
Alle 365 tests draaien zonder netwerk. Dat is bewust: deze functies falen niet met een foutmelding, maar met een verkeerd getal, een stil verdwenen positie of een alert die nooit afgaat.
De naïeve portefeuillegrafiek telt elke euro die je bijstort als koerswinst. Eén storting
die de pot verviervoudigde leverde een "dagrendement" van +300% op en tilde de
geannualiseerde volatiliteit boven de 1.000%. De statistieken rekenen nu per dag met
(waarde − wat je die dag zelf inlegde) / waarde gisteren, waarbij de
kasstromen apart worden geteld in plaats van afgeleid uit de kostprijs — anders leest elke
wisselkoersbeweging als een storting.
De gids van 152 fondsen is met de hand samengesteld. Toen hij eindelijk tegen de officiële Xetra-lijst werd gelegd, rolden er zes fouten uit: drie fondsen stonden als herbeleggend gemarkeerd terwijl ze uitkeren (of andersom), en bij drie andere hoorde de ISIN bij een ánder fonds dan de naam ernaast. Dat laatste telt zwaar — die ISIN is precies wat er in de zoekbalk van je broker geplakt wordt. ISIN, ticker en kosten komen nu uit beursdata in plaats van uit het hoofd, en een offline test controleert van elke ISIN het controlecijfer.
De sync duwt het hele document, dus "de laatste wint" zou stilletjes weggooien wat het andere apparaat had gedaan — terwijl het scherm opgewekt "opgeslagen" meldt. Elke push stuurt daarom mee welk tijdstempel de client dacht te hebben; is het opgeslagen document nieuwer, dan geeft de server een 409 met dat document erbij en voegt de client samen met exact dezelfde functie die ook bij inloggen wordt gebruikt. Zonder dialoog, want er valt niets te kiezen.
Het hele portaal werkt zonder account; alles blijft dan in je browser en er gaat niets naar de server. Maar browseropslag is niet blijvend — WebKit ruimt hem op na zeven dagen zonder bezoek — dus er zijn twee uitwegen waarvoor je geen e-mailadres hoeft achter te laten. Een overzetcode parkeert je gegevens een kwartier in Redis onder een code van acht tekens, precies één keer op te halen. Of een tijdelijk account: geen naam, geen adres, alleen een willekeurig nummer en een herstelcode van zestien tekens die uitsluitend als hash wordt bewaard. Dat is bewust een kale SHA-256 en geen HMAC: er een sleutel aan hangen zou "het geheim roteren" veranderen van "iedereen moet opnieuw inloggen" in "iedereen is zijn account definitief kwijt".
Geen advertenties, geen trackers, geen verkoop van gegevens — in de privacyverklaring opgeschreven als belofte, niet slechts als huidige stand van zaken. Eén functionele sessiecookie, en alleen nadat je inlogt. Daarom is er ook geen cookiebanner.
Bezoekers worden anoniem geteld: geen cookies, geen opgeslagen IP-adressen. Unieke bezoekers per dag via een onomkeerbare hash die dagelijks wisselt, zodat gisteren en vandaag niet aan elkaar te koppelen zijn. De browsertaal wordt geaggregeerd geteld, los van enig bezoek — zo vielen die Duitse en Italiaanse bezoekers überhaupt op. Lees de volledige privacyverklaring.
Dit is een zes dagen oud project op een gratis hostingpakket met een daglimiet. Het is oprecht bruikbaar en oprecht onaf, en de beperkingen hieronder gaan je later niet verrassen.
.AS) zitten nog niet in de ETF-index, en bij vijf
fondsen spreekt de opgegeven TER de databron tegen zonder dat vaststaat wie gelijk heeft.
Allebei bekend en open.Gebouwd door één persoon in Nederland, in zes dagen, met Claude Code (Opus). Python 3-standaardbibliotheek · vanilla JavaScript · TradingView Lightweight Charts · een eigen Redis-server in Nederland. Data van Yahoo Finance, SEC EDGAR & XBRL, Finnhub, FRED, de ECB, de CFTC, de AFM, Deutsche Börse, Google Nieuws en alternative.me.
Feedback komt rechtstreeks bij de maker terecht via het tekstballonnetje in de kopbalk van het portaal — ingelogd of anoniem.
Koersen kunnen vertraagd zijn. De signalen zijn puur technisch en informatief en vormen geen beleggingsadvies. De cijfers op deze pagina zijn gemeten op 27 juli 2026.
A free investing portal for European retail investors — live quotes, charts with indicators, a portfolio tracker that does the return maths properly, an ETF index covering the whole of Xetra, and price alerts. No account needed, no ads, no tracking, no cookie banner. Built in six days, in Python's standard library, with no runtime dependencies at all.
Euronext quotes run ~15 min behind. The site says so, on every screen.
TradeScout is a single page for keeping track of your own investments and the markets around them. It is aimed at European retail investors — the sort of person who holds a few ETFs at a Dutch or German broker and would like to know what they actually own and what it actually returned.
Most tools in this space either want your brokerage credentials, want a subscription, or are American enough that a Euronext listing confuses them. TradeScout wants none of those. You type in what you hold — or import your broker's CSV — and everything is computed in your browser.
It started on 22 July 2026 as a private tool: one person wanted a watchlist that showed Amsterdam tickers without a login. Six days later it had a portfolio tracker with time-weighted returns, an ETF index built from the official Deutsche Börse listing, a tax year overview for the Dutch Box 3 declaration, and visitors from Germany and Italy who found it on their own.
That is the honest origin story, and it explains the shape of the thing: it is unusually deep in the places one person actually needed, and deliberately empty where they did not.
The backend is Python with no third-party packages — standard library only, top to bottom. HTTP, JSON, HMAC, hashing, CSV parsing, XBRL extraction: all stdlib. The frontend is hand-written JavaScript with no framework and no build step. The only vendored code is TradingView's Lightweight Charts (Apache-2.0, self-hosted) for the main chart; every other visualisation — sparklines, heatmap, comparison, RSI and MACD panels, allocation bars — is a bespoke SVG component.
The same file, _portal.py, serves both the local development server and
production. On the free hosting tier a project may have at most twelve functions, so all 32
API routes live behind one catch-all function with a rewrite in front of it.
Caching is two-layer: per-instance memory in front of a shared Redis. Cold starts read from Redis rather than hitting the upstream source, which is what keeps the quote provider from rate-limiting a datacenter IP. Redis holds values fifteen minutes past their TTL so that stale-while-error works even for a freshly started instance during an outage — a broken page is worse than a slightly old price.
All 365 tests run without a network. That is deliberate: these functions do not fail with an error message, they fail with a wrong number, a silently vanished position, or an alert that never fires.
The naive portfolio chart treats every euro you add as a gain. One deposit that quadrupled
the pot produced a "daily return" of +300% and pushed annualised volatility past 1,000%. The
statistics now compute per day as (value − what you deposited that day) / yesterday's
value, with cash flows counted separately rather than inferred from cost basis —
otherwise every exchange-rate move reads as a deposit.
The 152-fund guide was assembled by hand. When it was finally checked against the official Xetra listing, six errors fell out: three funds labelled accumulating when they distribute (or the reverse), and three ISINs that belonged to a different fund than the name beside them. That last category matters — the ISIN is what gets copied into your broker's search box. ISIN, ticker and cost now come from exchange data instead of from memory, and an offline test verifies the check digit of every ISIN.
Sync pushes the whole document, so last-write-wins would quietly discard whatever the other device did — and the UI would cheerfully say "saved". Every push now carries the timestamp the client believed it had; if the stored document is newer the server returns 409 with that document attached, and the client merges using exactly the same pure function it uses when you log in. No dialog, because there is nothing to choose.
The entire portal works with no account; everything lives in your browser and nothing reaches the server. But browser storage is not permanent — WebKit clears it after seven days without a visit — so there are two ways out that don't require an email address. A transfer code parks your data in Redis for fifteen minutes under an eight-character code, retrieved exactly once. Or a temporary account: no name, no email, just a random identifier and a 16-character recovery code stored only as a hash. It is a plain SHA-256 and not an HMAC on purpose — keying it would turn "rotate the secret" from "everyone logs in again" into "everyone loses their account permanently".
No ads, no trackers, no data sold — stated in the privacy policy as a commitment rather than a current state of affairs. One functional session cookie, and only after you log in, which is why there is no cookie banner.
Visitors are counted anonymously: no cookies, no stored IPs. Unique visitors are counted per day through an irreversible hash that changes daily, so yesterday and today cannot be linked. Browser language is counted in aggregate, unlinked to any visit — that is how the German and Italian visitors were noticed in the first place. Read the full privacy policy.
This is a side project six days old, running on a free hosting tier with a daily ceiling. It is genuinely useful and genuinely unfinished, and the limitations below are not going to surprise you later.
.AS) listings are not yet in the ETF index, and five funds have
a stated cost that disagrees with the data provider without it being clear which is right.
Both are known and open.Built by one person in the Netherlands, in six days, with Claude Code (Opus). Python 3 standard library · vanilla JavaScript · TradingView Lightweight Charts · a self-hosted Redis server in the Netherlands. Data from Yahoo Finance, SEC EDGAR & XBRL, Finnhub, FRED, the ECB, the CFTC, the AFM, Deutsche Börse, Google News and alternative.me.
Feedback goes to the maker directly, through the speech-bubble button in the site's header — logged in or anonymously.
Prices may be delayed. Signals are technical and informational and do not constitute investment advice. Figures on this page were measured on 27 July 2026.