From 0cc5c106461fc8aefdc949eb7a8bc7c688acf90f Mon Sep 17 00:00:00 2001 From: Ned Twigg Date: Wed, 6 May 2026 14:46:50 -0700 Subject: [PATCH 1/4] Add phone-roaming signup form and rework README for launch Homepage gets a new #notify section after #download with a phone mockup, the upcoming-feature pitch, and a Substack subscribe form (custom UI, posts to substackapi.com with real validation and confirmation states). README rewritten to put completion detection and a hero image up top, surface the Playground/download/marketplace links before the dev quickstart, and remove the outdated "under construction" banner. Co-Authored-By: Claude Opus 4.7 (1M context) --- README.md | 36 +++++---- website/src/assets/phone-mockup.webp | Bin 0 -> 32678 bytes website/src/pages/Home.tsx | 109 ++++++++++++++++++++++++++- 3 files changed, 130 insertions(+), 15 deletions(-) create mode 100644 website/src/assets/phone-mockup.webp diff --git a/README.md b/README.md index 6f28bf0..c253c52 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,27 @@ -> [!CAUTION] -> This project is under construction and not ready for public use. Please check back in a few days! - # MouseTerm -Multitasking terminal for mice. +**Multitasking terminal for the mouse, tmux-compatible.** + +Run multiple terminals side-by-side, click to split, drag to resize. +When a pane stops outputting for two seconds, it's marked done — works +with any CLI tool, no plugins or config. + +![MouseTerm hero](website/src/assets/video-climb-blink-and-stare.webp) + +## Try it -- VSCode plugin or standalone desktop app -- tmux-compatible keybindings AND mouse -- alert system for notifying when a terminal task is done or waiting for user input +- **[Playground](https://mouseterm.com/playground)** — try in your browser, no install +- **[Demo videos and downloads](https://mouseterm.com)** — Mac, Windows, Linux +- **[Marketplace](https://marketplace.visualstudio.com/items?itemName=diffplug.mouseterm)** / **[Open VSX](https://open-vsx.org/extension/diffplug/mouseterm)** — VS Code extension (also works in Cursor, Windsurf, Antigravity) -Major URLs: -- [homepage with screen recordings](https://mouseterm.com) -- [download standalone app or VSCode plugins](https://mouseterm.com/#download) -- [playground and tutorial](https://mouseterm.com/playground) -- [production dependencies](https://mouseterm.com/dependencies) +## Features + +- **Automatic completion detection.** When a pane goes quiet for two seconds, it's marked done. Works with builds, AI agents, scripts, anything. +- **tmux-compatible keybindings.** Same prefix, same splits, same pane navigation. Muscle memory transfers. +- **Full mouse support.** Click to split, drag to resize, scroll to navigate. Or stay on the keyboard. +- **Copy-paste that works.** Click and drag selects text the way you'd expect, even in mouse-aware TUIs that normally swallow it as escape codes. Ctrl+C copies; killing the program is a separate gesture. +- **Sleep/wake panes.** Minimize a terminal to a compact status indicator. It keeps running and you can still see whether its task finished. +- **Dual distribution.** Standalone desktop app (Mac/Windows/Linux) or VS Code extension. ## Development @@ -23,8 +31,6 @@ The terminal is currently hosted by `node-pty`, but we plan on switching to a Ru ### Quickstart -Here are the key development loops: - ```sh pnpm install pnpm dev:website # vite hotreload at http://localhost:5173/playground @@ -54,3 +60,5 @@ This project was built with a combination of Claude, Codex, and Devin. Recommend ## License [FSL-1.1-MIT](LICENSE) — Copyright 2026 DiffPlug LLC + +[Production dependencies](https://mouseterm.com/dependencies) diff --git a/website/src/assets/phone-mockup.webp b/website/src/assets/phone-mockup.webp new file mode 100644 index 0000000000000000000000000000000000000000..17a9136152c28807182e9ab3f9625183cb8d5ff5 GIT binary patch literal 32678 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 literal 0 HcmV?d00001 diff --git a/website/src/pages/Home.tsx b/website/src/pages/Home.tsx index f36ef89..1976c74 100644 --- a/website/src/pages/Home.tsx +++ b/website/src/pages/Home.tsx @@ -9,7 +9,7 @@ import { TerminalIcon, WindowsLogoIcon, } from "@phosphor-icons/react"; -import { useEffect, useLayoutEffect, useRef, useState, type CSSProperties, type MouseEventHandler, type ReactNode } from "react"; +import { useEffect, useLayoutEffect, useRef, useState, type CSSProperties, type FormEvent, type MouseEventHandler, type ReactNode } from "react"; import SiteHeader from "../components/SiteHeader"; import posterUrl from "../assets/video-climb-blink-and-stare.webp"; import videoUrl from "../assets/video-climb-blink-and-stare.mp4"; @@ -18,6 +18,7 @@ import copyPasteVideoUrl from "../assets/video-copy-paste.mp4"; import tmuxVideoUrl from "../assets/video-tmux.mp4"; import visualStudioIconUrl from "../assets/visual-studio-icon.svg"; import tinyIconUrl from "../assets/icon-tiny-dark.png"; +import phoneMockupUrl from "../assets/phone-mockup.webp"; import standaloneLatest from "@standalone-latest"; export { Home as Component }; @@ -243,6 +244,89 @@ function DownloadGroupHeader({ ); } +const EMAIL_REGEX = + /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/; + +function NotifySignupForm() { + const [email, setEmail] = useState(""); + const [loading, setLoading] = useState(false); + const [success, setSuccess] = useState(false); + const [message, setMessage] = useState(""); + + async function handleSubmit(e: FormEvent) { + e.preventDefault(); + if (loading) return; + + if (!EMAIL_REGEX.test(email)) { + setMessage("Please enter a valid email"); + return; + } + + setLoading(true); + setMessage(""); + + try { + const response = await fetch("https://substackapi.com/api/subscribe", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + email, + domain: "https://nedshed.dev/", + }), + }); + const data = await response.json(); + + if (data.errors) { + setMessage(data.errors[0].msg); + } else if (data.requires_confirmation) { + setSuccess(true); + } + } catch { + setMessage("Something went wrong. Please try again."); + } finally { + setLoading(false); + } + } + + if (success) { + return ( +

+ Thanks — check your email to confirm your subscription. +

+ ); + } + + return ( +
+
+ setEmail(e.target.value)} + placeholder="you@example.com" + required + disabled={loading} + aria-label="Email address" + className="min-h-12 w-full rounded-md border border-[var(--color-text)]/20 bg-[var(--color-bg)] px-4 py-3 text-base text-[var(--color-text)] placeholder:opacity-40 focus:border-[var(--color-caramel)] focus:outline-none disabled:opacity-50 sm:flex-1" + /> + +
+ {message && ( +

+ {message} +

+ )} +
+ ); +} + function Home() { const videoRef = useRef(null); const posterRef = useRef(null); @@ -817,6 +901,29 @@ function Home() { +
+ MouseTerm Playground running on a phone +
+

+ Coming soon: walk away from any agent +

+

+ Auto-pair your laptop with your phone. Close your laptop with + Claude Code or Codex still running, and pick up the session on + your phone. No setup, no "I'm walking away" dance. +

+

+ Free with a room code. Auto-pairing across tools will be a paid + tier — first 100 founding members lock $24/yr for life. +

+ +
+
+