Application
Small software that does one thing and then gets out of your way. Browser tools and toys, with no accounts and no ulterior motives.
Stock Ticker
Add a ticker once, find it there forever.
Your tickers
Your ticker list is empty. Type a ticker above, or start with a few:
The watchlist
The page opens on five defaults: Meta, Apple, Nvidia, Google, Microsoft. Make it yours. The field above the list searches about 9,500 US-listed stocks, funds, FX pairs and crypto by ticker or company name; pick a match and it lands in the list. Each symbol gets its own cell: price, day change, a sparkline. The row of ranges above the cells, 1D through ALL, redraws every sparkline at that span. The header checkbox turns the scrolling strip off.
Tap a cell and it pushes a detail screen: the day's numbers, market cap, P/E, EPS, dividend yield, and a bigger chart with its own range tabs from one day to everything. The address bar carries #s=NASDAQ:AAPL while the screen is open, and that link reopens the same screen, on any symbol, listed or not.
Housekeeping lives behind Edit. It reveals Γ to remove and β‘ to reorder: drag with a pointer, or on the keyboard, where space lifts a row, arrows move it, and space drops it. Edit is also where watchlists are managed. Up to eight named lists, one showing at a time; the switcher stays out of the way until a second list exists.
The lists live in localStorage. They survive reloads and restarts in this browser, on this device, and go no further: no account, no sync, no database on my end. Clearing site data clears them. There is no export either, so a list built on a laptop stays on that laptop.
None of which makes it private from TradingView. Every symbol you add is passed to them to draw, so they see the list, your address, and the page you came from. The honest version of the claim is that nothing reaches a server of mine, because I don't have one.
Symbol formats
Search covers the US listings, cap-ranked so the match you meant comes up first. The same field still takes anything TradingView can resolve, typed raw: exchange-prefixed forms like NYSE:BRK.B and AMEX:VOO, FX pairs (EURUSD), crypto (BTCUSD, COINBASE:ETHUSD). A bare ticker the directory knows is upgraded to its listed form on the way in: aapl becomes NASDAQ:AAPL.
Outside the directory, bare tickers are first match, not canonical, and the first match is not always the famous one. SPX gets you SpaceX, not the S&P 500. Index and futures symbols mostly don't resolve at all on the free tier: ask for SP:SPX or CME_MINI:ES1! and the cell says the symbol is only available on TradingView, which is their way of saying that data costs money. TradingView's search gives the canonical form.
The cap is 25 symbols a list. That is a rendering budget, not a philosophy: each one is its own frame.
Where the numbers come from
TradingView, through its free embeddable widgets. No key, no account. That is also the constraint. US equity prices run about fifteen minutes behind, more on some exchanges, and TradingView decides what happens inside the frames. This is a glance, not a trading desk, and not advice.
Every free quote API I checked, Alpha Vantage and Finnhub and Polygon and Twelve Data, either restricts redisplaying quotes on a public page or charges for the right. An embed is the honest way to do this for nothing.
If the quotes don't load
A short note takes the place of the quotes. Usually that means a privacy extension or a network filter is blocking TradingView. It can also mean this site's content-security-policy hasn't been told to allow them, which is my fault rather than yours. Either way your saved symbols are untouched, and they come back when the quotes do.
Speed trial
Words per Minute
A word is five characters, by decree. The clock does the rest.
Test
shiftenter counts you in. Esc for settings.
Result
Stats
Per-key detail
Everything lives in this browser. Nothing leaves it.
Practice
Smoothed speed per key against your target. The lowest bar picks the next drill.
Modes
- Time. 15, 30, 60 or 120 seconds against a stream of common words, with punctuation and numbers as optional seasoning.
- Words. A fixed count: 10, 25, 50 or 100.
- Quote. Passages from Austen, Melville, Fitzgerald and friends. All of it published before 1931, all of it public domain, so the only thing being stolen is your time.
- Code. Real snippets in seven languages. Enter is a newline, indentation is skipped for you, and nothing auto-closes brackets, because your editor will not be there for you on a whiteboard.
- Blog. Excerpts from this site. Type the words you were going to skim.
- Custom. Paste anything. The draft is kept for next time.
- Drill. Generated from your own mistakes. See below.
The numbers
The headline wpm counts characters in correctly typed words, divided by five, per minute, the same definition this site's glossary uses. Around it: raw speed, keystroke accuracy, real accuracy of the final transcript (the two disagree when you correct a lot), a consistency score, and a per-second chart of the whole run.
Deeper in the stats: a keyboard heat map of your slowest and most-missed keys, your slowest cross-hand letter pairs, rollover (how often the next key goes down before the last one comes up, the strongest single predictor of speed in the Aalto 136-million-keystroke study), keystrokes per character, and an activity calendar with streaks. Every stat's label opens its exact formula. No mystery numbers.
Practice
The test remembers which keys are slow, which pairs stall, and which words you flub. Drill mode generates practice text weighted toward exactly those, with the weakest key present in every word. After a bad run, one click turns the words that cost you into their own drill. Monkeytype forgets your weak spots after every test; this one holds a grudge.
Your data
Everything lives in this browser. Nothing leaves it. Export the whole history as JSON or CSV, import it on another machine, and imports merge by id instead of overwriting, so combining two machines' histories is safe to do twice. Personal bests are kept per exact configuration, and a run under fifteen seconds saves as practice rather than polluting the record.
Colophon
The word list is derived from the MIT-licensed wikipedia-word-frequency dataset, Β© 2015 Ilya Semenov, an Ilya who is not me. Quotes are verbatim from pre-1931 editions. Code snippets are original. For which finger owns which key, the Home Row guide is next door.
Diff Viewer
Two versions in, every real change out. Reordered keys and trailing whitespace don't count.
Drop, paste, or type two versions. The differences appear below as you type.
Differences
How to use it
- Load two documents. Type or paste into the left and right panes, or drop a file onto either side.
- Pick a format, or let it guess. Auto-detect reads the file extension and a quick content sniff. Override it from the Format menu when you know better.
- Read the diff. Side-by-side on desktop, stacked and unified on a phone. Additions are green, deletions are red, and the changed words inside a line are tinted.
- Tune what counts. Toggle off whitespace, case, or blank-line changes. Switch between word-level and character-level highlighting.
- Take it with you. Copy or download a unified
.patch, or hit Share link to put the whole comparison in a URL.
Keyboard: Alt+β and Alt+β jump to the next and previous change.
What βsmartβ means
The viewer picks a strategy per format instead of treating everything as text:
- JSON parses both sides and compares structure, so key order and indentation never register. One changed value is one changed line.
- YAML parses to the same canonical, key-sorted form before diffing. Reordering a mapping is a no-op.
- XML and HTML are pretty-printed by the browserβs own parser, then compared line by line.
- CSV is parsed into a table and diffed cell by cell, so a single edited field doesnβt flag the whole row.
- Markdown gets a line-and-word diff plus a live rendered preview.
- Source code β 25+ languages (Python, C, C++, Java, Go, Rust, C#, TypeScript, Ruby, PHP, SQL, and more) get per-language syntax highlighting on every line, including the changed ones, auto-detected from the file extension or pasted content. Optional toggles ignore comment-only edits and treat reordered imports as unchanged, and long runs of unchanged lines fold into expandable, function-labelled separators.
- Plain text falls back to a classic line diff with word-level highlights.
If a document wonβt parse as its claimed format, the viewer says so and compares it as plain text instead. Nothing throws.
Privacy
Everything runs in your browser. The two documents, the diff, the patch, the share link: none of it is uploaded, because there is no server to upload to. The libraries are bundled into the page, so it works offline and keeps working if this site ever goes away. Close the tab and the only trace left is whatever you copied to your own clipboard, plus a draft saved to your browserβs localStorage so the panes survive a reload.
FAQ
Does it send my files anywhere?
No. The diff is computed locally in JavaScript. There are no network requests after the page loads.
How big a file can it handle?
Drops are capped at 2 MB, and binary files are rejected. Past about 2,000 lines the viewer drops intra-line highlighting and re-diffs when you click away rather than on every keystroke, to stay responsive.
Why does reordering JSON keys show no change?
Because JSON objects are unordered by definition. The viewer compares the parsed structure, not the text. Turn off βSort keysβ if you want key order to count.
What does the Share link contain?
Both documents and your current options, compressed into the URL after the #. The link never hits a server, so very large inputs can make it too long for some apps to pass around.
Can I diff two different formats?
You can, but it is rarely useful. The viewer detects one format for the pair. Set it explicitly from the Format menu if auto-detect guesses wrong.
Does it highlight source code?
Yes β 25+ languages, detected from the file extension (.py, .cpp, .rs, .go, β¦) or, for pasted snippets, from the content. Both the unchanged context and the changed lines are syntax-highlighted; changed lines also keep the word-level diff. Pick a language by hand from the Format menu if auto-detect guesses wrong. (A .h header is treated as C β switch it to C++ if you need C++-only keywords.)
What do βIgnore commentsβ and βIgnore import orderβ do?
βIgnore commentsβ drops comment-only edits, so a reworded comment isnβt flagged β line and single-line block comments, with multi-line blocks handled best-effort. βIgnore import orderβ treats a run of import / #include / use lines as a set, so reordering them shows nothing (it canonicalizes their order in the view).
What is βFold unchangedβ?
Long stretches of unchanged lines collapse into one separator, labelled with the enclosing function or class, so a small change in a large file stays readable β click a separator to expand it. It also keeps very large files fast.
Press Space or tap to flap