en-US/about_ProjectGemini.help.txt

TOPIC
    about_ProjectGemini

SHORT DESCRIPTION
    Project Gemini ("Gemini") is a client-server communications protocol that
    is deigned to be simple.

ABOUT THIS HELP
    This conceptual help article contains everything you need to know about
    Gemini itself. This was written by "Solderpunk", and I have chosen to
    include it with the PSGemini PowerShell module as an educational resource.
    It has been edited for formatting.

PROJECT GEMINI SPECULATIVE SPECIFICATION
    v0.16.1, January 30th 2022

    This is an increasingly less rough sketch of an actual spec for Project
    Gemini. Although not finalized yet, further changes to the specification
    are likely to be relatively small. You can write code to this pseudo-
    specification and be confident that it probably won't become totally non-
    functional due to massive changes next week, but you are still urged to keep
    an eye on ongoing development of the protocol and make changes as required.

    This is provided mostly so that people can quickly get up to speed on what
    I'm thinking without having to read lots and lots of old phlog posts and
    keep notes.

    Feedback on any part of this is extremely welcome, please email:
    solderpunk@posteo.net.

CONVENTIONS USED IN THIS DOCUMENT
    The keywords "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
    "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to
    be interpreted as described in BCP14.

1. OVERVIEW
    Gemini is a client-server protocol featuring request-response transactions,
    broadly similar to Gopher or HTTP. Connections are closed at the end of a
    single transaction and cannot be reused. When Gemini is served over TCP/IP,
    servers should listen on port 1965 (the first manned Gemini mission, Gemini
    3, flew in March '65). This is an unprivileged port, so it's very easy to
    run a server as a "nobody" user, even if e.g. the server is written in Go
    and so can't drop privileges in the traditional fashion.

    1.1 Gemini transactions

    There is one kind of Gemini transaction, roughly equivalent to a Gopher
    request or a HTTP "GET" request. Transactions happen as follows:

    C: Opens connection
    S: Accepts connection
    C/S: Complete TLS handshake (see section 4)
    C: Validates server certificate (see 4.2)
    C: Sends request (one CRLF terminated line) (see section 2)
    S: Sends response header (one CRLF terminated line), closes connection
       under non-success conditions (see 3.1 and 3.2)
    S: Sends response body (text or binary data) (see 3.3)
    S: Closes connection (including TLS close_notify, see section 4)
    C: Handles response (see 3.4)

    Note that clients are not obligated to wait until the server closes the
    connection to begin handling the response. This is shown above only for sim-
    plicity/clarity, to emphasise that responsibility for closing the connection
    under typical conditions lies with the server and that the connection should
    be closed immediately after the completion of the response body.

    1.2 Gemini URI scheme

    Resources hosted via Gemini are identified using URIs with the scheme
    "gemini". This scheme is syntactically compatible with the generic URI syn-
    tax defined in RFC 3986, but does not support all components of the generic
    syntax. In particular, the authority component is allowed and required, but
    its userinfo subcomponent is NOT allowed. The host subcomponent is required.
    The port subcomponent is optional, with a default value of 1965. The path,
    query and fragment components are allowed and have no special meanings
    beyond those defined by the generic syntax. An empty path is equivalent to
    a path consisting only of "/". Spaces in paths should be encoded as %20, not
    as +.

    Clients SHOULD normalise URIs (as per section 6.2.3 of RFC 3986) before
    sending requests (see section 2) and servers SHOULD normalise received URIs
    before processing a request.

2. GEMINI REQUESTS
    Gemini requests are a single CRLF-terminated line with the following struc-
    ture:

    <URL><CR><LF>

    <URL> is a UTF-8 encoded absolute URL, including a scheme, of maximum length
    1024 bytes. The request MUST NOT begin with a U+FEFF byte order mark.

    Sending an absolute URL instead of only a path or selector is effectively
    quivalent to building in a HTTP "Host" header. It permits virtual hosting of
    multiple Gemini domains on the same IP address. It also allows servers to
    optionally act as proxies. Including schemes other than "gemini" in requests
    allows servers to optionally act as protocol-translating gateways to e.g.
    fetch gopher resources over Gemini. Proxying is optional and the vast
    majority of servers are expected to only respond to requests for resources
    at their own domain(s).

    Clients MUST NOT send anything after the first occurrence of <CR><LF> in a
    request, and servers MUST ignore anything sent after the first occurrence of
    a <CR><LF>.

3. GEMINI RESPONSES
    Gemini response consist of a single CRLF-terminated header line, optionally
    followed by a response body.

    3.1 Response headers

    Gemini response headers look like this:

    <STATUS><SPACE><META><CR><LF>

    <STATUS> is a two-digit numeric status code, as described below in 3.2 and
    in Appendix 1.

    <SPACE> is a single space character, i.e. the byte 0x20.

    <META> is a UTF-8 encoded string of maximum length 1024 bytes, whose meaning
    is <STATUS> dependent.

    The response header as a whole and <META> as a sub-string both MUST NOT
    begin with a U+FEFF byte order mark.

    If <STATUS> does not belong to the "SUCCESS" range of codes, then the server
    MUST close the connection after sending the header and MUST NOT send a re-
    sponse body.

    If a server sends a <STATUS> which is not a two-digit number or a <META>
    which exceeds 1024 bytes in length, the client SHOULD close the connection
    and disregard the response header, informing the user of an error.

    3.2 Status codes

    Gemini uses two-digit numeric status codes. Related status codes share the
    same first digit. Importantly, the first digit of Gemini status codes do not
    group codes into vague categories like "client error" and "server error" as
    per HTTP. Instead, the first digit alone provides enough information for a
    client to determine how to handle the response. By design, it is possible
    to write a simple but feature complete client which only looks at the first
    digit. The second digit provides more fine-grained information, for unam-
    biguous server logging, to allow writing comfier interactive clients which
    provide a slightly more streamlined user interface, and to allow writing
    more robust and intelligent automated clients like content aggregators,
    search engine crawlers, etc.

    The first digit of a response code unambiguously places the response into
    one of six categories, which define the semantics of the <META> line.

    3.2.1 1x (INPUT)

    Status codes beginning with 1 are INPUT status codes, meaning:

    The requested resource accepts a line of textual user input. The <META> line
    is a prompt which should be displayed to the user. The same resource should
    then be requested again with the user's input included as a query component.
    Queries are included in requests as per the usual generic URL definition in
    RFC3986, i.e. separated from the path by a ?. Reserved characters used in
    the user's input must be "percent-encoded" as per RFC3986, and space chara-
    cters should also be percent-encoded.

    3.2.2 2x (SUCCESS)

    Status codes beginning with 2 are SUCCESS status codes, meaning:

    The request was handled successfully and a response body will follow the
    response header. The <META> line is a MIME media type which applies to the
    response body.

    3.2.3 3x (REDIRECT)

    Status codes beginning with 3 are REDIRECT status codes, meaning:

    The server is redirecting the client to a new location for the requested
    resource. There is no response body. <META> is a new URL for the requested
    resource. The URL may be absolute or relative. If relative, it should be
    resolved against the URL used in the original request. If the URL used in
    the original request contained a query string, the client MUST NOT apply
    this string to the redirect URL, instead using the redirect URL "as is".
    The redirect should be considered temporary, i.e. clients should continue
    to request the resource at the original address and should not perform
    convenience actions like automatically updating bookmarks. There is no
    response body.

    3.2.4 4x (TEMPORARY FAILURE)

    Status codes beginning with 4 are TEMPORARY FAILURE status codes, meaning:

    The request has failed. There is no response body. The nature of the
    failure is temporary, i.e. an identical request MAY succeed in the future.
    The contents of <META> may provide additional information on the failure,
    and should be displayed to human users.

    3.2.5 5x (PERMANENT FAILURE)

    Status codes beginning with 5 are PERMANENT FAILURE status codes, meaning:

    The request has failed. There is no response body. The nature of the failure
    is permanent, i.e. identical future requests will reliably fail for the same
    reason. The contents of <META> may provide additional information on the
    failure, and should be displayed to human users. Automatic clients such as
    aggregators or indexing crawlers should not repeat this request.

    3.2.6 6x (CLIENT CERTIFICATE REQUIRED)

    Status codes beginning with 6 are CLIENT CERTIFICATE REQUIRED status codes,
    meaning:

    The requested resource requires a client certificate to access. If the
    request was made without a certificate, it should be repeated with one. If
    the request was made with a certificate, the server did not accept it and
    the request should be repeated with a different certificate. The contents
    of <META> (and/or the specific 6x code) may provide additional information
    on certificate requirements or the reason a certificate was rejected.

    3.2.7 Notes

    Note that for basic interactive clients for human use, errors 4 and 5 may be
    effectively handled identically, by simply displaying the contents of <META>
    under a heading of "ERROR". The temporary/permanent error distinction is
    primarily relevant to well-behaving automated clients. Basic clients may
    also choose not to support client-certificate authentication, in which case
    only four distinct status handling routines are required (for statuses
    beginning with 1, 2, 3 or a combined 4-or-5).

    The full two-digit system is detailed in Appendix 1. Note that for each of
    the six valid first digits, a code with a second digit of zero corresponds
    is a generic status of that kind with no special semantics. This means that
    basic servers without any advanced functionality need only be able to return
    codes of 10, 20, 30, 40 or 50.

    The Gemini status code system has been carefully designed so that the
    increased power (and correspondingly increased complexity) of the second
    digits is entirely "opt-in" on the part of both servers and clients.

    3.3 Response bodies

    Response bodies are just raw content, text or binary, à la Gopher. There is
    no support for compression, chunking or any other kind of content or trans-
    fer encoding. The server closes the connection after the final byte, there
    is no "end of response" signal like gopher's lonely dot.

    Response bodies only accompany responses whose header indicates a SUCCESS
    status (i.e. a status code whose first digit is 2). For such responses,
    <META> is a MIME media type as defined in RFC 2046.

    Internet media types are registered with a canonical form. Content trans-
    ferred via Gemini MUST be represented in the appropriate canonical form
    prior to its transmission except for "text" types, as defined in the next
    paragraph.

    When in canonical form, media subtypes of the "text" type use CRLF as the
    text line break. Gemini relaxes this requirement and allows the transport
    of text media with plain LF alone (but NOT a plain CR alone) representing a
    line break when it is done consistently for an entire response body. Gemini
    clients MUST accept CRLF and bare LF as being representative of a line break
    in text media received via Gemini.

    If a MIME type begins with "text/" and no charset is explicitly given, the
    charset should be assumed to be UTF-8. Compliant clients MUST support UTF-8-
    encoded text/* responses. Clients MAY optionally support other encodings.
    Clients receiving a response in a charset they cannot decode SHOULD grace-
    fully inform the user what happened instead of displaying garbage.

    If <META> is an empty string, the MIME type MUST default to "text/gemini;
    charset=utf-8". The text/gemini media type is defined in section 5.

    3.4 Response body handling

    Response handling by clients should be informed by the provided MIME type
    information. Gemini defines one MIME type of its own (text/gemini) whose
    handling is discussed below in section 5. In all other cases, clients should
    do "something sensible" based on the MIME type. Minimalistic clients might
    adopt a strategy of printing all other text/* responses to the screen with-
    out formatting and saving all non-text responses to the disk. Clients for
    UNIX systems may consult /etc/mailcap to find installed programs for hand-
    ling non-text types.

4. TLS

    Use of TLS for Gemini transactions is mandatory.

    Use of the Server Name Indication (SNI) extension to TLS is also mandatory,
    to facilitate name-based virtual hosting.

    As per RFCs 5246 and 8446, Gemini servers MUST send a TLS `close_notify`
    prior to closing the connection after sending a complete response. This is
    essential to disambiguate completed responses from responses closed prema-
    turely due to network error or attack.

    4.1 Version requirements

    Servers MUST use TLS version 1.2 or higher and SHOULD use TLS version 1.3 or
    higher. TLS 1.2 is reluctantly permitted for now to avoid drastically redu-
    cing the range of available implementation libraries. Hopefully TLS 1.3 or
    higher can be specced in the near future. Clients who wish to be "ahead of
    the curve MAY refuse to connect to servers using TLS version 1.2 or lower.

    4.2 Server certificate validation

    Clients can validate TLS connections however they like (including not at
    all) but the strongly RECOMMENDED approach is to implement a lightweight
    "TOFU" certificate-pinning system which treats self-signed certificates as
    first- class citizens. This greatly reduces TLS overhead on the network
    (only one cert needs to be sent, not a whole chain) and lowers the barrier
    to entry for setting up a Gemini site (no need to pay a CA or setup a Let's
    Encrypt cron job, just make a cert and go).

    TOFU stands for "Trust On First Use" and is public-key security model
    similar to that used by OpenSSH. The first time a Gemini client connects
    to a server, it accepts whatever certificate it is presented. That certifi-
    cate's fingerprint and expiry date are saved in a persistent database (like
    the .known_hosts file for SSH), associated with the server's hostname. On
    all subsequent connections to that hostname, the received certificate's
    fingerprint is computed and compared to the one in the database. If the
    certificate is not the one previously received, but the previous certifi-
    cate's expiry date has not passed, the user is shown a warning, analogous
    to the one web browser users are shown when receiving a certificate without
    a signature chain leading to a trusted CA.

    This model is by no means perfect, but it is not awful and is vastly super-
    ior to just accepting self-signed certificates unconditionally.

    4.3 Client certificates

    Although rarely seen on the web, TLS permits clients to identify themselves
    to servers using certificates, in exactly the same way that servers tradit-
    ionally identify themselves to the client. Gemini includes the ability for
    servers to request in-band that a client repeats a request with a client
    certificate. This is a very flexible, highly secure but also very simple
    notion of client identity with several applications:

    • Short-lived client certificates which are generated on demand and deleted
      immediately after use can be used as "session identifiers" to maintain
      server-side state for applications. In this role, client certificates
      act as a substitute for HTTP cookies, but unlike cookies they are gener-
      ated voluntarily by the client, and once the client deletes a certificate
      and its matching key, the server cannot possibly "resurrect" the same
      value later (unlike so-called "super cookies").

    • Long-lived client certificates can reliably identify a user to a multi-
      user application, without the need for passwords which may be brute-
      forced. Even a stolen database table mapping certificate hashes to user
      identities is not a security risk, as rainbow tables for certificates are
      not feasible.

    • Self-hosted, single-user applications can be easily and reliably secured
      in a manner familiar from OpenSSH: the user generates a self-signed cer-
      tificate and adds its hash to a server-side list of permitted certifi-
      cates, analogous to the .authorized_keys file for SSH).

    Gemini requests will typically be made without a client certificate. If a
    requested resource requires a client certificate and one is not included in
    a request, the server can respond with a status code of 60, 61 or 62 (see
    Appendix 1 below for a description of all status codes related to client
    certificates). A client certificate which is generated or loaded in response
    to such a status code has its scope bound to the same hostname as the
    request URL and to all paths below the path of the request URL path.
    E.g., if a request for gemini://example.com/foo returns status 60 and the
    user chooses to generate a new client certificate in response to this, that
    same certificate should be used for subsequent requests to
    gemini://example.com/foo, gemini://example.com/foo/bar/,
    gemini://example.com/foo/bar/baz, etc., until such time as the user decides
    to delete the certificate or to temporarily deactivate it. Interactive cli-
    ents for human users are strongly recommended to make such actions easy and
    to generally give users full control over the use of client certificates.

5. THE text/gemini MEDIA TYPE
    5.1 Overview

    In the same sense that HTML is the "native" response format of HTTP and
    plain text is the native response format of Gopher, Gemini defines its own
    native response format -- though of course, thanks to the inclusion of a
    MIME type in the response header Gemini can be used to serve plain text,
    rich text, HTML, Markdown, LaTeX, etc.

    Response bodies of type "text/gemini" are a kind of lightweight hypertext
    format, which takes inspiration from Gophermaps and from Markdown. The for-
    mat permits richer typographic possibilities than the plain text of Gopher,
    but remains extremely easy to parse. The format is line-oriented, and a
    satisfactory rendering can be achieved with a single pass of a document,
    processing each line independently. vAs per Gopher, links can only be dis-
    played one per line, encouraging neat, list-like structure.

    Similar to how the two-digit Gemini status codes were designed so that
    simple clients can function correctly while ignoring the second digit, the
    text/gemini format has been designed so that simple clients can ignore the
    more advanced features and still remain very usable.

    5.2 Parameters

    As a subtype of the top-level media type "text", "text/gemini" inherits the
    "charset" parameter defined in RFC 2046. However, as noted in 3.3, the de-
    fault value of "charset" is "UTF-8" for "text" content transferred via
    Gemini.

    A single additional parameter specific to the "text/gemini" subtype is
    defined: the "lang" parameter. The value of "lang" denotes the natural
    language or language(s) in which the textual content of a "text/gemini"
    document is written. The presence of the "lang" parameter is optional.
    When the "lang" parameter is present, its interpretation is defined entirely
    by the client. For example, clients which use text-to-speech technology to
    make Gemini content accessible to visually impaired users may use the value
    of "lang" to improve pronunciation of content. Clients which render text to
    a screen may use the value of "lang" to determine whether text should be
    displayed left-to-right or right-to-left. Simple clients for users who only
    read languages written left-to-right may simply ignore the value of "lang".
    When the "lang" parameter is not present, no default value should be assumed
    and clients which require some notion of a language in order to process the
    content (such as text-to-speech screen readers) should rely on user-input
    to determine how to proceed in the absence of a "lang" parameter.

    Valid values for the "lang" parameter are comma-separated lists of one or
    more language tags as defined in BCP47. For example:

    • "text/gemini; lang=en" Denotes a text/gemini document written in English
    • "text/gemini; lang=fr" Denotes a text/gemini document written in French
    • "text/gemini; lang=en,fr" Denotes a text/gemini document written in a
                                mixture of English and French
    • "text/gemini; lang=de-CH" Denotes a text/gemini document written in
                                Swiss German
    • "text/gemini; lang=sr-Cyrl" Denotes a text/gemini document written in
                                  Serbian using the Cyrllic script
    • "text/gemini; lang=zh-Hans-CN" Denotes a text/gemini document written in
                                     Chinese using the Simplified script as used
                                     in mainland China

    5.3 Line-orientation

    As mentioned, the text/gemini format is line-oriented. Each line of a
    text/gemini document has a single "line type". It is possible to unambigu-
    ously determine a line's type purely by inspecting its first three charac-
    ters. A line's type determines the manner in which it should be presented
    to the user. Any details of presentation or rendering associated with a
    particular line type are strictly limited in scope to that individual line.

    There are 7 different line types in total. However, a fully functional and
    specification compliant Gemini client need only recognise and handle 4 of
    them - these are the "core line types", (see 5.4). Advanced clients can also
    handle the additional "advanced line types" (see 5.5). Simple clients can
    treat all advanced line types as equivalent to one of the core line types
    and still offer an adequate user experience.

    5.4 Core line types

    The four core line types are:

    5.4.1 Text lines

    Text lines are the most fundamental line type -- any line which does not
    match the definition of another line type defined below defaults to being a
    text line. The majority of lines in a typical text/gemini document will be
    text lines.

    Text lines should be presented to the user, after being wrapped to the
    appropriate width for the client's viewport (see below). Text lines may
    be presented to the user in a visually pleasing manner for general reading,
    the precise meaning of which is at the client's discretion. For example,
    variable width fonts may be used, spacing may be normalized, with spaces
    between sentences being made wider than spacing between words, and other
    such typographical niceties may be applied. Clients may permit users to
    customise the appearance of text lines by altering the font, font size, text
    and background colour, etc. Authors should not expect to exercise any
    control over the precise rendering of their text lines, only of their actual
    textual content. Content such as ASCII art, computer source code, etc.
    which may appear incorrectly when treated as such should be enclosed between
    preformatting toggle lines (see 5.4.3).

    Blank lines are instances of text lines and have no special meaning. They
    should be rendered individually as vertical blank space each time they
    occur. In this way they are analogous to <br> tags in HTML. Consecutive
    blank lines should NOT be collapsed into fewer blank lines. Note also that
    consecutive non-blank text lines do not form any kind of coherent unit or
    block such as a "paragraph": all text lines are independent entities.

    Text lines which are longer than can fit on a client's display device SHOULD
    be "wrapped" to fit, i.e. long lines should be split (ideally at whitespace
    or at hyphens) into multiple consecutive lines of a device-appropriate
    width. This wrapping is applied to each line of text independently. Multiple
    consecutive lines which are shorter than the client's display device MUST
    NOT be combined into fewer, longer lines.

    In order to take full advantage of this method of text formatting, authors
    of text/gemini content SHOULD avoid hard-wrapping to a specific fixed width,
    in contrast to the convention in Gopherspace where text is typically wrapped
    at 80 characters or fewer. Instead, text which should be displayed as a
    contiguous block should be written as a single long line. Most text editors
    can be configured to "soft-wrap", i.e. to write this kind of file while
    displaying the long lines wrapped at word boundaries to fit the author's
    display device.

    Authors who insist on hard-wrapping their content MUST be aware that the
    content will display neatly on clients whose display device is as wide
    as the hard-wrapped length or wider, but will appear with irregular line
    widths on narrower clients.

    5.4.2 Link lines

    Lines beginning with the two characters "=>" are link lines, which have the
    following syntax:

    =>[<whitespace>]<URL>[<whitespace><USER-FRIENDLY LINK NAME>]

    where:

        <whitespace> is any non-zero number of consecutive spaces or tabs
        Square brackets indicate that the enclosed content is optional.
        <URL> is a URL, which may be absolute or relative.

    All the following examples are valid link lines:

    => gemini://example.org/
    => gemini://example.org/ An example link
    => gemini://example.org/foo Another example link at the same host
    => foo/bar/baz.txt A relative link
    => gopher://example.org:70/1 A gopher link

    URLs in link lines must have reserved characters and spaces percent-encoded
    as per RFC 3986.

    Note that link URLs may have schemes other than gemini. This means that
    Gemini documents can simply and elegantly link to documents hosted via other
    protocols, unlike gophermaps which can only link to non-gopher content via
    a non-standard adaptation of the `h` item-type.

    Clients can present links to users in whatever fashion the client author
    wishes, however clients MUST NOT automatically make any network connections
    as part of displaying links whose scheme corresponds to a network protocol
    e.g. links beginning with gemini://, gopher://, https://, ftp:// , etc.).

    5.4.3 Preformatting toggle lines

    Any line whose first three characters are "```" (i.e. three consecutive back
    ticks with no leading whitespace) are preformatted toggle lines. These lines
    should NOT be included in the rendered output shown to the user. Instead,
    these lines toggle the parser between preformatted mode being "on" or "off".
    Preformatted mode should be "off" at the beginning of a document. The
    current status of preformatted mode is the only internal state a parser is
    required to maintain. When preformatted mode is "on", the usual rules for
    identifying line types are suspended, and all lines should be identified as
    preformatted text lines (see 5.4.4).

    Preformatting toggle lines can be thought of as analogous to <pre> and
    </pre> tags in HTML.

    Any text following the leading "```" of a preformat toggle line which
    toggles preformatted mode on MAY be interpreted by the client as "alt text"
    pertaining to the preformatted text lines which follow the toggle line. Use
    of alt text is at the client's discretion, and simple clients may ignore it.
    Alt text is recommended for ASCII art or similar non-textual content which,
    for example, cannot be meaningfully understood when rendered through a
    screen reader or usefully indexed by a search engine. Alt text may also be
    used for computer source code to identify the programming language which
    advanced clients may use for syntax highlighting.

    Any text following the leading "```" of a preformat toggle line which
    toggles preformatted mode off MUST be ignored by clients.

    5.4.4 Preformatted text lines

    Preformatted text lines should be presented to the user in a "neutral",
    monowidth font without any alteration to whitespace or stylistic enhance-
    ments. Graphical clients should use scrolling mechanisms to present
    preformatted text lines which are longer than the client viewport, in
    preference to wrapping. In displaying preformatted text lines, clients
    should keep in mind applications like ASCII art and computer source code:
    in particular, source code in languages with significant whitespace
    (e.g., Python) should be able to be copied and pasted from the client into a
    file and interpreted/compiled without any problems arising from the client's
    manner of displaying them.

    5.5 Advanced line types

    The following advanced line types MAY be recognized by advanced clients.
    Simple clients may treat them all as text lines as per 5.4.1 without any
    loss of essential function.

    5.5.1 Heading lines

    Lines beginning with "#" are heading lines. Heading lines consist of one,
    two or three consecutive "#" characters, followed by optional whitespace,
    followed by heading text. The number of # characters indicates the "level"
    of header; #, ## and ### can be thought of as analogous to <h1>, <h2> and
    <h3> in HTML.

    Heading text should be presented to the user, and clients MAY use special
    formatting, e.g. a larger or bold font, to indicate its status as a header
    (simple clients may simply print the line, including its leading #s, without
    any styling at all). However, the main motivation for the definition of
    heading lines is not stylistic but to provide a machine-readable representa-
    tion of the internal structure of the document. Advanced clients can use
    this information to, e.g. display an automatically generated and hierarchi-
    cally formatted "table of contents" for a long document in a side-pane,
    allowing users to easily jump to specific sections without excessive
    scrolling. CMS-style tools automatically generating menus or Atom/RSS feeds
    for a directory of text/gemini files can use the first heading in the file
    as a human-friendly title.

    5.5.2 Unordered list items

    Lines beginning with "* " are unordered list items. This line type exists
    urely for stylistic reasons. The * may be replaced in advanced clients by a
    bullet symbol. Any text after the "* " should be presented to the user as
    if it were a text line, i.e. wrapped to fit the viewport and formatted
    "nicely". Advanced clients can take the space of the bullet symbol into
    account when wrapping long list items to ensure that all lines of text
    corresponding to the item are offset an equal distance from the left of the
    screen.

    5.5.3 Quote lines

    Lines beginning with ">" are quote lines. This line type exists so that
    advanced clients may use distinct styling to convey to readers the important
    semantic information that certain text is being quoted from an external
    source. For example, when wrapping long lines to the viewport, each
    resultant line may have a ">" symbol placed at the front.

    Appendix 1. Full two digit status codes

    10 INPUT

    As per definition of single-digit code 1 in 3.2.

    11 SENSITIVE INPUT

    As per status code 10, but for use with sensitive input such as passwords.
    Clients should present the prompt as per status code 10, but the user's
    input should not be echoed to the screen to prevent it being read by
    "shoulder surfers".

    20 SUCCESS

    As per definition of single-digit code 2 in 3.2.

    30 REDIRECT - TEMPORARY

    As per definition of single-digit code 3 in 3.2.

    31 REDIRECT - PERMANENT

    The requested resource should be consistently requested from the new URL
    provided in future. Tools like search engine indexers or content aggregators
    should update their configurations to avoid requesting the old URL, and
    end-user clients may automatically update bookmarks, etc. Note that clients
    which only pay attention to the initial digit of status codes will treat
    this as a temporary redirect. They will still end up at the right place,
    they just won't be able to make use of the knowledge that this redirect is
    permanent, so they'll pay a small performance penalty by having to follow
    the redirect each time.

    40 TEMPORARY FAILURE

    As per definition of single-digit code 4 in 3.2.

    41 SERVER UNAVAILABLE

    The server is unavailable due to overload or maintenance. (cf HTTP 503)

    42 CGI ERROR

    A CGI process, or similar system for generating dynamic content, died
    unexpectedly or timed out.

    43 PROXY ERROR

    A proxy request failed because the server was unable to successfully
    complete a transaction with the remote host. (cf HTTP 502, 504)

    44 SLOW DOWN

    Rate limiting is in effect. <META> is an integer number of seconds which
    the client must wait before another request is made to this server.
    (cf HTTP 429)

    50 PERMANENT FAILURE

    As per definition of single-digit code 5 in 3.2.

    51 NOT FOUND

    The requested resource could not be found but may be available in the
    future. (cf HTTP 404) (struggling to remember this important status code?
    Easy: you can't find things hidden at Area 51!)

    52 GONE

    The resource requested is no longer available and will not be available
    again. Search engines and similar tools should remove this resource from
    their indices. Content aggregators should stop requesting the resource
    and convey to their human users that the subscribed resource is gone.
    (cf HTTP 410)

    53 PROXY REQUEST REFUSED

    The request was for a resource at a domain not served by the server and the
    server does not accept proxy requests.

    59 BAD REQUEST

    The server was unable to parse the client's request, presumably due to a
    malformed request. (cf HTTP 400)

    60 CLIENT CERTIFICATE REQUIRED

    As per definition of single-digit code 6 in 3.2.

    61 CERTIFICATE NOT authorized

    The supplied client certificate is not authorized for accessing the
    particular requested resource. The problem is not with the certificate
    itself, which may be authorized for other resources.

    62 CERTIFICATE NOT VALID

    The supplied client certificate was not accepted because it is not valid.
    This indicates a problem with the certificate in and of itself, with no
    consideration of the particular requested resource. The most likely cause is
    is that the certificate's validity start date is in the future or its expiry
    date has passed, but this code may also indicate an invalid signature, or a
    violation of X.509 standard requirements. The <META> should provide more
    information about the exact error.

LINKS
    This document: gemini://gemini.circumlunar.space/docs/specification.gmi

KEYWORDS
    Gemini
    Gemtext
    Solderpunk
    the small web