Stay local.

Keep your editor, your dotfiles, your workflow.
Work with remote files and commands as if they were local.
Quick Start →
Install Graft
curl --proto '=https' --tlsv1.2 -sSf https://graft.run/install.sh | sh
See it in action
main.go
package main

import (
    "net/http"
    "runtime"
)

func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}

func handler(w http.ResponseWriter, r *http.Request) {
    if runtime.GOOS == "darwin" {
        w.Write([]byte("hello from darwin"))
    } else {
        w.Write([]byte("hello from linux"))
    }
}
tab 1
tab 2