diff --git a/cmd/qrunproxy/static/index.html b/cmd/qrunproxy/static/index.html
index baaf093..2ae4eb3 100644
--- a/cmd/qrunproxy/static/index.html
+++ b/cmd/qrunproxy/static/index.html
@@ -181,13 +181,17 @@ function render(data) {
const hasSignal = !hasCue && cells.some(c => c.event && c.is_signal);
const rowCls = hasCue ? ' cue-row' : (hasSignal ? ' sig-row' : '');
- cells.forEach(c => {
+ cells.forEach((c, ti) => {
const div = document.createElement('div');
div.className = 'cell' + rowCls;
if (c.is_title) {
const block = data.blocks[c.block_id] || {};
const loop = block.loop ? ' \u21A9' : '';
div.innerHTML = `
${block.name || ''}${loop}
`;
+ } else if (c.is_chain) {
+ const nextCell = data.tracks[ti]?.cells[r+1] || {};
+ const sym = nextCell.is_start ? '\u2193' : '\u2502';
+ div.innerHTML = `${sym}
`;
} else if (c.block_id) {
const block = data.blocks[c.block_id] || {};
const isInfinity = r === numRows - 1 && !c.is_end && !c.is_title;
diff --git a/cmd/qrunproxy/timeline.go b/cmd/qrunproxy/timeline.go
index 2aebd10..97947e9 100644
--- a/cmd/qrunproxy/timeline.go
+++ b/cmd/qrunproxy/timeline.go
@@ -28,7 +28,7 @@ type TimelineCell struct {
IsTitle bool `json:"is_title,omitempty"`
IsSignal bool `json:"is_signal,omitempty"`
IsGap bool `json:"-"`
- IsChain bool `json:"-"`
+ IsChain bool `json:"is_chain,omitempty"`
row int `json:"-"`
track *TimelineTrack `json:"-"`
}