{"id":6066,"date":"2026-10-07T15:25:42","date_gmt":"2026-10-07T13:25:42","guid":{"rendered":"https:\/\/perso.uclouvain.be\/tom.barbette\/?p=6066"},"modified":"2026-10-21T17:47:30","modified_gmt":"2026-10-21T15:47:30","slug":"tired-of-ssh-and-claude-getting-frozen-when-you-switch-to-wifi-use-mptcp-on-macos","status":"publish","type":"post","link":"https:\/\/perso.uclouvain.be\/tom.barbette\/tired-of-ssh-and-claude-getting-frozen-when-you-switch-to-wifi-use-mptcp-on-macos\/","title":{"rendered":"Tired of SSH and Claude getting frozen when you switch to WiFi? Use MPTCP on macOS!"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Undock, and everything freezes<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Most of my work happens on remote Linux servers, through VS Code Remote-SSH, and more and more with Claude Code running inside that remote session. My MacBook sits on a dock with an Ethernet cable most of the day. Every time I unplug it to walk to a meeting, everything freezes: the terminal, the VS Code window, and Claude Code in the middle of a task. Nothing comes back until the dead TCP connection times out and VS Code reconnects. And the Claude session did not advance while I was away.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The reason is TCP itself. A TCP connection is bound to one source address, and when the Ethernet address disappears, the connection has nowhere to go. Multipath TCP (<a href=\"https:\/\/datatracker.ietf.org\/doc\/html\/rfc8684\" target=\"_blank\" rel=\"noopener\">RFC 8684<\/a>, introduce by my beloved colleague Olivier Bonaventure) fixes exactly this: one connection runs over several subflows, one per interface, and traffic moves from the Ethernet subflow to the WiFi one without the application noticing. Linux supports it since kernel 5.6, and macOS has an MPTCP client in its kernel. But it&#8217;s nearly hidden !<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So the question was simple: how do I make ssh on macOS open MPTCP connections? The answer took longer than expected. It ends with <a href=\"https:\/\/github.com\/UCLouvain-ENSG\/ssh-mptcp\" target=\"_blank\" rel=\"noopener\">ssh-mptcp<\/a>, a 300-line ProxyCommand that works with any ssh client, VS Code included. And yes, Claude did the 300 lines by himself. Thanks Claude.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Demo<\/h2>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"MPTCP on MacOS with a simple Proxy jump\" width=\"525\" height=\"295\" src=\"https:\/\/www.youtube.com\/embed\/hkhqbTNozUQ?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/www.youtube.com\/watch?v=hkhqbTNozUQ\">Video<\/a><\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">TL;DR<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">On the Mac, with the Xcode command line tools installed:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git clone https:\/\/github.com\/UCLouvain-ENSG\/ssh-mptcp.git\ncd ssh-mptcp\nmake &amp;&amp; make install   # installs ~\/.local\/bin\/ssh-mptcp\nmake check             # prints \"You are using MPTCP.\" if your Mac can do MPTCP<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then, in <code>~\/.ssh\/config<\/code>, for the servers you care about:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Host *\n    ProxyCommand ~\/.local\/bin\/ssh-mptcp %h %p<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">That is all on the client side. VS Code Remote-SSH reads the same file, so it needs no extra setting. The server must speak MPTCP too: it&#8217;s as easy as installing mptcpize and running &#8220;mptpize enable sshd&#8221;.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The search<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">OpenSSH does not want it<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The obvious first stop is a recent OpenSSH with an MPTCP option. There is none. Native support was proposed twice, in <a href=\"https:\/\/github.com\/openssh\/openssh-portable\/pull\/335\" target=\"_blank\" rel=\"noopener\">PR #335<\/a> and <a href=\"https:\/\/github.com\/openssh\/openssh-portable\/pull\/547\" target=\"_blank\" rel=\"noopener\">PR #547<\/a>, and the maintainers declined both: they do not want a protocol that is only available on some of the platforms OpenSSH supports. Linux is reaching nearly 100% of top computer, and nearly all servers. iOS and MacOS supports it. In Android it&#8217;s just not activated. On Desktop, only Windows is left<a href=\"https:\/\/perso.uclouvain.be\/tom.barbette\/mptcp-on-windows-with-wsl2\/\" data-type=\"link\" data-id=\"https:\/\/perso.uclouvain.be\/tom.barbette\/mptcp-on-windows-with-wsl2\/\"> but we also have a solution<\/a>. So yes, I&#8217;m a bit pissed off \ud83d\ude42 <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">The Linux tricks do not work on macOS<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">macOS has no <code>IPPROTO_MPTCP<\/code>. The kernel does have an <code>AF_MULTIPATH<\/code> socket family, used through <code>connectx(2)<\/code>, but it is undocumented and, according to <a target=\"_blank\" rel=\"noopener\" href=\"https:\/\/www.mptcp.dev\/faq.html#what-are-the-supported-operating-systems\">mptcp.dev<\/a>, it creates MPTCP connections without the extra subflows that make them useful. The supported way in is Network.framework: <code>nw_parameters_set_multipath_service()<\/code>, available since macOS 10.14, as the <a target=\"_blank\" rel=\"noopener\" href=\"https:\/\/www.mptcp.dev\/macOS.html\">mptcp.dev macOS guide<\/a> explains. So whatever opens the connection has to go through Network.framework, not through a socket.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Apple already patched ssh, sort of<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This is where it gets interesting. Apple ships its own fork of OpenSSH, and its <a target=\"_blank\" rel=\"noopener\" href=\"https:\/\/github.com\/apple-oss-distributions\/OpenSSH\/blob\/main\/openssh\/sshconnect.c\">sshconnect.c<\/a> already connects through Network.framework. It also has a hidden, undocumented option, <code>AppleMultipath<\/code>, present since Apple&#8217;s OpenSSH-281.40.2 release (July 2022). When it is set, ssh asks for <code>nw_multipath_service_handover<\/code> through a private call, <code>nw_parameters_create_legacy_tcp_socket()<\/code>, and extracts the kernel socket from the connection, so there is no relay process.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On paper, <code>AppleMultipath yes<\/code> in <code>~\/.ssh\/config<\/code> is all you need. In practice, it is fragile:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Homebrew&#8217;s ssh refuses the option.<\/li>\n\n\n\n<li>Apple&#8217;s code skips the Network.framework path, and multipath with it, whenever <code>ConnectTimeout<\/code>, <code>ConnectionAttempts<\/code>, <code>ProxyJump<\/code>, <code>ProxyCommand<\/code> or hostname canonicalization is set, or when the destination is an IP address.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">In my tests, with Apple&#8217;s ssh and the option accepted, tcpdump still showed a SYN with no MPTCP option at all, to a server that does speak MPTCP. I did not find out why: the private call is closed source.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">The result: ssh-mptcp<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of patching ssh, I moved the connection out of it. ssh already knows how to delegate its transport: <code>ProxyCommand<\/code> starts a program and speaks SSH over its stdin and stdout. <a target=\"_blank\" rel=\"noopener\" href=\"https:\/\/github.com\/UCLouvain-ENSG\/ssh-mptcp\">ssh-mptcp<\/a> is that program, about 300 lines of C on the public Network.framework API:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>ssh starts <code>ssh-mptcp host port<\/code>.<\/li>\n\n\n\n<li>ssh-mptcp creates an <code>nw_connection<\/code> to the server with plain TCP parameters, <code>TCP_NODELAY<\/code>, and <code>nw_parameters_set_multipath_service()<\/code>. Network.framework resolves the name, races IPv4 and IPv6, and asks the kernel for an MPTCP connection.<\/li>\n\n\n\n<li>Once connected, two loops relay the bytes: stdin to <code>nw_connection_send()<\/code>, and <code>nw_connection_receive()<\/code> to stdout.<\/li>\n\n\n\n<li>When the Ethernet cable goes, the kernel moves the connection to the WiFi subflow. ssh, and everything running over it, never sees it.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/UCLouvain-ENSG\/ssh-mptcp\">https:\/\/github.com\/UCLouvain-ENSG\/ssh-mptcp<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">ssh only talks to a pipe. The MPTCP connection and its subflows live in the kernel, so losing the Ethernet subflow changes nothing above it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Network.framework never hands out the underlying socket, so ssh-mptcp has to stay in the middle and copy the bytes, rather than pass a file descriptor back to ssh with <code>ProxyUseFdpass<\/code>. At SSH speeds, the extra process and the extra copy do not matter.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>-m<\/code> option picks one of the three modes Apple defines:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>handover<\/code> only uses another interface once the primary one is lost.<\/li>\n\n\n\n<li><code>interactive<\/code>, the default, also switches when the primary interface suffers loss or delay. It picks the lowest-latency path, which is what an interactive SSH session wants.<\/li>\n\n\n\n<li><code>aggregate<\/code> spreads the traffic over all interfaces. macOS refuses it to third-party programs unless you run <code>sudo sysctl net.inet.mptcp.allow_aggregate=1<\/code>.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">With <code>-v<\/code>, ssh-mptcp logs the interfaces in use and every path change to stderr, which is the easiest way to watch a handover happen. Because it is a plain <code>ProxyCommand<\/code>, it works with Apple&#8217;s ssh, Homebrew&#8217;s ssh, <code>git<\/code>, <code>rsync<\/code>, and VS Code Remote-SSH alike.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Server side<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">macOS only does MPTCP as a client, so the other end must be a Linux server (kernel 5.6 or later, <code>net.mptcp.enabled = 1<\/code>) whose sshd listens on an MPTCP socket. If it does not, the connection falls back to plain TCP: ssh still works, but the session will not survive the switch.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That&#8217;s actually easy, just install mptcpize and run &#8220;sudo mptcpize enable sshd&#8221; and the sshd service will be prefixed by a preloader that will change TCP by MPTCP. Don&#8217;t worry, MPTCP always fallbacks to TCP.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">SSH gateway<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Do you need to do this on all your server? No ! SSH ProxyCommands can be changed. Probably if your work has a bit of sense about security, you already have to hop through an SSH gateway. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That will enable to hop throu a SSH gateway (a machine just justed to hop through SSH) :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Host *_via_proxy\n    User XXX\n    ProxyCommand ssh -o StrictHostKeyChecking=no -A -X -Y -q &#91;gateway address] -W $(basename %h _via_proxy):%p\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">That will use ssh-mptcp as a hop for all destination :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Host *\n    ControlMaster auto\n    ControlPath \/tmp\/.ssh.%h\n    ServerAliveInterval 1\n    ServerAliveCountMax 300\n    ProxyCommand ~\/workspace\/openssh-mptcp\/ssh-mptcp -m interactive %h %p<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The controlsocket is unrelated but allows to reuse a single connection to multiplex all client connections. More efficient and the server does not thing it&#8217;s DDOSed when you have many many connection.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">With that, using ssh google.com_via_proxy will connect to google.com, via MPTCP, via your proxy.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Limitations<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">ssh-mptcp only covers what goes through ssh. Anything else on the Mac, including the Claude app&#8217;s own connections, still uses plain TCP, and MPTCP would also need the remote end to support it. The server must run MPTCP, and a middlebox on the path can strip the options, in which case the connection quietly falls back to TCP. macOS cannot accept MPTCP connections, so this does not help with a Mac acting as a server.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">MPTCP on macOS has been one API call away for years, but nothing in the ssh toolchain makes that call reliably, and the one place Apple did it is hidden and fragile. A small ProxyCommand on the public API is enough: my remote sessions, VS Code, and the Claude Code agent running inside them now survive leaving the dock. The code, README and build instructions are on <a target=\"_blank\" rel=\"noopener\" href=\"https:\/\/github.com\/UCLouvain-ENSG\/ssh-mptcp\">GitHub<\/a>, under the MIT license. If you are on Windows, my older post on <a target=\"_blank\" rel=\"noopener\" href=\"https:\/\/perso.uclouvain.be\/tom.barbette\/mptcp-on-windows-with-wsl2\/\">MPTCP with WSL2<\/a> covers the same use case there.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Sources<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/github.com\/UCLouvain-ENSG\/ssh-mptcp\" target=\"_blank\" rel=\"noopener\">ssh-mptcp on GitHub<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/datatracker.ietf.org\/doc\/html\/rfc8684\" target=\"_blank\" rel=\"noopener\">RFC 8684, TCP Extensions for Multipath Operation with Multiple Addresses<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.mptcp.dev\/faq.html\" target=\"_blank\" rel=\"noopener\">mptcp.dev FAQ: MPTCP with OpenSSH, supported operating systems<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.mptcp.dev\/macOS.html\" target=\"_blank\" rel=\"noopener\">mptcp.dev: MPTCP on macOS with Network.framework<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/openssh\/openssh-portable\/pull\/335\" target=\"_blank\" rel=\"noopener\">openssh-portable PR #335<\/a> and <a href=\"https:\/\/github.com\/openssh\/openssh-portable\/pull\/547\" target=\"_blank\" rel=\"noopener\">PR #547<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/apple-oss-distributions\/OpenSSH\/blob\/main\/openssh\/sshconnect.c\" target=\"_blank\" rel=\"noopener\">Apple&#8217;s OpenSSH, sshconnect.c<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/apple-oss-distributions\/xnu\" target=\"_blank\" rel=\"noopener\">XNU sources<\/a> (bsd\/netinet\/mptcp_usrreq.c, tcp_cache.c)<\/li>\n\n\n\n<li><a href=\"https:\/\/developer.apple.com\/documentation\/network\/nw_multipath_service_t\" target=\"_blank\" rel=\"noopener\">Apple documentation: nw_multipath_service_t<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/multipath-tcp\/mptcp-check\" target=\"_blank\" rel=\"noopener\">mptcp-check, the server behind check.mptcp.dev<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Undock, and everything freezes Most of my work happens on remote Linux servers, through VS Code Remote-SSH, and more and more with Claude Code running inside that remote session. My MacBook sits on a dock with an Ethernet cable most of the day. Every time I unplug it to walk to a meeting, everything freezes: &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/perso.uclouvain.be\/tom.barbette\/tired-of-ssh-and-claude-getting-frozen-when-you-switch-to-wifi-use-mptcp-on-macos\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Tired of SSH and Claude getting frozen when you switch to WiFi? Use MPTCP on macOS!&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[15],"tags":[],"class_list":["post-6066","post","type-post","status-publish","format-standard","hentry","category-network"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Tired of SSH and Claude getting frozen when you switch to WiFi? Use MPTCP on macOS! - Tom Barbette<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/perso.uclouvain.be\/tom.barbette\/tired-of-ssh-and-claude-getting-frozen-when-you-switch-to-wifi-use-mptcp-on-macos\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Tired of SSH and Claude getting frozen when you switch to WiFi? Use MPTCP on macOS! - Tom Barbette\" \/>\n<meta property=\"og:description\" content=\"Undock, and everything freezes Most of my work happens on remote Linux servers, through VS Code Remote-SSH, and more and more with Claude Code running inside that remote session. My MacBook sits on a dock with an Ethernet cable most of the day. Every time I unplug it to walk to a meeting, everything freezes: &hellip; Continue reading &quot;Tired of SSH and Claude getting frozen when you switch to WiFi? Use MPTCP on macOS!&quot;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/perso.uclouvain.be\/tom.barbette\/tired-of-ssh-and-claude-getting-frozen-when-you-switch-to-wifi-use-mptcp-on-macos\/\" \/>\n<meta property=\"og:site_name\" content=\"Tom Barbette\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-07T13:25:42+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-21T15:47:30+00:00\" \/>\n<meta name=\"author\" content=\"Tom Barbette\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@TomBarbette\" \/>\n<meta name=\"twitter:site\" content=\"@TomBarbette\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Tom Barbette\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/tired-of-ssh-and-claude-getting-frozen-when-you-switch-to-wifi-use-mptcp-on-macos\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/tired-of-ssh-and-claude-getting-frozen-when-you-switch-to-wifi-use-mptcp-on-macos\\\/\"},\"author\":{\"name\":\"Tom Barbette\",\"@id\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/#\\\/schema\\\/person\\\/7f791766092e1207bc7a94a65e74f4fd\"},\"headline\":\"Tired of SSH and Claude getting frozen when you switch to WiFi? Use MPTCP on macOS!\",\"datePublished\":\"2026-10-07T13:25:42+00:00\",\"dateModified\":\"2026-10-21T15:47:30+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/tired-of-ssh-and-claude-getting-frozen-when-you-switch-to-wifi-use-mptcp-on-macos\\\/\"},\"wordCount\":1345,\"publisher\":{\"@id\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/#organization\"},\"articleSection\":[\"Network\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/tired-of-ssh-and-claude-getting-frozen-when-you-switch-to-wifi-use-mptcp-on-macos\\\/\",\"url\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/tired-of-ssh-and-claude-getting-frozen-when-you-switch-to-wifi-use-mptcp-on-macos\\\/\",\"name\":\"Tired of SSH and Claude getting frozen when you switch to WiFi? Use MPTCP on macOS! - Tom Barbette\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/#website\"},\"datePublished\":\"2026-10-07T13:25:42+00:00\",\"dateModified\":\"2026-10-21T15:47:30+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/tired-of-ssh-and-claude-getting-frozen-when-you-switch-to-wifi-use-mptcp-on-macos\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/tired-of-ssh-and-claude-getting-frozen-when-you-switch-to-wifi-use-mptcp-on-macos\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/tired-of-ssh-and-claude-getting-frozen-when-you-switch-to-wifi-use-mptcp-on-macos\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tired of SSH and Claude getting frozen when you switch to WiFi? Use MPTCP on macOS!\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/#website\",\"url\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/\",\"name\":\"Tom Barbette\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/#organization\",\"name\":\"Efficiency of Networked Systems Group\",\"url\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/wp-content\\\/uploads\\\/2022\\\/04\\\/cropped-logo-uclouvain-2021-barbette.png\",\"contentUrl\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/wp-content\\\/uploads\\\/2022\\\/04\\\/cropped-logo-uclouvain-2021-barbette.png\",\"width\":512,\"height\":512,\"caption\":\"Efficiency of Networked Systems Group\"},\"image\":{\"@id\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/x.com\\\/TomBarbette\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/tom-barbette\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/#\\\/schema\\\/person\\\/7f791766092e1207bc7a94a65e74f4fd\",\"name\":\"Tom Barbette\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/aecd99cba3b4d91d3775fde3219bfa362cd99acfbe95848ec303b9685f366fcd?s=96&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/aecd99cba3b4d91d3775fde3219bfa362cd99acfbe95848ec303b9685f366fcd?s=96&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/aecd99cba3b4d91d3775fde3219bfa362cd99acfbe95848ec303b9685f366fcd?s=96&r=g\",\"caption\":\"Tom Barbette\"},\"sameAs\":[\"https:\\\/\\\/www.tombarbette.be\"],\"url\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/author\\\/tom\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Tired of SSH and Claude getting frozen when you switch to WiFi? Use MPTCP on macOS! - Tom Barbette","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/perso.uclouvain.be\/tom.barbette\/tired-of-ssh-and-claude-getting-frozen-when-you-switch-to-wifi-use-mptcp-on-macos\/","og_locale":"en_US","og_type":"article","og_title":"Tired of SSH and Claude getting frozen when you switch to WiFi? Use MPTCP on macOS! - Tom Barbette","og_description":"Undock, and everything freezes Most of my work happens on remote Linux servers, through VS Code Remote-SSH, and more and more with Claude Code running inside that remote session. My MacBook sits on a dock with an Ethernet cable most of the day. Every time I unplug it to walk to a meeting, everything freezes: &hellip; Continue reading \"Tired of SSH and Claude getting frozen when you switch to WiFi? Use MPTCP on macOS!\"","og_url":"https:\/\/perso.uclouvain.be\/tom.barbette\/tired-of-ssh-and-claude-getting-frozen-when-you-switch-to-wifi-use-mptcp-on-macos\/","og_site_name":"Tom Barbette","article_published_time":"2026-10-07T13:25:42+00:00","article_modified_time":"2026-10-21T15:47:30+00:00","author":"Tom Barbette","twitter_card":"summary_large_image","twitter_creator":"@TomBarbette","twitter_site":"@TomBarbette","twitter_misc":{"Written by":"Tom Barbette","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/perso.uclouvain.be\/tom.barbette\/tired-of-ssh-and-claude-getting-frozen-when-you-switch-to-wifi-use-mptcp-on-macos\/#article","isPartOf":{"@id":"https:\/\/perso.uclouvain.be\/tom.barbette\/tired-of-ssh-and-claude-getting-frozen-when-you-switch-to-wifi-use-mptcp-on-macos\/"},"author":{"name":"Tom Barbette","@id":"https:\/\/perso.uclouvain.be\/tom.barbette\/#\/schema\/person\/7f791766092e1207bc7a94a65e74f4fd"},"headline":"Tired of SSH and Claude getting frozen when you switch to WiFi? Use MPTCP on macOS!","datePublished":"2026-10-07T13:25:42+00:00","dateModified":"2026-10-21T15:47:30+00:00","mainEntityOfPage":{"@id":"https:\/\/perso.uclouvain.be\/tom.barbette\/tired-of-ssh-and-claude-getting-frozen-when-you-switch-to-wifi-use-mptcp-on-macos\/"},"wordCount":1345,"publisher":{"@id":"https:\/\/perso.uclouvain.be\/tom.barbette\/#organization"},"articleSection":["Network"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/perso.uclouvain.be\/tom.barbette\/tired-of-ssh-and-claude-getting-frozen-when-you-switch-to-wifi-use-mptcp-on-macos\/","url":"https:\/\/perso.uclouvain.be\/tom.barbette\/tired-of-ssh-and-claude-getting-frozen-when-you-switch-to-wifi-use-mptcp-on-macos\/","name":"Tired of SSH and Claude getting frozen when you switch to WiFi? Use MPTCP on macOS! - Tom Barbette","isPartOf":{"@id":"https:\/\/perso.uclouvain.be\/tom.barbette\/#website"},"datePublished":"2026-10-07T13:25:42+00:00","dateModified":"2026-10-21T15:47:30+00:00","breadcrumb":{"@id":"https:\/\/perso.uclouvain.be\/tom.barbette\/tired-of-ssh-and-claude-getting-frozen-when-you-switch-to-wifi-use-mptcp-on-macos\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/perso.uclouvain.be\/tom.barbette\/tired-of-ssh-and-claude-getting-frozen-when-you-switch-to-wifi-use-mptcp-on-macos\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/perso.uclouvain.be\/tom.barbette\/tired-of-ssh-and-claude-getting-frozen-when-you-switch-to-wifi-use-mptcp-on-macos\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/perso.uclouvain.be\/tom.barbette\/"},{"@type":"ListItem","position":2,"name":"Tired of SSH and Claude getting frozen when you switch to WiFi? Use MPTCP on macOS!"}]},{"@type":"WebSite","@id":"https:\/\/perso.uclouvain.be\/tom.barbette\/#website","url":"https:\/\/perso.uclouvain.be\/tom.barbette\/","name":"Tom Barbette","description":"","publisher":{"@id":"https:\/\/perso.uclouvain.be\/tom.barbette\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/perso.uclouvain.be\/tom.barbette\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/perso.uclouvain.be\/tom.barbette\/#organization","name":"Efficiency of Networked Systems Group","url":"https:\/\/perso.uclouvain.be\/tom.barbette\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/perso.uclouvain.be\/tom.barbette\/#\/schema\/logo\/image\/","url":"https:\/\/perso.uclouvain.be\/tom.barbette\/wp-content\/uploads\/2022\/04\/cropped-logo-uclouvain-2021-barbette.png","contentUrl":"https:\/\/perso.uclouvain.be\/tom.barbette\/wp-content\/uploads\/2022\/04\/cropped-logo-uclouvain-2021-barbette.png","width":512,"height":512,"caption":"Efficiency of Networked Systems Group"},"image":{"@id":"https:\/\/perso.uclouvain.be\/tom.barbette\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/TomBarbette","https:\/\/www.linkedin.com\/in\/tom-barbette"]},{"@type":"Person","@id":"https:\/\/perso.uclouvain.be\/tom.barbette\/#\/schema\/person\/7f791766092e1207bc7a94a65e74f4fd","name":"Tom Barbette","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/aecd99cba3b4d91d3775fde3219bfa362cd99acfbe95848ec303b9685f366fcd?s=96&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/aecd99cba3b4d91d3775fde3219bfa362cd99acfbe95848ec303b9685f366fcd?s=96&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/aecd99cba3b4d91d3775fde3219bfa362cd99acfbe95848ec303b9685f366fcd?s=96&r=g","caption":"Tom Barbette"},"sameAs":["https:\/\/www.tombarbette.be"],"url":"https:\/\/perso.uclouvain.be\/tom.barbette\/author\/tom\/"}]}},"_links":{"self":[{"href":"https:\/\/perso.uclouvain.be\/tom.barbette\/wp-json\/wp\/v2\/posts\/6066","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/perso.uclouvain.be\/tom.barbette\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/perso.uclouvain.be\/tom.barbette\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/perso.uclouvain.be\/tom.barbette\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/perso.uclouvain.be\/tom.barbette\/wp-json\/wp\/v2\/comments?post=6066"}],"version-history":[{"count":3,"href":"https:\/\/perso.uclouvain.be\/tom.barbette\/wp-json\/wp\/v2\/posts\/6066\/revisions"}],"predecessor-version":[{"id":6070,"href":"https:\/\/perso.uclouvain.be\/tom.barbette\/wp-json\/wp\/v2\/posts\/6066\/revisions\/6070"}],"wp:attachment":[{"href":"https:\/\/perso.uclouvain.be\/tom.barbette\/wp-json\/wp\/v2\/media?parent=6066"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/perso.uclouvain.be\/tom.barbette\/wp-json\/wp\/v2\/categories?post=6066"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/perso.uclouvain.be\/tom.barbette\/wp-json\/wp\/v2\/tags?post=6066"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}