Features
Newest at the left
The thread is a row of vertical columns. The oldest turn sits against the right edge and each new turn enters from the left, so your eye moves right→left through the conversation, the way it crosses a page of vertical Japanese. “Newest at the bottom” becomes “newest at the left.”
Speakers on one axis
A vertical thread has no left or right, so there are no chat bubbles. Each column names its speaker at the top, where reading begins: a filled mark for you, an open ring for the assistant.
A vertical composer
The input is the rightmost column, where reading and writing begin. It commits to vertical writing instead of dropping a horizontal bar into the layout. The honest trade-off: the CJK IME candidate window still assumes a horizontal baseline.
Answers streamed down the column
Replies come from a real model and stream character by character, top to bottom, a caret riding the writing head. Ask in 日本語, 한국어, or English, and the interface, persona, and reply all follow the language you pick.
Design Decisions
Why newest at the left, not the bottom?
“Newest at the bottom, scroll down” is a horizontal-page assumption. Vertical text advances right to left across columns, so “new” runs leftward. The thread right-anchors: a few turns hug the right edge; as it fills, older columns scroll off to the right while the newest stays in view.
Why is the composer a column, not a bar?
A bottom input bar is the horizontal chat skeleton showing through. The composer is the rightmost vertical column instead, keeping the whole surface on one reading axis: you write the next turn where reading starts. On phones a VisualViewport handler holds that column above the on-screen keyboard.
Why a real model behind a demo?
A canned reply proves the reading model but not the seam where live, unpredictable text meets vertical setting: digits, acronyms, mixed script, variable length. Real streamed answers are the stress test; a canned reply stays only as an offline fallback so the page always responds.
