import { useEffect, useState, type ReactNode } from 'react' import { PreviewImageLink } from '../components/PreviewImageLink' const contents = [ { id: 'install', label: 'install' }, { id: 'quickstart', label: 'quickstart' }, { id: 'usage', label: 'usage' }, { id: 'examples', label: 'examples' }, { id: 'https-certs', label: 'https & certs' }, { id: 'keymaps', label: 'keymaps' }, { id: 'search', label: 'search' }, { id: 'privacy', label: 'privacy' }, ] type DocsSectionProps = { id: string number: string title: string children: ReactNode } type CommandBlockProps = { children: ReactNode } function DocsSection({ id, number, title, children }: DocsSectionProps) { return (

// {number}

{title}

{children}
) } function CommandBlock({ children }: CommandBlockProps) { return (
      {children}
    
) } export function DocsPage() { const [activeSection, setActiveSection] = useState(contents[0]?.id ?? 'install') useEffect(() => { const sections = contents .map((entry) => document.getElementById(entry.id)) .filter((section): section is HTMLElement => section !== null) if (!sections.length) return const observer = new IntersectionObserver( (entries) => { const visibleEntry = entries .filter((entry) => entry.isIntersecting) .sort((a, b) => b.intersectionRatio - a.intersectionRatio)[0] if (visibleEntry?.target.id) { setActiveSection(visibleEntry.target.id) } }, { rootMargin: '-20% 0px -65% 0px', threshold: [0.1, 0.25, 0.5, 0.75, 1], }, ) sections.forEach((section) => observer.observe(section)) const onHashChange = () => { const next = window.location.hash.replace('#', '') if (next) setActiveSection(next) } window.addEventListener('hashchange', onHashChange) return () => { observer.disconnect() window.removeEventListener('hashchange', onHashChange) } }, []) return (

Docs.

Everything you need to get Termtap running in under a minute.

Download the binary for your OS from{' '} GitHub Releases :

https://github.com/haydenhargreaves/termtap/releases

Choose your OS/architecture asset, unpack it, and move tap into your PATH. Run{' '} tap cert if you need the HTTPS trust path.

Supported: macOS, Linux, Windows

If demand for other install methods grows, they can be added later.

Wrap any command with tap run --. Termtap will boot a local proxy, set the right environment variables on the child process, and stream every outbound request.

$ tap run -- go run .

You'll see a live request stream:

The general form:

$ tap run [flags] -- <your command>

--port Proxy port (default 8080)

Go application:

$ tap run -- go run .

Or use a custom port (default 8080)

$ tap run --port 8888 -- go run .

Termtap inspects HTTPS traffic by terminating TLS at a local proxy. It generates a local root CA and prints the certificate path with tap cert.

The cert lives in your user config directory and never leaves your machine.

RUN THE CERT COMMAND

$ tap cert

The command shows the cert path, whether your system already trusts it, and OS-specific trust instructions if you need them.

NOTE

Termtap uses a local CA to inspect HTTPS traffic. If an app ignores the system trust store, it may need to be pointed at the cert path printed by tap cert using that app's normal trust settings.

Trusting the CA only lets the app accept Termtap's certificate. Traffic still has to flow through the proxy for Termtap to see it.

On some Windows setups, trust propagation can be inconsistent. If HTTPS requests fail with cert errors, test with curl -k first to confirm proxying works, then finish trusting the CA from tap cert.

Termtap's terminal UI supports keyboard-first navigation. Use the shortcuts below to move around quickly while requests stream in.

Key Action
q Quit Termtap
ctrl+c Quit Termtap
j / down Move down in the focused pane
k / up Move up in the focused pane
tab Next details tab
shift+tab Previous details tab
1 Focus Requests pane
2 Focus Details pane
3 Focus Events pane (when visible)
4 Focus Stdout pane (when visible)
e Toggle Events pane
o Toggle Stdout pane
/ Open the search prompt
esc Close the search prompt
ctrl+r Restart the wrapped process

Tip: e and o are useful when you want more vertical space for the request and details panes.

Press / to open search. Filtering is live as you type and applies to the Requests pane.

Search supports free text and simple field filters.

Pattern Meaning
users api.example.com Free text; matches host and URL path (AND between terms)
method:get Method equals GET (case-insensitive)
status:404 Exact response status code
status:5xx Status class match (1xx-5xx)
method: get status: 5xx login Mixed filters + terms, including spaced filter syntax

Tip: press esc to close search and clear the active query.

Termtap is a local-only tool. It does not phone home, collect telemetry, or send any data anywhere.

  • > Captured traffic stays on your machine. It is held in memory and, if you opt in with --out, written only to the file you specify.
  • > The root CA generated on install is unique to your machine and is never transmitted.
  • > No analytics, no crash reporting, no usage pings - not opt-out, just absent.
  • > Termtap makes one outbound request: an opt-in version check, only when you run `tap update`.
  • > The source is open. Read it, audit it, run it offline.

Last updated: 2026-04-19. Questions?{' '} Open an issue.

{'<- back home'} edit on github ->
) }