## 1. Project Overview & Quickstart (knqyf263/pet) # Pet - CLI Snippet Manager [](https://github.com/knqyf263/pet/releases/latest) [](https://github.com/knqyf263/pet/blob/master/LICENSE) # Motivation `pet` is a simple command-line snippet manager (inspired by [memo](https://github.com/mattn/memo)). I have a hard time remembering complex command or ones that I rarely use. Moreover, it is difficult to find them in shell history. It's time to let go of the expectation of remembering every command, and focus on productivity and finding the right commands as fast as possible. It's fun when you're 2 years in and work with 2 tools, but less so when you're a decade in and work across backend/frontend/infrastructure with tons of tools. You most probably relate to this if you're a developer. `pet` is a simple tool that allows you to save, tag, search, and execute command-line snippets easily! It's now nearly 8 years old and is used by many developers around the world. `pet` is written in Go, and therefore you can just grab the binary releases and drop it in your $PATH. You can use variables (`` or `` ) in snippets. # TOC - [Main features](#main-features) - [Parameters](#parameters) - [Examples](#examples) - [Register the previous command easily](#register-the-previous-command-easily) - [bash](#bash-prev-function) - [zsh](#zsh-prev-function) - [fish](#fish) - [Select snippets at the current line (like C-r) (RECOMMENDED)](#select-snippets-at-the-current-line-like-c-r-recommended) - [bash](#bash) - [zsh](#zsh) - [fish](#fish-1) - [Copy snippets to clipboard](#copy-snippets-to-clipboard) - [Features](#features) - [Edit snippets](#edit-snippets) - [Sync snippets](#sync-snippets) - [Hands-on Tutorial](#hands-on-tutorial) - [Usage](#usage) - [Snippet](#snippet) - [Configuration](#configuration) - [Selector option](#selector-option) - [Tag](#tag) - [Sync](#sync) - [Auto Sync](#auto-sync) - [Installation](#installation) - [Binary](#binary) - [macOS / Homebrew](#macos--homebrew) - [RedHat, CentOS](#redhat-centos) - [Debian, Ubuntu](#debian-ubuntu) - [Archlinux](#archlinux) - [Build](#build) - [Migration](#migration) - [Contribute](#contribute) # Main features `pet` has the following features. - Register your command snippets easily. - Use variables (with one or several default values) in snippets. - Search snippets interactively - Run snippets directly. - Edit snippets easily (config is just a TOML file). - Sync snippets via Gist or GitLab Snippets automatically. # Creating a snippet You can create a snippet by running `pet new`. ``` $ pet new Command> echo Hello world! Description> print Hello world ``` To see all available arguments, run `pet new --help`. Multiline commands can be entered by using the multiline argument `pet new --multiline` You can use also use variables in snippets, these are called parameters. More information on that in the next section. You can also *tag* snippets to search for them faster. More information on that in the tag section. # Parameters There are `` ways of entering parameters. They can contain default values: Hello `` defined by the equal sign. They can even contain `` where the default value would be \spaces & = signs\>. Default values just can't \. They can also contain multiple default values: Hello `` The values in this case would be :Hello \John\_\|\|\_Sam\_\|\|\_Jane Doe = special #chars\_\|\> # Examples Some examples are shown below. ## Register the previous command easily By adding the following config to `.bashrc` or `.zshrc`, you can easily register the previous command. ### bash prev function ``` function prev() { PREV=$(echo `history | tail -n2 | head -n1` | sed 's/[0-9]* //') sh -c "pet new `printf %q "$PREV"`" } ``` ### zsh prev function ``` cat .zshrc function prev() { PREV=$(fc -lrn | head -n 1) sh -c "pet new `printf %q "$PREV"`" } ``` ### fish See below for details. https://github.com/otms61/fish-pet ## Select snippets at the current line (like C-r) (RECOMMENDED) ### bash By adding the following config to `.bashrc`, you can search snippets and output on the shell. This will also allow you to execute the commands yourself, which will add them to your shell history! This is basically the only way we can manipulate shell history. This also allows you to *chain* commands! [Example here](https://github.com/knqyf263/pet/discussions/266) You can also customize the search and list commands with options, example `-t` or `--tags`, for example to only search the subset of snippets tagged with myjob `pet search -t myjob`. ``` cat .bashrc function pet-select() { BUFFER=$(pet search --query "$READLINE_LINE") READLINE_LINE=$BUFFER READLINE_POINT=${#BUFFER} } bind -x '"\C-x\C-r": pet-select' ``` ### zsh ``` cat .zshrc function pet-select() { BUFFER=$(pet search --query "$LBUFFER") CURSOR=$#BUFFER zle redisplay } zle -N pet-select stty -ixon bindkey '^s' pet-select ``` ### fish See below for details. https://github.com/otms61/fish-pet ## Expand snippet parameters inline on shell You can expand parameters using the shell instead of the builtin TUI dialog. This allows you to edit the parameters with native shell features, like tab-completion, highlighting, etc. ### bash ```bash function pet-select() { BUFFER=$(pet search --raw --query "$READLINE_LINE") READLINE_LINE=$BUFFER READLINE_POINT=${#BUFFER} } bind -x '"\C-x\C-r": pet-select' function _pet_move_cursor_to_next_parameter() { match="$(echo "$READLINE_LINE" | perl -nle 'print $& if /<.*?>/')" if [ -n "$match" ]; then default="$(echo "$match" | perl -nle 'print $& if /(?<==).*(?=>)/')" match_len=${#match} default_len=${#default} pre_match=${READLINE_LINE%%$match*} parameter_offset=${#pre_match} READLINE_POINT="$((${parameter_offset} + ${default_len}))" READLINE_LINE="${READLINE_LINE:0:$parameter_offset}${default}${READLINE_LINE:$parameter_offset+$match_len}" fi } bind -x '"\C-n": _pet_move_cursor_to_next_parameter' ``` ### zsh ```zsh function pet-select() { BUFFER=$(pet search --raw --query "$LBUFFER") CURSOR=$#BUFFER zle redisplay } zle -N pet-select stty -ixon bindkey '^s' pet-select function _pet_move_cursor_to_next_parameter() { match="$(echo "$BUFFER" | perl -nle 'print $& if /<.*?>/')" if [ -n "$match" ]; then default="$(echo "$match" | perl -nle 'print $& if /(?<==).*(?=>)/')" match_len=${#match} default_len=${#default} parameter_offset=${#BUFFER%%$match*} CURSOR="$((${parameter_offset} + ${default_len}))" BUFFER="${BUFFER[1,$parameter_offset]}${default}${BUFFER[$parameter_offset+$match_len+1,-1]}" fi } zle -N _pet_move_cursor_to_next_parameter bindkey '^n' _pet_move_cursor_to_next_parameter ``` ## Copy snippets to clipboard By using `pbcopy` on macOS, you can copy snippets to clipboard. ## Allow to register from history when using fzf Just export this to your `.bashrc` or `.zshrc` file. This will show your history as default (when using fzf) and it also binds the `alt+s` key combination to allow you to search and save some previous used command command. ``` export FZF_CTRL_R_OPTS=" --reverse --cycle --info=right --color header:italic --header 'alt+s (pet new)' --preview 'echo {}' --preview-window down:3:hidden:wrap --bind '?:toggle-preview' --bind 'alt-s:execute(pet new --tag {2..})+abort'" ``` # Features ## Edit snippets The snippets are managed in the TOML file, so it's easy to edit. ## Sync snippets You can share snippets via Gist. # Usage ``` Usage: pet [command] Available Commands: clip Copy the selected commands configure Edit config file edit Edit snippet file exec Run the selected commands help Help about any command list Show all snippets new Create a new snippet search Search snippets sync Sync snippets version Print the version number Flags: --config string config file (default is $HOME/.config/pet/config.toml) --debug debug mode -h, --help help for pet Use "pet [command] --help" for more information about a command. ``` # Snippet Run `pet edit` You can also register the output of command (but cannot search). ``` [[snippets]] command = "echo | openssl s_client -connect example.com:443 2>/dev/null |openssl x509 -dates -noout" description = "Show expiration date of SSL certificate" output = """ notBefore=Nov 3 00:00:00 2015 GMT notAfter=Nov 28 12:00:00 2018 GMT""" ``` Run `pet list` ``` Command: echo | openssl s_client -connect example.com:443 2>/dev/null |openssl x509 -dates -noout Output: notBefore=Nov 3 00:00:00 2015 GMT notAfter=Nov 28 12:00:00 2018 GMT ------------------------------ ``` # Configuration Run `pet configure` ``` [General] snippetfile = "path/to/snippet" # specify snippet directory editor = "vim" # your favorite text editor column = 40 # column size for list command selectcmd = "fzf" # selector command for edit command (fzf or peco) backend = "gist" # specify backend service to sync snippets (gist, ghe or gitlab, default: gist) sortby = "description" # specify how snippets get sorted (recency (default), -recency, description, -description, command, -command, output, -output) cmd = ["sh", "-c"] # specify the command to execute the snippet with color = false # enables output coloring with fzf, same as '--color' flag format = "[$description]: $command $tags" controls the format of the output when searching [Gist] file_name = "pet-snippet.toml" # specify gist file name access_token = "" # your access token gist_id = "" # Gist ID public = false # public or priate auto_sync = false # sync automatically when editing snippets [GitLab] file_name = "pet-snippet.toml" # specify GitLab Snippets file name access_token = "XXXXXXXXXXXXX" # your access token id = "" # GitLab Snippets ID visibility = "private" # public or internal or private auto_sync = false # sync automatically when editing snippets ``` ## Multi directory and multi file setup Directories must be specified as an array. All `toml` files will be scraped and found snippets will be added. Example1: single directory ```toml [GHEGist] base_url = "" # GHE base URL upload_url = "" # GHE upload URL (often the same as the base URL) file_name = "pet-snippet.toml" # specify gist file name access_token = "" # your access token gist_id = "" # Gist ID public = false # public or priate auto_sync = false # sync automatically when editing snippets ``` ``` $ pet configure [General] ... snippetdirs = ["/path/to/some/snippets/"] ... ``` Example2: multiple directories ``` $ pet configure [General] ... snippetdirs = ["/path/to/some/snippets/", "/more/snippets/"] ... ``` If `snippetfile` setting is omitted, new snippets will be added in a separate file to the first directory. The generated filename is time based. Snippet files in `snippetdirs` will not be added to Gist or GitLab. You've to do version control manually. ## Selector option Example1: Change layout (bottom up) ``` pet configure [General] ... selectcmd = "fzf" ... ``` Example2: Enable colorized output ``` pet configure [General] ... selectcmd = "fzf --ansi" ... pet search --color ``` ## Tag You can use tags (delimiter: space). ``` pet new -t Command> ping 8.8.8.8 Description> ping Tag> network google ``` Or edit manually. ``` pet edit [[snippets]] description = "ping" command = "ping 8.8.8.8" tag = ["network", "google"] output = "" ``` They are displayed with snippets. ``` pet search [ping]: ping 8.8.8.8 #network #google ``` You can exec snippet with filtering the tag ``` pet exec -t google [ping]: ping 8.8.8.8 #network #google ``` ## Sync ### Gist You must obtain access token. Go https://github.com/settings/tokens/new and create access token (only need "gist" scope). Set that to `access_token` in `[Gist]` or use an environment variable with the name `$PET_GITHUB_ACCESS_TOKEN`. After setting, you can upload snippets to Gist. If `gist_id` is not set, new gist will be created. ``` pet sync Gist ID: 1cedddf4e06d1170bf0c5612fb31a758 Upload success ``` Set `Gist ID` to `gist_id` in `[Gist]`. `pet sync` compares the local file and gist with the update date and automatically download or upload. If the local file is older than gist, `pet sync` download snippets. ``` pet sync Download success ``` If gist is older than the local file, `pet sync` upload snippets. ``` pet sync Upload success ``` *Note: `-u` option is deprecated* ### GHE Gist To use Gist with GitHub Enterprise, you need to follow these steps: 1. Obtain an Access Token: Visit your GitHub Enterprise settings page to create a new access token with just the "gist" scope. This is necessary to authenticate and interact with the Gist API on GitHub Enterprise. 2. Set the Access Token: Assign the newly created access token to `access_token` in the `[GHEGist]` section of your configuration. Alternatively, you can use an environment variable named `$PET_GITHUB_ENTERPRISE_ACCESS_TOKEN` to manage your token securely. 3. Configure API Endpoints: Unlike the regular Gist config, you need to set `base_url` and `upload_url` to point to your GitHub Enterprise API endpoints. For example: ```toml [GHEGist] base_url = "https://github-enterprise.example.com/api/v3/gists" upload_url = "https://github-enterprise.example.com/api/v3/gists" # Often the same as the base URL ``` By setting these parameters, your tool will be configured to interact with GitHub Enterprise Gist, enabling you to sync and manage your snippets just as you would with the standard GitHub Gist service. Remember to replace `https://github-enterprise.example.com` with the actual URL of your GitHub Enterprise instance. This customization allows your tool to correctly connect to and use the Gist service in a GitHub Enterprise environment. ### GitLab Snippets You must obtain access token. Go https://gitlab.com/-/profile/personal_access_tokens and create access token. Set that to `access_token` in `[GitLab]` or use an environment variable with the name `$PET_GITLAB_ACCESS_TOKEN`. You also have to configure the `url` under `[GitLab]`, so pet knows which endpoint to access. You would use `url = "https://gitlab.com"`unless you have another instance of Gitlab. At last, switch the `backend` under `[General]` to `backend = "gitlab"`. After setting, you can upload snippets to GitLab Snippets. If `id` is not set, new snippet will be created. ``` pet sync GitLab Snippet ID: 12345678 Upload success ``` Set `GitLab Snippet ID` to `id` in `[GitLab]`. `pet sync` compares the local file and gitlab with the update date and automatically download or upload. If the local file is older than gitlab, `pet sync` download snippets. ``` pet sync Download success ``` If gitlab is older than the local file, `pet sync` upload snippets. ``` pet sync Upload success ``` ## Auto Sync You can sync snippets automatically. Set `true` to `auto_sync` in `[Gist]`, `[GHEGist]` or `[GitLab]`. Then, your snippets sync automatically when `pet new` or `pet edit`. ``` pet edit Getting Gist... Updating Gist... Upload success ``` # Installation You need to install selector command ([fzf](https://github.com/junegunn/fzf) or [peco](https://github.com/peco/peco)). `homebrew` install `fzf` automatically. After you install Pet, it's HIGHLY recommended to install the shortcuts mentioned in the section on [ZSH Prev](#zsh-prev-function) ## Binary Go to [the releases page](https://github.com/knqyf263/pet/releases), find the version you want, and download the zip file. Unpack the zip file, and put the binary to somewhere you want (on UNIX-y systems, /usr/local/bin or the like). Make sure it has execution bits turned on. ## macOS / Homebrew Install [selector command](#Installation) first. You can use homebrew on macOS. ``` brew install pet ``` If you receive an error (`Error: knqyf263/pet/pet 64 already installed`) during `brew upgrade`, try the following command ``` brew unlink pet && brew uninstall pet (rm -rf /usr/local/Cellar/pet/64) brew install knqyf263/pet/pet ``` ## Fedora, RedHat, CentOS Install [selector command](#Installation) first. Download rpm package from [the releases page](https://github.com/knqyf263/pet/releases) ``` sudo rpm -ivh https://github.com/knqyf263/pet/releases/download/vx.x.x/pet_x.x.x_linux_amd64.rpm ``` Also available on the [Terra repository](https://terra.fyralabs.com/) (3rd party) for Fedora/Fedora-based distros ``` sudo dnf install pet ``` ## Debian, Ubuntu Install [selector command](#Installation) first. Download deb package from [the releases page](https://github.com/knqyf263/pet/releases) ``` wget https://github.com/knqyf263/pet/releases/download/vx.x.x/pet_x.x.x_linux_amd64.deb dpkg -i pet_x.x.x_linux_amd64.deb ``` ## Archlinux Install [selector command](#Installation) first. Two packages are available in [AUR](https://wiki.archlinux.org/index.php/Arch_User_Repository). You can install the package [from source](https://aur.archlinux.org/packages/pet-git): ``` yay -S pet-git ``` Or [from the binary](https://aur.archlinux.org/packages/pet-bin): ``` yay -S pet-bin ``` ## Build Install [selector command](#Installation) first. ``` mkdir -p $GOPATH/src/github.com/knqyf263 cd $GOPATH/src/github.com/knqyf263 git clone https://github.com/knqyf263/pet.git cd pet make install ``` # Migration ## From Keep https://blog.saltedbrain.org/2018/12/converting-keep-to-pet-snippets.html # Contribute 1. fork a repository: github.com/knqyf263/pet to github.com/you/repo 2. get original code: `go get github.com/knqyf263/pet` 3. work on original code 4. add remote to your repo: git remote add myfork https://github.com/you/repo.git 5. push your changes: git push myfork 6. create a new Pull Request - see [GitHub and Go: forking, pull requests, and go-getting](http://blog.campoy.cat/2014/03/github-and-go-forking-pull-requests-and.html) ---- # License MIT # Author Teppei Fukuda ## 2. Official Technical Reference & Guides (knqyf263/website) # The Kubernetes documentation [](https://app.netlify.com/sites/kubernetes-io-main-staging/deploys) [](https://github.com/kubernetes/website/releases/latest) This repository contains the assets required to build the [Kubernetes website and documentation](https://kubernetes.io/). We're glad that you want to contribute! + [Contributing to the docs](#contributing-to-the-docs) + [Localization ReadMes](#localization-readmemds) # Using this repository You can run the website locally using Hugo (Extended version), or you can run it in a container runtime. We strongly recommend using the container runtime, as it gives deployment consistency with the live website. ## Prerequisites To use this repository, you need the following installed locally: - [npm](https://www.npmjs.com/) - [Go](https://golang.org/) - [Hugo (Extended version)](https://gohugo.io/) - A container runtime, like [Docker](https://www.docker.com/). Before you start, install the dependencies. Clone the repository and navigate to the directory: ``` git clone https://github.com/kubernetes/website.git cd website ``` The Kubernetes website uses the [Docsy Hugo theme](https://github.com/google/docsy#readme). Even if you plan to run the website in a container, we strongly recommend pulling in the submodule and other development dependencies by running the following: ``` # pull in the Docsy submodule git submodule update --init --recursive --depth 1 ``` ## Running the website using a container To build the site in a container, run the following to build the container image and run it: ``` make container-image make container-serve ``` If you see errors, it probably means that the hugo container did not have enough computing resources available. To solve it, increase the amount of allowed CPU and memory usage for Docker on your machine ([MacOSX](https://docs.docker.com/docker-for-mac/#resources) and [Windows](https://docs.docker.com/docker-for-windows/#resources)). Open up your browser to http://localhost:1313 to view the website. As you make changes to the source files, Hugo updates the website and forces a browser refresh. ## Running the website locally using Hugo Make sure to install the Hugo extended version specified by the `HUGO_VERSION` environment variable in the [`netlify.toml`](netlify.toml#L10) file. To build and test the site locally, run: ```bash # install dependencies npm ci make serve ``` This will start the local Hugo server on port 1313. Open up your browser to http://localhost:1313 to view the website. As you make changes to the source files, Hugo updates the website and forces a browser refresh. ## Building the API reference pages The API reference pages located in `content/en/docs/reference/kubernetes-api` are built from the Swagger specification, using https://github.com/kubernetes-sigs/reference-docs/tree/master/gen-resourcesdocs. To update the reference pages for a new Kubernetes release (replace v1.20 in the following examples with the release to update to): 1. Pull the `kubernetes-resources-reference` submodule: ``` git submodule update --init --recursive --depth 1 ``` 2. Create a new API revision into the submodule, and add the Swagger specification: ``` mkdir api-ref-generator/gen-resourcesdocs/api/v1.20 curl 'https://raw.githubusercontent.com/kubernetes/kubernetes/master/api/openapi-spec/swagger.json' > api-ref-generator/gen-resourcesdocs/api/v1.20/swagger.json ``` 3. Copy the table of contents and fields configuration for the new release from a previous one: ``` mkdir api-ref-generator/gen-resourcesdocs/api/v1.20 cp api-ref-generator/gen-resourcesdocs/api/v1.19/* api-ref-generator/gen-resourcesdocs/api/v1.20/ ``` 4. Adapt the files `toc.yaml` and `fields.yaml` to reflect the changes between the two releases 5. Next, build the pages: ``` make api-reference ``` You can test the results locally by making and serving the site from a container image: ``` make container-image make container-serve ``` In a web browser, go to http://localhost:1313/docs/reference/kubernetes-api/ to view the API reference. 6. When all changes of the new contract are reflected into the configuration files `toc.yaml` and `fields.yaml`, create a Pull Request with the newly generated API reference pages. ## Troubleshooting ### error: failed to transform resource: TOCSS: failed to transform "scss/main.scss" (text/x-scss): this feature is not available in your current Hugo version Hugo is shipped in two set of binaries for technical reasons. The current website runs based on the **Hugo Extended** version only. In the [release page](https://github.com/gohugoio/hugo/releases) look for archives with `extended` in the name. To confirm, run `hugo version` and look for the word `extended`. ### Troubleshooting macOS for too many open files If you run `make serve` on macOS and receive the following error: ``` ERROR 2020/08/01 19:09:18 Error: listen tcp 127.0.0.1:1313: socket: too many open files make: *** [serve] Error 1 ``` Try checking the current limit for open files: `launchctl limit maxfiles` Then run the following commands (adapted from https://gist.github.com/tombigel/d503800a282fcadbee14b537735d202c): ```shell #!/bin/sh # These are the original gist links, linking to my gists now. # curl -O https://gist.githubusercontent.com/a2ikm/761c2ab02b7b3935679e55af5d81786a/raw/ab644cb92f216c019a2f032bbf25e258b01d87f9/limit.maxfiles.plist # curl -O https://gist.githubusercontent.com/a2ikm/761c2ab02b7b3935679e55af5d81786a/raw/ab644cb92f216c019a2f032bbf25e258b01d87f9/limit.maxproc.plist curl -O https://gist.githubusercontent.com/tombigel/d503800a282fcadbee14b537735d202c/raw/ed73cacf82906fdde59976a0c8248cce8b44f906/limit.maxfiles.plist curl -O https://gist.githubusercontent.com/tombigel/d503800a282fcadbee14b537735d202c/raw/ed73cacf82906fdde59976a0c8248cce8b44f906/limit.maxproc.plist sudo mv limit.maxfiles.plist /Library/LaunchDaemons sudo mv limit.maxproc.plist /Library/LaunchDaemons sudo chown root:wheel /Library/LaunchDaemons/limit.maxfiles.plist sudo chown root:wheel /Library/LaunchDaemons/limit.maxproc.plist sudo launchctl load -w /Library/LaunchDaemons/limit.maxfiles.plist ``` This works for Catalina as well as Mojave macOS. # Get involved with SIG Docs Learn more about SIG Docs Kubernetes community and meetings on the [community page](https://github.com/kubernetes/community/tree/master/sig-docs#meetings). You can also reach the maintainers of this project at: - [Slack](https://kubernetes.slack.com/messages/sig-docs) [Get an invite for this Slack](https://slack.k8s.io/) - [Mailing List](https://groups.google.com/forum/#!forum/kubernetes-sig-docs) # Contributing to the docs You can click the **Fork** button in the upper-right area of the screen to create a copy of this repository in your GitHub account. This copy is called a *fork*. Make any changes you want in your fork, and when you are ready to send those changes to us, go to your fork and create a new pull request to let us know about it. Once your pull request is created, a Kubernetes reviewer will take responsibility for providing clear, actionable feedback. As the owner of the pull request, **it is your responsibility to modify your pull request to address the feedback that has been provided to you by the Kubernetes reviewer.** Also, note that you may end up having more than one Kubernetes reviewer provide you feedback or you may end up getting feedback from a Kubernetes reviewer that is different than the one initially assigned to provide you feedback. Furthermore, in some cases, one of your reviewers might ask for a technical review from a Kubernetes tech reviewer when needed. Reviewers will do their best to provide feedback in a timely fashion but response time can vary based on circumstances. For more information about contributing to the Kubernetes documentation, see: * [Contribute to Kubernetes docs](https://kubernetes.io/docs/contribute/) * [Page Content Types](https://kubernetes.io/docs/contribute/style/page-content-types/) * [Documentation Style Guide](https://kubernetes.io/docs/contribute/style/style-guide/) * [Localizing Kubernetes Documentation](https://kubernetes.io/docs/contribute/localization/) # Localization `README.md`'s | Language | Language | |---|---| |[Chinese](README-zh.md)|[Korean](README-ko.md)| |[French](README-fr.md)|[Polish](README-pl.md)| |[German](README-de.md)|[Portuguese](README-pt.md)| |[Hindi](README-hi.md)|[Russian](README-ru.md)| |[Indonesian](README-id.md)|[Spanish](README-es.md)| |[Italian](README-it.md)|[Ukrainian](README-uk.md)| |[Japanese](README-ja.md)|[Vietnamese](README-vi.md)| # Code of conduct Participation in the Kubernetes community is governed by the [CNCF Code of Conduct](https://github.com/cncf/foundation/blob/master/code-of-conduct.md). # Thank you! Kubernetes thrives on community participation, and we appreciate your contributions to our website and our documentation!