basics

gold · BTC · US 10Y yield · S&P 500 (ES futures) · crude oil — five markets, one shared time axis, each on its own scale hubdecouplandscapefxratioxyzbasics loading…
Basics — gold · BTC · US 10Y · S&P 500 (ES) · crude oil on one shared time axis Five markets drawn together over the same period. They are priced in completely different units ($4,000 gold vs a 4.6% yield vs a 7,400 index), so each line is rescaled to fill the chart — what you are comparing is shape and timing: who turned first, who is going the other way. The numbers down the left edge are the real values of the ruler ticker (the one in candles). Tap a line — or its row on the tape below — to turn that ticker into candles and move the ruler to it; tap empty space to go back. The pills just switch a market on or off.
Chart controls — drawing, scale, splice, events, legend, reset, full screen and PNG are ON the chart, top-right
100% 70% 100%
↕ drag to resize chart height
Stretch tape — every ticker vs its own history
↕ drag to resize tape height
How to read this — and where every number comes from
What it isThe five markets that frame almost every macro conversation — gold, bitcoin, the US 10-year yield, the S&P 500 and crude oil — drawn on ONE shared time axis so you can see who moved first and who moved the other way.
Why each line is rescaledGold trades near $4,000, the 10-year near 4.6%, the S&P near 7,400. On one raw axis four of the five would be flat lines. Every series is therefore given its OWN scale and stretched to fill the canvas — the comparison is shape and timing, not level.
Reading real numbersThe left axis always prints the REAL values of the ruler ticker with its unit ($/oz, %, index, $/bbl). Tap a line or a pill to move the ruler — that ticker also becomes candles. Tap empty chart space to go back to all-lines with the S&P ruler.
Scale modesFill = each line stretched to its own high/low (shape). Z-score = standard deviations on one shared axis, so "+2σ" means the same rarity for every market (divergence). % = percent change since the window start (who moved most). The choice is saved.
The S&P and Nasdaq lines are FUTURESThe cash indices (^GSPC, ^NDX) print only 09:30–16:00 New York — 6.5 hours out of 24 — which left 17.5 hours of holes in the line every day. Since 2026-07-28 these two series are the continuous front-month CME futures, ES=F and NQ=F, the same instrument TradingView calls ES1! / NQ1!: ~23 hours a session (276 five-minute bars on a Monday versus the cash index's 78). The only holes left are the real CME daily break (17:00–18:00 New York) and the weekend. History and daily bars are the same futures back to September 2000, so there is no cash-to-futures seam anywhere in this app — nothing is stitched, shifted or basis-adjusted.
The 10-year yield is 24 hours^TNX is a CBOE cash index and prints only 09:30–16:00 New York, so on a 24-hour chart it used to stop dead for 17.5 hours. Treasuries themselves trade around the clock, so outside the cash session the line is continued from the CBOT 10-year note future (ZN=F): yield = last cash print + beta × (ZN price change). ZN is a price in points and 32nds and moves inversely to yield, so it is not a substitute — it is a conversion, and the conversion is stated. Beta (about −0.145 %-yield per price point, the on-the-run 10-year's DV01) is refitted from our own overlapping bars every response by least squares, and the composite re-anchors at every cash print, so the approximation error (convexity, the cheapest-to-deliver note changing — basis-point scale over one night) can never accumulate across days. Every synthesised bar is drawn faded and tagged ZN-implied in the legend, the tooltip, the readout, the CSV and the live-price tag. No silent blending.
The axis is SPLICED — dead sessions removedMarkets are shut most of the week, and a true-clock axis spends that space drawing nothing. Any stretch where the ruler ticker has no bars at all — the weekend, the daily CME halt — is cut out, so Friday's last candle and Sunday's reopen sit side by side. Each cut is marked on the chart with a dashed line and a tag (Sat-Sun, 1h halt), and the readout says how many seams and how much time were removed — you can always see that time is missing. Everything else stays real time: tooltips, the date line, trend lines and the window span (a "1 week" view still covers one real week, it is just drawn without the dead space). The threshold is 45 minutes, measured: the live minute data shows ordinary quiet gaps of 2-5 minutes and one real 61-minute CME halt, so 45 min removes the halt and the weekend and nothing else.
… except when Bitcoin is onBitcoin trades straight through the weekend, so while its pill is on the axis reverts to real clock time and Saturday and Sunday are drawn at full width — compressing them would throw away the one thing Bitcoin is there to show. Toggling the Bitcoin pill flips the axis live and re-fits the window. The Splice gaps button is the manual override for everything else; while Bitcoin is shown it is disabled and says real time. Consequence, stated: the axis follows the ruler ticker's sessions, so any other series that DID trade inside a spliced stretch (USD live on a Sunday) has that trading compressed into the seam. Show Bitcoin, or switch splicing off, to see those hours at full width.
Windows end at the last OPEN sessionNever at the wall clock. US markets are shut most of the day, so a "last 4 hours" keyed off now would be blank three quarters of the time. The readout prints the exact anchor timestamp and which instrument set it.
Candle resolutionEach window defaults to the finest candles the source can actually cover: 1-minute out to a week, 5-minute to a month, hourly to a year, daily for 5 years. Impossible combinations are greyed out with the reason; a forced downgrade is always printed.
The tape underneathSame data, second perspective. Rows are tickers, columns are time, colour is that ticker versus its own history (or versus SPX / NAS100 / the rest of the board). Lines give you the exact path; the tape shows correlation and divergence at a glance.
Trend lines are locked to the DATATurn Draw on, then drag to lay a hairline. Handles adjust the ends, a tap selects it. Each line stores the time and the real price of the ticker that owned the ruler when you drew it, and it is redrawn through that ticker's scale every frame — so it stays glued to its data through zooming, panning, pinching, a window switch (draw on 1d, it is in the same place on 4h and 1w) and a candle-ticker switch (lines belonging to other tickers keep their own scale). Lines never expire and never disappear on their own.
Trend-line styleTap any line you drew — the tool does not even need to be on — and a style bar opens beside it: colour, width (1 / 1.5 / 2 / 3 px), solid / dashed / dotted, opacity. The next line you draw inherits that style. The style bar also names the ticker the line is locked to. The default is a 1-px solid line in a colour no market on this chart uses, so an annotation can never be mistaken for data. The tap zone stays finger-sized no matter how thin the line is, and the styles are burned into Save-PNG and fullscreen.
Deleting linesOnly you delete a line. Delete removes the selected one; Delete all lines clears every line on every window and every ticker at once. Both pop a 5-second Undo at the bottom of the screen, so a mis-tap costs nothing. Everything is saved in this browser (localStorage), so your lines are still there tomorrow.
Reset viewOne tap refits the selected window edge to edge: the x-axis becomes exactly that window, the vertical scale returns to 1× with no offset, every line is re-fitted to the window and the dateline / identified line / candle mode are cleared. Double-tapping the chart does the same (it used to reset only the vertical view). The button sits in the control bar, in the collapsed phone bar and on the chart while it is full screen, so it is always one tap away.
Live price lineTap any line and it becomes the identified series — a dashed horizontal line is drawn at its current price with a colour-matched price tag pinned on the Y ruler, flashing green or red as it ticks. Only that one series is polled, at the fastest cadence its vendor can honestly sustain: Bitcoin and USD-live every second (real exchange prints), US equities every 2 s, the CME futures every 5 s, Yahoo-quoted lines every 10 s. The header prints the actual cadence — no line ever fakes a 1-second tick on a 10-second feed. Tapping empty space removes both the line and its feed.
Pills are names onlyEvery pill is just the readable name — Gold (GC), Bitcoin, US 10Y Yield, S&P 500 (ES fut), Nasdaq 100 (NQ fut), Crude Oil (WTI), NVIDIA, Semiconductors (SMH), SK Hynix US, SK Hynix Korea, Dollar Index (DXY), USD Live (USDT/KRW). No exchange code, no price, no extra buttons on the button. The exact symbol and the last price are in the pill's tooltip, in the legend burned on the chart, in the readout row under it and in the CSV, so nothing is lost.
One opacity sliderThere is a single Opacity slider and it fades the last pill you tapped — its label always names the target. Each line still remembers its own opacity, so you can fade them one at a time and they stay that way. Before you have tapped any pill the slider is disabled and says tap a pill.
Event dates — the red hairlinesA 1px vertical red line (60% transparent) marks every FOMC decision day and every mega-cap earnings date. FOMC dates come from the Fed's own calendar and are stamped on the second day of a two-day meeting, when the statement lands at 14:00 New York. Earnings dates come from Yahoo for AAPL, MSFT, NVDA, GOOGL, AMZN, META, TSLA and AVGO, anchored on the 16:00 New York closing bell of the report date — they all report after the bell. Hover or tap a line to name it (FOMC Jul 29, NVDA earnings Aug 26); several events on one date share one line and stack their labels. An estimated date says (est).
Hiding the event layerThe Events button in the control bar turns the whole layer off — zero lines, not faded ones — and the choice is saved in this browser. The dates themselves live in a record-first store on the server: the Fed calendar is re-read weekly, the earnings dates daily, and nothing is ever refetched or overwritten once it has happened.
Events and the spliced axisAn event line is projected through exactly the same time map the price lines use, so it can never land a column out. The one special case is an event that falls inside a stretch the axis removed (a weekend-dated print, a holiday): it snaps to the nearest kept column — the last bar before the gap or the first after it — so a hairline always sits on tradeable time rather than in the middle of a gap mark.
Fading everything but one lineThe Others slider fades every line except the one you last clicked (or the last pill you tapped) — a one-motion spotlight. It multiplies the per-line opacities rather than replacing them, so putting it back to 100% restores exactly what you had. The S&P 500 and NAS100 reference lines are never faded by it, because a benchmark you cannot see is not a benchmark.
Minimizing the boxesTwo things can be shrunk out of the way. Tickers ▾ collapses the whole pill box to a single tab that still says how many tickers are showing. Legend cycles the box burned in the chart's bottom-left corner through full (name, price, feed, session), min (colour chip and name only) and off. Both are saved in this browser, and whatever the legend is showing is what a saved PNG contains.
Chips on the chart, not in a barThe actions that belong to the chart sit on the chart, in its top-right corner, as tiny two- and three-letter chips: fit/z/% switches the Y-scale mode (the chip shows the mode it will switch to), fs full screen, png saves the image, rst resets the view and end appears only while the drawing tool is armed and leaves it. They look tiny but their touch targets are full thumb size, and each one's plain-English meaning is in its tooltip. They are HTML over the canvas, so a saved PNG never contains them.
Full screen really is full screenfs hands the chart the whole physical screen through the browser's own full-screen mode, so the address bar and tabs disappear rather than just being filled around. The tiny B at the top centre brings the browser back (Esc does too, on a keyboard). Where a browser refuses — iOS Safari only grants full screen to video — the chart falls back to filling the browser window and the B button's tooltip says so.
Scrolling the page on a phoneA finger on the chart pans and zooms the chart, which used to leave nowhere comfortable to scroll a long page. The strip down the left edge of each canvas — over the axis labels, where nothing is ever drawn — is reserved for the page: swipe there and the page scrolls, never the chart. It is marked with a faint ↕.
ColoursThe lines you can see always wear the most distinct colours available — red, blue, black, green, orange, purple, then greys and further-apart hues — and they are re-assigned every time you switch a pill on or off, so two visible lines are never similar shades. The S&P 500 keeps its reserved dark blue and the Nasdaq 100 its dark purple; no other line is allowed near those.
Touch — direct manipulationOne finger drags the chart both ways: sideways through time and up/down to move the vertical view. Two fingers pinch or spread, and the gesture is split by axis — spreading them apart sideways zooms time, up and down stretches the values, and a diagonal does both at once, always anchored on the point between your fingers. A tap identifies a line, a tap on empty space clears it, a long press drops the all-series date line, and a double tap is Reset view — the whole window refitted edge to edge (it used to reset only the vertical scale).
MouseWheel = zoom time, shift + wheel = stretch the values about the cursor, drag = pan both axes, shift-click = the all-series date line, double-click = Reset view (the window refitted edge to edge). The Y slider in the control bar and the pinch gesture drive the same number and stay in lockstep.
Where the live price comes fromGold, crude and now the S&P and Nasdaq series themselves (ES=F / NQ=F) ride the paid Massive Futures Advanced real-time CME feed (~1–2 minutes behind the tape). Yahoo's same futures symbols are ~10 minutes behind, so Massive leads them by about nine minutes. Bitcoin and the 10-year yield stay on Yahoo because that tier is not entitled to them — Massive's crypto and index endpoints answer delayed or 403. That entitlement gap is one more reason the index series are the futures: the futures ARE on the real-time feed, the cash indices never were. The header names the live feed per ticker; hover it for the exact lag and the reason for each.
Data + storageEvery fetch tail-extends a local store (data/bars/), so this app keeps more 1-minute and hourly history than Yahoo will ever serve again. Each stored bar carries its own source tag, one row per time bucket — the two feeds can never double-count a minute, and the real-time bar always wins. If Massive errors or rate-limits, that symbol silently falls back to Yahoo for that cycle and the chart never blanks. The page re-polls a light endpoint every ~25s without moving your view.
apps2 · basics — S&P 500 = ES=F and Nasdaq 100 = NQ=F, continuous front month (ES1!/NQ1!), ~23h a session, no cash splice · Massive Futures Advanced real-time on GC=F · CL=F · ES=F · NQ=F; Yahoo on BTC-USD · ^TNX (not entitled on this tier) and for all history · record-first local store, tail-extended, source-tagged per bar · apps2 hub