Jesse A. Green / notebook

cheat.sh User Guide

Generated June 2026 from chubin/cheat.sh at 031a5d3

AI-generated documentation. The library is checked by sampling (three repositories so far); this guide was not individually reviewed. Verify against the project before relying on it.

cheat.sh is the command line's missing cheat sheet. It gives you instant, copy-paste-ready answers to "how do I do X?" — for UNIX/Linux commands and 58 programming languages — directly from your terminal, your browser, or your code editor, with nothing to install.

You ask a question by making an HTTP request. The answer comes back as plain text you can paste straight into your shell or your program:

curl cheat.sh/tar
# To extract an uncompressed archive:
tar -xvf /path/to/foo.tar

# To create an uncompressed archive:
tar -cvf /path/to/foo.tar /path/to/foo/

# To extract a .gz archive:
tar -xzvf /path/to/foo.tgz
...

That is the entire idea: a cheat sheet that is concise, fast (answers in ~100 ms), comprehensive, universal (works anywhere curl works), and unobtrusive. This guide shows you everything you can do with it.

Note

cheat.sh aggregates the best community-driven cheat sheet repositories in the world (tldr-pages, the cheat project, Learn X in Y Minutes, RosettaCode) plus StackOverflow. You are querying a unified front door to all of them at once.


Table of Contents

  1. Quick Start
  2. Two Ways to Use It
  3. Installing the cht.sh Client
  4. Everyday Queries
  5. Programming Language Cheat Sheets
  6. Query Options
  7. Searching
  8. Special Pages
  9. The cht.sh Shell Mode
  10. Tab Completion
  11. Stealth Mode
  12. Editor Integration
  13. Recipes
  14. How It Works (Concepts)
  15. Troubleshooting
  16. FAQ
  17. Quick Reference

1. Quick Start

You do not need to install anything to start. If you have curl (or any HTTP client), you are ready.

Tip

Both names work and are interchangeable: the long form cheat.sh and the short form cht.sh. Use whichever you can type fastest.

Get a cheat sheet for a UNIX/Linux command:

curl cht.sh/rsync

Get a programming-language answer:

curl cht.sh/python/lambda

Ask a free-form "how do I…" question (separate words with +):

curl cht.sh/python/reverse+a+list
# python - How do I reverse a list?

>>> L = [0, 10, 20, 40]
>>> L[::-1]
[40, 20, 10, 0]

Search for a command when you don't know its name (use ~):

curl cht.sh/~snapshot

That is everything you need to be productive. The rest of this guide adds power features: a dedicated client, syntax-highlight controls, shell mode, completion, and editor integration.

Important

Use HTTPS for anything you care about: curl https://cht.sh/tar. Plain HTTP also works, but HTTPS protects the query and answer in transit.


2. Two Ways to Use It

There are two equally valid ways to talk to cheat.sh. Pick based on your taste.

Approach What it is Best for
Direct curl Raw HTTP requests to cheat.sh/... Scripts, one-offs, zero setup, any machine
cht.sh client A small shell script wrapper Daily use: natural spacing, history, clipboard, shell mode, stealth

The service automatically detects how you are connecting and formats the answer accordingly:

  • Terminal tools (curl, wget, httpie, python-requests, xh, fetch, PowerShell, and friends) receive plain text with terminal colors (ANSI).
  • Web browsers receive a formatted HTML page with a search box.

So curl cht.sh/go/Pointers gives you pasteable text, while opening https://cht.sh/go/Pointers in Chrome gives you a styled page.

Note

The whole interface is "the URL is the question." There is no separate API to learn — the path is the query, and query-string letters like ?T are the options. Section 6 covers those.


3. Installing the cht.sh Client

The cht.sh client is optional but highly recommended for interactive daily use. It is a shell script — not a Python or pip package — so you install it by downloading the script and making it executable.

Caution

There is no pip install cht.sh. cheat.sh is not published to PyPI, and trying to pip install it will fail. Use the curl method below (or the third-party cht.exe on Windows — see section 12).

Install for your user

Linux / macOS (user)

PATH_DIR="$HOME/bin"   # any directory already on your $PATH
mkdir -p "$PATH_DIR"
curl https://cht.sh/:cht.sh > "$PATH_DIR/cht.sh"
chmod +x "$PATH_DIR/cht.sh"

Linux / macOS (global)

curl -s https://cht.sh/:cht.sh | sudo tee /usr/local/bin/cht.sh && \
  sudo chmod +x /usr/local/bin/cht.sh

The special page :cht.sh returns the source code of the client itself — that is what you are downloading.

Install the shell-mode dependency

Shell mode (section 9) needs rlwrap for readline support:

sudo apt install rlwrap     # Debian/Ubuntu

Tip

Verify the install: cht.sh --help or cht.sh tar. If the command is found and returns a cheat sheet, you are done.

Verify your install

  • [ ] cht.sh is on your $PATH (command -v cht.sh prints a path)
  • [ ] cht.sh tar returns a cheat sheet
  • [ ] rlwrap is installed (only needed for --shell)

4. Everyday Queries

Look up a UNIX/Linux command

curl cht.sh/tar
curl cht.sh/rsync
curl cht.sh/tr

With the client:

cht.sh tar

Ask a programming question

Put the language first, then your question. Separate words with + when using curl:

curl cht.sh/go/reverse+a+list
curl cht.sh/js/parse+json
curl cht.sh/lua/merge+tables
curl cht.sh/clojure/variadic+function

With the client you can use real spaces instead of +:

cht.sh go reverse a list
cht.sh js parse json

Pick a different answer

If the first answer isn't what you wanted, append /1, /2, … to cycle through alternatives:

curl cht.sh/python/random+string
curl cht.sh/python/random+string/1
curl cht.sh/python/random+string/2

Exclude a word from the answer

Add the unwanted word with +- to filter it out — useful to avoid a particular library:

curl cht.sh/python/multiply+matrices+-numpy

Tip

Write better questions and you get better answers. Be specific (python/append+file beats python/file), ask practical questions, and name the language as the first path segment.


5. Programming Language Cheat Sheets

Language cheat sheets live in namespaces named after the language. cheat.sh covers 58 languages plus a few related topics (CMake, Django, Flask, Git).

For each language, several special sheets are available:

Query What you get
lua The main Lua cheat sheet
lua/hello How to install, build, run, and a "Hello world"
lua/:list All topics available for that language
lua/:learn A full "Learn X in Y Minutes" tutorial sheet
perl/1line A collection of one-liners (where available)
js/weirdness Examples of the language's weird corners (where available)
curl cht.sh/go/:list       # list all Go topics
curl cht.sh/python/:learn  # Python basics tour
curl cht.sh/lua/hello      # getting-started for Lua

How answers are generated

If a cheat sheet already exists for your query, you get it directly. If not — which is common for free-form questions — cheat.sh generates an answer on the fly from the available cheat sheets and the best StackOverflow answers for that language. It won't be a 100% guaranteed hit, but it is usually exactly what you needed.

Note

Answers are formatted as valid code in the queried language, so you can paste them directly into a program. Explanatory text is rendered as comments in that language's syntax (#, //, --, etc.).

Supported languages (prefixes)

arduino  assembly awk      basic    bash     bf       c        chapel
clean    clojure  coffee   cpp      csharp   d        dart     delphi
dylan    eiffel   elixir   elisp    elm      erlang   factor   forth
fortran  fsharp   go       groovy   haskell  java     js       julia
kotlin   latex    lisp     lua      matlab   nim      ocaml    octave
perl     perl6    php      pike     python   python3  r        racket
ruby     rust     scala    scheme   solidity swift    tcl      tcsh
objective-c        vb       vbnet

Related (not languages): cmake, django, flask, git.

Tip

Common aliases are understood automatically: c++ → cpp, c# → csharp, golang → go, js/javascript, sh → bash, objc → objective-c, f# → fsharp, and more.


6. Query Options

Options are single letters appended to the query as a query string. When using curl you must escape the ? (or quote the URL) so your shell doesn't try to glob it.

Option Effect
?Q Quiet — remove the explanatory text, return code only
?T Text — turn syntax highlighting (terminal colors) off
?q Quiet rendering (suppress the page chrome in HTML)
?c Drop comments, keep original indentation
?C Drop comments and unindent the code
?style=NAME Use a specific syntax-highlight color style
?lang=XX Request answer in a human language (where supported)

Combine options by stringing the letters together — ?QT means "code only, no colors":

curl cht.sh/python/random+list+elements\?Q
curl cht.sh/lua/merge+tables\?QT
curl "cht.sh/go/reverse+a+list?Q"     # quoting also works

Example — comments stripped with ?Q:

curl cht.sh/lua/table+keys\?Q
local keyset={}
local n=0

for k,v in pairs(tab) do
  n=n+1
  keyset[n]=k
end

Color styles

List the available highlight styles and preview them:

curl cht.sh/:styles         # names only
curl cht.sh/:styles-demo    # rendered examples

Then use one:

curl cht.sh/python/lambda\?style=native

Note

The available style names come from Pygments (the highlighting library). If you ask for a style that isn't recognized, the default is used silently.


7. Searching

When you don't know the exact name of a command or topic, search with the ~ notation. Search is not recursive by default — it only looks at the level you specify.

curl cht.sh/~snapshot          # search top-level cheat sheets
curl cht.sh/scala/~currying    # search within the scala namespace

Add /r (a search option after a closing slash) to search all cheat sheets:

curl cht.sh/~snapshot/r

Search options

Append these letters after the closing slash:

Option Meaning
i Case-insensitive
b Match whole words (word boundaries)
r Recursive (search every sheet)
curl cht.sh/~shot/bi    # case-insensitive, whole-word match for "shot"

Note

Searches are capped at the first 20 matching answers. If you hit the cap, a LIMITED TO 20 ANSWERS marker is appended so you know there may be more — narrow your keyword to see them.


8. Special Pages

Pages whose name starts with a colon (:) are not cheat sheets — they are built-in helpers.

Getting started:

Page What it shows
:help Description of all special pages and options
:intro A guided introduction covering the most common usage
:list List every available cheat sheet (works in a subsection: go/:list)

Client and shell support:

Page What it shows
:cht.sh The source code of the cht.sh client
:bash_completion The bash tab-completion function
:bash bash function + completion setup
:fish fish function + completion setup
:zsh zsh function + completion setup

Editor support:

Page What it shows
:vim cheat.sh support for Vim
:emacs cheat.sh function for Emacs
:emacs-ivy Emacs support for ivy users

Other pages:

Page What it shows
:post How to submit a new cheat sheet
:styles List of color styles
:styles-demo Color-style usage examples
:random A random page (works in a subsection: go/:random)
curl cht.sh/:help
curl cht.sh/:list
curl cht.sh/python/:random

Tip

curl cht.sh/:intro is the fastest way to get the highlights of the service in one screen.

Beyond cheat sheets: built-in tools

A few namespaces are computed, not stored:

curl cht.sh/chmod/644      # explain a chmod numeric mode
curl cht.sh/rfc/2616       # fetch an RFC by number
curl cht.sh/oeis/A000045   # look up an OEIS integer sequence

9. The cht.sh Shell Mode

Shell mode gives you a persistent, interactive prompt with history, a language context, and clipboard integration. Start it with --shell:

cht.sh --shell
cht.sh> go reverse a list

Set a language context

If all your questions are about one language, set the context once with cd and drop the language prefix:

$ cht.sh --shell
cht.sh> cd go
cht.sh/go> reverse a list
cht.sh/go> join a list

You can also start directly in a context:

cht.sh --shell go

To run a one-off query in a different language without changing context, prefix it with /:

cht.sh/go> /python dictionary comprehension

Internal shell commands

Command Aliases What it does
help Show the in-shell help
hush Stop showing the help banner at startup
cd LANG Change the language context
copy yank, y, c Copy the last answer to the clipboard
ccopy cc, Y, C Copy the last answer without comments
id [ID] Set/show a session id (reset / remove)
stealth Enter stealth mode (see section 11)
update Self-update the client (if the script file is writable)
version Show the client version
exit quit, Ctrl-D Leave the shell

Example — copy an answer without comments:

cht.sh/python> append file
#  python - How do you append to a file?

with open("test.txt", "a") as myfile:
    myfile.write("appended text")
cht.sh/python> C
copy: 2 lines copied to the selection

Client configuration file

The client reads ~/.cht.sh/cht.sh.conf (override the location with the CHTSH_CONF environment variable). Put query options you always want there:

# ~/.cht.sh/cht.sh.conf
CHTSH_QUERY_OPTIONS="T"            # always turn highlighting off

Other useful settings:

CHTSH_QUERY_OPTIONS="style=native" # always use a specific color style
CHTSH_CURL_OPTIONS="-A curl"       # extra curl options for every query
CHTSH_URL=https://cht.sh           # point the client at a different server

Tip

CHTSH_URL lets you point the client at your own self-hosted instance. See the Admin Guide for how to run one.


10. Tab Completion

Tab completion lets you press Tab to complete language names and topics.

Bash

curl https://cheat.sh/:bash_completion > ~/.bash.d/cht.sh
. ~/.bash.d/cht.sh
# add this line to ~/.bashrc to load it on every shell:
#   . ~/.bash.d/cht.sh

Zsh

curl https://cheat.sh/:zsh > ~/.zsh.d/_cht
echo 'fpath=(~/.zsh.d/ $fpath)' >> ~/.zshrc
# open a new shell to load the plugin

Fish

# fetch the fish setup function
curl https://cheat.sh/:fish
# follow the printed instructions to install it

Note

These completion scripts are served live from the service, so they always match the current client.


11. Stealth Mode

Stealth mode lets you get answers without touching the keyboard. Once enabled, any text you select with the mouse (into the X selection buffer or clipboard) is sent as a query and the matching cheat sheet appears automatically.

Enter it from shell mode:

$ cht.sh --shell python
cht.sh/python> stealth

Add the Q option to get code only (no commentary):

cht.sh/python> stealth Q
stealth: you are in the stealth mode; select any text
stealth: selections longer than 5 words are ignored
stealth: query arguments: ?Q
stealth: use ^C to leave this mode

Now selecting the phrase "reverse a list" anywhere on your screen instantly prints:

reverse_lst = lst[::-1]

Press Ctrl-C to leave stealth mode.

Important

Selections longer than 5 words are ignored, so ordinary reading won't trigger a flood of queries.

Caution

The project's own documentation jokes about using this during interviews. Don't. Stealth mode is a genuinely useful pair-programming and learning tool — use it to learn faster, not to misrepresent your skills.


12. Editor Integration

You can query cheat.sh from your editor without switching to a browser. Each editor plugin lives in its own repository (cheat.sh itself does not bundle them).

Editor Plugin
Vim cheat.sh-vim
Emacs cheat-sh.el (also cht.sh/:emacs)
Visual Studio Code vscode-snippet
Sublime Text cheat.sh-sublime-plugin
IntelliJ IDEA idea-cheatsh-plugin
QtCreator cheatsh-qtcreator

Feature support varies by editor:

Feature Emacs Sublime Vim VSCode IDEA QtCreator
Command queries ✓ ✓ ✓ ✓ ✓ ✓
Queries from buffer ✓ ✓ ✓
Toggle comments ✓ ✓ ✓ ✓
Prev/next answer ✓ ✓ ✓ ✓
Multiple answers ✓ ✓
Warnings as queries ✓
Queries history ✓ ✓
Session id ✓
Configurable server ✓ ✓ ✓ ✓

Vim example

With cheat.sh-vim installed, type a question directly in your buffer and press <leader>KK to see the answer in a pager (<leader>KB for a separate buffer). <leader>KP pastes it below your question; <leader>KR replaces the question; <leader>KC toggles comments. If you use a linter such as syntastic, put the cursor on a warning line and press <leader>KE to look up an explanation.

Windows

There is no native Windows client in this repository. Use the third-party cht.exe (supports colorization, command-line options, and its own config file). Install it with scoop:

scoop install cht

13. Recipes

Make a shell alias

# ~/.bashrc
cheat() { curl -s "cht.sh/$1"; }
# usage: cheat tar

Get just the code, no colors, for piping

curl -s cht.sh/python/read+json\?QT

The Q strips prose and T strips ANSI color codes, leaving clean code suitable for redirecting into a file or another program.

Repeat your previous query

Set a session id (via a cookie or the client's id command), then request :last:

# the cht.sh client manages this for you with `id`
curl -b "id=mysession" cht.sh/:last

Note

:last requires a session id. Without one you get ERROR: you have to set id for your requests to use /:last. The cht.sh client sets the id for you when you run id <name> in shell mode.

Submit your own cheat sheet

You can POST a cheat sheet to the service:

curl --data "$(cat my-cheatsheet.txt)" cht.sh/python/my-trick

See curl cht.sh/:post for the full instructions, and section 16 for the recommended way to contribute lasting cheat sheets.


14. How It Works (Concepts)

You don't need this to use cheat.sh, but it explains the behavior you see.

The URL is the query. Everything after the host is your question. The first path segment is usually a language or command; the rest is the topic. Query-string letters (?QT) are options.

Answers come from many sources, merged. Behind the service is a set of adapters, each wrapping one upstream cheat sheet repository or computed source:

Source Provides
cheat.sheets The native cheat.sh sheets (UNIX/Linux + programming)
tldr Simplified, example-driven man pages (tldr-pages)
cheat Community command cheat sheets (the cheat project)
learnxiny "Learn X in Y Minutes" language tours (the :learn pages)
rosetta RosettaCode task implementations
question On-the-fly answers from StackOverflow
rfc, oeis, chmod Computed lookups (RFCs, integer sequences, file modes)

When several sources can answer, you get multiple answers and can switch between them with /1, /2, …

Formatting adapts to you. The service checks your User-Agent: terminal clients get colored plain text, browsers get an HTML page. The ?T option forces plain, color-free text regardless.

Note

For the architecture in depth — the routing table, caching, adapters, and how to run your own instance — see the cheat.sh Admin Guide.


15. Troubleshooting

Error: 500 Internal Server Error

Cause: A transient server-side error, often from an upstream source timing out or a malformed query path. The :shell-x/ proxy path is a known trigger.

Solution: Retry the query; simplify it; ensure your path doesn't contain stray special characters. If it persists for a normal query, it is a service-side issue — check the project's GitHub issues.

Prevention: Prefer specific, well-formed queries (/python/append+file). Avoid internal proxy paths like :shell-x unless you know you need them.

Error: 429 Not so fast! Number of queries per <interval> is limited to <N>

Cause: You exceeded the per-IP rate limit. Limits apply to multi-word queries (those containing +).

Solution: Slow down your request rate, or self-host an instance (see the Admin Guide) where you control the limits.

Prevention: Cache answers locally in scripts; don't hammer the public service in tight loops.

Error: Unknown topic. Do you mean one of these topics maybe?

Cause: The topic name wasn't recognized. cheat.sh shows the three closest matches.

Solution: Pick one of the suggestions, or rephrase. For a free-form question, make sure you put the language first: /python/<question>.

Prevention: Use :list (e.g. curl cht.sh/python/:list) to see valid topics.

Error: 404 NOT FOUND — Unknown cheat sheet. Please try to reformulate your query.

Cause: No answer could be generated for a programming-language question.

Solution: Reformulate using the /LANG/QUESTION format, e.g. /python/read+json, /js/regex+search. Use + between words.

Prevention: Be specific and practical; name the language explicitly.

pip install cht.sh fails (especially on Windows)

Cause: cheat.sh is not a pip package. The client is a shell script.

Solution: Install via curl https://cht.sh/:cht.sh > ~/bin/cht.sh && chmod +x ~/bin/cht.sh on Linux/macOS, or use cht.exe on Windows.

Prevention: Don't use pip for the client — follow section 3.

The install command hangs forever (macOS)

Cause: Usually a network stall fetching the script, or rlwrap not yet installed when entering shell mode.

Solution: Re-run the curl install with -s; install rlwrap (brew install rlwrap) before using --shell.

Prevention: Install rlwrap first; use HTTPS URLs.

Shell mode prints an error about rlwrap

Cause: Shell mode (--shell) requires rlwrap for readline support.

Solution: sudo apt install rlwrap (Debian/Ubuntu) or brew install rlwrap (macOS), then retry.

Prevention: Install rlwrap as part of setup (section 3).

A cheat sheet's content looks wrong or misleading

Cause: The content comes from a community upstream repository, not from cheat.sh itself.

Solution: Fix it in the upstream repo — open the answer in a browser, click the repository button at the bottom of the page, and edit it there. See section 16.

Prevention: None needed; this is how community content stays current.

Light-mode browser themes are hard to read

Cause: The HTML output is tuned for dark backgrounds (solarized-dark palette).

Solution: Use a dark theme in your browser, or query from the terminal where you control colors with ?style= and ?T.


16. FAQ

Q: Do I need to install anything to use cheat.sh? No. Any HTTP client (curl, wget, a browser) works against the public service. The cht.sh client is an optional convenience.

Q: What's the difference between cheat.sh and cht.sh? Nothing — they are two names for the same service. cht.sh is just shorter to type.

Q: Why use the cht.sh client instead of plain curl? The client lets you write queries with spaces instead of +, keeps a history, integrates with your clipboard, offers a persistent shell mode, tab completion, and stealth mode.

Q: How do I get only the code, without comments or colors? Append ?QT — Q removes the prose, T removes the terminal colors: curl cht.sh/go/reverse+a+list?QT.

Q: Can I get answers as JSON? No. The public service returns terminal text (ANSI) or an HTML page, chosen by your User-Agent. There is no JSON API endpoint.

Q: How are answers generated when no cheat sheet exists? cheat.sh synthesizes one from the available cheat sheets and the best StackOverflow answers for your language. It is best-effort, not guaranteed.

Q: How many languages are supported? 58 programming languages, plus related topics (CMake, Django, Flask, Git) and over a thousand UNIX/Linux commands.

Q: How do I cycle through alternative answers? Append /1, /2, … to your query.

Q: How do I exclude a library or keyword from an answer? Add it with +-, e.g. python/multiply+matrices+-numpy.

Q: Can I search if I don't know the command name? Yes — use ~: cht.sh/~snapshot. Add /r for a recursive search across all sheets, and i/b for case-insensitive / whole-word matching.

Q: How do I edit or add a cheat sheet? Edit the original upstream repository (the page's repository button links to it). To add one, contribute it to an external repo, to chubin/cheat.sheets, or POST it via cht.sh/:post.

Q: Is there a Windows client? Yes, the third-party cht.exe, installable via scoop install cht.

Q: Can I run my own private instance? Yes — cheat.sh is self-hostable with Docker. See the Admin Guide.

Q: Can I use it completely offline? You can self-host for offline cheat-sheet access, but the StackOverflow-backed question answers are not available offline — that feature is not implemented.

Q: How do I point a client or editor at my own server? Set CHTSH_URL for the cht.sh client, or use the "configurable server" option in editors that support it.


17. Quick Reference

Query forms

Form Meaning
cht.sh/COMMAND Cheat sheet for a UNIX/Linux command
cht.sh/LANG/QUESTION Programming answer (+ between words)
cht.sh/LANG/QUESTION/2 Alternative answer #2
cht.sh/LANG/Q+-WORD Exclude WORD from the answer
cht.sh/~KEYWORD Search at the top level
cht.sh/LANG/~KEYWORD Search within a language
cht.sh/~KEYWORD/r Recursive search across all sheets
cht.sh/LANG/:list List topics for a language
cht.sh/LANG/:learn Learn-X-in-Y tutorial for a language
cht.sh/LANG/:random A random page from a language
cht.sh/chmod/644 · /rfc/N · /oeis/AN Computed lookups

Options (append as ?...)

Option Effect
Q Code only, no prose
T No syntax-highlight colors
q Quiet page chrome (HTML)
c / C Drop comments / drop comments + unindent
style=NAME Pick a color style
lang=XX Human-language preference

Search options (after closing slash)

Option Meaning
i Case-insensitive
b Whole words
r Recursive

cht.sh client shell commands

Command Effect
cd LANG Set language context
c / C Copy last answer / without comments
id [ID] Set/show session id
stealth [Q] Enter stealth mode (Q = code only)
update · version · hush · help Self-update · version · hide banner · help
exit / Ctrl-D Leave the shell

Client environment variables

Variable Purpose
CHTSH_URL Server URL (default https://cht.sh)
CHTSH_QUERY_OPTIONS Default query options
CHTSH_CURL_OPTIONS Extra curl options
CHTSH_CONF Path to the client config file

Install in one line

curl https://cht.sh/:cht.sh > ~/bin/cht.sh && chmod +x ~/bin/cht.sh