Terminal Login
Proany email · password is planes · anything else tears the screen
Installation
npx shadcn add @useplanes/terminal-login
Works once the @useplanes registry is set up in your project (one-time). After that, copy and run commands directly.
Unlock with Planes Pro
$129 once · 159 Pro components · lifetime updates.
import { TerminalLogin } from "@/components/ui/TerminalLogin";
<TerminalLogin
banner="acme 2.4 tty1"
onSubmit={async (email, password) => signIn(email, password)}
onSuccess={() => router.push("/app")}
/>Examples
Paper white phosphor
A cooler tube with a custom banner and a longer message of the day.
<TerminalLogin
phosphor="#c8d8e0"
banner="northwind 3.1 ttyS0"
motd={["Last login: Mon Oct 5 22:41:07 on ttyS0", "You have mail."]}
/>Reject on the server
Resolve false and the screen tears, prints the error, and asks again. Nothing navigates until onSuccess.
<TerminalLogin
onSubmit={async (email, password) => {
const res = await fetch("/api/login", { method: "POST", body: JSON.stringify({ email, password }) });
return res.ok;
}}
onSuccess={() => router.replace("/dashboard")}
/>Use cases
Developer tool sign-in
A CLI, infra, or terminal product whose login should feel like the product.
Admin and staff portals
An internal console that doesn't need marketing chrome, only a prompt.
Launch and waitlist gates
An invite-only beta where typing a code into a tube is the whole point.
Themed events
Hackathon, CTF, or retro computing pages where the login is part of the set.