The tunnel to staging, open before you have found the command again.

Postgres on RDS, Redis behind a bastion, a Google Cloud VM with no public address. Kestro reads your ~/.ssh/config, works out the rest and opens the door with a switch. In the evening, “Close all” shuts them all. And you never had an extra terminal to keep an eye on.

macOS 11+ · Windows soon

CodeFileView14:43
Kestro1 tunnel open · 1 service isn’t answering
Filter tunnels⌘FNew tunnel
bastion-prodprodSSHshellbastion.kestro.internalclosed
notes-dbstagingPostgreslocalhost:5432pg-staging.eu-west-1.rdsopen
run-eventsprodMongolocalhost:27017mongo-prod.atlasclosed
⌘K palette↑↓ navigate␣ togglecloses if you click elsewhere
run-tracker , zsh
Applying 2 migrations to shop-staging-db…
20240612_add_orders_index ok
done in 1.4s
run-tracker , zsh
# every door, and which ones are open
tunnel notes-db ouvert :5432
tunnel run-events ouvert :27017
tunnel bastion-prod fermé

Tunnels

Six things ssh -L does not do.

jump

The jump host, without the three-storey command

A bastion in front of the database, and the line becomes unreadable: one hop, a local port, a key per machine. Kestro takes your ~/.ssh/config entries exactly as they are (the jump, the user, the key) and turns them into a single switch.

cloud

Google Cloud and AWS, without exporting a single key

Cloud SQL, a Google VM, an EC2 instance through Session Manager: Kestro leans on your gcloud and aws tools, already signed in. It lists what it finds in your project, you pick the line.

wake

Your Mac wakes, so does the tunnel

Tick reconnection on a tunnel: a closed lid, a change of Wi-Fi or a VPN coming back no longer kill it. It comes back on the same local port, and your SQL client’s saved connection still works. Off by default: a door onto production does not reopen unless you asked for it.

prod

Production does not look like staging

Every tunnel carries its environment, and the production row a red edge. You see what you are opening onto before you click, and the count of open doors says how many of them are production.

shell

And from the keyboard, if you prefer

kestro with notes-db -- npm run migrate opens the tunnel, waits until it actually answers, then runs the command in this very terminal. psql "$(kestro url notes-db)" slots into a sentence no interface will ever write for you.

assistant

Your assistant opens the tunnel: never the production one

Kestro is an MCP server: ask Claude or Cursor for staging, and the tunnel opens. A tunnel marked “prod” stays visible without its host, its instance or its port, it knows the tunnel exists, it has nothing to open. The rest lives in switches, and whatever is closed gets asked for at the moment it matters.

Works with what you already haveSSH · Google Cloud · AWS · Cloudflare · Docker · PostgreSQL · Redis · Git

From an address to an open door

You paste what you have. Kestro does the rest.

It replaces neither SSH nor gcloud: it uses them. Nothing to reconfigure, nothing copied into a store of its own, nothing to clean up the day you uninstall it.

  1. Paste

    A host from your ~/.ssh/config, a Cloud SQL instance as project:region:instance, an EC2 identifier. Kestro recognises the shape, fills in the port and infers the environment from the name.

  2. It checks first

    Is the local port free? It says so while you are filling in the form, not three minutes later in a log. A tunnel reported as open is a tunnel where something answered.

  3. It holds the door

    On the tunnels where you asked for it: reconnects when the machine wakes and when the network comes back, with the retry count in plain sight. This is not a terminal you find dead an hour later.

  4. It closes when you say so

    No door ever closes behind your back: a tunnel vanishing mid-transfer would be worse than the problem it solves. “Close all” shuts them all in one gesture, and the count of what is open stays in the menu bar.

On your machine

Everything stays with you.

Your connections run from your computer to your servers, never through us.

  • No account

    Nothing to create, no password.

  • Your keys stay put

    SSH, Google Cloud, AWS: Kestro uses your own tools, locally.

  • No usage statistics

    We don’t know what you open, or when.

  • One exception

    Your licence renews with us. Nothing else leaves.

And the rest

Kestro does more than tunnels.

It holds everything you used to leave running in those other terminal tabs. Same panel, same shortcut, same price.

  • Your projects

    The branch, what has changed, what is left to push. And the dev server, or the compose stack, started from the row.

  • Your services

    Sites, APIs, ports: checked continuously from your own machine. The moment one goes down, the menu bar icon changes.

  • Your scripts

    npm, make, docker: pinned, run from a shortcut, with their output in the panel rather than in yet another window.

Pricing

You pay once. That’s it.

A tool you open forty times a day shouldn’t send an invoice every month.

Kestro licence

€29.99$29.99£25.99CHF 25.90CA$40.99A$45.99€39.99$39.99£34.99CHF 33.90CA$54.99A$61.99 · Launch offer · upcoming price

1 computer · one-time

  • Every feature of the app, no tiers, no “Pro” edition
  • One year of updates included, then renew if you want to
  • The app stays yours, renewed or not
  • One key, the same on all your computers
  • Switch machines whenever you like, no limit
  • No account to create: the key arrives by email

Or download it for free first →

Refunded within 14 days, no questions asked.

Questions we get asked

Does Kestro replace my ~/.ssh/config?

No, it reads it. Your hosts, your jump hosts, your keys and your users stay where they are and stay the reference: Kestro borrows them as they are. Nothing is copied into a store of its own, nothing is rewritten in your file, and the day you uninstall Kestro there is nothing to clean up: your ssh keeps working exactly as before.

What about behind a bastion?

That is the common case, not the exception. If your configuration already describes the hop, Kestro borrows it; if not, you name the jump host in the tunnel’s form and it builds both hops. The only port you see afterwards is the local one, the one you hand to your client.

Do my SSH keys leave my machine?

No. Kestro copies none and stores none: it runs ssh the way you would, with your agent and your keys where they already are. For Google Cloud and AWS it goes through gcloud and aws, already signed in on your machine. Everything opens directly between your machine and your servers: nothing passes through our infrastructure, and since there is no account, we do not even know that you are opening a tunnel.

What if the local port is already taken?

Kestro sees it while you are filling in the form and tells you right then: “free” or “taken”, under the field. You pick another in one keystroke, instead of discovering a bind error after the fact. The chosen port shows on the tunnel’s row, and it is the one kestro url returns.

How many tunnels at once?

As many as your machine can carry. “Open all” brings them up in one gesture, each with its own connection and its own transition. In the morning, it is one click for the day. The button flips to “Close all” once there is nothing left to open, so there are never two buttons to choose between.

Does it work with Cloud SQL, RDS or Atlas?

Yes: those are databases behind a private network, and that is precisely what a tunnel crosses. Cloud SQL by its instance, a Google VM by its name, an EC2 through Session Manager, a database behind a bastion through the hop your SSH configuration already describes.

Does the trial ask for a card?

No, and it does not ask for an account either. You download, you get 7 full days. No card is asked for until you decide to buy.