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: '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 latest binary from{' '} GitHub Releases :

$ curl -L -o termtap.tar.gz https://github.com/termtap/releases/latest

Unpack the binary, place it on your PATH, and run tap cert if you need the HTTPS trust path.

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 8888)

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.

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 ->
) }