Canopy studio
The new home page makes the grid the central object: select a market, shape a price band on its chart, review a funded mandate, and manage saved strategies visually. The earlier terminal remains at /launches.html; the earlier stock research page remains at /stocks/. Git checkpoint 77bb81c preserves the previous work before this redesign.
Graphics engine decision
Use TradingView Lightweight Charts 5.0.9, pinned and served locally (about 178 KB uncompressed), with a small custom SVG interaction layer. The library supplies time/price scales, pan, zoom, crosshair, line/candlestick series and volume rendering. Our layer uses public price/coordinate conversions and a series primitive lifecycle to stay aligned with chart redraws. It supports upper/lower handles, keyboard nudging, drawing a range, a freehand corridor, and undo. The custom code is restricted to grid interactions rather than recreating a chart engine.
Official plugin primitives support this extension model. TradingView's product comparison separates Lightweight Charts from the heavier Advanced Charts product. A general drawing suite is unnecessary for the current two-bound grid workflow. A later full technical-analysis terminal could justify that additional surface.
The attribution notice and link are available in the data/about dialogs, and the chart includes the TradingView attribution logo. License and NOTICE accompany the vendored renderer in web/grid/vendor/.
Product behavior
- Explore 434 saved stock/ETF and pons catalog entries, search by ticker/name/address, sort, and keep a browser-local watchlist. This is the known saved universe, not a claim of all chain markets.
- Inspect long reference-price histories as lines. Do not fabricate candles, volume, order books or live quotes from samples.
- Choose Goldsky trade bars when published locally, with 1-minute, 5-minute and 1-hour intervals. Keep USDG prices distinct from USD reference values.
- The main setup has two steps: set the price range, then choose a paper budget. Edit chart bounds or numeric inputs, with a suggested-range reset beside them. Interval count, arithmetic/geometric spacing and session are under a closed “More settings” disclosure that summarizes the current configuration. The range methodology and alternative presets are in a separate optional disclosure below the chart.
- Suggestions use the recent observed price distribution. They are deterministic research aids, not model-generated recommendations. The grid configuration boundary can accept a future validated AI proposal, but this preview does not pretend a model is connected.
- Review the resulting range and budget, then deploy a paper bot. Saved cards expose range, budget, source and mode, with editing, pause/resume, historical replay and reversible removal.
- Paper deployment creates a configuration in browser storage. It does not connect a wallet, sign a transaction or start live automation. Live deployment remains an architectural implementation project.
Data contract and cache policy
lib/grid-data.mjs exposes /api/grid/markets, /api/grid/history?id=ADDRESS&basis=reference|dex&interval=60|300|3600, and /api/grid/research?id=ADDRESS. It reads saved snapshots and the existing stock API adapter. It never calls Goldsky or another provider. Repeated browser requests are deduplicated by URL; disk JSON is cached by modification time. Reload to discover new published results.
Goldsky chart publications are read from data/stock-lake/published/history/{coingeckoId}.json through lib/stocks.mjs. The payload contains snapshot, quote currency, points, interval-keyed bars and coverage. The pipeline owns raw acquisition, caching, independent verification and publication. The UI must not re-run a backfill or treat a raw delivery as a checked chart publication.
The publication contains partial NVDA and SPY trade histories, priced in USDG, from checked event blocks. Counts and coverage grow as the pipeline publishes more cached data. It is not a full-session history or executable-liquidity validation. New publications can grow without rebuilding the terminal. Reference and DEX series are never spliced together.
Appearance
Four coordinated palettes soften the terminal: Sage (default), Warm stone, Mist and Wintergreen. The appearance menu updates surfaces, text, chart series, grid handles and bot cards together. Selection persists in browser storage. Buy/sell roles retain labels and distinct line patterns in every palette. Browser checks cover all four themes, persistence and the dark mobile layout.
HIG adaptation
Apple's Charts and Accessibility guidance informs clear titles, restrained visual density, descriptive labels and equivalent interactions. A green buy line and lavender sell line also differ in dash pattern and carry labels. The chart has a tabular observation alternative. Range handles support arrow keys (Shift for larger steps), and all essential configuration has numeric controls. The review is a native dialog with Escape support. Notifications remain until dismissed; removal can be undone. Motion is reduced when requested. Mobile uses a market drawer and stacks the editor below the chart.
This is a web adaptation, not a claim of native HIG certification or a complete assistive-technology audit.
Paper replay model
Replay is an explicit historical experiment, not a background service. It starts with quote cash, reserves exposure through bounded rung sizes, and arms a rung's sell only after its own buy obtains inventory. It fills at most one previously standing crossed rung per observation interval, using the next observed price. Gaps over two hours and excluded sessions do not create fills. A configurable internal assumption of 20 basis points per side is deducted; ending inventory is marked, not liquidated. Gas, adverse selection, deeper execution effects and terminal unwind costs are not established. Never describe the output as live P&L or proof of profitability.
Tests cover grid validity, geometric spacing, funded inventory, fee accounting, gaps, session exclusion and duplicate-rung prevention. Browser checks cover drawing and keyboard alternatives, source selection, invalid inputs, the paper bot lifecycle, persistent state, missing data and responsive layouts.