Self-hosted service
telepresenceio/telepresence avatar
telepresenceio/telepresence

Telepresence: replace, intercept, wiretap or ingest a Kubernetes workload

Local development against a remote Kubernetes or OpenShift cluster

7,333 stars585 forksGoApache-2.0

At a glance

What is it?
Telepresence is a CNCF project that puts a local process where a cluster workload runs, moving traffic, environment variables and volume mounts across a link from your workstation. The parts worth reading twice are the choice between an injected sidecar and a node-hosted agent, and how little the README says about installing any of it.
Who is it for?
Telepresence fits a developer who needs a real debugger against real cluster traffic and who can afford a traffic-manager in the cluster plus, by default, a restarted pod. Skip it when the namespace forbids new node pods or refuses injection into existing workloads.
Can I use it commercially?
Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository received new commits within the last day.
What is it written in?
Mainly Go, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on November 14, 2026, and from our analysis. They are not legal advice.

From daily snapshots

Star history

  • telepresenceio/telepresence7,333 ★ · +27
Star history
Repository2026-09-232026-11-14
telepresenceio/telepresence7.3k7.3k

27 Stars in the last 52 days, measured from the daily GitHub snapshot. Compare with other projects

Editorial analysis

A virtual interface on your laptop, a traffic-manager in the cluster

Connecting Telepresence leaves two objects between your workstation and the cluster. On your side it creates a virtual network interface, which is why cluster DNS names resolve and cluster IPs connect as if the machine sat inside the cluster network, with no port-forward per service. In the cluster, a traffic-manager holds the routing. Attaching to a workload then adds a traffic-agent beside it, and that agent hands three things across the link: the traffic the workload would have received, its environment variables, and its volume mounts.

So the local process is not merely pointed at the cluster. It inherits the remote container's runtime context, which is the reason a service behaves differently on your machine than it does behind a port-forward. Traffic-manager and traffic-agent are separate objects with separate jobs, and the README says nothing about the permissions or namespace the traffic-manager needs. Plan on reading the architecture overview and troubleshooting pages before you promise a team this works on their cluster.

Replace, intercept, wiretap, ingest: what each mode gives up

Four attachment modes decide how much of the remote workload your machine takes over, and each one is a different answer to the same question: whose requests stop being served by the remote container.

Replace substitutes your local process for the remote container, so the cluster sends the workload's traffic to you and the deployed copy stops being the thing under test. Intercept takes over one service port and leaves the rest of the workload alone. Wiretap hands you a copy of the traffic while the remote container keeps answering its own requests, which suits a change you want to watch without taking the service away from anyone else. Ingest takes the environment and the volumes and leaves the traffic in the cluster, useful when the problem is configuration rather than request handling.

Treat the choice as blast radius rather than preference: Replace puts the whole request path on your workstation, Intercept takes one service port, Wiretap gives you a copy while the remote container keeps answering, and Ingest leaves the traffic in the cluster. The README names all four modes but does not document the command line that selects them, so the mapping between mode and flag has to come from the external documentation.

Header and path filters decide whose requests you take

One developer intercepting one service is easy. Several developers sharing one cluster is the case the traffic filter exists for, and it is the reason Telepresence can sit in a shared dev environment at all. Requests are selected by HTTP header or by path, so an interception can be narrowed to the requests carrying your own marker. Whole clusters get shared between developers, and avoiding collisions there is the stated goal. That choice lands on your own client. When the selector is a header, something has to set that header: a test script, a browser session, whatever calls the service. Anything that does not set it keeps reaching the remote container, so a team has to agree on the selector value before the interception tells anyone anything. Forget that agreement and you will spend an afternoon wondering why your local process receives no requests from a colleague's test run.

Only HTTP header and path get named as selectors. No selector is given for a workload reachable only over raw TCP, and nothing says how filters behave when several people filter on the same service at once.

Sidecar injection versus the node-hosted agent

Traffic-agent comes in two shapes, and the shape has a cost. Injected as a sidecar, which is the default, the agent becomes a second container inside the remote pod. A node-hosted alternative runs as a pod on the node and attaches to the workload from outside it. Its payoff gets one line in the README: no injection, no pod restarts.

That line decides whether the tool is usable at all in your cluster. It matters when the workload is shared with other people, when the pod spec is owned by a controller you do not control, when the namespace policy rejects added containers, or when the target pod cannot be recreated without losing state. In each of those cases the default path costs something real: the remote pod's definition changes and the pod restarts to make room for the agent, which is a visible event for everyone else attached to that workload.

No flag, config key, or environment variable for choosing the node-agent form appears in the README. If restart-free attachment is a requirement rather than a nicety, locate that switch in the project's own documentation first.

Where the client comes from, and what a source build demands

The README carries no install command. It names an Installation page at https://telepresence.io/docs/install/client and a Quick Start Guide at https://telepresence.io/docs/quick-start, then stops there. Both the client install and the first connect command live off the repository page, which means you cannot work entirely from a clone.

Building from the repository is the part you can read locally. go.mod names the module and the toolchain floor:

go
module github.com/telepresenceio/telepresence/v2

go 1.27.1

The Makefile resolves the version before it does anything else, and pins the shell it runs under:

make
TELEPRESENCE_REGISTRY ?= ghcr.io/telepresenceio
TELEPRESENCE_VERSION ?= $(shell unset GOOS GOARCH; go run ./build-aux/genversion)
SHELL:=$(shell which bash)

Three things follow. Published images come from ghcr.io/telepresenceio. Version strings are generated by running build-aux/genversion rather than typed by hand, which is why the Makefile aborts unless the result begins with v2. And the build needs bash on PATH, so a minimal container without it fails before compiling anything. Check that version guard before you experiment with a branch other than release/v2.

Rollback, cleanup and version matching are absent from the README

Several things an adopter looks for first are simply missing. Rollback is not documented: nothing here tells you how to hand a workload back to its remote container after a debugging session ends, or what state the cluster is left in if your workstation disconnects mid-session.

Cleanup is not documented either. You cannot tell from the repository how an injected sidecar is removed afterwards, or how the traffic-manager is uninstalled from the cluster it lives in, and a cluster you share with other teams needs both answers before the first experiment, not after it. Client version matching is missing as well: v2.32.3 is the current release, and the README does not say how a client build is matched to a traffic-manager version.

Permissions for the traffic-manager are the gap that costs the most time, because they decide whether any of this works on your cluster and the README never states them. A second look at the top-level tree helps with the rest: charts/, k8s/, packaging/ and the troubleshooting path in the documentation are where deployment details live, not the README.

Where port-forwards and image rebuild loops stop being enough

Two other approaches cover part of the ground, and each stops where Telepresence begins.

A port-forward moves one port from one pod to your machine and installs nothing in the cluster, which is why it survives environments you are not allowed to change. In exchange you give up cluster DNS, cluster IPs, interception of a service's traffic, and every bit of the remote container's environment and volume mounts. That answers can I reach this pod, not can my debugger see what this service does.

Skaffold takes the opposite route, keeping your code inside the cluster: it builds and pushes an image on every change and replaces the running pod, so debugging happens where the workload actually runs and the pod stays the real artifact.

Telepresence inverts that trade. You keep the local debugger and the edit cycle, and you pay for it with a traffic-manager in the cluster and, on the default path, a modified and restarted pod.

Signing, sponsorship and a release branch as the default

Nothing is marked archived on the repository, and the last push was on 2026-11-02. Recent releases came about two weeks apart: v2.32.1 on 2026-09-25, v2.32.2 on 2026-10-08 and v2.32.3 on 2026-10-21. That cadence belongs to a v2 patch line, and the default branch is release/v2, so the tip you clone is a release branch rather than a staging area.

Governance is written down at the top level in CODEOWNERS, MAINTAINERS.md, GOVERNANCE-maintainer.md and SECURITY.md, and four named people hold committer and reviewer rights on the telepresence-maintainers team, with two administrators, @khussey and @thallgren, as approvers. OpenAI is the only past sponsor the README names. Licensing is Apache-2.0, which matters if you plan to run the traffic-manager inside a company cluster that audits its components.

One supply-chain detail is narrow and worth knowing: Windows release binaries and installers are Authenticode-signed through SignPath, and the README says nothing about signing for other platforms.

Editorial conclusion

Telepresence fits a developer who needs a real debugger against real cluster traffic and who can afford a traffic-manager in the cluster plus, by default, a restarted pod. Skip it when the namespace forbids new node pods or refuses injection into existing workloads. Before anything else, find out which client version your traffic-manager expects: the README states no compatibility range.

Frequently asked questions

How do you install the Telepresence client?

The README carries no install command. It sends you to the Installation page at https://telepresence.io/docs/install/client and to a Quick Start Guide at https://telepresence.io/docs/quick-start, so the client install and the first connect command are documented off the repository.

What does Telepresence do for Kubernetes?

It connects your workstation to a cluster so a local process receives the traffic a workload would get, with cluster DNS and cluster IPs reachable from the machine. A traffic-manager in the cluster and a traffic-agent next to the workload carry the traffic, environment variables and volumes.

How does Telepresence work?

It creates a virtual network interface on your workstation and routes cluster traffic through a traffic-manager deployed in the cluster. Attaching to a workload adds a traffic-agent, a sidecar or a node-agent, that hands the workload's traffic, environment and volumes to your machine.

What are the limitations of Telepresence?

The README names only HTTP header and path as traffic selectors, and documents none for other protocols. It also does not document rollback, how to remove an injected sidecar, how to uninstall the traffic-manager, or how a client version is matched to the traffic-manager.

Official sources

  1. License: Apache-2.0
  2. Project website
  3. README
  4. Releases
  5. telepresenceio/telepresence on GitHub
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/telepresenceio-telepresence.svg)](https://hysenlabs.com/projects/telepresenceio-telepresence)

Star history chart for your README

markdown
[![Star history](https://hysenlabs.com/chart/telepresenceio-telepresence.svg)](https://hysenlabs.com/projects/telepresenceio-telepresence)

Was this useful?