vjuu 0.5.0

Fast review window for AI-agent handoffs: markdown, diffs and code with inline comments.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>vjuu</title>
<!-- Fetch fonts alongside the scripts; otherwise first paint waits for them after layout. -->
<link rel="preload" href="vendor/inter.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="vendor/jetbrains-mono.woff2" as="font" type="font/woff2" crossorigin>
<link rel="stylesheet" href="vendor/diff2html.min.css">
<link rel="stylesheet" href="style.css">
<!-- After style.css, so a theme's colours win; compiled by vjuu from the themes folder. -->
<link rel="stylesheet" href="theme.css" id="theme-css">
<style id="theme-preview"></style>
</head>
<body>
<!-- The window is frameless: this is its title bar. Empty space drags the window. -->
<header id="titlebar">
  <svg id="brand" role="img" aria-label="vjuu" viewBox="-27 -33 1078 1078"><title>vjuu</title>
<path fill="#5e8c14" fill-rule="evenodd" d="M556.1 779.4C532.4 773.0 507.1 747.1 497.8 719.5C490.6 698.6 494.6 680.1 510.6 658.8C516.3 651.1 539.5 625.2 546.1 619.1C551.4 614.2 564.5 598.2 567.9 592.6C585.8 562.7 579.7 534.0 550.8 512.7C548.8 511.2 546.8 510.0 546.5 510.0C546.1 510.0 544.6 509.2 543.2 508.2C539.4 505.6 533.6 502.6 509.0 490.7C485.9 479.5 483.0 477.4 479.4 469.6C472.6 454.9 478.9 443.3 500.5 430.6C542.6 405.8 544.6 404.4 572.5 377.0C604.0 346.2 629.2 325.9 658.0 308.3C664.9 304.1 670.7 300.4 671.0 300.1C671.3 299.8 674.4 298.0 678.0 296.2C681.6 294.4 690.6 289.8 698.0 286.0C726.6 271.5 779.9 252.7 806.0 248.0C808.5 247.5 816.7 245.8 824.2 244.1C831.8 242.4 839.0 241.0 840.2 241.0C841.4 241.0 843.7 240.6 845.4 240.1C848.8 239.1 861.1 237.2 873.0 235.9C877.1 235.5 883.9 234.7 888.0 234.1C909.4 231.0 990.0 230.7 990.0 233.6C990.0 234.4 985.4 237.3 979.9 240.1C961.3 249.4 937.7 265.4 919.1 281.2C908.3 290.4 884.4 314.2 879.1 321.2C876.8 324.1 872.9 329.0 870.4 332.0C863.3 340.6 850.7 360.0 830.8 393.0C820.6 409.8 807.4 431.6 801.3 441.5C792.3 456.1 702.4 604.2 695.4 615.7C694.4 617.5 680.5 640.5 664.6 666.7C648.7 693.0 629.8 724.4 622.6 736.4C605.0 765.7 597.4 773.9 582.5 779.0C575.5 781.4 564.1 781.6 556.1 779.4ZM323.5 611.2C154.4 329.1 166.5 348.8 150.0 328.1C121.6 292.5 82.5 259.6 46.9 241.5C39.2 237.6 34.0 234.3 34.0 233.5C34.0 230.3 120.9 231.5 146.0 235.1C149.6 235.6 156.3 236.5 161.0 237.1C165.7 237.7 172.7 238.8 176.5 239.6C180.3 240.4 191.4 242.6 201.0 244.6C210.6 246.5 221.2 248.7 224.5 249.5C227.8 250.3 232.8 251.4 235.5 252.0C238.2 252.6 241.9 253.8 243.7 254.6C245.4 255.4 247.7 256.0 248.8 256.0C250.0 256.0 251.2 256.5 251.5 257.0C251.8 257.6 253.4 258.0 254.9 258.0C256.4 258.0 258.0 258.4 258.6 258.9C259.1 259.3 264.6 261.4 270.9 263.4C281.2 266.8 294.5 271.9 312.9 279.5C329.0 286.3 364.2 306.9 386.5 322.8C407.8 338.0 439.8 366.1 455.1 383.1C464.1 393.1 475.0 402.0 483.9 406.4C490.0 409.5 505.0 414.0 509.2 414.0C514.3 414.0 509.9 417.1 498.8 421.4C468.3 433.2 459.3 438.0 448.8 447.8C441.1 455.1 439.0 459.8 439.0 469.6C439.0 484.6 447.8 495.9 471.5 511.6C492.6 525.6 493.8 526.5 499.1 532.6C509.1 544.0 511.3 554.5 506.0 566.1C500.3 578.8 493.5 584.3 465.9 598.6C426.4 619.1 407.0 634.4 394.6 654.9C386.6 668.1 384.8 675.0 384.2 692.8C383.9 703.3 383.4 708.0 382.6 708.0C382.0 708.0 355.4 664.5 323.5 611.2Z"/>
<path fill="#a6e22e" fill-rule="evenodd" d="M475.0 581.4C444.9 576.0 410.0 553.3 377.1 517.8C356.7 495.7 343.7 479.3 320.0 445.5C288.1 400.1 275.6 384.6 250.6 359.1C210.7 318.6 171.6 289.3 129.5 268.3C107.1 257.1 49.1 237.0 39.3 237.0C37.6 237.0 37.0 236.4 37.0 234.6L37.0 232.3L56.2 231.8C84.7 231.0 146.5 233.7 152.3 235.9C153.7 236.4 158.1 237.1 162.1 237.5C166.2 237.8 172.7 238.7 176.5 239.5C180.3 240.4 191.4 242.6 201.0 244.6C210.6 246.5 221.2 248.7 224.5 249.5C227.8 250.3 232.8 251.4 235.5 252.0C238.2 252.6 241.9 253.8 243.7 254.6C245.4 255.4 247.7 256.0 248.8 256.0C250.0 256.0 251.2 256.4 251.5 257.0C251.8 257.6 253.4 258.0 254.9 258.0C256.4 258.0 258.0 258.4 258.6 258.9C259.1 259.3 264.6 261.4 270.9 263.4C281.2 266.8 294.5 271.9 312.9 279.5C329.0 286.3 364.2 306.9 386.5 322.8C407.8 338.0 439.8 366.1 455.1 383.1C464.1 393.1 475.0 402.0 483.9 406.4C490.0 409.5 505.0 414.0 509.2 414.0C514.3 414.0 509.9 417.1 498.8 421.4C468.3 433.2 459.3 438.0 448.8 447.8C441.1 455.1 439.0 459.8 439.0 469.6C439.0 484.6 447.8 495.9 471.5 511.6C492.6 525.6 493.8 526.5 499.1 532.6C506.8 541.3 508.5 545.2 508.4 554.0C508.4 563.2 505.1 570.8 498.0 578.2C492.7 583.7 489.8 584.1 475.0 581.4ZM577.5 558.2C577.4 539.9 569.6 526.5 550.8 512.7C548.8 511.2 546.8 510.0 546.5 510.0C546.1 510.0 544.6 509.2 543.2 508.2C539.4 505.6 533.6 502.6 509.0 490.7C485.9 479.5 483.0 477.4 479.4 469.6C472.6 454.9 478.9 443.3 500.5 430.6C542.6 405.8 544.6 404.4 572.5 377.0C604.0 346.2 629.2 325.9 658.0 308.3C664.9 304.1 670.7 300.4 671.0 300.1C671.3 299.8 674.4 298.0 678.0 296.2C681.6 294.4 690.6 289.8 698.0 286.0C726.6 271.5 779.9 252.7 806.0 248.0C808.5 247.5 816.7 245.8 824.2 244.1C831.8 242.4 839.0 241.0 840.2 241.0C841.4 241.0 843.7 240.6 845.4 240.1C848.8 239.1 861.1 237.2 873.0 235.9C877.1 235.5 883.9 234.7 888.0 234.1C899.6 232.4 948.4 231.0 968.8 231.7L987.0 232.3L987.0 234.7C987.0 236.2 986.4 237.0 985.2 237.0C982.9 237.0 964.0 241.6 956.5 244.1C953.2 245.1 949.6 246.0 948.5 246.0C947.3 246.0 944.7 246.9 942.5 248.0C940.4 249.1 937.0 250.3 935.1 250.6C933.1 251.0 930.4 251.9 929.0 252.6C927.6 253.4 921.1 256.3 914.5 259.1C885.3 271.6 843.9 295.6 829.9 308.0C827.5 310.2 825.1 312.0 824.6 312.0C821.5 312.1 780.2 349.7 763.8 367.5C742.5 390.4 732.7 402.9 702.3 445.3C695.9 454.2 690.4 461.7 690.0 462.0C689.6 462.3 688.4 463.9 687.4 465.6C685.2 469.2 672.6 485.4 662.4 497.9C651.9 510.6 632.1 530.9 620.1 541.1C614.3 546.1 607.2 552.1 604.5 554.5C590.0 567.0 586.8 569.0 581.6 569.0L577.5 569.0L577.5 558.2Z"/>
</svg>
  <nav id="tabs" title="Reviews (Ctrl+Tab, Ctrl+1–9)"></nav>
  <span id="session"></span>
  <span id="context"></span>
  <span id="name"></span>
  <button id="changes" hidden title="Toggle the changes since the previous version / the full file (d)">Full file</button>
  <button id="view" hidden title="Toggle unified / side-by-side (v)">Side-by-side</button>
  <button id="settings-open" title="Settings (Ctrl+,)">&#x2699;</button>
  <div id="window-controls">
    <button data-cmd="minimize" title="Minimize">&#xE921;</button>
    <button data-cmd="maximize" id="max" title="Maximize">&#xE922;</button>
    <button data-cmd="close" id="close" title="Close: sends every review as it is">&#xE8BB;</button>
  </div>
</header>
<nav id="files" hidden title="Files (f to hide)"></nav>
<div id="scroll">
  <main id="content"></main>
  <section id="overall-box">
    <label for="overall">Overall</label>
    <textarea id="overall" rows="3" placeholder="General comment (optional)"></textarea>
  </section>
  <button id="sel-comment" hidden title="Comment on the selected lines (c)">Comment</button>
</div>
<footer id="statusbar">
  <span id="count"></span>
  <span id="hint">&uarr;&darr; move &middot; Enter or click to comment &middot; &larr;&rarr; files &middot; F1 all keys</span>
  <button id="done" title="Send the review to the agent and close (Ctrl+Enter)">Submit &amp; continue <kbd>Ctrl</kbd><kbd>Enter</kbd></button>
</footer>
<dialog id="settings">
  <h2>Settings</h2>
  <label class="theme"><b>Theme</b> <select id="theme"></select></label>
  <div id="auto-themes">
    <label class="theme">When the system is light <select id="theme-light"></select></label>
    <label class="theme">When the system is dark <select id="theme-dark"></select></label>
  </div>
  <p class="cli"><button id="themes-open">Open themes folder</button> Copy a theme there to make your own.</p>
  <p>What vjuu opens for Claude Code:</p>
  <label><input type="checkbox" name="plan"><b>Plan review</b>
    <span>Open a finished plan before you approve it; comments send it back to Claude.</span></label>
  <label><input type="checkbox" name="ask"><b>Questions</b>
    <span>Answer Claude's questions here instead of the terminal picker.</span></label>
  <label><input type="checkbox" name="turn"><b>Turn review</b>
    <span>After each turn with edits, open the diff of what Claude changed.</span></label>
  <label><input type="checkbox" name="permission"><b>Permission prompts</b>
    <span>Allow or deny what Claude wants to run here, with the command or diff in full.</span></label>
  <label><input type="checkbox" name="focus"><b>Bring new windows to the front</b>
    <span>Off: a new review opens behind the window you are in, with a notification.</span></label>
  <label><input type="checkbox" name="tray"><b>Tray icon and notifications</b>
    <span>Show what is waiting in the tray, and notify when a window opens behind others.</span></label>
  <p class="cli">Also <code>vjuu config</code> in a terminal.</p>
  <button id="settings-apply" title="Esc cancels">Apply <kbd>Ctrl</kbd><kbd>Enter</kbd></button>
</dialog>
<dialog id="help">
  <h2><img src="logo.svg" alt="" width="28" height="28">vjuu <span id="version"></span></h2>
  <table>
    <tr><td><kbd>&uarr;</kbd> <kbd>&darr;</kbd> or <kbd>k</kbd> <kbd>j</kbd></td><td>Previous / next line or block</td></tr>
    <tr><td><kbd>&larr;</kbd> <kbd>&rarr;</kbd> or <kbd>p</kbd> <kbd>n</kbd></td><td>Previous / next file; in a single markdown file, heading</td></tr>
    <tr><td><kbd>Enter</kbd> or <kbd>c</kbd></td><td>Comment on the current line, or on the selected text</td></tr>
    <tr><td><kbd>Ctrl</kbd> <kbd>Enter</kbd></td><td>In a comment: save it. In settings: Apply. Anywhere else: Submit &amp; continue</td></tr>
    <tr><td><kbd>Ctrl</kbd> <kbd>Shift</kbd> <kbd>Enter</kbd></td><td>Submit &amp; continue, from anywhere</td></tr>
    <tr><td><kbd>Esc</kbd></td><td>Cancel the comment being written; close settings or this help</td></tr>
    <tr><td><kbd>1</kbd>&ndash;<kbd>9</kbd></td><td>Pick that option of the choice block under the cursor; again to take it back</td></tr>
    <tr><td><kbd>v</kbd></td><td>Toggle unified / side-by-side diff</td></tr>
    <tr><td><kbd>d</kbd></td><td>A revised plan: toggle its changes / the full plan</td></tr>
    <tr><td><kbd>x</kbd></td><td>Mark the diff file viewed: fold it and tick it in the sidebar; again to unmark</td></tr>
    <tr><td><kbd>o</kbd></td><td>Fold / open the diff file; lock, minified and generated files start folded</td></tr>
    <tr><td><kbd>f</kbd></td><td>Hide / show the sidebar</td></tr>
    <tr><td><kbd>Ctrl</kbd> <kbd>Tab</kbd> / <kbd>Ctrl</kbd> <kbd>Shift</kbd> <kbd>Tab</kbd></td><td>Next / previous tab</td></tr>
    <tr><td><kbd>Ctrl</kbd> <kbd>1</kbd>&ndash;<kbd>9</kbd></td><td>That tab</td></tr>
    <tr><td><kbd>Ctrl</kbd> <kbd>W</kbd></td><td>Close the tab: sends its review as it is</td></tr>
    <tr><td><kbd>Ctrl</kbd> <kbd>,</kbd></td><td>Settings (<kbd>&#x2318;</kbd> <kbd>,</kbd> on macOS)</td></tr>
    <tr><td><kbd>F1</kbd></td><td>This help</td></tr>
  </table>
</dialog>
<!-- Resize handles: the webview covers the window, so its edges have to be handled here. -->
<div class="edge" data-dir="n"></div><div class="edge" data-dir="s"></div>
<div class="edge" data-dir="e"></div><div class="edge" data-dir="w"></div>
<div class="edge" data-dir="ne"></div><div class="edge" data-dir="nw"></div>
<div class="edge" data-dir="se"></div><div class="edge" data-dir="sw"></div>
<script src="app.js"></script>
</body>
</html>