• The perils of writing your own newsreader - the perils of posting to moderated newsgroups

    From Maria Sophia@mariasophia@comprehension.com to alt.free.newsservers,news.software.readers,alt.comp.os.windows-10 on Thu Jan 29 14:06:28 2026
    From Newsgroup: news.software.readers

    True story. Just happened moments ago. Interesting lessons were learned.

    BACKGROUND:
    When I moved from UNIX (SunOS/Solaris) to Redhat/Centos long ago, with help
    on Linux newsgroups (e.g., Marek Novotny was a Godsend) I wrote a working newsreader which incorporated telnet/vi & which allowed for random headers. That telnet:vi newsreader was ported to Windows telent/gVim 15 years ago.
    I haven't touched it since (other than to clean up charset headers).

    I've been posting to Usenet using various free servers for years using it. Today, I tried my 1st post to a moderated newsgroup & it failed instantly.
    Why?

    Note: I am not deprecating Jesse's server as I very much appreciate
    his very kind permission to use his server resources.

    It's just what happened.

    It turns out Jesse Rehmer's server simply doesn't carry that moderated ng (which is perfectly understandable as the misc.taxes ng is more active).
    Taskbar > Runbox > cmd
    telnet news.blueworldhosting.com 119
    200 nnrp.usenet.blueworldhosting.com InterNetNews NNRP server INN
    2.8.0 (20250329 snapshot) ready (posting ok)
    MODE READER
    LIST ACTIVE misc.taxes
    215 Newsgroups in form "group high low status"
    misc.taxes 0000060117 0000000001 y
    .
    LIST ACTIVE misc.taxes.moderated
    215 Newsgroups in form "group high low status"
    .
    LIST MODERATORS
    215 Newsgroup moderators in form "group-pattern:submission-template"
    aioe.*:%s-newsgroup@aioe.org
    fido7.*:%s@fido7.org
    ffm.*:%s@moderators.arcornews.de
    fj.*:%s@moderators.fj-news.org
    medlux.*:%s@news.medlux.ru
    nl.*:%s@nl.news-admin.org
    perl.*:news-moderator-%s@perl.org
    relcom.*:%s@moderators.relcom.ru
    si.*:%s@arnes.si
    ukr.*:%s@sita.kiev.ua
    *:%s@moderators.isc.org
    .
    QUIT

    Drat. Blueworld does not carry the misc.taxes.moderated newsgroup, which is perfectly understandable as it has a lower volume than misc.taxes does.

    If Blueworld did carry misc.taxes.moderated then it would have forwarded moderated posts to misc-taxes-moderated@moderators.isc.org but since the low-activity moderated tax group is not carried, this rule never applies.

    You might not see this 'cuz a "real" newsreader would likely have emailed
    the moderator directly which requires connecting to a working MAPI mail
    client, which my homegrown newsreader never thought it would need to do.

    Let's run another test, only with an arbitrarily different free server.
    Let's pick Ivo Gandolfo's server as the 1st pick of free nntp servers.

    Taskbar > Runbox > cmd
    telnet paganini.bofh.team 119
    200 paganini.bofh.team InterNetNews NNRP server INN 2.6.4 ready
    (posting ok)
    MODE READER
    LIST ACTIVE misc.taxes
    215 Newsgroups in form "group high low status"
    misc.taxes 0000060041 0000059279 y
    .
    LIST ACTIVE misc.taxes.moderated
    215 Newsgroups in form "group high low status"
    misc.taxes.moderated 0000061574 0000002149 m
    .
    LIST MODERATORS
    215 Newsgroup moderators in form "group-pattern:submission-template"
    fido7.*:%s@fido7.ru
    ffm.*:%s@moderators.arcornews.de
    fj.*:%s@moderators.fj-news.org
    medlux.*:%s@news.medlux.ru
    nl.*:%s@nl.news-admin.org
    perl.*:news-moderator-%s@perl.org
    relcom.*:%s@moderators.relcom.ru
    si.*:%s@arnes.si
    ukr.*:%s@sita.kiev.ua
    *:%s@moderators.isc.org
    .
    QUIT

    Woo hoo!

    Paganini *does* carry misc.taxes.moderated, as shown by the line:
    misc.taxes.moderated 0000061574 0000002149 m
    The trailing "m" means the group is moderated.

    And because paganini has the wildcard rule:
    *:%s@moderators.isc.org
    it automatically expands the group name & forwards all moderated posts to:
    misc-taxes-moderated@moderators.isc.org

    Whew!

    No MAPI mail client needed. No local mailer. No coding needed! No fuss.

    Conclusion on the perils of writing your own home-grown newsreader...
    a. The failure wasn't Blueworld's fault as it simply doesn't carry
    misc.taxes.moderated, so there was no NNTP path for my post.

    b. A more full-featured newsreader would likely have fallen back to sending
    the article via email to the moderator, but my home-grown setup doesn't
    communicate with a local mail client, so that path wasn't available.

    c. Luckily, the next server I randomly tested (paganini.bofh.team) *does*
    carry misc.taxes.moderated & handles the forwarding to the moderator
    via email automatically, so the post appears to have gone through.

    I'll know in a couple of days if that post went through though, but I
    figured I'd write up this one lesson in the perils of writing a newsreader.

    Have any of the readers who see this written their own newsreader?
    How did you handle sending to moderated newsgroups with email fallback?

    How does a NORMAL newsreader handle this fallback to email for moderation?
    --
    Usenet allows old friends to discuss unique topics of mutual interest.
    --- Synchronet 3.21b-Linux NewsLink 1.2
  • From Marco Moock@mm@dorfdsl.de to news.software.readers on Thu Jan 29 21:24:30 2026
    From Newsgroup: news.software.readers

    Crosspost to unrelated groups removed

    On 29.01.2026 14:06 Uhr Maria Sophia wrote:

    If Blueworld did carry misc.taxes.moderated then it would have
    forwarded moderated posts to misc-taxes-moderated@moderators.isc.org
    but since the low-activity moderated tax group is not carried, this
    rule never applies.

    You might not see this 'cuz a "real" newsreader would likely have
    emailed the moderator directly which requires connecting to a working
    MAPI mail client, which my homegrown newsreader never thought it
    would need to do.

    It is common that the servers carry the groups and you post your
    message using NNTP to the group. The server then creates the mail and
    doesn't add the post to the local spool nor distributes it to the peers.

    Conclusion on the perils of writing your own home-grown newsreader...
    a. The failure wasn't Blueworld's fault as it simply doesn't carry
    misc.taxes.moderated, so there was no NNTP path for my post.

    In such a case you should get a "No such group" or similar NNTP error
    message.

    b. A more full-featured newsreader would likely have fallen back to
    sending the article via email to the moderator, but my home-grown
    setup doesn't communicate with a local mail client, so that path
    wasn't available.

    c. Luckily, the next server I randomly tested (paganini.bofh.team)
    *does* carry misc.taxes.moderated & handles the forwarding to the
    moderator via email automatically, so the post appears to have gone
    through.

    That process is the default, as the moderated groups use this general
    domain (and used moderators.uu.net before that, but still active).

    I'll know in a couple of days if that post went through though, but I
    figured I'd write up this one lesson in the perils of writing a
    newsreader.

    I've checked my mod relay (2 others exist), but I cannot see that
    message. I assume one of the others were used, so in case it doesn't
    work, ask Ivo to which one the message was relayed.

    Have any of the readers who see this written their own newsreader?
    How did you handle sending to moderated newsgroups with email
    fallback?

    How does a NORMAL newsreader handle this fallback to email for
    moderation?

    I've never seen such a functionality in the wild. The normal process is
    to use NNTP to post - if that fails an error message will be shown.
    --
    kind regards
    Marco

    Send spam to 1769691988muell@stinkedores.dorfdsl.de

    --- Synchronet 3.21b-Linux NewsLink 1.2
  • From R.Wieser@address@is.invalid to alt.free.newsservers,news.software.readers,alt.comp.os.windows-10 on Thu Jan 29 22:07:38 2026
    From Newsgroup: news.software.readers

    Arlen,

    You might not see this 'cuz a "real" newsreader would likely have emailed
    the moderator directly

    Why ?

    Why would the moderator want to receive - and put into a newsgroup - a post which you could not read the responses to ?

    Paganini *does* carry misc.taxes.moderated

    Oh goodie. Now all you have to do is to post in that newsgroup and see if
    you get permission from the moderator. That is how it works.

    Ofcourse, there is a good chance, if the moderator allows you to post,
    that, when you post the same crap as you do here, that permission will be revoked rather quickly.

    How does a NORMAL newsreader handle this fallback to email for moderation?

    :-) I suggest you first try to determine if such a NORMAL newsreader does indeed offer such a fall-back (it doesn't). *and only it does* try to figure out how its implemented..

    Kiddo, that MODERATOR list is there to allow you to make a moderator aware
    of *PROBLEMS*. And yours is not a problem.

    It sounds to me that you have absolutily *zero* idea how a moderated
    newsgroup works, and, as always, can't be arsed to google for it.

    Regards,
    Rudy Wieser




    --- Synchronet 3.21b-Linux NewsLink 1.2
  • From Maria Sophia@mariasophia@comprehension.com to alt.free.newsservers,news.software.readers,alt.comp.os.windows-11 on Thu Jan 29 21:55:08 2026
    From Newsgroup: news.software.readers

    R.Wieser wrote:
    You might not see this 'cuz a "real" newsreader would likely have emailed
    the moderator directly

    Why ?

    Why would the moderator want to receive - and put into a newsgroup - a post which you could not read the responses to ?

    Hi Rudy,
    You know what I like about you? It's you ask questions about concepts that
    I hadn't even thought of for a single moment, since I run a tight ship.

    Given I care about privacy, I never use the same newsserver to read from as
    I do to write to, so any given newsgroup could be on one but not the other.

    But if you hadn't asked that question, I wouldn't have even thought to tell people this since I do a billion things for privacy by design like that.

    Paganini *does* carry misc.taxes.moderated

    Oh goodie. Now all you have to do is to post in that newsgroup and see if you get permission from the moderator. That is how it works.

    Marco Moock already kindly tested it and said he didn't see it in his
    searches. (See his post reproduced below since it only went to n.s.r).

    How does a NORMAL newsreader handle this fallback to email for moderation?

    :-) I suggest you first try to determine if such a NORMAL newsreader does indeed offer such a fall-back (it doesn't). *and only it does* try to figure out how its implemented..

    See above. Marco Moock already disabused me of that assumption of how a
    normal newsreader handles moderated newsgroups whose nntp server doesn't forward the articles.

    It sounds to me that you have absolutily *zero* idea how a moderated newsgroup works...

    This is true and I said so. Since I don't post to moderated newsgroups, the first time I needed to post was today when I was summarizing the two dozen known methods for USA citizens to file taxes in the USA this year where all
    the normal Intuit personal methods require you to purchase a new PC if you don't have Windows 10 yet their business software works on Win10.

    It was something I spent hours writing up and then it took me by surprise
    that my privacy-based newsserver of choice (blueworld) post failed.

    When I debugged what happened, I realized that a normal newsreader "might"
    have handled moderation differently, where there appear to be 2 paths:
    1. The newsreader handles the email itself, or,
    2. The newsserver handles the email itself.

    Thanks for recognizing that I am indeed clueless how this process works.

    Had I known how it works, I would have written up a tutorial instead since
    I'm a rare breed of person who delights in edifying everyone around me.

    Below, for continuity, and to help answer your concerns, is Marco's
    message.

    From: Marco Moock <mm@dorfdsl.de>
    Newsgroups: news.software.readers
    Subject: Re: The perils of writing your own newsreader - the perils of
    posting to moderated newsgroups
    Date: Thu, 29 Jan 2026 21:24:30 +0100
    Organization: A noiseless patient Spider
    Lines: 62
    Message-ID: <20260129212430.496f6fb5@ryz.dorfdsl.de>
    References: <10lgb3k$1sok$1@nnrp.usenet.blueworldhosting.com>
    MIME-Version: 1.0
    Content-Type: text/plain; charset=US-ASCII
    Content-Transfer-Encoding: 7bit
    Injection-Date: Thu, 29 Jan 2026 20:24:32 +0000 (UTC)
    Injection-Info: dont-email.me;
    posting-host="adbb16f8564e65e1a100820265895c75"; logging-data="1637696"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+REpfdYREratir4KZTv9dG"
    Cancel-Lock: sha1:Xf4vBeEkUXWMKYc+jjesuUr5vuk=
    X-Newsreader: Claws Mail 4.3.1 (GTK 3.24.51; x86_64-pc-linux-gnu)
    Xref: sewer news.software.readers:12217

    Crosspost to unrelated groups removed

    On 29.01.2026 14:06 Uhr Maria Sophia wrote:

    If Blueworld did carry misc.taxes.moderated then it would have
    forwarded moderated posts to misc-taxes-moderated@moderators.isc.org
    but since the low-activity moderated tax group is not carried, this
    rule never applies.

    You might not see this 'cuz a "real" newsreader would likely have
    emailed the moderator directly which requires connecting to a working
    MAPI mail client, which my homegrown newsreader never thought it
    would need to do.

    It is common that the servers carry the groups and you post your
    message using NNTP to the group. The server then creates the mail and
    doesn't add the post to the local spool nor distributes it to the peers.

    Conclusion on the perils of writing your own home-grown newsreader...
    a. The failure wasn't Blueworld's fault as it simply doesn't carry
    misc.taxes.moderated, so there was no NNTP path for my post.

    In such a case you should get a "No such group" or similar NNTP error
    message.

    b. A more full-featured newsreader would likely have fallen back to
    sending the article via email to the moderator, but my home-grown
    setup doesn't communicate with a local mail client, so that path
    wasn't available.

    c. Luckily, the next server I randomly tested (paganini.bofh.team)
    *does* carry misc.taxes.moderated & handles the forwarding to the
    moderator via email automatically, so the post appears to have gone
    through.

    That process is the default, as the moderated groups use this general
    domain (and used moderators.uu.net before that, but still active).

    I'll know in a couple of days if that post went through though, but I
    figured I'd write up this one lesson in the perils of writing a
    newsreader.

    I've checked my mod relay (2 others exist), but I cannot see that
    message. I assume one of the others were used, so in case it doesn't
    work, ask Ivo to which one the message was relayed.

    Have any of the readers who see this written their own newsreader?
    How did you handle sending to moderated newsgroups with email
    fallback?

    How does a NORMAL newsreader handle this fallback to email for
    moderation?

    I've never seen such a functionality in the wild. The normal process is
    to use NNTP to post - if that fails an error message will be shown.
    --
    kind regards
    Marco

    Send spam to 1769691988muell@stinkedores.dorfdsl.de
    --- Synchronet 3.21b-Linux NewsLink 1.2
  • From Marco Moock@mm@dorfdsl.de to news.software.readers on Fri Jan 30 08:43:16 2026
    From Newsgroup: news.software.readers

    On 29.01.2026 15:43 Uhr Maria Sophia wrote:

    If my post does not show up, I will follow your suggestion and ask Ivo
    which relay handled it. Thanks for checking your mod relay.

    Is there any way for a typical user like I am to get that information?

    Unless you get an error message or the post is being posted, no.

    Because of SPF, most servers rewrite the sender and use their own
    domain, so the original poster will not receive the bounces, but the
    news server admin will (if he heads that inbox).

    If the post is being approved and posted to the group, the Received:
    headers are removed, so you cannot see that.

    Although, other headers are sometimes kept that might indicate what
    happened, e.g. the X- headers that are added by some spam filters are
    often kept that can indicate (but do not need to) which relay they used.
    --
    kind regards
    Marco

    Send spam to 1769697808muell@stinkedores.dorfdsl.de

    --- Synchronet 3.21b-Linux NewsLink 1.2
  • From Carlos E.R.@robin_listas@es.invalid to alt.free.newsservers,news.software.readers,alt.comp.os.windows-11 on Fri Jan 30 13:35:43 2026
    From Newsgroup: news.software.readers

    On 2026-01-29 22:55, Maria Sophia wrote:
    R.Wieser wrote:
    You might not see this 'cuz a "real" newsreader would likely have emailed >>> the moderator directly

    Why ?

    Why would the moderator want to receive - and put into a newsgroup - a post >> which you could not read the responses to ?

    Hi Rudy,
    You know what I like about you? It's you ask questions about concepts that
    I hadn't even thought of for a single moment, since I run a tight ship.

    Given I care about privacy, I never use the same newsserver to read from as
    I do to write to, so any given newsgroup could be on one but not the other.

    But if you hadn't asked that question, I wouldn't have even thought to tell people this since I do a billion things for privacy by design like that.


    I asked Google "how do moderated groups work on Usenet?". Here is the
    answer. My comments in curly brackets {}.

    +++--------------
    AI Overview

    Moderated groups on Usenet function by requiring all submissions to be reviewed by a human moderator or automated system before appearing,
    ensuring discussions remain on-topic and free of spam. When a user
    posts, the message is routed to a specialized email address, where the moderator approves or rejects it.

    {thus the email must be real and working. The moderator
    must be able to email you, specially if the post is rejected.}

    Key Aspects of Moderated Usenet Groups:

    * The Workflow: Instead of appearing immediately, posts to moderated groups (e.g., rec.food.recipes) are sent to a moderator. The moderator
    reviews them to ensure they follow the group's charter, then publishes approved messages to the Usenet server.

    * Purpose: These groups are designed for higher quality, focused discussions, or to prevent spam and off-topic posts in niche areas.

    Approval Process: If a message is approved, it is distributed to
    the Usenet network. If rejected, it never reaches the public newsgroup.

    * Creation: Moderated groups are created through a formal Request
    for Discussion (RFD) and Call for Votes (CFV) process, which specifies
    the moderation policy.

    * Identification: While not always obvious, moderated groups are
    often identified in newsgroup lists, and their content is generally
    restricted to specific topics rather than open, unmoderated discussion.

    Moderators can also choose to post a composite digest of articles rather
    than individual submissions.
    --------------++-

    Links:

    <https://www.lsu.edu/internet/guides/zen/zen-1.0_5.html>

    <https://www.newsdemon.com/what-is-moderated-group>

    <http://www.tcpipguide.com/free/t_UsenetAddressingNewsgroupsNewsgroupHierarchiesandT-4.htm>



    When you configure an Usenet account in Thunderbird (I'm checking this
    on Linux), there is an entry that is normally not used, where you define
    the "Outgoing Server (SMTP)". This can be a local Sendmail, for example,
    but can be any server on internet. Ie, it is the same configuration as
    for a Mail Account. It has to be a real mail identity, and you must have whatever credentials the outgoing SMTP server requires from you. Likely,
    a password.
    --
    Cheers, Carlos.
    ESEfc-Efc+, EUEfc-Efc|;
    --- Synchronet 3.21b-Linux NewsLink 1.2
  • From rbowman@bowman@montana.com to alt.free.newsservers,news.software.readers,alt.comp.os.windows-11 on Fri Jan 30 18:30:03 2026
    From Newsgroup: news.software.readers

    On Fri, 30 Jan 2026 13:35:43 +0100, Carlos E.R. wrote:


    * The Workflow: Instead of appearing immediately, posts to moderated groups (e.g., rec.food.recipes) are sent to a moderator. The moderator reviews them to ensure they follow the group's charter, then publishes approved messages to the Usenet server.

    I was a moderator for a group years ago. The name escapes me but we used a service to coordinate the moderation. It was inexpensive and the several moderators chipped in to pay the cost.

    The newsgroup still exists but hasn't had moderators for about 20 years.
    --- Synchronet 3.21b-Linux NewsLink 1.2
  • From Mike Easter@MikeE@ster.invalid to alt.free.newsservers,news.software.readers,alt.comp.os.windows-11 on Fri Jan 30 14:27:09 2026
    From Newsgroup: news.software.readers

    Carlos E.R. wrote:
    From the user side, how did it work?

    For example, when posting, Thunderbird would automatically send an email
    to the moderator list, and would find out this address automatically?

    Not exactly.

    Tb 'tries to' post to the ng via nntp; but in a mod group, the news
    server doesn't 'just' post it; instead the news server 'auto' emails it
    to an .isc address ie group-name@moderators.isc.org. That address is configured to email 'forward' it to the ng's moderators of record.

    The ng's moderators of record have their 'own' system of handling the
    msg. Theoretically it could be handled by human eyeballs and hands, but
    more like the mod mail has some auto-handling of its own.

    If the msg is 'ok' then it gets posted to the group via having an
    appropriate header prepended.
    --
    Mike Easter
    --- Synchronet 3.21b-Linux NewsLink 1.2
  • From Carlos E.R.@robin_listas@es.invalid to alt.free.newsservers,news.software.readers,alt.comp.os.windows-11 on Sat Jan 31 00:03:17 2026
    From Newsgroup: news.software.readers

    On 2026-01-30 23:27, Mike Easter wrote:
    Carlos E.R. wrote:
    -aFrom the user side, how did it work?

    For example, when posting, Thunderbird would automatically send an
    email to the moderator list, and would find out this address
    automatically?

    Not exactly.

    Tb 'tries to' post to the ng via nntp; but in a mod group, the news
    server doesn't 'just' post it; instead the news server 'auto' emails it
    to an .isc address ie group-name@moderators.isc.org. That address is configured to email 'forward' it to the ng's moderators of record.

    Ah. That makes more sense. Transparent, from the client point of view.

    Although it means that all the news servers in the world have to be
    configured to do this.

    Or perhaps not configured servers can simply refuse to post to moderated groups.


    The ng's moderators of record have their 'own' system of handling the
    msg. Theoretically it could be handled by human eyeballs and hands, but
    more like the mod mail has some auto-handling of its own.

    If the msg is 'ok' then it gets posted to the group via having an appropriate header prepended.

    Right.
    --
    Cheers, Carlos.
    ESEfc-Efc+, EUEfc-Efc|;
    --- Synchronet 3.21b-Linux NewsLink 1.2
  • From Maria Sophia@mariasophia@comprehension.com to alt.free.newsservers,news.software.readers,alt.comp.os.windows-11 on Fri Jan 30 18:42:01 2026
    From Newsgroup: news.software.readers

    Carlos E.R. wrote:
    On 2026-01-30 23:27, Mike Easter wrote:
    Carlos E.R. wrote:
    aFrom the user side, how did it work?

    For example, when posting, Thunderbird would automatically send an
    email to the moderator list, and would find out this address
    automatically?

    Not exactly.

    Tb 'tries to' post to the ng via nntp; but in a mod group, the news
    server doesn't 'just' post it; instead the news server 'auto' emails it
    to an .isc address ie group-name@moderators.isc.org. That address is
    configured to email 'forward' it to the ng's moderators of record.

    Ah. That makes more sense. Transparent, from the client point of view.

    Although it means that all the news servers in the world have to be configured to do this.

    Or perhaps not configured servers can simply refuse to post to moderated groups.


    The ng's moderators of record have their 'own' system of handling the
    msg. Theoretically it could be handled by human eyeballs and hands, but
    more like the mod mail has some auto-handling of its own.

    If the msg is 'ok' then it gets posted to the group via having an
    appropriate header prepended.

    Right.

    Thanks for all the help where I think I was wrong when I assumed that the newsreader could email the moderators directly, but I'm not fully sure.

    On my end, my home-grown newsreader simply failed because it was not a case
    of NNTP rejecting the post but simply that Jesse's server did not carry the group <misc.taxes.moderated>

    Testing what failed in my home-grown newsreader, Blueworld does return a
    normal 200 greeting and accepts MODE READER, but when I issue:

    LIST ACTIVE misc.taxes.moderated

    Jesse's server returns an empty list.
    In other words, the moderated group is not carried at all.

    Since that moderated group does not exist on that server, there is no "m"
    flag and no submission template to trigger the moderator-forwarding
    mechanism. My home-grown reader therefore sent the POST command normally,
    and the server rejected it immediately because the group was not in its
    active file. That is why I did not get a "No such group" error until after attempting to post.

    Ivo Gandolfo's Paganini, on the other hand, does carry that newsgroup.

    misc.taxes.moderated 0000061574 0000002149 m

    and because it has the wildcard rule:

    *:%s@moderators.isc.org

    it automatically expands the group name and forwards the article to:

    misc-taxes-moderated@moderators.isc.org

    So the difference was not NNTP vs email fallback inside my reader. It was simply that Ivo's server carried the moderated group and Jesse's did not.

    Once I posted to a server that actually carried the group, I believe the standard moderation-forwarding path works on the nntp server side.

    I haven't yet tested Wolfgang's (Ray Banana) free server, nor Steve Crook's free server, nor Alex de Joode's free server, etc. as 2 tests were enough.

    But it seems, in summary, that the news server handles how the moderation
    email gets written, and the user remains blissfully unaware of the steps.
    --- Synchronet 3.21b-Linux NewsLink 1.2
  • From rbowman@bowman@montana.com to alt.free.newsservers,news.software.readers,alt.comp.os.windows-11 on Sat Jan 31 03:05:28 2026
    From Newsgroup: news.software.readers

    On Fri, 30 Jan 2026 14:27:09 -0800, Mike Easter wrote:


    Tb 'tries to' post to the ng via nntp; but in a mod group, the news
    server doesn't 'just' post it; instead the news server 'auto' emails it
    to an .isc address ie group-name@moderators.isc.org. That address is configured to email 'forward' it to the ng's moderators of record.

    I wish I could remember the name of the intermediary service we used. When someone posted the moderators got an email notification and one would
    approve or deny the post. It streamlined the process.

    It was a lot of work to strain out a few people. This wasn't the group but
    if you go to alt.pagan and download a couple of months worth of headers
    you'll meet the famous David Dalton. He has an obsession with Sarah
    McLachlan and is usually way off his meds. He's still going strong after
    all these years, the sole poster in abandoned ngs.

    I wasn't too enthusiastic about the moderation and tended to be liberal in allowing posts. Other than the odd nutter the really divisive topic was
    Viktor Rydgerg's theories on Norse mythology.

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



    --- Synchronet 3.21b-Linux NewsLink 1.2
  • From 7@7@7.7 to alt.free.newsservers,news.software.readers,alt.comp.os.windows-11 on Sat Jan 31 22:21:56 2026
    From Newsgroup: news.software.readers

    On 30 Jan 2026, Mike Easter <MikeE@ster.invalid> posted some news:mu4phuF3kgeU1@mid.individual.net:

    Carlos E.R. wrote:
    From the user side, how did it work?

    For example, when posting, Thunderbird would automatically send an
    email to the moderator list, and would find out this address
    automatically?

    Not exactly.

    Tb 'tries to' post to the ng via nntp; but in a mod group, the news
    server doesn't 'just' post it; instead the news server 'auto' emails
    it to an .isc address ie group-name@moderators.isc.org. That address
    is configured to email 'forward' it to the ng's moderators of record.

    The ng's moderators of record have their 'own' system of handling the
    msg. Theoretically it could be handled by human eyeballs and hands,
    but more like the mod mail has some auto-handling of its own.

    If the msg is 'ok' then it gets posted to the group via having an appropriate header prepended.

    +1
    --- Synchronet 3.21b-Linux NewsLink 1.2
  • From Kerr-Mudd, John@admin@127.0.0.1 to alt.free.newsservers,news.software.readers,alt.comp.os.windows-11 on Sun Feb 1 10:07:24 2026
    From Newsgroup: news.software.readers

    On 31 Jan 2026 03:05:28 GMT
    rbowman <bowman@montana.com> wrote:

    On Fri, 30 Jan 2026 14:27:09 -0800, Mike Easter wrote:


    Tb 'tries to' post to the ng via nntp; but in a mod group, the news
    server doesn't 'just' post it; instead the news server 'auto' emails it
    to an .isc address ie group-name@moderators.isc.org. That address is configured to email 'forward' it to the ng's moderators of record.

    I wish I could remember the name of the intermediary service we used. When someone posted the moderators got an email notification and one would approve or deny the post. It streamlined the process.

    It was a lot of work to strain out a few people. This wasn't the group but if you go to alt.pagan and download a couple of months worth of headers you'll meet the famous David Dalton. He has an obsession with Sarah McLachlan and is usually way off his meds. He's still going strong after
    all these years, the sole poster in abandoned ngs.

    He appears (out of his depth) in a few other NGs. At least he's stopped
    wanting to find the ark of the covenant (was it?) buried under Stonehenge.
    The good thing is that he rarely nym-shifts.


    I wasn't too enthusiastic about the moderation and tended to be liberal in allowing posts. Other than the odd nutter the really divisive topic was Viktor Rydgerg's theories on Norse mythology.

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



    --
    Bah, and indeed Humbug.
    --- Synchronet 3.21b-Linux NewsLink 1.2
  • From Daniel70@daniel47@nomail.afraid.org to alt.free.newsservers,news.software.readers,alt.comp.os.windows-11 on Sun Feb 1 21:22:58 2026
    From Newsgroup: news.software.readers

    On 1/02/2026 9:07 pm, Kerr-Mudd, John wrote:
    On 31 Jan 2026 03:05:28 GMT
    rbowman <bowman@montana.com> wrote:
    On Fri, 30 Jan 2026 14:27:09 -0800, Mike Easter wrote:

    Tb 'tries to' post to the ng via nntp; but in a mod group, the news
    server doesn't 'just' post it; instead the news server 'auto' emails it
    to an .isc address ie group-name@moderators.isc.org. That address is
    configured to email 'forward' it to the ng's moderators of record.

    I wish I could remember the name of the intermediary service we used. When >> someone posted the moderators got an email notification and one would
    approve or deny the post. It streamlined the process.

    It was a lot of work to strain out a few people. This wasn't the group but >> if you go to alt.pagan and download a couple of months worth of headers
    you'll meet the famous David Dalton. He has an obsession with Sarah
    McLachlan and is usually way off his meds. He's still going strong after
    all these years, the sole poster in abandoned ngs.

    He appears (out of his depth) in a few other NGs. At least he's stopped wanting to find the ark of the covenant (was it?) buried under Stonehenge.

    "Stonehenge"?? I thought The Ark of The Covenant was on Mt Ararat in
    Turkiye or some such!!
    --
    Daniel70
    --- Synchronet 3.21b-Linux NewsLink 1.2
  • From Kerr-Mudd, John@admin@127.0.0.1 to alt.free.newsservers,news.software.readers,alt.comp.os.windows-11 on Sun Feb 1 10:44:41 2026
    From Newsgroup: news.software.readers

    On Sun, 1 Feb 2026 21:22:58 +1100
    Daniel70 <daniel47@nomail.afraid.org> wrote:

    On 1/02/2026 9:07 pm, Kerr-Mudd, John wrote:
    On 31 Jan 2026 03:05:28 GMT
    rbowman <bowman@montana.com> wrote:
    On Fri, 30 Jan 2026 14:27:09 -0800, Mike Easter wrote:

    Tb 'tries to' post to the ng via nntp; but in a mod group, the news
    server doesn't 'just' post it; instead the news server 'auto' emails it >>> to an .isc address ie group-name@moderators.isc.org. That address is
    configured to email 'forward' it to the ng's moderators of record.

    I wish I could remember the name of the intermediary service we used. When >> someone posted the moderators got an email notification and one would
    approve or deny the post. It streamlined the process.

    It was a lot of work to strain out a few people. This wasn't the group but >> if you go to alt.pagan and download a couple of months worth of headers
    you'll meet the famous David Dalton. He has an obsession with Sarah
    McLachlan and is usually way off his meds. He's still going strong after >> all these years, the sole poster in abandoned ngs.

    He appears (out of his depth) in a few other NGs. At least he's stopped wanting to find the ark of the covenant (was it?) buried under Stonehenge.

    "Stonehenge"?? I thought The Ark of The Covenant was on Mt Ararat in
    Turkiye or some such!!

    You're barking up the wrong ark.

    PS it's spelled 'Turkey' in English. If you're a Turk, you need to put
    double dots on the last 'e' in Turkiye, IIRC.
    --
    Bah, and indeed Humbug.
    --- Synchronet 3.21b-Linux NewsLink 1.2
  • From Daniel70@daniel47@nomail.afraid.org to alt.free.newsservers,news.software.readers,alt.comp.os.windows-11 on Sun Feb 1 22:54:38 2026
    From Newsgroup: news.software.readers

    On 1/02/2026 9:44 pm, Kerr-Mudd, John wrote:
    On Sun, 1 Feb 2026 21:22:58 +1100 Daniel70
    <daniel47@nomail.afraid.org> wrote:
    On 1/02/2026 9:07 pm, Kerr-Mudd, John wrote:
    On 31 Jan 2026 03:05:28 GMT rbowman <bowman@montana.com> wrote:
    On Fri, 30 Jan 2026 14:27:09 -0800, Mike Easter wrote:

    Tb 'tries to' post to the ng via nntp; but in a mod group,
    the news server doesn't 'just' post it; instead the news
    server 'auto' emails it to an .isc address ie
    group-name@moderators.isc.org. That address is configured to
    email 'forward' it to the ng's moderators of record.

    I wish I could remember the name of the intermediary service we
    used. When someone posted the moderators got an email
    notification and one would approve or deny the post. It
    streamlined the process.

    It was a lot of work to strain out a few people. This wasn't
    the group but if you go to alt.pagan and download a couple of
    months worth of headers you'll meet the famous David Dalton. He
    has an obsession with Sarah McLachlan and is usually way off
    his meds. He's still going strong after all these years, the
    sole poster in abandoned ngs.

    He appears (out of his depth) in a few other NGs. At least he's
    stopped wanting to find the ark of the covenant (was it?) buried
    under Stonehenge.

    "Stonehenge"?? I thought The Ark of The Covenant was on Mt Ararat
    in Turkiye or some such!!

    You're barking up the wrong ark.

    Yes, I was (mistakenly) think of Noah's Ark being on Mt Ararat!

    Opps!!

    PS it's spelled 'Turkey' in English.

    Used to be ... but, I thought, over the past few years there had been a
    swing in English Media to use "Turkiye".

    If you're a Turk, you need to put double dots on the last 'e' in
    Turkiye, IIRC.

    Can't say I've seen them.
    --
    Daniel70
    --- Synchronet 3.21b-Linux NewsLink 1.2
  • From issdr@p_u_n_k_i_n_d@yahoo.it to alt.free.newsservers,news.software.readers,alt.comp.os.windows-11 on Sun Feb 1 13:09:33 2026
    From Newsgroup: news.software.readers

    "Kerr-Mudd, John" wrote:

    PS it's spelled 'Turkey' in English. If you're a Turk, you need to put
    double dots on the last 'e' in Turkiye, IIRC.

    i'm gonna miss usenet as hell Ef2|
    --- Synchronet 3.21b-Linux NewsLink 1.2
  • From Maria Sophia@mariasophia@comprehension.com to alt.free.newsservers,news.software.readers,alt.comp.os.windows-10 on Sun Feb 1 11:32:00 2026
    From Newsgroup: news.software.readers

    Marco Moock wrote:
    On 29.01.2026 15:43 Uhr Maria Sophia wrote:

    If my post does not show up, I will follow your suggestion and ask Ivo
    which relay handled it. Thanks for checking your mod relay.

    Is there any way for a typical user like I am to get that information?

    Unless you get an error message or the post is being posted, no.

    Because of SPF, most servers rewrite the sender and use their own
    domain, so the original poster will not receive the bounces, but the
    news server admin will (if he heads that inbox).

    If the post is being approved and posted to the group, the Received:
    headers are removed, so you cannot see that.

    Although, other headers are sometimes kept that might indicate what
    happened, e.g. the X- headers that are added by some spam filters are
    often kept that can indicate (but do not need to) which relay they used.

    Thanks Marco, and thanks for your kind help (which was supplemented by
    Thomas Hochstein on the same thread in n.a.p just yesterday & today).

    Here's a longer summary of what people need who write their own newsreader:
    *Usenet Big-8 Management Board - Moderated Newsgroups*
    <https://www.big-8.org/wiki/Moderated_Newsgroups>

    Here's a quick shorter summary with enough detail to help others who write their own newsreaders to be able to switch from telnet to smtp for writing emails directly to the moderator (if desired) for the approval header to be added (which is what the peering servers need in order to disseminate).

    Please pick this apart if there are technical flaws in this writeup!

    1. We post our article from our newsreader to our NNTP server. The
    server receives it using the NNTP POST command. The server checks
    the group flags and sees that misc.test.moderated is moderated, so
    it does not inject the article directly into the group.

    2. Our NNTP server forwards the post to the moderator. The server sends
    the submission as email to the moderator's address for that group.
    The address is normally formed by replacing periods with hyphens and
    appending @moderators.isc.org. Note that a bogus or nonworking
    "From" address is common on Usenet and is normally acceptable.
    The domain can be real but the address is designed to not be real.

    3. The moderator reviews the submission. They read the post in their
    moderation queue and check that it is on topic, that it follows the
    group's rules, and that it is not spam or abusive. A real email
    address is usually not required. A bogus address only matters if the
    moderator needs to contact us or if the group has rules requiring
    real identities.

    4. If the moderator approves the post, they reinject it into Usenet.
    The moderator or their software adds an Approved header during this
    reinjection, for example...
    Approved: moderator@example.org
    This header tells Usenet servers that the article is authorized for
    the moderated group. The moderator's system posts from a trusted
    host or authenticated account, so servers accept the Approved
    article.

    5. Usenet servers distribute the approved article. Because it contains
    a valid Approved header and comes from a trusted injection point,
    servers propagate it normally. Our original From header, even if it
    is bogus, is usually preserved unless the moderator changes it.

    For a direct email... as far as I can tell... (which may be wrong)...

    1. We compose our article in our MUA. Instead of posting through NNTP,
    we prepare to send it as email directly to the moderator or to the
    ISC moderation relay. This method is allowed for moderated groups as
    long as we supply the correct Usenet headers.

    2. We set the To address to the group's submission address. For Big-8
    groups the standard form is the group name with periods changed to
    hyphens, plus @moderators.isc.org. Example:
    misc.test.moderated -> misc-test-moderated@moderators.isc.org

    3. We include all required Usenet headers in the email body. These
    headers must appear exactly as they would in a normal Usenet post.
    At minimum we include:
    From:
    Newsgroups:
    Subject:
    Date:
    Message-ID:
    References: (optional)
    Organization: (optional)
    User-Agent: (optional)
    We do not include a spoofed Approved header.
    That is frowned upon as it is added only by the moderator.

    4. We place a blank line after the headers. After that blank line we
    write the body of our article. The email now contains a complete
    Usenet article wrapped inside an email envelope.

    5. We send the email. Our MUA hands it to our SMTP server, which
    delivers it to the ISC moderation relay or directly to the
    moderator, depending on the address we used.

    6. The moderator receives our submission in their moderation queue. The
    moderator checks that the article is on topic, follows the group's
    rules, and is not spam or abusive. A bogus From address is normally
    acceptable unless the moderator needs to contact us.

    7. If the moderator approves the article, they reinject it into Usenet.
    Their system adds an Approved header and posts the article from a
    trusted host. Example:
    Approved: moderator@example.org

    8. Usenet servers accept the Approved article and propagate it normally
    across the network. Our original From header is usually preserved
    unless the moderator edits it.

    9. Our NNTP server eventually receives the approved article from its
    peers. It appears in the moderated group as if we had posted it
    through NNTP, even though we submitted it by email.
    --
    Had I known how it works, I would have written up a tutorial instead since
    I'm a rare breed of person who delights in edifying everyone around me.

    --- Synchronet 3.21b-Linux NewsLink 1.2
  • From Mike Easter@MikeE@ster.invalid to alt.free.newsservers,news.software.readers,alt.comp.os.windows-11 on Sun Feb 1 09:11:34 2026
    From Newsgroup: news.software.readers

    Daniel70 wrote:
    I thought, over the past few years there had been a
    swing in English Media to use "Turkiye".

    What we call Turkey 'official' name is Republic of T|+rkiye which name contains the umlaut lowercase U, which should display as a UTF-8.
    --
    Mike Easter
    --- Synchronet 3.21b-Linux NewsLink 1.2
  • From Maria Sophia@mariasophia@comprehension.com to news.software.readers on Thu Jan 29 15:43:28 2026
    From Newsgroup: news.software.readers

    Marco Moock wrote:
    You might not see this 'cuz a "real" newsreader would likely have
    emailed the moderator directly which requires connecting to a working
    MAPI mail client, which my homegrown newsreader never thought it
    would need to do.

    It is common that the servers carry the groups and you post your
    message using NNTP to the group. The server then creates the mail and
    doesn't add the post to the local spool nor distributes it to the peers.

    Conclusion on the perils of writing your own home-grown newsreader...
    a. The failure wasn't Blueworld's fault as it simply doesn't carry
    misc.taxes.moderated, so there was no NNTP path for my post.

    In such a case you should get a "No such group" or similar NNTP error message.

    b. A more full-featured newsreader would likely have fallen back to
    sending the article via email to the moderator, but my home-grown
    setup doesn't communicate with a local mail client, so that path
    wasn't available.

    c. Luckily, the next server I randomly tested (paganini.bofh.team)
    *does* carry misc.taxes.moderated & handles the forwarding to the
    moderator via email automatically, so the post appears to have gone
    through.

    That process is the default, as the moderated groups use this general
    domain (and used moderators.uu.net before that, but still active).

    I'll know in a couple of days if that post went through though, but I
    figured I'd write up this one lesson in the perils of writing a
    newsreader.

    I've checked my mod relay (2 others exist), but I cannot see that
    message. I assume one of the others were used, so in case it doesn't
    work, ask Ivo to which one the message was relayed.

    Have any of the readers who see this written their own newsreader?
    How did you handle sending to moderated newsgroups with email
    fallback?

    How does a NORMAL newsreader handle this fallback to email for
    moderation?

    I've never seen such a functionality in the wild. The normal process is
    to use NNTP to post - if that fails an error message will be shown.


    Thanks for the clarification, Marco, where I guess the main question for
    n.s.r is simply how it's supposed to work for those using real newsreaders.

    On my end, my home-grown newsreader simply failed because it was not a case
    of NNTP rejecting the post but simply that Jesse's server did not carry the group <misc.taxes.moderated>

    Testing what failed in my home-grown newsreader, Blueworld does return a
    normal 200 greeting and accepts MODE READER, but when I issue:

    LIST ACTIVE misc.taxes.moderated

    Jesse's server returns an empty list.
    In other words, the moderated group is not carried at all.

    Since that moderated group does not exist on that server, there is no "m"
    flag and no submission template to trigger the moderator-forwarding
    mechanism. My home-grown reader therefore sent the POST command normally,
    and the server rejected it immediately because the group was not in its
    active file. That is why I did not get a "No such group" error until after attempting to post.

    Ivo Gandolfo's Paganini, on the other hand, does carry that newsgroup.

    misc.taxes.moderated 0000061574 0000002149 m

    and because it has the wildcard rule:

    *:%s@moderators.isc.org

    it automatically expands the group name and forwards the article to:

    misc-taxes-moderated@moderators.isc.org

    So the difference was not NNTP vs email fallback inside my reader. It was simply that Ivo's server carried the moderated group and Jesse's did not.
    Once I used a server that actually carried the group, I believe the
    standard moderation-forwarding path works exactly as you described.

    I haven't yet tested Wolfgang's (Ray Banana) free server, nor Steve Crook's free server, nor Alex de Joode's free server, etc. as 2 tests were enough.

    As for the "email fallback" idea, thanks for clarifying that most "real" newsreaders do not implement it. My telnet/vim-based home-grown newsreader
    does not either as it just posts via NNTP and reports whatever the server returns. I only mentioned the fallback because when I was debugging why it failed, I saw in the results that some readers appear to do it behind the scenes when the server does not carry a moderated group, but that is really just the server doing the forwarding, not the client.

    If my post does not show up, I will follow your suggestion and ask Ivo
    which relay handled it. Thanks for checking your mod relay.

    Is there any way for a typical user like I am to get that information?
    --
    I include multiple newsgroups because I want everyone to learn from this.
    --- Synchronet 3.21d-Linux NewsLink 1.2
  • From Carlos E.R.@robin_listas@es.invalid to alt.free.newsservers,news.software.readers,alt.comp.os.windows-11 on Fri Jan 30 22:46:17 2026
    From Newsgroup: news.software.readers

    On 2026-01-30 19:30, rbowman wrote:
    On Fri, 30 Jan 2026 13:35:43 +0100, Carlos E.R. wrote:


    * The Workflow: Instead of appearing immediately, posts to moderated
    groups (e.g., rec.food.recipes) are sent to a moderator. The moderator
    reviews them to ensure they follow the group's charter, then publishes
    approved messages to the Usenet server.

    I was a moderator for a group years ago. The name escapes me but we used a service to coordinate the moderation. It was inexpensive and the several moderators chipped in to pay the cost.

    The newsgroup still exists but hasn't had moderators for about 20 years.

    From the user side, how did it work?

    For example, when posting, Thunderbird would automatically send an email
    to the moderator list, and would find out this address automatically?
    --
    Cheers, Carlos.
    ESEfc-Efc+, EUEfc-Efc|;
    --- Synchronet 3.21d-Linux NewsLink 1.2
  • From Maria Sophia@mariasophia@comprehension.com to alt.free.newsservers,news.software.readers,alt.comp.os.windows-11 on Wed Mar 11 16:05:41 2026
    From Newsgroup: news.software.readers

    Herbert Kleebauer wrote:
    There shouldn't be any problem when you copy text from a web page and
    past it into an usnet posting. There is only a problem if you
    convert the utf-8 text into "something else" and then paste it
    into the posting. You don't solve a problem, you create a problem.

    Hi Herbert,

    Thank you for asking a question to understand why the conversion is needed. You've helped me many times over the decades, and you deserve the answer.

    In the past, Carlos, Andy & others have noted my nntp headers have a
    character set defined (or not) that doesn't always match the character set.

    That's because I don't use a "real" newsreader.

    I wrote a unique simple newsreader (which is just a bunch of batch scripts with telnet, stunnel & gVim predominating) but which has no good way of knowing what character set I'm pasting into my gVim NNTP editing sessions.

    Worse, I can spend hours on a Usenet post, where I can combine input from dozens or even scores of web page sources, so character sets will mix.

    So I try to automagically force every character in the final gVim edit to
    be only 7-bit pure-ASCII characters (using a Notepad++ control-B macro).

    1. I select text in Chromium & press "ctrl+c" to copy to clipboard
    2. I type "n" in the taskbar Windows "Win+R" runbox to bring up Notepad++
    3. I type "ctrl+v" to paste that HTML text into that Notepad++ session
    4. I type "ctrl+b" to run the conversion to ASCII & clean the clipboard
    5. I type "ctrl+v" to paste that clipbrd into my gVim editing session

    This is extremely simple.
    Yet very complicated.

    It's brilliant, IMHO, but most people likely won't understand that concept.
    But some people *do* understand that the Windows clpbrd is rather messy.

    And some people might *appreciate* that I clean everything to 7-bit ASCII.

    While many people waste about five seconds per Usenet post, I can invest hours, where I collate input from a huge variety of sources, and, as it
    turns out, when copying from many sources, CF_HTML metadata fragments can corrupt the text in ways that most people have absolutely no idea of.

    Newsgroups: alt.comp.software.firefox,comp.sys.mac.system,alt.os.linux
    Subject: PSA: Clipboard differences between Chromium & Firefox across platforms
    Date: Thu, 12 Feb 2026 15:26:32 -0500
    Message-ID: <10mld1o$1910$1@nnrp.usenet.blueworldhosting.com>

    I need to stress that out of a million people, only two or three know what
    is in that thread I listed above, so I understand that most people wouldn't have any idea that the Linux/macOS/Windows clipboard is so complicated.

    It's simple.
    But it is complicated too.

    A clipboard copied from a browser contains a lot of "garbage".
    Only some of that garbage is visible, but much of it is invisible.

    The updated notepad++ macro below converts all that invisible/visible
    garbage into the ~95 7-bit pure ASCII characters found on my keyboard.

    <?xml version="1.0" encoding="UTF-8" ?>
    <!-- C:\app\editor\txt\N++\shortcuts.xml for Windows Notepad++ (N++) -->
    <!-- Automatically cleans fragments, converts to ASCII & copies to clipbrd --> <!-- Use model: Control+V (paste) & Control+B (run the macro) -->
    <!-- Notepad++ does not treat shortcuts.xml as a user-editable file. -->
    <!-- It treats it as an internal state file. -->
    <!-- If you hand-edit it, Notepad++ will rewrite it, reorder it, -->
    <!-- truncate it, or revert it to whatever it feels like doing. -->
    <!-- Which means you need to always save a text copy of every version -->
    <!-- v4p6 20260311 fix the problem that it doesn't always work -->
    <!-- Scintilla may preserve CF_HTML metadata even after cutting -->
    <!-- Force the clipboard to contain plain text by doing a 2x copy --> <!-- Copy cleaned text, Insert dummy char, Delete dummy char -->
    <!-- Select all, Copy again -->
    <!-- So clipboard contains only the 2nd copy, which is always text-->
    <!-- Fixed inaccuracies in the Scintilla-command comment section -->
    <!-- Also fixed two Tangsa blocks U+16C00 and U+16C20 which did nothing prior -->
    <!-- v4p5 20260311 fix the problem that a space is deleted -->
    <!-- But Scintilla 2326 had deleted the character before the caret --> <!-- So, instead of Insert space, Delete space before the caret -->
    <!-- Insert a newline, Move caret left, Delete the newline -->
    <!-- v4p4 Replace U+FFFD (REPLACEMENT CHARACTER) with nothing & collapse--> <!-- Merged letters around U+00A1 (inverted exclamation mark) -->
    <!-- v4p3 Replace U+FF1A (FULLWIDTH COLON) with ASCII ':' -->
    <!-- v4p2 Replace U+00D7 (MULTIPLICATION SIGN) with ASCII 'x' -->
    <!-- v4p1 20260213 Convert Tangsa UTF-8 (F4 86 B0 80) to a placeholder -->
    <!-- v4p0 (Scintilla changes this file so always save a text backup! -->
    <!-- v3p9 20260211 N++ was not running the macro in the order shown -->
    <!-- But it turned out any error causes an OLDER version to run. -->
    <!-- Worse, when that happens, N++ overwrites this file -->
    <!-- Worse, N++ is executing macro actions in a different order -->
    <!-- than they appear in the XML so a total rewrite is needed in v4p0 -->
    <!-- v3p8 20260211 U+2060 is driving me nuts so it's the first block now --> <!-- v3p7 20260211 moved U+2060 up because it's the most disruptive -->
    <!-- v3p6 20260211 U+2009 & U+200B not being converted properly -->
    <!-- v3p5 20260211 fixed U+200B failing when U+200B is between ' & s -->
    <!-- A 2nd pass was duplicated after apostrophe normalization rules --> <!-- v3p4 20260211 added U+275E (heavy double quote right) -->
    <!-- v3p3 20260211 added U+2009 (thin space) -->
    <!-- v3p2 20260211 added seven new conversions after running testcases -->
    <!-- U+02BE (modifier letter right half ring) -->
    <!-- U+02BF (modifier letter left half ring) -->
    <!-- U+201E (double low-9 quote) -->
    <!-- U+201F (double high-reversed-9 quote) -->
    <!-- U+275D (heavy double quote left) -->
    <!-- U+275E (heavy double quote right) -->
    <!-- U+2015 (horizontal bar) -->
    <!-- U+2009 (thin space) -->
    <!-- v3p1 20260211 reorganized into a dozen distinct categories -->
    <!-- (1) control characters: U+000F U+0001 -->
    <!-- (2) dashes & minus signs: U+2010 U+2011 U+2012 U+2212 -->
    <!-- (3) zero-width characters: U+200C U+200B U+200D U+FEFF U+2060 -->
    <!-- (4) special spaces: U+00A0 U+2007 U+202F U+200A U+2008 U+2006 -->
    <!-- (5) apostrophe-like characters:
    U+0F0C U+2018 U+2019 U+2032 U+02BC U+02B9 U+02C8 U+02EE
    U+201B U+02CB U+A78C U+FF07 -->
    <!-- (6) combining marks (remove after apostrophes):
    U+0351 U+0307 U+0331 U+0335 U+0336 U+0337 U+0338 -->
    <!-- (7) double-quote normalization: U+201C U+201D -->
    <!-- (8) dash-like & ellipsis & HTML entities:
    U+2026 - U+2014 U+2013 - -->
    <!-- (9) bullets, math symbols, diacritics:
    U+2022 U+8722 U+011F U+2009 U+00E1 U+0161 U+011B -->
    <!-- (10) miscellaneous symbols:
    U+2713 ASCII hyphen ' U+2192 U+00B0 U+00A9 U+2122 U+00AE -->
    <!-- (11) invisible operators:
    U+00AD U+2061 U+2062 U+2063 U+2064 U+180E -->
    <!-- (12) line separators: U+2028 U+2029 U+0085 -->
    <!-- v3p0 20260211 added combining marks U+0351 U+0307 U+0331 -->
    <!-- v3p1 20260211 added apostrophe-like characters U+201B U+02CB -->
    <!-- v2p9 20260211 moved U+2060 to be above apostrophe-related blocks -->
    <!-- v2p8 20260211 fixed Chromium CF_HTML paste control+A anomaly -->
    <!-- v2p7 20260211 added U+02EE modifier letter double apostrophe rule -->
    <!-- v2p6 20260211 fixed U+02C8 modifier letter vertical line) rule -->
    <!-- v2p5 20260211 fixed U+02B9 (modifier letter prime) rule -->
    <!-- v2p4 20260211 removed one of two U+000F blocks -->
    <!-- v2p3 20260211 removed two (duplicate) 1700 lines in U+0161 -->
    <!-- v2p2 20260211 fixed all zero-width blocks to replace with nothing -->
    <!-- v2p1 20260211 fixed BOM to replace with nothing -->
    <!-- v2p0 20260210 cleaned (emptied out) closing sections of the file -->
    <!-- v1p9 20260210 ported old shortcuts.xml to improve coverage -->
    <!-- Cleans Chromium pasted text & normalizes Unicode to ASCII -->
    <!-- Use model: paste (using control+v) & fix (using control+b) -->
    <!-- The macro should 1st break CF_HTML fragment mode (so Ctrl+A works) --> <!-- and then run the Unicode-to-ASCII cleanup on all the pasted text -->
    <!-- cutting (control+x) the result back into the Windows clipboard -->
    <!-- thereby leaving the N++ GUI empty & ready for the next paste-->

    <!--
    To break Scintilla's CF_HTML fragment mode, we need to make any edit.
    We can insert a space & then delete that space, for example.
    <Action type="0" message="2001" wParam="32" /> (insert a space)
    <Action type="0" message="2326" /> (delete a char to the left)
    But that is dependent on the position of the cursor, which changes!
    So, in v4p4, instead of Insert space, Delete space before the caret
    Insert a newline, Move caret left, Delete the newline


    <!-- Scintilla message-id engine command meanings:
    1601 = set the search string (the Unicode character to find)
    1602 = set the replacement string (ASCII equivalent)
    1625 = clear the replacement buffer
    1700 = begin a new search/replace operation
    1701 = end this search/replace block
    1702 = execute Replace All
    2001 = Replace the current selection with the given text
    2013 = SCI_SELECTALL (selects everything)
    2177 = SCI_CUT (cut all)
    2304 = Move caret one character to the left
    2326 = SCI_DELETEBACK (delete the character to the left of the caret)
    2327 = Delete the character to the right of the caret
    41001 = IDM_FILE_EXIT (close)


    <!-- When you paste from a Chromium-based app, the clipboard contains:
    CF_UNICODETEXT (plain text) & CF_HTML (HTML fragment)
    And sometimes CF_RTF where N++ prefers CF_HTML if available.

    v2p0 fixes a N++ selection issue caused by CF_HTML pastes.
    "HTML Paste Mode" prevents the "Control+A" from working.
    "HTML paste mode" inserts HTML fragment as plain text
    where Ctrl+A is disabled until the buffer is "normalized"
    (until the first edit that breaks the fragment state)


    <!-- BELOW IS THE START OF THE NOTEPAD++ SHORTCUTS.XML FILE -->
    <!-- Below is garbage that N++ adds to shortcuts.xml -->
    <NotepadPlus>
    <InternalCommands>
    <Shortcut id="43009" Ctrl="no" Alt="no" Shift="no" Key="0" />
    </InternalCommands>
    <Macros>
    <!-- Above is garbage that N++ adds to shortcuts.xml -->

    <!-- ASCII "control+b" Cleanup Macro -->
    <Macro name="ASCII" Ctrl="yes" Alt="no" Shift="no" Key="66">

    <!-- Begin Scintilla HTML-paste workaround top portion -->
    <!-- Break Chromium CF_HTML fragment mode by adding & deleting a line -->
    <!-- Insert newline -->
    <Action type="0" message="2001" wParam="10" lParam="0" sParam="" />
    <!-- Move caret left -->
    <Action type="0" message="2304" wParam="0" lParam="0" sParam="" />
    <!-- Delete character to the right -->
    <Action type="0" message="2327" wParam="0" lParam="0" sParam="" />
    <!-- Select all text before running cleanup -->
    <Action type="0" message="2013" wParam="0" lParam="0" sParam="" />
    <!-- End Scintilla HTML-paste workaround top portion -->

    <!-- BEGIN STANDARD CONVERSION BLOCKS -->

    <!-- U+2060 is driving me nuts so I'm making it the 1st block -->
    <!-- U+2060 must be placed above the apostrophe-related blocks -->
    <!-- Otherwise apostrophe block may skip over it -->
    <!-- U+2060 is disruptive as it must be placed above zero-width too -->
    <!-- Replace U+2060 (WORD JOINER) with nothing -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2060;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- #1. CONTROL CHARACTERS (remove first) -->
    <!-- Replace U+000F (SHIFT-OUT control character) with nothing -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+0001 (SOH control character) with nothing -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x0001;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- #2. DASHES & MINUS SIGNS (safest to remove early) -->
    <!-- Replace U+2010 (HYPHEN) with ASCII "-" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2010;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="-" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+2011 (NON-BREAKING HYPHEN) with ASCII hyphen "-" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2011;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="-" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+2012 (FIGURE DASH) with ASCII "-" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2012;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="-" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+2212 (MINUS SIGN) with ASCII "-" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2212;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="-" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- #3. ZERO-WIDTH CHARACTERS (must be BEFORE apostrophes) -->

    <!-- Replace U+200C (ZERO WIDTH NON-JOINER) with "" (nothing) -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x200C;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+200B (ZERO WIDTH SPACE) with nothing -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x200B;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+200D (ZERO WIDTH JOINER) with nothing -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x200D;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+FEFF (BOM) with nothing -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#xFEFF;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- #4. SPECIAL SPACES (convert to ASCII space) -->
    <!-- Replace U+00A0 (NO-BREAK SPACE) with ASCII space -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x00A0;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+2007 (FIGURE SPACE) with ASCII space -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2007;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+202F (NARROW NO-BREAK SPACE) with ASCII space -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x202F;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+200A (HAIR SPACE) with ASCII space -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x200A;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+2008 (PUNCTUATION SPACE) with ASCII space -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2008;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+2006 (SIX-PER-EM SPACE) with ASCII space -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2006;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- #5. APOSTROPHE-LIKE CHARACTERS -->
    <!-- Replace U+0F0C (TIBETAN MARK DELIMITER) with ASCII apostrophe "'" --> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x0F0C;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="&apos;" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+2018 (LEFT SINGLE QUOTE) with ASCII apostrophe "'" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2018;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="&apos;" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+2019 (RIGHT SINGLE QUOTATION) with ASCII apostrophe "'" --> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2019;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="&apos;" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+2032 (PRIME) with ASCII apostrophe -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2032;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="&apos;" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+02BC (MODIFIER LETTER APOSTROPHE) with ASCII apostrophe --> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x02BC;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="&apos;" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+02B9 (MODIFIER LETTER PRIME) with ASCII apostrophe "'" --> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x02B9;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="&apos;" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+02C8 (MODIFIER LETTER VERTICAL) with ASCII apostrophe "'" --> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x02C8;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="&apos;" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+02EE (MODIFIER DOUBLE APOSTROPHE) with ASCII apostrophe "'" --> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x02EE;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="&apos;" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- U+201B (SINGLE HIGH-REVERSED-9 QUOTATION MARK) with apostrophe "'" --> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x201B;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="&apos;" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+02CB (MODIFIER LETTER GRAVE ACCENT) with ASCII apostrophe "'" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x02CB;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="&apos;" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- This is is a duplication which is after the apostrophes -->
    <!-- When U+200B appears between two characters that were already replaced --> <!-- the first pass fails to remove it, so I added this duplicate -->
    <!-- Remove U+200B (ZERO-WIDTH SPACE) second pass -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x200B;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- #6. COMBINING MARKS (remove only after apostrophes are done) -->
    <!-- Remove U+0351 (COMBINING RIGHT HALF RING ABOVE) -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x0351;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Remove U+0307 (COMBINING DOT ABOVE) -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x0307;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Remove U+0331 (COMBINING MACRON BELOW) -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x0331;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />


    <!-- #7. DOUBLE-QUOTE NORMALIZATION -->
    <!-- Replace U+201C (LEFT DOUBLE QUOTE) with ASCII double quote " -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x201C;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam='&quot;' /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+201D (RIGHT DOUBLE QUOTE) with ASCII double quote -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x201D;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam='&quot;' /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- #8. ELLIPSIS, EM DASH, EN DASH, HTML ENTITIES -->
    <!-- Replace U+2026 (HORIZONTAL ELLIPSIS) with ASCII "..." -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2026;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="..." />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace literal - (HTML entity for EM DASH) with ASCII "-" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&amp;#151;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="-" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+2014 (EM DASH) with ASCII "-" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2014;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="-" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+2013 (EN DASH) with ASCII "-" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2013;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="-" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace literal - (ZERO WIDTH NON-JOINER entity) with ASCII "-" --> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="-" />
    <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="-" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- #9. BULLETS, MATH SYMBOLS, LETTERS WITH DIACRITICS -->
    <!-- Replace U+2022 (BULLET) with ASCII "*" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2022;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="&#x002A;" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+8722 (MATHEMATICAL MINUS variant) with ASCII "&" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x8722;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="&amp;" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+011F (LATIN SMALL G WITH BREVE) with ASCII "g" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x11f;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="g" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+00E1 (LATIN SMALL A WITH ACUTE) with ASCII "a" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#xe1;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="a" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+0161 (LATIN SMALL S WITH CARON) with ASCII "s" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x161;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="s" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+011B (LATIN SMALL E WITH CARON) with ASCII "e" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x11b;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="e" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- #10. MISCELLANEOUS SYMBOLS -->
    <!-- Replace U+2713 (CHECK MARK) with ASCII space -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2713;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace ASCII hyphen "-" with ASCII hyphen "-" (normalize) -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="-" />
    <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="-" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace backtick with ASCII single quote -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="'" />
    <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="&apos;" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace Unicode Arrow (U+2192) with ASCII dash greaterthan -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2192;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="->" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace degree symbol with deg -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x00B0;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="deg" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace copyright symbol U??? with (C) -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x00A9;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="(C)" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace Trademark (U+2122) with (TM) -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2122;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="(TM)" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace Registered (U+00AE) with (R) -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x00AE;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="(R)" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />


    <!-- #11. INVISIBLE OPERATORS (remove) -->
    <!-- Replace U+00AD (SOFT HYPHEN) with "" (remove completely) -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x00AD;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+2061 (FUNCTION APPLICATION) with "" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2061;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+2062 (INVISIBLE TIMES) with "" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2062;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+2063 (INVISIBLE SEPARATOR) with "" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2063;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+2064 (INVISIBLE PLUS) with "" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2064;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+180E (MONGOLIAN VOWEL SEPARATOR) with "" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x180E;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- #12. LINE SEPARATORS -->
    <!-- Replace U+2028 (LINE SEPARATOR) with ASCII newline -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2028;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+2029 (PARAGRAPH SEPARATOR) with ASCII newline -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2029;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+0085 (NEXT LINE / NEL) with ASCII newline -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x0085;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+A78C (LATIN SMALL LETTER SALTILLO) with ASCII apostrophe "'" --> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#xA78C;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="&apos;" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+FF07 (FULLWIDTH APOSTROPHE) with ASCII apostrophe "'" --> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#xFF07;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="&apos;" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Remove U+0335 (COMBINING SHORT STROKE OVERLAY) -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x0335;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Remove U+0336 (COMBINING LONG STROKE OVERLAY) -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x0336;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Remove U+0337 (COMBINING SHORT SOLIDUS OVERLAY) -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x0337;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Remove U+0338 (COMBINING LONG SOLIDUS OVERLAY) -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x0338;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+2043 (HYPHEN BULLET) with ASCII "-" -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2043;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="-" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+02BE (MODIFIER LETTER RIGHT HALF RING) w/ ASCII apostrophe --> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x02BE;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="&apos;" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+02BF (MODIFIER LETTER LEFT HALF RING) w/ ASCII apostrophe --> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x02BF;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="&apos;" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+201E (DOUBLE LOW-9 QUOTATION MARK) w/ ASCII double quote --> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x201E;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="&quot;" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+201F (DOUBLE HIGH-REVERSED-9 QUOTATION MARK) w/ dquote --> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x201F;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="&quot;" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+275D (HEAVY DOUBLE QUOTATION MARK ORNAMENT LEFT) w/ dquote --> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x275D;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="&quot;" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+275E (HEAVY DOUBLE QUOTATION MARK ORNAMENT RIGHT) w/ dquote --> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x275E;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="&quot;" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+2015 (HORIZONTAL BAR) with ASCII hyphen -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2015;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="-" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+2009 (THIN SPACE) with ASCII space -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2009;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+2009 (THIN SPACE) with ASCII space -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x2009;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+00D7 (MULTIPLICATION SIGN) with ASCII 'x' -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x00D7;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="x" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+FF1A (FULLWIDTH COLON) with ASCII ':' -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#xFF1A;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam=":" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- END OF STANDARD CONVERSION BLOCKS -->

    <!-- v4p1 Convert Tangsa UTF-8 (F4 86 B0 80) to a harmless placeholder -->
    <!-- Replace U+16C00 (Tangsa Letter OZ) with placeholder -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x16C00;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="[[NW]]" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />


    <!-- Replace U+16C20 (mutated Tangsa) with placeholder -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#x16C20;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="[[NW]]" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Replace U+FFFD (REPLACEMENT CHARACTER) with nothing -->
    <!--
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="&#xFFFD;" />
    <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />


    <!-- Merge letters around U+FFFD (fix broken ligatures by collapsing) --> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="([A-Za-z])&#xFFFD;([A-Za-z])" />
    <Action type="3" message="1625" wParam="0" lParam="0" sParam="\1\2" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Merge letters around U+00A1 (inverted exclamation mark) -->
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="([A-Za-z])&#x00A1;\s*([A-Za-z])" />
    <Action type="3" message="1625" wParam="0" lParam="0" sParam="\1\2" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />

    <!-- Begin Scintilla HTML-paste workaround bottom portion -->
    <!-- First copy -->
    <Action type="0" message="2178" />
    <!-- Insert dummy space -->
    <Action type="0" message="2001" wParam="32" />
    <!-- Move caret left -->
    <Action type="0" message="2304" />
    <!-- Delete dummy space safely -->
    <Action type="0" message="2327" />
    <!-- Select all again -->
    <Action type="0" message="2013" />
    <!-- Second copy (guaranteed plain text) -->
    <Action type="0" message="2178" />
    <!-- Cut to empty editor -->
    <Action type="0" message="2177" />
    <!-- End Scintilla HTML-paste workaround bottom portion -->

    <!-- Close N++ -->
    <Action type="2" message="41001" wParam="0" lParam="0" sParam="" />

    <!-- N++ will save shortcuts.xml automatically as it
    rewrites the file whenever shortcuts/macros/plugins change.
    Some sections are required so empty sections will be recreated.


    </Macro>
    </Macros>
    <UserDefinedCommands>
    </UserDefinedCommands>

    <PluginCommands />
    <ScintillaKeys />

    </NotepadPlus>

    <!-- ABOVE IS THE MEAT OF THE NOTEPAD++ SHORTCUTS.XML FILE -->
    --
    There are two kinds of people on Usenet, only one of which can add value.
    --- Synchronet 3.21d-Linux NewsLink 1.2
  • From snipeco.2@snipeco.2@gmail.com (Wader of Doom) to alt.free.newsservers,news.software.readers,alt.comp.os.windows-11 on Thu Mar 12 01:21:37 2026
    From Newsgroup: news.software.readers

    Maria Sophia <mariasophia@comprehension.com> wrote:

    Hi Herbert,

    Hi, Arlen, how's your User-Agent?
    --
    Darth Wader [breathe, breathe...]
    --- Synchronet 3.21d-Linux NewsLink 1.2
  • From Maria Sophia@mariasophia@comprehension.com to alt.free.newsservers,news.software.readers,alt.comp.os.windows-11 on Thu Mar 12 10:10:31 2026
    From Newsgroup: news.software.readers

    Several kind posters have helped me track down why my replies sometimes get corrupted when responding to posts from Winston, so I wanted to kindly summarize the
    findings so the whole picture is clear, which would be helpful to those who care.

    While anything I say below can be wrong, it's what I "think" is happening...

    1. Winston types his display name using Windows Alt-codes.
    These produce raw Windows-1252 bytes:
    A1 = -i
    F1 = |#
    A7 = -o
    B1 = -#
    A4 = -n
    His full display name is literally:
    ...w-i|#-o-#-n|#

    2. These bytes are legal in Windows-1252, but not legal in a Usenet header.
    Usenet headers must be 7-bit ASCII unless they use a MIME encoded-word.
    WinstonrCOs header contains raw 8-bit bytes, not ASCII and not UTF-8.

    3. Thunderbird displays those bytes as-is.
    Thunderbird does not sanitize nor re-encode the header on send.
    In the message viewer, Thunderbird shows:
    ...w-i|#-o-#-n|# <winstonmvp@gmail.com>
    When viewing the raw source, Thunderbird shows a MIME-encoded version,
    but that is Thunderbird's internal representation, not what was sent.

    4. My own workflow is strict ASCII.
    I enforce 7-bit output. When I quote Winston, his raw 8-bit bytes get
    copied into my attribution line. That can create a mojibake mismatch
    between declared charsets and the actual bytes in my outgoing post.

    5. Some NNTP servers may (apparently) try to 'repair' that mismatch.
    Different nntp servers may handle illegal bytes differently. Some
    may rewrite the charset, some might re-encode the body, and some
    may simply corrupt the article into mojibake scrambled eggs.
    I think that is why my replies sometimes get mangled on the way out.

    6. By experiment, ASCII mode works better for me than UTF-8 mode.
    When I declare US-ASCII and strip all non-ASCII before posting, the
    article is internally consistent and servers seem to not interfere.
    When I declare UTF-8, servers appear to try to validate the bytes to
    fix what is not valid UTF-8, which may lead to unpredictable results.

    Since this is a component of the perils of writing your own newsreader,
    I am adding a normalization step in my shortcuts.xml so that any non-ASCII bytes in the attribution line are removed or replaced before posting. This keeps my outgoing articles 7-bit clean and prevents NNTP servers from
    rewriting them. Modern newsreaders already do this automatically, so this likely perhaps mainly only affects older strict-ASCII workflows like mine.

    Thanks to everyone who helped test this from the recipient's side. The
    problem is now better understood & the workaround on my end is ongoing.
    --
    There are 2 types of posters on Usenet, only half of which can add value.
    --- Synchronet 3.21d-Linux NewsLink 1.2
  • From Phil Boutros@philb@philb.ca to alt.free.newsservers,news.software.readers,alt.comp.os.windows-11 on Fri Mar 13 18:57:41 2026
    From Newsgroup: news.software.readers

    Maria Sophia <mariasophia@comprehension.com> wrote:
    <snip>

    I need to stress that out of a million people, only two or three know what is in that thread I listed above, so I understand that most people wouldn't have any idea that the Linux/macOS/Windows clipboard is so complicated.
    But it is complicated too.

    You think only "two of three" people out of a million, whom hang
    out on Usenet in 2026, in a software-related group no less (I'm
    reading this on news.software.readers) understand how character
    encoding and decoding works?

    <snip a whole heap of macro>

    And that it takes about a thousand lines to move from one encoding
    to another? Most modern programming languages can do this trivially
    in one operation. You should only have to decode based on the
    specified encoding, then encode to your specified encoding. Literally
    one line per operation. This is specifically why Unicode is used.

    Am I missing something obvious? In what language is your
    newsreader written?


    Phil
    --
    AH#61 Wolf#14 BS#89 bus#1 CCB#1 SENS KOTC#4
    philb@philb.ca http://philb.ca
    --- Synchronet 3.21d-Linux NewsLink 1.2
  • From Maria Sophia@mariasophia@comprehension.com to news.software.readers on Sun Mar 15 21:27:29 2026
    From Newsgroup: news.software.readers

    Phil Boutros wrote:
    Am I missing something obvious?

    This finds thousands...
    grep -nP "[^\x00-\x7F]" body.txt

    How do you efficiently convert each set differently?

    In what language is your newsreader written?

    Windows batch. Telnet. Stunnel. gVim.
    --- Synchronet 3.21d-Linux NewsLink 1.2
  • From Colin Macleod@user7@newsgrouper.org.invalid to news.software.readers on Sun Mar 15 20:49:19 2026
    From Newsgroup: news.software.readers

    Maria Sophia <mariasophia@comprehension.com> posted:
    Phil Boutros wrote:
    In what language is your newsreader written?

    Windows batch. Telnet. Stunnel. gVim.

    Wow! You obviously like doing things the hard way! :-)
    --
    Colin Macleod ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ https://cmacleod.me.uk

    FEED HOUSE SAVE FEED HOUSE SAVE FEED HOUSE SAVE
    GAZA GAZA GAZA GAZA GAZA GAZA GAZA GAZA GAZA
    NOW! NOW! NOW! NOW! NOW! NOW! NOW! NOW! NOW!
    --- Synchronet 3.21d-Linux NewsLink 1.2
  • From Maria Sophia@mariasophia@comprehension.com to news.software.readers on Mon Mar 16 04:52:29 2026
    From Newsgroup: news.software.readers

    Colin Macleod wrote:
    Maria Sophia <mariasophia@comprehension.com> posted:
    Phil Boutros wrote:
    In what language is your newsreader written?

    Windows batch. Telnet. Stunnel. gVim.

    Wow! You obviously like doing things the hard way! :-)

    The concept of writing my own newsreader began just after the IBM-360 punch card and assembly language PDP-11 bootstrap-switch days when we stopped visiting the computer overnight and we started hauling SunOS workstations around and reveling in the SPARC pizza-box era of the uunet bang-paths.

    By the time I used rn, I already had the attitude of someone who built
    their own tools, which wasn't quelled when using tin a few years later.

    In the Motorola 68701 era. we didn't download software, we burned it.

    Literally. We all hand-assembled hex, programmed EEPROMs and hoped we
    didn't miscount an offset. For those of us who grew up in that environment, writing our own newsreader is just stringing telnet & stunnel together.

    The main advantage was privacy because rn enforced a real email address in
    the days we used to actually complain to the ISP of those who spammed us.

    Remember then? Back then everyone's fingers knew vi (or ed, if they were
    truly ancient) like the back of their hand, long before gVim or anything
    with a menu bar existed, so everyone's fingers were fluent in regexp.

    And here we all stand, decades later, and I still don't know of a Windows newsreader that works with gVim, which, well, it might exist.

    Or, it might not.
    Does it?

    If not, I'm using the only one out there in the world that we know of.
    If you know of a Windows newsreader integrated with gVim, do let me know.
    --- Synchronet 3.21d-Linux NewsLink 1.2
  • From issdr@p_u_n_k_i_n_d@yahoo.it to news.software.readers on Mon Mar 16 05:00:02 2026
    From Newsgroup: news.software.readers

    Maria Sophia wrote:

    And here we all stand, decades later, and I still don't know of a Windows newsreader that works with gVim, which, well, it might exist.

    Or, it might not.
    Does it?

    Forte Agent and Xnews allow you to use an external text editor
    --- Synchronet 3.21d-Linux NewsLink 1.2
  • From Colin Macleod@user7@newsgrouper.org.invalid to news.software.readers on Mon Mar 16 09:31:12 2026
    From Newsgroup: news.software.readers

    Maria Sophia <mariasophia@comprehension.com> posted:

    Literally. We all hand-assembled hex, programmed EEPROMs and hoped we
    didn't miscount an offset. For those of us who grew up in that environment, writing our own newsreader is just stringing telnet & stunnel together.

    Well, my first programs were punched on cards, and I've hand-written
    machine code in hex (for NatSemi SC/MP), but I wrote my newsgrouper.org
    in Tcl, which already has packages to handle nntp, mime-en/decoding, etc..
    What a wimp! :-)
    --
    Colin Macleod ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ https://cmacleod.me.uk

    FEED HOUSE SAVE FEED HOUSE SAVE FEED HOUSE SAVE
    GAZA GAZA GAZA GAZA GAZA GAZA GAZA GAZA GAZA
    NOW! NOW! NOW! NOW! NOW! NOW! NOW! NOW! NOW!
    --- Synchronet 3.21d-Linux NewsLink 1.2
  • From Maria Sophia@mariasophia@comprehension.com to news.software.readers on Mon Mar 16 11:55:38 2026
    From Newsgroup: news.software.readers

    issdr wrote:
    Maria Sophia wrote:

    And here we all stand, decades later, and I still don't know of a Windows >> newsreader that works with gVim, which, well, it might exist.

    Or, it might not.
    Does it?

    Forte Agent and Xnews allow you to use an external text editor

    That's a good start since no newsreader should be considered a newsreader
    of any import if it didn't simply use $EDITOR as the article-body editor.

    Of course, rn/trn/tin could accept the visual, so the second most important feature necessary in any decent privacy-focused newsreader are the headers.

    Header rotation (changing non-essential header fields in a semi-random way)
    is critical for privacy, although most people won't understand the concept.
    a. No single stable identifier follows you across thousands of posts
    b. Aggregators can't trivially correlate your messages
    c. With the hope that your posting pattern becomes harder to fingerprint
    etc.
    But all the while, any "human" will know exactly who you are since you
    don't change the style or what you say or where you live except in headers.

    While I get it that of the million things to know about privacy, most
    people understand about two or three of them, but headers are part of it.
    A. Message-ID patterns, From patterns, Posting time patterns, etc.
    B. X-Newsreader or User-Agent patterns, NNTP-server patterns, etc.
    C. NNTP-Posting-Host, Timezone offsets, Organization, signatures, etc.
    etc.

    Note: The instant a 'dumbshit' sees the above, they scream out "trolling";
    but what they don't ever comprehend is a basic tenet of Occam's Razor.
    1. Occam's Razor says to take into account *all* the known facts
    2. Before coming to a conclusion (which should be the simplest first)
    3. Where... get this... you have to actually troll, to be a troll. Duh.

    With that caveat in mind (to keep the barking idiots at bay), you can be easily correlated by your discussion style, which you don't bother to hide.

    That used to be harder than it is now to be done by robots, but my goal is header privacy in writing my own newsreader in addition to using gVim.

    My headers are semi randomly chosen, at least yearly, via free news
    servers, where the instant you pay 1 cent for anything, your privacy is
    gone. This used to be easier in the days of aioe (Paolo), albasani (Roman, Alexander), solani (Dan, Monika, Benjamin), netfront (PRC), mixmin (Steve), dizum (Alex), neodome (?), sunsite (Steve), news4all (sweden?)... but all
    we have now (AFAICT) for privacy-aware no-cost low-registration news
    servers is paganini (Ivo), ES (Wolfgang), blueworld (Jessie), et al.
    Newsgroups: misc.phone.mobile.iphone,comp.sys.mac.advocacy
    Subject: Happy New Year. It's January 1st. I'm changing the moniker on all my accounts
    Date: Thu, 1 Jan 2026 18:28:42 -0500
    Message-ID: <10j6vva$lie$1@nnrp.usenet.blueworldhosting.com>

    At the moment, blueworld is having unspecified issues, so I'm using Ivo Gandolfo's BOFH server for this post, but otherwise it would be Jessie's.

    There's a bit of Windows batch in rotating time zones and setting content headers, but most is basic stuff which I presume everyone here long knows.

    So the next question, is whether Forte Agent and Xnews also allow you to
    set all the headers at will, where while we can mess partly with the PATH, that's usually the header that is not really in the users' total control.

    Q: What Windows newsreaders allow you to set the $EDITOR & all the headers?
    A:
    --
    If privacy is a million things, most people only understand 2 or 3 of them where privacy is a feature that you build into everything you do every day.
    --- Synchronet 3.21d-Linux NewsLink 1.2
  • From issdr@p_u_n_k_i_n_d@yahoo.it to news.software.readers on Mon Mar 16 16:33:01 2026
    From Newsgroup: news.software.readers

    Maria Sophia wrote:

    Q: What Windows newsreaders allow you to set the $EDITOR & all the headers? A:

    Agent allows some editing, but not on all headers. Xnews used to let one
    tweak them all, but some, as you know, are often overwritten by servers,
    either free or non-free.

    besides that, i agree with your insight about privacy, but i nonetheless
    let other people plonk me efficiently if they wish, by exposing a
    (kinda) FQDN in my message-ids.
    --- Synchronet 3.21d-Linux NewsLink 1.2
  • From Maria Sophia@mariasophia@comprehension.com to news.software.readers on Mon Mar 16 14:48:42 2026
    From Newsgroup: news.software.readers

    issdr wrote:
    Maria Sophia wrote:

    Q: What Windows newsreaders allow you to set the $EDITOR & all the headers? >> A:

    Agent allows some editing, but not on all headers. Xnews used to let one tweak them all, but some, as you know, are often overwritten by servers, either free or non-free.

    besides that, i agree with your insight about privacy, but i nonetheless
    let other people plonk me efficiently if they wish, by exposing a
    (kinda) FQDN in my message-ids.

    Thanks for helping to answer the question, where the only way to get
    privacy is to build it into your system, yourself, as far as I can tell.

    Privacy isn't something you get by accident. It's something you build.
    The instant you set up any computer system, you start adding privacy to it.

    Of the million things needed to know for privacy, most people only know 3.

    For example, I post perhaps, oh, I don't know, a thousand photos a year to various forums, where I wonder if most people know about sensor pattern
    noise fingerprinting. They know about EXIF but not about PRNU tracking.

    And then, as with writing a newsreader with full obfuscation power, they
    then need to quickly mathematically reduce the PRNU, which is not simple.

    I invest hours in any given article body & I help thousands of people
    yearly, where the *value* of that gift isn't in the wrapping paper header.

    I don't change who I am (same 2021 phone, same 2009 desktop, same Santa
    Cruz Mountain location, same iPads, same attitudes, same everything.

    With my nearly-perfect grammar, stellar spelling, line-wrap balance and attitudes toward Google/Microsoft/Apple, I don't hide who I am. Ever.

    I don't change my punctuation style, nor my attitudes about marketing.
    If marketing supplied it to you, then you're the product in many cases.

    One big step to garner privacy on the Internet, if it's even possible, is
    to refuse to create an account for anything & never pay even 1 cent online.

    Another is to understand how programs (web browsers in particular) are fingerprinted so as to put lower-entropy randomizing procedures in place.

    Yet another is to rotate VPNs and time zones randomly, and even to stack
    VPNs on top of proxies (& vice versa), particularly using only free tools.

    That's why my Windows 11 setup has no MSA for example, although it's almost impossible to remain private from any operating system vendor, as a rule.
    Newsgroups: alt.comp.os.windows-11,alt.comp.hardware.pc-homebuilt,alt.comp.microsoft.windows
    Subject: PSA: I can happily report that my first Win11 Home installed sans a MSA
    Date: Mon, 12 Jan 2026 15:24:16 -0500
    Message-ID: <10k3l9g$2ug$1@nnrp.usenet.blueworldhosting.com>

    Android is the easiest common consumer platform to remain private on,
    whereas iOS is, by far, almost impossible (contrary to Marketing claims).

    Back to newsreaders, most people simply give up on protecting privacy.
    But privacy is like hygiene; it's a million little things done every day.

    One of those little things is to not re-use the same Usenet wrapping paper. People who don't practice privacy as simple as that, may never understand.
    --
    Just one person on Usenet paying it forward so all benefit daily.
    --- Synchronet 3.21d-Linux NewsLink 1.2
  • From Phil Boutros@philb@philb.ca to news.software.readers on Mon Mar 16 22:59:04 2026
    From Newsgroup: news.software.readers

    Maria Sophia <mariasophia@comprehension.com> wrote:
    <snip>
    If not, I'm using the only one out there in the world that we know of.
    If you know of a Windows newsreader integrated with gVim, do let me know.

    slrn should be compilable on Windows, I believe. The better
    question is: If your goal is to use gVim, and you solve that by
    telnetting through stunnels to the servers, etc...then why run Windows
    at all?

    Seems to be a unix-based OS would suit your needs much better.


    Phil
    --
    AH#61 Wolf#14 BS#89 bus#1 CCB#1 SENS KOTC#4
    philb@philb.ca http://philb.ca
    --- Synchronet 3.21d-Linux NewsLink 1.2
  • From Maria Sophia@mariasophia@comprehension.com to news.software.readers on Tue Mar 17 21:54:13 2026
    From Newsgroup: news.software.readers

    Phil Boutros wrote:
    If not, I'm using the only one out there in the world that we know of.
    If you know of a Windows newsreader integrated with gVim, do let me know.

    slrn should be compilable on Windows, I believe. The better
    question is: If your goal is to use gVim, and you solve that by
    telnetting through stunnels to the servers, etc...then why run Windows
    at all?

    Seems to be a unix-based OS would suit your needs much better.

    You're right. I wish you had told me that long ago though. Hindsight is so 20:20. Looking it up, slrn doesnot embed an editor. Instead, slrn launches whatever editor you specify in your slrn.rc (or _slrnrc) file.
    <https://slrn.info/> <https://www.jedsoft.org/snapshots/>
    <https://sourceforge.net/projects/slrn/> <https://github.com/jedsoft/slrn>

    %APPDATA%\slrn\slrn.rc
    set editor_command "\"C:\\Program Files (x86)\\Vim\\vim90\\gvim.exe\" +%d"

    Where the %d tells slrn to open the temporary article file



    slrn allows you to change many of the user-defined headers at will, as far
    as I'm aware after running a quick check on slrn but not the date header.

    The timezone in the Date header is whatever Windows reports (but that's
    easy to rotate anyway, as my Windows system timezone is always random).

    At this point, the newsreader is on Windows but as you suspected, the newsreader started way back on alt.os.linux when Marek Novotny was alive.

    It was first written for Centos and only ported, years later, to Windows. However, if I were to start over today, slrn would be the way to go.

    Looking it up, slrn can do a lot of nice things, such as
    a. Add arbitrary headers
    b. Remove headers
    c. Rewrite headers
    d. Define per-group header rules
    group "news.software.readers" {
    set_header "User-Agent: slrn + gVim"
    }
    e. Use macros to generate dynamic headers
    f. Override the default From: header
    g. Add custom X-Whatever: headers

    In my next life, I will use slrn on Windows (or Linux) to be my
    privacy-aware newsreader. Thanks for bringing it up. It's the best choice.

    I don't know why I didn't start with slrn in the first place, but it's too
    late now. Hindsight is so 20:20. This thread should help others though.
    --- Synchronet 3.21e-Linux NewsLink 1.2
  • From issdr@p_u_n_k_i_n_d@yahoo.it to news.software.readers on Wed Mar 18 11:45:33 2026
    From Newsgroup: news.software.readers

    Maria Sophia wrote:

    Phil Boutros wrote:

    [...]

    slrn should be compilable on Windows, I believe. The better
    question is: If your goal is to use gVim, and you solve that by
    telnetting through stunnels to the servers, etc...then why run Windows
    at all?

    Seems to be a unix-based OS would suit your needs much better.

    You're right.

    you may also consider the "server through stunnel" part. don't feel
    intimidated by words, i'm on an island, i have an apartment on mainland,
    800 km (500 mi) from here. my server is a tiny box, containing a
    Raspberry Pi card (picture a credit card with components and ports on
    it); it's running a headless, striped downe Debian, compiled for its
    RISC processor. this message has been written from mobile, using a mosh-compatible terminal.

    https://imgur.com/a/LipaZyM


    --- Synchronet 3.21e-Linux NewsLink 1.2
  • From Kerr-Mudd, John@admin@127.0.0.1 to news.software.readers on Wed Mar 18 17:15:39 2026
    From Newsgroup: news.software.readers

    On Wed, 18 Mar 2026 11:45:33 +0100
    issdr <p_u_n_k_i_n_d@yahoo.it> wrote:

    Maria Sophia wrote:

    Phil Boutros wrote:

    [...]

    slrn should be compilable on Windows, I believe. The better
    question is: If your goal is to use gVim, and you solve that by
    telnetting through stunnels to the servers, etc...then why run Windows
    at all?

    Seems to be a unix-based OS would suit your needs much better.

    You're right.

    you may also consider the "server through stunnel" part. don't feel intimidated by words, i'm on an island, i have an apartment on mainland,
    800 km (500 mi) from here. my server is a tiny box, containing a
    Raspberry Pi card (picture a credit card with components and ports on
    it); it's running a headless, striped downe Debian, compiled for its
    RISC processor. this message has been written from mobile, using a mosh-compatible terminal.


    Sounds good!

    https://imgur.com/a/LipaZyM


    Luckily I'm unable to view your pornographic image. (Well it could be,
    think of the children)
    --
    Bah, and indeed Humbug.
    --- Synchronet 3.21e-Linux NewsLink 1.2
  • From issdr@p_u_n_k_i_n_d@yahoo.it to news.software.readers on Wed Mar 18 21:46:49 2026
    From Newsgroup: news.software.readers

    "Kerr-Mudd, John" wrote:

    https://imgur.com/a/LipaZyM


    Luckily I'm unable to view your pornographic image. (Well it could be,
    think of the children)

    EfOe
    --- Synchronet 3.21e-Linux NewsLink 1.2
  • From candycanearter07@candycanearter07@candycanearter07.nomail.afraid to news.software.readers on Wed Mar 25 21:50:05 2026
    From Newsgroup: news.software.readers

    Maria Sophia <mariasophia@comprehension.com> wrote at 20:27 this Sunday (GMT):
    Phil Boutros wrote:
    Am I missing something obvious?

    This finds thousands...
    grep -nP "[^\x00-\x7F]" body.txt

    How do you efficiently convert each set differently?

    In what language is your newsreader written?

    Windows batch. Telnet. Stunnel. gVim.


    I'm honestly suprised, I figured you would be a linux user.
    --
    user <candycane> is generated from /dev/urandom
    --- Synchronet 3.21f-Linux NewsLink 1.2
  • From Joerg Walther@joerg.walther@magenta.de to news.software.readers on Tue May 5 19:56:59 2026
    From Newsgroup: news.software.readers

    issdr wrote:

    Forte Agent and Xnews allow you to use an external text editor

    Pardon? I am a user Agent for ~30 years but never came across a setting
    for that. There are a couple of options for the composition window, but
    that's it, imho.

    -jw-
    --
    And now for something completely different...
    --- Synchronet 3.21f-Linux NewsLink 1.2
  • From issdr@p_u_n_k_i_n_d@yahoo.it to news.software.readers on Tue May 5 20:50:39 2026
    From Newsgroup: news.software.readers

    Joerg Walther wrote:

    issdr wrote:

    Forte Agent and Xnews allow you to use an external text editor

    Pardon? I am a user Agent for ~30 years but never came across a setting
    for that. There are a couple of options for the composition window, but that's it, imho.

    you're right about Agent, i was probably thinking of it wrapped in Agent-launcher, which probably quit working on recent windows
    versions. you can probably achieve the same result by using autohotkey.
    --- Synchronet 3.21f-Linux NewsLink 1.2