flnews(1)

πŸ“¦ version 1.2.1, in opensuse-leap 16.0

okay bestie, welcome to flnews(1) β€” the manual page for flnews 1.2.1, aka the fast and lightweight Usenet client with a GUI. it’s giving β€œniche but iconic,” no cap πŸ’–

✨ NAME ✨

flnews β€” fast and lightweight Usenet client with GUI. that’s the whole vibe: fast, lightweight, GUI, Usenet. periodt πŸ¦‹

🌸 SYNOPSIS 🌸

run it like this, bestie:

flnews [-display [host]:display] [-geometry WxH[+X+Y]]

flnews [-h|-v]

πŸ¦‹ DESCRIPTION πŸ¦‹

if you don’t know what Usenet is, you probably wanna read this article first, fr fr:

https://en.wikipedia.org/wiki/Usenet

flnews is a client with a graphical user interface that uses the NNTP protocol defined in RFC 3977 to get Usenet news articles defined in RFC 5536 from a server via IP network. Version 1 of the NNTP protocol (as defined in RFC 977) is supported too and automatically used if the server does not report support for Version 2. lowkey efficient πŸ’…

if it was compiled with support for ssl(3), the NNTPS protocol (NNTP over encrypted TLS connection) is supported. For NNTPS connections, server-to-client authentication via X509 certificate is always performed. Optionally, the client can authenticate to the server via the AUTHINFO USER/PASS extension defined in RFC 4643. secure-ish and slay πŸ”₯

if it was compiled with support for compression and zlib(3), the NNTP COMPRESS extension is supported. Compression negotiation is disabled by default and can be enabled on the Edit->Configuration->Misc tab in the user interface. Because compression in general can weaken the underlying encryption, the optional authentication is always done before compression is negotiated. For the same reason, compression negotiation should be disabled for reading groups that contain articles with confidential information. protect the vibes, bestie 🫢

flnews provides full Unicode support, including NFC normalization for posting and search/compare operations. Article content is converted to ISO 8859-1 before posting (if possible) to be more friendly to old clients. The ability to display Unicode content depends on the GUI toolkit fltk(3). Even if the content could not be correctly displayed, it is always possible to correctly quote it in follow-up articles. so the Unicode girlies are mostly fed 🌈

flnews has MIME support according to RFC 2045, RFC 2046, RFC 2047 and RFC 2231. Since version 0.18, full MIME conformance according to RFC 2049 Section 2 was reached. Posted articles should be fully RFC 5536 conformant (without postprocessing by the user). it ate and left no crumbs πŸ’–

additional checks are implemented that create warnings if an article violates common Usenet conventions. Conformance to mandatory GNKSA 2.0 rules was reached with exception of part 4 (the "Reply-To" header field can only be modified before the article composer is started):

https://js.home.xs4all.nl/gnksa/

currently flnews 1.2.1 provides no support for the following features, and I’m just gonna say it plainly:

  • Multiple servers
  • Offline mode
  • UUCP

if you need one of these features, use leafnode(8) or another proxy server (consider Hamster for machines with Windows operating system). not me being picky, it’s just the facts πŸŽ€

πŸ’… OPTIONS πŸ’…

the following options are supported, bestie:

  • -4 β€” Force usage of IPv4 network protocol.
  • -confprefix path β€” Use different configuration directory. Attention: Never set path to an existing configuration directory for flnews with a different major version number! 🚨
  • -debug β€” Enable debug mode.
  • -display [host]:display β€” X display to use. More information about X can be found in X(7).
  • -geometry WxH[+X+Y] β€” Window size and position.
  • -h β€” Print help message.
  • -iconic β€” Starts with minimized window.
  • -notooltips β€” Disable tooltip messages.
  • -v β€” Print version and compile time options.

πŸŽ€ EXIT STATUS πŸŽ€

Zero on regular exit. All other values indicate an error. short and iconic, like her πŸ’€

🌈 ENVIRONMENT 🌈

  • DISPLAY β€” X display to use. More information about X can be found in X(7).
  • FLTK_SCHEME β€” Selects the FLTK scheme to use. FLTK 1.3.0 accepts the following options:
    • none (Default style)
    • gtk+ (GTK+ style)
    • plastic (Aqua style)

Newer FLTK versions may accept additional schemes. slay, but read the version notes bestie ✨

  • TMPDIR β€” Directory used for temporary files (as recommended by POSIX). This value will override the default "/tmp".
  • TZ β€” The timezone that is used by localtime(3). flnews internally uses this function to convert POSIX timestamps to local time and for creating 'date-time' tokens according to RFC 5322.
  • XDG_CONFIG_HOME β€” Prefix for configuration directory path according to XDG Base Directory Specification. This value will override the default "~/.config". The program name flnews is appended as last path component.

in addition, flnews honours the following locale related variables:

  • LANG β€” Used as fallback if LC_* variables are not set.
  • LC_ALL β€” Overdrives all other LC_* variables.
  • LC_CTYPE β€” Character classification to use. Only locales with US-ASCII, ISO 8859-1 and UTF-8 codesets are allowed here. Setting this to a locale with UTF-8 codeset is very expensive on some operating systems (e.g. more than an order of magnitude slower on NetBSD 5). Note that setting this to POSIX or an ISO 8859-1 locale will not completely disable Unicode support! You can at least use Unicode for your name in the identity configuration and you can correctly quote Unicode content for follow-up articles in any case. highkey important 😭
  • LC_MESSAGES β€” Locale for user interface language. The codeset is ignored because FLTK internally always use UTF-8 (regardless of the locale settings). If flnews is compiled without National Language Support (NLS), this variable is ignored.

as a general rule, POSIX.2 define that all locale sections must use the same codeset. More information about NLS can be found in nls(7) or locale(7) depending on the operating system. okay copy that, bestie 🫢

⭐ X RESOURCES ⭐

information about X resources and how to set them can be found in X(7). now let’s get into the resource lineup:

  • fltk.background β€” (String) The value of this resource is taken as the background color for most widgets (see Text.background if it does not work).
  • fltk.foreground β€” (String) The value of this resource is taken as the foreground color for most widgets.
  • fltk.scheme β€” (String) See the environment variable FLTK_SCHEME for possible values. The environment variable takes precedence over this resource.
  • Text.background β€” (String) The value of this resource is taken as the background color for text, list, and valuator widgets.
  • Text.selectBackground β€” (String) The value of this resource is taken as the background color for selected text. Set it to something like "gray" for a more decent selection color. On machines with 8-bit color depth the highlight color for search results (that is derived from the selection background color) may have little or no contrast. Use a darker color in this case, e.g. "darkgray".
  • Xft.antialias β€” (Boolean) If FLTK uses the X11 backend and is compiled to use Xft (the default), then the value "true" will enable and "false" will disable font anti-aliasing. The recommended setting is "true".
  • Xft.hinting β€” (Boolean) If FLTK uses the X11 backend and is compiled to use Xft (the default), then the value "true" will enable and "false" will disable font hinting. The recommended setting is "true".
  • Xft.autohint β€” (Boolean) If FLTK uses the X11 backend, is compiled to use Xft (the default) and Xft is configured with enabled font hinting (resource Xft.hinting set to "true") then this resource controls the hinting algorithm. With setting "false" the BCI algorithm is used, "true" enables the builtin autohinter of Freetype2. The recommended setting is "false".
  • Xft.hintstyle β€” (Integer) If FLTK uses the X11 backend, is compiled to use Xft (the default) and Xft is configured with enabled font hinting (resource Xft.hinting set to "true") then this resource controls the hinting mode. Possible values are "hintnone" (0), "hintslight" (1), "hintmedium" (2) and "hintfull" (3). The recommended setting is "hintfull" (3).
Attention: With some modes it is possible that lines will overlap and characters like underscore are clipped! πŸ’€ not the underscore getting clipped, bestie, protect her at all costs 😭

πŸ’– FILES πŸ’–

okay bestie, here’s the tea on where flnews keeps its stuff β€” every path matters, so don’t skip a single one πŸ‘‘

  • ~/.signature β€” the signature from this file is automatically appended to all created articles. this file is not used if another location for the signature file is configured. see CONFIGURATION section below for details (configfile entry "signature_file").
Note: at this (shared) location the file should be US-ASCII encoded. if you want to use Unicode in signatures, a dedicated signature file for flnews should be configured.

The following files are inside the configuration directory. the default location is "~/.config/flnews". the environment variable XDG_CONFIG_HOME and the option -confprefix (highest precedence) can be used to modify the configuration directory location.

  • .cancelsecret β€” secret for generating Cancel-Locks/-Keys with scheme SHA256 according to RFC 8315.

the secret in this file must be a cryptographically random value according to RFC 4086 and should be at least 32 octets in length.

flnews must be compiled with support for ssl(3) or this file will be ignored, because the cryptographic functions are shared.

if this file is not present, it is automatically created and a new secret is written to it (using random data from the cryptographic PRNG).

if this file is present and not empty, and the fqdn entry is set, flnews creates "Cancel-Lock" (always) and "Cancel-Key" header fields when canceling or superseding articles.

to use the same secret as another installation of flnews (or another newsreader that use the algorithm recommended by RFC 8315 with HMAC based on SHA256), copy the file with the desired secret to this location.

to manually disable this feature, an empty file must be used.

Attention: everybody who get his hands on this secret can cancel articles that were locked using this key in the past! this file should be readable only by the user.

the old scheme SHA1 is still supported too. see CONFIGURATION section below for details (configfile entry "cancelkey").

  • configfile β€” configuration and user interface state of last session. the file format is forward and backward compatible between all versions with same major number.

see CONFIGURATION section below for details.

  • groupfile β€” subscribed groups and already viewed articles database. the data is US-ASCII encoded in newsrc format and can be shared with other newsreaders using the entry newsrc in configfile. it is possible to share the group data over machine borders by using a NFS server (advisory file locking support is required).
Attention: in any case all newsreaders that share a groupfile must be configured to use the same server! there is a convention to name such files "newsrc-$HOSTNAME" to make it obvious for which server they can be used.

it is allowed to share the groupfile between multiple instances of flnews that run simultaneously. the file will contain the state of the instance that is terminated last.

  • headers/* β€” cached article header database. the file names correspond to the article watermarks of the current NNTP server. if the server provides the OVER capability defined in RFC 3977, this database is not used.
  • logfile β€” protocol dump of server communication from current/last session. to view this data while the program is running, select 'Tools->Protocol console' in the user interface. this file is overwritten for every new connection.
  • scorefile β€” scoring rules. the file format is forward and backward compatible between all versions with same major number. the data can be shared using the entry scorerc in configfile. it is possible to share the scoring rules over machine borders by using a NFS server (advisory file locking support is required).

it is allowed to share the scorefile between multiple instances of flnews that run simultaneously. the file will contain the state of the instance that is terminated last.

see SCORING section below for details.


✨ CONFIGURATION ✨

this section describes the format of the configfile β€” yes bestie, this is where the real customization lives πŸŽ€

this file must be a POSIX textfile, this means every line must be terminated with a LF line break.

any line starting with '#' is treated as a comment (not parsed and ignored). missing entries are automatically added, unsupported entries are ignored.

the content can have one of two types: Integer or Unicode string. strings use the UTF-8 representation and NFC normalization of Unicode.

the following entries are supported by version 1.2.1 but can't be configured from the GUI. some have no GUI editor by intent. if you don't know what you are doing, consider to not modify them. fr fr, don't just poke around for fun πŸ™ˆ

  • cancelkey (String) β€” secret for generating Cancel-Locks/-Keys with scheme SHA1 according to RFC 8315.

flnews must be compiled with support for ssl(3) to make this work, because the cryptographic functions are shared.

if this entry and the fqdn entry are set, flnews creates "Cancel-Lock" (always) and "Cancel-Key" header fields when canceling or superseding articles.

Note: the scheme SHA1 is obsolete since RFC 8315. this entry is preserved for backward compatibility. after a transition period this entry should be left empty and the scheme SHA256 should be used. see section above (File "~/.config/flnews/.cancelsecret").
  • color_xxx (Integer) β€” text foreground color for xxx.

the value must be an 8-bit index for the FLTK colormap:

https://www.fltk.org/doc-1.3/drawing.html#drawing_colors

  • crl_check (Integer) β€” enable TLS certificate CRL checks.

a nonzero value means that CRL checks are enabled.

flnews must be compiled with support for CRL checks to make this work.

  • crl_upd_c (Integer) β€” TLS certificate CRL update choice.

a nonzero value means that, after the CRL update interval has elapsed, the user get a choice to select whether the CRL update should be delayed.

  • crl_upd_iv (Integer) β€” TLS certificate CRL update interval.

the value must be positive and is a period of time in hours. too large values (longer than one year) are clamped to the upper limit. the value zero means that new CRLs should be downloaded for every new connection (not recommended).

  • crl_upd_ts (String) β€” TLS certificate CRL update timestamp.

this entry contains a timestamp in ISO 8601 format for the last successful CRL update.

  • dist_suggestions (Integer) β€” use distribution suggestions.

setting this to a nonzero value automatically initialize the distribution header field in the composer with suggested distribution data (if available). if no distribution suggestions are available for the target groups, the header field is initialized to "world" as with this option set to zero.

any time a distribution suggestion is used, the user is informed with a popup window in the GUI.

with the NNTP protocol the command LIST DISTRIB.PATS is used to retrieve the distribution suggestions from the server.

  • editor (String) β€” optional external editor for article composition.

the pathname of an executable program must be specified.

the pathname of a file containing the data is passed as parameter. if the external editor requires additional parameters, a start script must be specified (and the script must provide the additonal parameters).

the editor must be able to process Unicode data in UTF-8 format. the specified editor must terminate with exit status zero on success.

a temporary file is used. consider to set the TMPDIR environment variable.

  • flowed_insert_crlf (Integer) β€” add empty line after paragraph.

only used if "Format=flowed" is declared.

a value of zero corresponds to the dumb behaviour up to version 0.16 (if a paragraph ends with an empty line, there is no separation to the following text).

a value of one adds an empty line separator after every paragraph that ends with an empty line. this is required to create single line paragraphs (allow single line to be rewrapped to smaller width for display). the author of an article can request this behaviour with the experimental parameter "InsLine=yes" in addition to "Format=flowed".

  • fqdn (String) β€” fully qualified domain name (FQDN) of the machine.

must be empty or a valid "dot-atom" according to RFC 5322, this means the nameless root domain must be omitted (no trailing dot).

this entry is used to generate Message-IDs. they are only worldwide unique for all time if flnews runs on a machine with a FQDN. in addition the clock of the machine must be synchronized so that timestamps are not ambigous.

So, if a FQDN is configured, flnews creates the header fields Message-ID, Injection-Date, Cancel-Lock and Cancel-Key (that last pair only when you're cancelling or superseding an article) for all outgoing articles. Heads up though: RFC 5537 specifies some truly cursed details for the Injection-Date header field β€” and that is literally the reason flnews handles it internally in this case. 😭 No cap.

  • force_unicode (Integer) β€” force Unicode for outgoing articles πŸ¦‹

With the value 0, outgoing articles are converted to ISO 8859-1 if possible. With a nonzero value, all articles are sent using Unicode (UTF-8 transformation format).

  • immedauth (Integer) β€” immediate authentication option πŸ”‘

The value 1 represents the default behaviour: authenticate immediately after a connection was established.

The value 0 switches the behaviour, so that authentication against the server is only executed after a request to do so (the 480 response when using the NNTP protocol).

  • inews (String) β€” pathname of an optional external inews πŸ“¨

The external inews must accept the article on its standard input and inject it into the network. After successful completion of this task it must terminate with exit status zero. In the case of an error, it must terminate with a nonzero exit status.

Note that the article fed into the external inews has canonical format (CR+LF line breaks).

If your inews needs command line parameters or a different input format, specify a shell script here (and call the external inews from this script).

  • initial_greeting (String) β€” greeting line for the first article of a new thread πŸŽ€

The content is automatically inserted into the body of every new regular article (so not a followup, cancel or supersede, bestie).

  • intro (String) β€” introduction line format ✨

The name of the cited author can be inserted with %s. The newsgroups list of the cited article can be inserted with %g. Every variable is allowed only once.

The last character should be a colon.

  • inv_order (Integer) β€” inverse order πŸ™ƒ

The value 0 is the default behaviour (top down).

A nonzero value inverts the order of articles or thread branches respectively.

  • newsrc (String) β€” optional pathname of file to share group states in newsrc format πŸ”„

This file is imported at startup and used as groupfile. At exit the local groupfile is copied back to this location. Note that this file is replaced with rename(2) and is not modified in place. If the file is accessed via NFS, advisory locking must be available.

  • nntp_no_over (Integer) β€” disable usage of overview (OVER command) for NNTP protocol πŸ‘€

Setting this to a nonzero value disables usage of overview and makes the whole newsgroup list usable for scoring rules.

In general the default value 0 should be used. There are two scenarios for which this option may be useful.

  • If the network connection to the server is very slow and no data compression is available: in this case the transfer of the (larger) overview may be slower than the transfer of a few (smaller) new headers, because the older headers can be taken from the local cache.
  • If one or more scoring rules should match other (not the current or not subscribed at all) newsgroups in Xposts: because the newsgroup list is not part of the overview, only the current group is available if the overview is used.
  • organization (String) β€” optional name of the user's organization 🏒

The string is inserted as the Organization header field in outgoing articles.

  • post_proc (String) β€” pathname of an optional article postprocessor 🧚

Note: the postprocessor can be used to insert custom header fields.

The postprocessor must be a filter in the Unix sense. It must accept the article on its standard input, process it and write the result to its standard output. After successful completion of this task it must terminate with exit status zero. In the case of an error, the postprocessor must terminate with a nonzero exit status.

Note that the article fed into the postprocessor has canonical format (CR+LF line breaks) and uses Unicode UTF-8 encoding for the body. Modifications must preserve this format. The Unicode normalization, potential conversion to the target character set and the application of the transfer encoding to the body is done after the postprocessing. Therefore the postprocessor is not allowed to add Content-Type and Content-Transfer-Encoding header fields! 🚫

The header is already in RFC 2047 format. If the postprocessor modifies an existing header field, this format must be preserved. If a new header field is added, the postprocessor is responsible for creating valid RFC 2047 encoding and Unicode normalization to NFC.

  • refresh_interval (Integer) β€” group list refresh interval ⏱️

The value 0 is the default behaviour and disables the autorefresh feature.

A nonzero value refreshes the group list in the specified interval (in minutes).

  • scorerc (String) β€” optional pathname of file to share scoring rules 🎯

This file is imported at startup and used as scorefile. At exit the local scorefile is copied back to this location. Note that this file is replaced with rename(2) and is not modified in place. If the file is accessed via NFS, advisory locking must be available.

  • signature_file (String) β€” pathname of file with signature (relative to home directory) πŸ’Œ

Default value: ".signature".

If this file is present, its content is used as signature. The signature separator "dash dash space" plus LF line break is automatically prepended if not already present in this file. The file must be a POSIX text file (LF line break after every line, including the last one) with Unicode encoding in UTF-8 format (Unicode normalization is not important and applied automatically).

Use an empty string to disable signature generation.

  • testgrp_ere (String) β€” POSIX.2 extended regular expression (Unicode is allowed) πŸ§ͺ

If non US-ASCII characters are used in the regular expression, they must be representable in the codeset of the character classification locale used at runtime. Otherwise the regular expression from this entry is ignored and will never match. See the description for the LC_CTYPE environment variable above for details.

Note that this regular expression is used for matching against individual group names, not group lists. This means ^ and $ will match start and end of individual group names.

If a match is detected against a group name, this group is treated as a test group that may require special control commands in the Keywords header field to silence e.g. reflector bots (see entry testgrp_kwords for keyword configuration).

  • testgrp_kwords (String) β€” comma separated list of words πŸ—οΈ

If a target group of an article is identified as a test group (as described for the testgrp_ere entry), the header field Keywords is initialized to the value defined with this entry.

Attention: version 1.2.1 of flnews currently only supports US-ASCII keywords. Do not use spaces around commas.
  • timestamp_comment (Integer) β€” generate Date header field with timezone comment 🌍

The value 0 represents the default behaviour to append no comment.

The value 1 switches the behaviour, so that a comment with the name of the timezone is appended to the Date header field. If the operating system does not provide timezone information, this entry is ignored.

  • tls_owncerts (Integer) β€” use local trust anchors for TLS πŸ”’

With a nonzero value the trust anchor (X.509 root certificate) of a certificate chain is searched in the local location only. The system wide certificate store of the OpenSSL installation is ignored.

Local X.509 certificate path: ~/.config/flnews/certs

Copy the root certificate (in PEM format) to a file with arbitrary name in the path specified above. Then run the c_rehash utility to create the symlink that OpenSSL uses for searching.

  • unread_in_next_group (Integer) β€” skip to next group for unread article ⏭️

With the value 0, searching for the next unread article stays in the current group.

With a nonzero value the next group with unread articles is selected if there are no more unread articles in the current group.

πŸ’… SCORING πŸ’…

okay so this whole section is literally the scorefile format, bestie β€” pay attention because it’s giving very specific rules energy ✨

This file must be a POSIX textfile, which means every single line has to be terminated with a LF line break. no cap.

Any line starting with # is treated as a comment β€” it’s not parsed and just ignored, periodt.

All other lines are parsed as rules with four colon-separated fields:

  • Target β€” The groups to which the rule is associated.

This must be a wildmat according to RFC 3977. The wildmat "*" will match all groups.

  • Type β€” The header field to which the rule is associated. This field is case sensitive.

The following types (in alphabetical order) are recognized by version 1.2.1:

  • Type "from" β€” The string from the fourth field must match literally against the "From" header field.
  • Type "from_ere" β€” The string from the fourth field is interpreted as a POSIX.2 extended regular expression and must match against the "From" header field.
  • Type "group" β€” The string from the fourth field must match literally against a group element in the "Newsgroups" header field.
  • Type "msgid_ere" β€” The string from the fourth field is interpreted as a POSIX.2 extended regular expression and must match against the "Message-ID" header field.
  • Type "subject" β€” The string from the fourth field must match literally against the "Subject" header field.
  • Type "subject_ere" β€” The string from the fourth field is interpreted as a POSIX.2 extended regular expression and must match against the "Subject" header field.

Note that rules using wildmats (other than "*") and/or regular expressions are ignored if flnews is compiled without support for regular expressions.

  • Score β€” The score value that apply if the filter rule matches.

This must be a signed integer value. If the scorefile is shared between multiple instances of flnews, the values must be usable for the whole group. The machine with the smallest limits will clamp the values if they are too large or too small respectively.

  • String β€” The rules content string.

This must always be an Unicode string (in UTF-8 format with NFC normalization).

Attention: If the normalization is wrong, the rule may not match as intended! 😭

The colon has no special meaning inside this field anymore and must not be quoted for any of the rule types listed above.

The default score for every article is zero. If a rule matches, the score value from the second field will be added to the corresponding article. Note that the processing is not stopped after a match, the following rules are applied too.

Articles with nonzero score result are marked with icons in the GUI. Articles with negative score result are additionally marked as read.


🌸 NOTES 🌸

flnews is based in part on the work of the following projects β€” shoutout to the icons πŸ‘‘

Unicode is a registered trademark of Unicode, Inc. in the United States and other countries.

If compiled with support for TLS.

If compiled with support for TLS (as replacement for OpenSSL).

If compiled with support for compression.


πŸŽ€ AUTHORS πŸŽ€

To view the list of authors and the license terms, select 'Help->License' in the user interface.


πŸ› BUGS πŸ›

To report bugs, select 'Help->Bug report' in the user interface.


πŸ“š STANDARDS πŸ“š

flnews tries to comply with the following standards β€” it’s a whole syllabus, bestie:

ISO 2022, ISO 8601, ISO 8859, RFC 20, RFC 822, RFC 850, RFC 977, RFC 1468, RFC 1738, RFC 2045, RFC 2046, RFC 2047, RFC 2049, RFC 2104, RFC 2152, RFC 2183, RFC 2231, RFC 2246, RFC 2368, RFC 2585, RFC 2606, RFC 2646, RFC 2980, RFC 3174, RFC 3629, RFC 3676, RFC 3977, RFC 3986, RFC 4346, RFC 4642, RFC 4643, RFC 5198, RFC 5246, RFC 5280, RFC 5322, RFC 5536, RFC 5537, RFC 5538, RFC 6048, RFC 6066, RFC 6068, RFC 6176, RFC 6657, RFC 7230, RFC 7231, RFC 7234, RFC 7366, RFC 7507, RFC 7568, RFC 7627, RFC 7919, RFC 8054, RFC 8089, RFC 8143, RFC 8315, RFC 8446, RFC 8996, POSIX.2-1992, POSIX.1-1996, POSIX.1-2001, POSIX.1-2008, Unicode 13.0.0, XDG Base Directory Specification 0.7


πŸ‘€ SEE ALSO πŸ‘€


and that’s the whole flnews(1) page, bestie 🫢 β€” source is Unix, version is flnews(1), dated 2024-05-06 πŸ’–βœ¨

πŸ“¦ where this page comes from