DEVTOOLBOX / REFERENCE CARDS
Downloadable reference cards
Three printable reference cards: the full ASCII table, HTTP status codes, and Unix permission digits. The numbers come from the same source as the tables below, and the PDFs are laid out at build time, so the two can never drift apart.
ASCII and code-point reference card
All 128 ASCII code points with decimal, hex, category and UTF-8 width
The first thing to check when text looks wrong is the code point, not the character. This card lists every one of the 128 ASCII code points with its decimal value, hex value, control abbreviation or glyph, category, and UTF-8 width, so a mismatch can be traced to a number instead of a guess.
When you need it
- A control character is hiding in a string and nothing prints it
- You need the hex form for a packet dump, a diff, or a regex
- A character works in one encoding and breaks in another
| Dec | Hex | Char or name | Category | UTF-8 bytes |
|---|---|---|---|---|
| 0 | 0x00 | NUL | Control | 1 |
| 1 | 0x01 | SOH | Control | 1 |
| 2 | 0x02 | STX | Control | 1 |
| 3 | 0x03 | ETX | Control | 1 |
| 4 | 0x04 | EOT | Control | 1 |
| 5 | 0x05 | ENQ | Control | 1 |
| 6 | 0x06 | ACK | Control | 1 |
| 7 | 0x07 | BEL | Control | 1 |
| 8 | 0x08 | BS | Control | 1 |
| 9 | 0x09 | TAB | Control | 1 |
| 10 | 0x0A | LF | Control | 1 |
| 11 | 0x0B | VT | Control | 1 |
| 12 | 0x0C | FF | Control | 1 |
| 13 | 0x0D | CR | Control | 1 |
| 14 | 0x0E | SO | Control | 1 |
| 15 | 0x0F | SI | Control | 1 |
| 16 | 0x10 | DLE | Control | 1 |
| 17 | 0x11 | DC1 | Control | 1 |
| 18 | 0x12 | DC2 | Control | 1 |
| 19 | 0x13 | DC3 | Control | 1 |
| 20 | 0x14 | DC4 | Control | 1 |
| 21 | 0x15 | NAK | Control | 1 |
| 22 | 0x16 | SYN | Control | 1 |
| 23 | 0x17 | ETB | Control | 1 |
| 24 | 0x18 | CAN | Control | 1 |
| 25 | 0x19 | EM | Control | 1 |
| 26 | 0x1A | SUB | Control | 1 |
| 27 | 0x1B | ESC | Control | 1 |
| 28 | 0x1C | FS | Control | 1 |
| 29 | 0x1D | GS | Control | 1 |
| 30 | 0x1E | RS | Control | 1 |
| 31 | 0x1F | US | Control | 1 |
| 32 | 0x20 | (space) | Whitespace | 1 |
| 33 | 0x21 | ! | Punctuation | 1 |
| 34 | 0x22 | " | Punctuation | 1 |
| 35 | 0x23 | # | Punctuation | 1 |
| 36 | 0x24 | $ | Punctuation | 1 |
| 37 | 0x25 | % | Punctuation | 1 |
| 38 | 0x26 | & | Punctuation | 1 |
| 39 | 0x27 | ' | Punctuation | 1 |
| 40 | 0x28 | ( | Punctuation | 1 |
| 41 | 0x29 | ) | Punctuation | 1 |
| 42 | 0x2A | * | Punctuation | 1 |
| 43 | 0x2B | + | Punctuation | 1 |
| 44 | 0x2C | , | Punctuation | 1 |
| 45 | 0x2D | - | Punctuation | 1 |
| 46 | 0x2E | . | Punctuation | 1 |
| 47 | 0x2F | / | Punctuation | 1 |
| 48 | 0x30 | 0 | Digit | 1 |
| 49 | 0x31 | 1 | Digit | 1 |
| 50 | 0x32 | 2 | Digit | 1 |
| 51 | 0x33 | 3 | Digit | 1 |
| 52 | 0x34 | 4 | Digit | 1 |
| 53 | 0x35 | 5 | Digit | 1 |
| 54 | 0x36 | 6 | Digit | 1 |
| 55 | 0x37 | 7 | Digit | 1 |
| 56 | 0x38 | 8 | Digit | 1 |
| 57 | 0x39 | 9 | Digit | 1 |
| 58 | 0x3A | : | Punctuation | 1 |
| 59 | 0x3B | ; | Punctuation | 1 |
| 60 | 0x3C | < | Punctuation | 1 |
| 61 | 0x3D | = | Punctuation | 1 |
| 62 | 0x3E | > | Punctuation | 1 |
| 63 | 0x3F | ? | Punctuation | 1 |
| 64 | 0x40 | @ | Punctuation | 1 |
| 65 | 0x41 | A | Uppercase | 1 |
| 66 | 0x42 | B | Uppercase | 1 |
| 67 | 0x43 | C | Uppercase | 1 |
| 68 | 0x44 | D | Uppercase | 1 |
| 69 | 0x45 | E | Uppercase | 1 |
| 70 | 0x46 | F | Uppercase | 1 |
| 71 | 0x47 | G | Uppercase | 1 |
| 72 | 0x48 | H | Uppercase | 1 |
| 73 | 0x49 | I | Uppercase | 1 |
| 74 | 0x4A | J | Uppercase | 1 |
| 75 | 0x4B | K | Uppercase | 1 |
| 76 | 0x4C | L | Uppercase | 1 |
| 77 | 0x4D | M | Uppercase | 1 |
| 78 | 0x4E | N | Uppercase | 1 |
| 79 | 0x4F | O | Uppercase | 1 |
| 80 | 0x50 | P | Uppercase | 1 |
| 81 | 0x51 | Q | Uppercase | 1 |
| 82 | 0x52 | R | Uppercase | 1 |
| 83 | 0x53 | S | Uppercase | 1 |
| 84 | 0x54 | T | Uppercase | 1 |
| 85 | 0x55 | U | Uppercase | 1 |
| 86 | 0x56 | V | Uppercase | 1 |
| 87 | 0x57 | W | Uppercase | 1 |
| 88 | 0x58 | X | Uppercase | 1 |
| 89 | 0x59 | Y | Uppercase | 1 |
| 90 | 0x5A | Z | Uppercase | 1 |
| 91 | 0x5B | [ | Punctuation | 1 |
| 92 | 0x5C | \ | Punctuation | 1 |
| 93 | 0x5D | ] | Punctuation | 1 |
| 94 | 0x5E | ^ | Punctuation | 1 |
| 95 | 0x5F | _ | Punctuation | 1 |
| 96 | 0x60 | ` | Punctuation | 1 |
| 97 | 0x61 | a | Lowercase | 1 |
| 98 | 0x62 | b | Lowercase | 1 |
| 99 | 0x63 | c | Lowercase | 1 |
| 100 | 0x64 | d | Lowercase | 1 |
| 101 | 0x65 | e | Lowercase | 1 |
| 102 | 0x66 | f | Lowercase | 1 |
| 103 | 0x67 | g | Lowercase | 1 |
| 104 | 0x68 | h | Lowercase | 1 |
| 105 | 0x69 | i | Lowercase | 1 |
| 106 | 0x6A | j | Lowercase | 1 |
| 107 | 0x6B | k | Lowercase | 1 |
| 108 | 0x6C | l | Lowercase | 1 |
| 109 | 0x6D | m | Lowercase | 1 |
| 110 | 0x6E | n | Lowercase | 1 |
| 111 | 0x6F | o | Lowercase | 1 |
| 112 | 0x70 | p | Lowercase | 1 |
| 113 | 0x71 | q | Lowercase | 1 |
| 114 | 0x72 | r | Lowercase | 1 |
| 115 | 0x73 | s | Lowercase | 1 |
| 116 | 0x74 | t | Lowercase | 1 |
| 117 | 0x75 | u | Lowercase | 1 |
| 118 | 0x76 | v | Lowercase | 1 |
| 119 | 0x77 | w | Lowercase | 1 |
| 120 | 0x78 | x | Lowercase | 1 |
| 121 | 0x79 | y | Lowercase | 1 |
| 122 | 0x7A | z | Lowercase | 1 |
| 123 | 0x7B | { | Punctuation | 1 |
| 124 | 0x7C | | | Punctuation | 1 |
| 125 | 0x7D | } | Punctuation | 1 |
| 126 | 0x7E | ~ | Punctuation | 1 |
| 127 | 0x7F | DEL | Control | 1 |
- U+0000 to U+007F encode as one UTF-8 byte; every code point above that needs two or more.
- U+007F is DEL, a control character, not a printable glyph.
- LF (10) and CR (13) are the only line endings this table needs to disambiguate: CRLF is both bytes in that order.
Related tools: ASCII / Code Point LookupUnicode EscapeHex Encode / DecodeText Statistics
HTTP status code reference card
Every registered status code from RFC 9110 and its extensions, grouped by class
A status code is not a label for how the request felt, it is a machine-readable statement about what happened. This card lists the registered codes with the reason phrase and the one detail that changes the fix — which codes must not carry a body, which ones are cacheable, and which ones ask the client to retry differently.
When you need it
- Choosing between 401, 403 and 404 for an authorization failure
- Debugging a proxy or CDN that rewrites the status
- Answering "is this cacheable" without re-reading the RFC
| Code | Reason phrase | What it commits you to |
|---|---|---|
| 100 | Continue | Headers received; the client may send the body |
| 101 | Switching Protocols | WebSocket upgrades happen here |
| 102 | Processing | WebDAV; accepted, still working |
| 103 | Early Hints | Preload hints before the final response |
| 200 | OK | Meaning varies by method: GET returns a body, POST a result |
| 201 | Created | Should carry Location for the new resource |
| 202 | Accepted | Accepted, not finished; poll somewhere |
| 203 | Non-Authoritative Information | Body altered by a proxy |
| 204 | No Content | No body allowed; metadata headers still legal |
| 205 | Reset Content | Client should reset the form view |
| 206 | Partial Content | Pairs with Content-Range; the basis of resuming |
| 207 | Multi-Status | WebDAV; XML multi-status body |
| 208 | Already Reported | WebDAV; avoids re-enumeration |
| 226 | IM Used | Delta encoding applied |
| 300 | Multiple Choices | Client picks a representation |
| 301 | Moved Permanently | Cacheable; the method may be rewritten to GET |
| 302 | Found | Temporary; historical clients rewrite the method |
| 303 | See Other | Explicitly switch to GET for the result |
| 304 | Not Modified | Must carry validators and no body |
| 305 | Use Proxy | Deprecated |
| 307 | Temporary Redirect | Method and body preserved |
| 308 | Permanent Redirect | Permanent 307; cacheable |
| 400 | Bad Request | Syntax or parameters invalid |
| 401 | Unauthorized | Missing credentials; send WWW-Authenticate |
| 402 | Payment Required | Reserved, never enabled |
| 403 | Forbidden | Identity known, permission missing; retrying will not help |
| 404 | Not Found | Also used to conceal whether a resource exists |
| 405 | Method Not Allowed | Must carry Allow |
| 406 | Not Acceptable | Accept negotiation failed |
| 407 | Proxy Authentication Required | Proxy-level authentication |
| 408 | Request Timeout | Server gave up waiting for the request |
| 409 | Conflict | State conflict, typically concurrent writes |
| 410 | Gone | Was here, deliberately gone; safe to purge from an index |
| 411 | Length Required | Content-Length is required |
| 412 | Precondition Failed | An If-Match style precondition failed |
| 413 | Content Too Large | Body exceeds the server limit |
| 414 | URI Too Long | Target URI too long |
| 415 | Unsupported Media Type | Content-Type not supported |
| 416 | Range Not Satisfiable | Should carry Content-Range: bytes */length |
| 417 | Expectation Failed | Expect header cannot be met |
| 418 | I'm a teapot | An April 1st joke that RFC 9110 still reserves |
| 421 | Misdirected Request | Connection reused for a host it does not serve |
| 422 | Unprocessable Content | Syntax fine, semantics rejected |
| 423 | Locked | WebDAV resource locked |
| 424 | Failed Dependency | WebDAV; a prior action failed |
| 425 | Too Early | Anti-replay; early data refused |
| 426 | Upgrade Required | Protocol upgrade demanded |
| 428 | Precondition Required | Conditional request required to avoid lost updates |
| 429 | Too Many Requests | Should carry Retry-After |
| 431 | Request Header Fields Too Large | Header block exceeds the limit |
| 451 | Unavailable For Legal Reasons | Unavailable for legal reasons |
| 500 | Internal Server Error | Unexpected failure; do not leak internals |
| 501 | Not Implemented | Method not recognised |
| 502 | Bad Gateway | Upstream returned an invalid response |
| 503 | Service Unavailable | Overload or maintenance; send Retry-After |
| 504 | Gateway Timeout | Upstream timed out |
| 505 | HTTP Version Not Supported | Protocol version unsupported |
| 506 | Variant Also Negotiates | Content negotiation misconfigured |
| 507 | Insufficient Storage | WebDAV; out of space |
| 508 | Loop Detected | WebDAV; loop detected |
| 510 | Not Extended | An extension is required |
| 511 | Network Authentication Required | Captive portal, typically public Wi-Fi |
- 204 and 304 must not carry a body; a 304 must also repeat the validator headers it compares against.
- 301 and 308 are permanent and cacheable; 302 and 307 are temporary, and only 307 guarantees the method and body survive.
- 5xx means the server failed, not the request; 4xx means the request is the problem, except 408 and 429 which are about timing.
Related tools: HTTP Status CodesURL ParserUser Agent Parser
Unix permission reference card
Octal digits, rwx triplets, special bits and the modes you actually type
Permissions are three independent digits, and almost every incident comes from reading them as one word. This card gives what each octal digit prints and grants, what the special bits do, and the modes that show up in real deployments — including why a directory needs the execute bit to be entered even when it is readable.
When you need it
- Deciding between 644 and 755 for a deployed file
- A script fails with permission denied while ls shows r--
- Writing an archive extractor that must restore modes
| Digit | Prints as | Grants |
|---|---|---|
| 0 | --- | No permission at all |
| 1 | --x | Execute only; traverse an exact known path |
| 2 | -w- | Write only; truncate and append work, reading does not |
| 3 | -wx | Drop-box: create and remove by name, no enumeration |
| 4 | r-- | Read only; scripts will not run, directories can be listed |
| 5 | r-x | The usual directory mode |
| 6 | rw- | The usual data-file mode |
| 7 | rwx | Full control; the executable-file mode |
- A mode is three of these digits: 644 is rw- r-- r-- and 755 is rwx r-x r-x.
- Special bits sit in front: 4000 setuid, 2000 setgid, 1000 sticky — a 1777 directory lets anyone create files but only owners delete them.
- umask subtracts at creation time: with umask 022 a request for 777 lands as 755, and a request for 666 lands as 644.
Related tools: Unix Permission CalculatorExtract ZIP ArchiveCreate ZIP Archive