Cursorneeds your permission…northwind · Refactor session auth
) : null}
{k === "persist" && t >= 1.1 && t < 3.8 ? (
Window closed. The server kept going.
{PERSIST_PANES.map(([a, s]) => (
{s}
))}
) : null}
);
};
{/* Mintlify documents useState and useEffect in MDX, so the mutable clock and the
element handle live in state rather than refs.
Keep JS comments out of every export body in this file, line and block comments alike: the
hosted Mintlify build fails to parse a page that has one, and shows only a
"parsing error" placeholder. mint dev and mint validate accept it, so the only
place it shows up is the live site. Comment at the top level, like this. */}
export const Demo = () => {
const [st, setSt] = useState({ ch: 0, t: 0 });
const [c0] = useState(() => ({ ch: 0, start: 0, visible: true, last: 0, paused: 0 }));
const [el, setEl] = useState(null);
useEffect(() => {
const c = c0;
c.start = performance.now();
let raf = 0;
const tick = (now) => {
raf = requestAnimationFrame(tick);
if (!c.visible || document.hidden) { c.start = now - c.paused; return; }
let t = (now - c.start) / 1000;
if (t >= CHAPTERS[c.ch].d) { c.ch = (c.ch + 1) % CHAPTERS.length; c.start = now; t = 0; }
c.paused = now - c.start;
if (now - c.last < 33) return;
c.last = now;
setSt({ ch: c.ch, t });
};
c.paused = 0;
raf = requestAnimationFrame(tick);
const io = new IntersectionObserver(([e]) => { c.visible = e.isIntersecting; }, { threshold: 0.05 });
if (el) io.observe(el);
return () => { cancelAnimationFrame(raf); io.disconnect(); };
}, [el]);
const go = (i) => {
const c = c0;
c.ch = i; c.start = performance.now(); c.paused = 0;
setSt({ ch: i, t: 0 });
};
const cur = CHAPTERS[st.ch];
return (
{CHAPTERS.map((c, i) => (
))}
{cur.label}
);
};
export const Ico = ({ d }) => (
);
export const FEATURES = [
{ t: "Sessions that outlive the app", href: "/getting-started/concepts",
d: "M12 3v8M6.3 6.3a8 8 0 1 0 11.4 0",
p: "A background server owns your shells, not the window. Quit tty7 and your builds keep building. No tmux to learn or configure." },
{ t: "Editor-grade input", href: "/terminal/prompt",
d: "M5 6h14a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2zM7 10h.01M11 10h.01M15 10h.01M8 14h8",
p: "Ghost suggestions from your history, tab completion that explains each flag, syntax highlighting, click-to-place caret, real multi-line editing." },
{ t: "Agent-aware", href: "/agents/overview",
d: "M8 8h8a3 3 0 0 1 3 3v5a3 3 0 0 1-3 3H8a3 3 0 0 1-3-3v-5a3 3 0 0 1 3-3zM12 4v4M9.5 13h.01M14.5 13h.01",
p: "26 coding CLIs recognised on sight. Per-pane status dots, a notification when one needs you, and session resume after a reboot." },
{ t: "Remote work that feels local", href: "/remote/workspaces",
d: "M5 4h14a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2zM5 13h14a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-3a2 2 0 0 1 2-2zM7 7.5h.01M7 16.5h.01",
p: "A native Rust SSH stack with profiles, SFTP, and port forwarding — plus remote workspaces where files, repos, and panes stay on the far machine." },
{ t: "Git where you are looking", href: "/git/source-control",
d: "M6 3a2 2 0 1 0 0 4 2 2 0 0 0 0-4zM6 17a2 2 0 1 0 0 4 2 2 0 0 0 0-4zM18 5a2 2 0 1 0 0 4 2 2 0 0 0 0-4zM6 7v10M18 9v1a4 4 0 0 1-4 4H6",
p: "Branch and diff counts on every sidebar row, a source control panel, a diff overlay, GitHub issues and pull requests, and worktrees in one dialog." },
{ t: "Scriptable", href: "/cli/overview",
d: "M5 4h14a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2zM7 9l3 3-3 3M13 15h4",
p: "A bundled tty7 CLI that opens panes, sends keys, reads screens, and blocks until an agent needs you — so scripts and agents can drive the workbench." },
];
export const Features = () => (
Cursor needs your permission…northwind · Refactor session auth
⌘1
);
export const Bench = ({ title, hint, big, unit, rows, max }) => (
{title}
{hint}
{big}{unit}
{rows.map(([n, v]) => (
{n}{v} {unit}
))}
);
export const STEPS = [
{ t: "Install it", p: "Native builds for macOS, Windows, and Linux. No runtime to install first.", href: "/getting-started/installation", l: "Installation" },
{ t: "Set it up", p: "Five minutes of settings that pay for themselves: shell, font, theme, keys.", href: "/getting-started/first-launch", l: "First launch" },
{ t: "Learn the three words", p: "Workspace, tab, pane — and the server underneath them that keeps it all alive.", href: "/getting-started/concepts", l: "Core concepts" },
];
export const Home = () => (
Open source · written in Rust
A terminal you can leave running.
Close the window, reboot, walk to a different laptop — the shells you started are still there, and so are the coding agents you left working in them.