bradtraversy.dev — 2026-05-22-shipping-linesmith.md
home.md projects/ tools/ devlog/ × articles/ now.md about.md
2026-05-22 · #linesmith · #devlog #ship #typescript #vscode

# shipping linesmith

linesmith v0.1.0 is live on the vs code marketplace and open vsx. yesterday’s spec post covered why it’s an extension instead of a keystroke tool. today it shipped, one session, scaffold through publish.

what dogfooding caught

three bugs synthetic testing would have missed. all of them are the kind of thing where running an actual recording surfaces what “it works in dev host” never does.

chunks ran together. chunk one ended from 'react'; at end of line. chunk two started function Counter() { right after the semicolon, no separator. fix: ensureFreshLine checks cursor position and inserts \n or \n\n before each chunk based on whether the previous chunk ended mid-line. small thing; immediately obvious during a real take, invisible in a smoke test.

pause and stop greyed out the whole time playback ran. the webview was only being told about engine status on idle or cancelled transitions, so it rendered the engine as idle while typing was happening. fix: push state to the webview on every transition. the kind of bug where the implementation looks right and the ux is broken.

the killer one was detached panels. the detach-panel command moves the webview into its own os window via workbench.action.moveEditorToNewWindow. the point is to drag the controls off-screen so a screen recording captures only the editor. visually it worked. playback did nothing. cached TextEditor references go stale when an editor moves to an auxiliary window. fix: store document uris, not editor references, and look up the live editor at play time via vscode.window.visibleTextEditors, with showTextDocument as fallback.

i’d have shipped without these and gotten three day-one bug reports. running it on my own recording during the build was the cheap version.

both registries on day one

the vs code marketplace is the obvious target. but cursor and windsurf (which most of my audience is actually using) pull from open vsx, not from microsoft. so day-one publish to both registries was a hard requirement, not a v0.2 follow-up.

mechanically it’s two commands once setup is done:

  • marketplace: azure devops pat scoped to marketplace > manage, then vsce publish
  • open vsx: eclipse foundation account + publisher agreement, then ovsx publish

one gotcha each. the marketplace upload timed out the first try: the 1.65mb demo gif slowed it past the gateway limit; retry succeeded. on open vsx the namespace has to be created first (ovsx create-namespace bradtraversy) or publish 404s with a misleading “not authenticated” error.

the next thing is recording with it

i’m not starting v0.2 (cursor choreography) until i’ve recorded something real with v0.1. the design of the @directive system will shift based on what the actual recording flow exposes. synthetic dogfooding already caught three bugs in one session; trust the same loop for v0.2 scoping.

install linesmith on vs code, or search “linesmith” in cursor / windsurf. mit, free, source at github.com/bradtraversy/linesmith.

// EOF 2026-05-22-shipping-linesmith.md
main
2026-05-22-shipping-linesmith.md
UTF-8
LF
Markdown
Ln 1, Col 1