@aelaraji@aelaraji.com hey, hey! You are my very first reply! šš» Cheers!
@david@collantes.us āHello backā from the other corner of the world! š«”
Incredibly upsetāmore than you could imagineābecause I already made the first mistake, and corrected it (but twtxt.net got it on itās cache, ugh!) :ā-( . Canāt wait for editing to become a reality!
Alright. My first mentionsāwhich were picked not so randomly, LOLāare @prologic@twtxt.net, @lyse@lyse.isobeef.org, and @movq@www.uninformativ.de. I am also posting my first image too, which you see below. Thatās my neighbourhood, in a āwinterā day. Hopefully @prologic@twtxt.net will add my domain to his allowed list, so that the image (and any other further) renders.
Alright, announce_me
set to true. Now, who do I pick to be my first mention? Decisions, decisions. Next twtxt will have my first mention(s). :-)
I have configured my twtxt.txt
as simple as possible. I have setup a publish_command
on jenny. Hopefully all works fine, and I am good to go. Next will be setting the announce_me
to true
. Here we go!
Everything starts at a āhello worldā. At least around these parts; the nerdy parts.
@sorenpeter@darch.dk hmm, how does your client handles āa little editingā? I am sure threads would break just as well. š
@prologic@twtxt.net, there is a parser bug on parent. Specifically on this portion:
"*If twtxt/Yarn was to grow bigger, then this would become a concern again. *But even Mastodon allows editing*, so how
+much of a problem can it really be? š
*"
@movq@www.uninformativ.de going a little sideways on this, ā*If twtxt/Yarn was to grow bigger, then this would become a concern again. But even Mastodon allows editing, so how much of a problem can it really be? š *ā, wouldnāt it preparing for a potential (even if very, very, veeeeery remote) growth be a good thing? Mastodon signs all messages, keeps a history of edits, and it doesnāt break threads. It isnāt a problem there.š It is here.
I think keeping hashes is a must. If anything for that āfeels goodā feeling.
@movq@www.uninformativ.de Agreed that hashes have a benefit. I came up with a similar example where when I twted about an 11-character hash collision. Perhaps hashes could be made optional somehow. Like, you could use the āreplytoā idea and then additionally put a hash somewhere if you want to lock in which version of the twt you are replying to.
There is nothing wrong with how we currently run a diff to see what has been removed. if i build a merkle tree off all the twt hashes in a feed i can use that to verify a twt should be in a feed or not. and gossip that to my peers.
So.. basically a rehash of the email āunsendā requests? What if i was to make a (delete: 5vbi2ea)
.. would it delete someone elses twt?
isnāt the benefit of blake2b that it is a more efficient algo than sha1 and has the same or similar entropy to sha3? i thought we had partially solved this with some type of expanding hash size? additionally we could increase bit density by using base36 or base64/url-safeā¦
Hey, @movq@www.uninformativ.de, a tiny thing to add to jenny
, a -v
switch. That way when you twtxt āThatās an older format that was used before jenny version v23.04ā, I can go and run jenny -v
, and āduh!ā myself on the way to a git pull
. :-D
@movq@www.uninformativ.de ooooh, nice! commit 62a2b7735749f2ff3c9306dd984ad28f853595c5
:
Crawl archived feeds in āfetch-context
Like, very much! :-)
@movq@www.uninformativ.de to paraphrase US Presidents speech on each State of the Union, āthe State of the Jenny is strong!ā :-D As for the potential upcoming changes, there has to be a knowledgeable head honcho that will agglomerate and coalesce, and guide onto the direction that will be taken. All that with the strong input from the developers that will be implementing the changes, and a lesser (but not less valuable) input from users.
@lyse@lyse.isobeef.org I call upon the services of the @yarn_police@twtxt.net to further investigate this oddness!
@quark@ferengi.one Oh, sure, it would be nice if edits didnāt break threads. I was just pondering the circumstances under which I get annoyed about data being irrecoverably deleted or otherwise lost.
@falsifian@www.falsifian.org āI donāt really mind if the twt gets edited before I even fetch it.ā, right, thatās never the problem. Editing a twtxt before anyone fetches it isnāt even editing, right? :-P The problem we are trying to fix is the havoc is causes editing twtxts that have already been replied to, often ad nauseam. Thatās the real problem.
@quark@ferengi.one I donāt really mind if the twt gets edited before I even fetch it. I think itās the idea of my computer discarding old versions itās fetched, especially if itās shown them to me, that bugs me.
But I do like @movq@www.uninformativ.deās suggestion on this thread that feeds could contain both the original and the edited twt. I guess it would be up to the author.
@lyse@lyse.isobeef.org now, how am I not surprised at that reply?! Hahahahaha!
@falsifian@www.falsifian.org that would be problematic to do on a fully decentralised system. I am not disagreeing, though. Thatās the reason I have stopped editing twtxts. I strive to own mistakes, as minor as they might be. Now, if trail editing can be accomplished, I am all for it!
@quark@ferengi.one None. I like being able to see edit history for the same reason.
@movq@www.uninformativ.de Youāre right! switching from zsh to bash gave me the same result zq4fgq
Thanks!
@falsifian@www.falsifian.org what would the difference be between an edit the changes everything on the original twtxt, and a delete?
@prologic@twtxt.net Why sha1 in particular? There are known attacks on it. sha256 seems pretty widely supported if youāre worried about support.
@prologic@twtxt.net I wouldnāt want my client to honour delete requests. I like my computerās memory to be better than mine, not worse, so it would bug me if I remember seeing something and my computer canāt find it.
Thereās a simple reason all the current hashes end in a or q: the hash is 256 bits, the base32 encoding chops that into groups of 5 bits, and 256 isnāt divisible by 5. The last character of the base32 encoding just has that left-over single bit (256 mod 5 = 1).
So I agree with #3 below, but do you have a source for #1, #2 or #4? I would expect any lack of variability in any part of a hash functionās output would make it more vulnerable to attacks, so designers of hash functions would want to make the whole output vary as much as possible.
Other than the divisible-by-5 thing, my current intuition is it doesnāt matter what part you take.
Hash Structure: Hashes are typically designed so that their outputs have specific statistical properties. The first few characters often have more entropy or variability, meaning they are less likely to have patterns. The last characters may not maintain this randomness, especially if the encoding method has a tendency to produce less varied endings.
Collision Resistance: When using hashes, the goal is to minimize the risk of collisions (different inputs producing the same output). By using the first few characters, you leverage the full distribution of the hash. The last characters may not distribute in the same way, potentially increasing the likelihood of collisions.
Encoding Characteristics: Base32 encoding has a specific structure and padding that might influence the last characters more than the first. If the data being hashed is similar, the last characters may be more similar across different hashes.
Use Cases: In many applications (like generating unique identifiers), the beginning of the hash is often the most informative and varied. Relying on the end might reduce the uniqueness of generated identifiers, especially if a prefix has a specific context or meaning.
@aelaraji@aelaraji.com odd, I ran it under Ubuntu 24.04, and got the same result as @prologic@twtxt.net (which is on macOS), zq4fgq
.
@prologic@twtxt.net I ran the same command and got an even different result xD
~ Ā» echo -n "https://twtxt.net/user/prologic/twtxt.txt\n2020-07-18T12:39:52Z\nHello World! š" | openssl dgst -blake2s256 -binary | base32 | tr -d '=' | tr 'A-Z' 'a-z' | tail -c 7
p44j3q
LinkedIn Is Training AI on User Data Before Updating Its Terms of Service
An anonymous reader shares a report: LinkedIn is using its usersā data for improving the social networkās generative AI products, but has not yet updated its terms of service to reflect this data processing, according to posts from various LinkedIn users and a statement from the company to 404 Media. Instead, the company says it ⦠ā Read more
@prologic@twtxt.net I just realised the jenny
also does what I want, as of latest commit. Simply use jenny --debug-feed <feed url>
, and it will do what I wanted too!
@movq@www.uninformativ.de alright, fair, and interesting. I was expecting them to be all the same (format wise), but it doesnāt matter, for sure, as it works just fine. Thanks!
I have noticed that twtxt timestamps differ. For example:
- @prologic@twtxt.net (and I assume any Yarn user)
2024-09-18T13:16:17Z
- @lyse@lyse.isobeef.org
2024-09-17T21:15:00+02:00
- @aelaraji@aelaraji.com (and @movq@www.uninformativ.de, and me)
2024-09-18T05:43:13+00:00
So, which is right, or best?
I came across this Gallery Theme for Hugo, and @lyse@lyse.isobeef.org immediately came to mind. I think it would be a very fitting theme to use for all your photos, Lyse!
Finally @lyse@lyse.isobeef.org ās idea of updating metadata changes in a feed āinlineā where the change happened (with respect to other Twts in whatever order the file is written in) is used to drive things like āOh this feed now has a new URI, letās use that from now on as the feedās identity for the purposes of computing Twt hashesā. This could extend to # nick =
as preferential indicators to clients as well as even other updates such as # description =
ā Not just # url =
Likewise we could also support delete:229d24612a2
, which would indicate to clients that fetch the feed to delete any cached Twt matching the hash 229d24612a2
if the author wishes to āunpublishā that Twt permanently, rather than just deleting the line from the feed (which does nothing for clients really).
An alternate idea for supporting (properly) Twt Edits is to denoate as such and extend the meaning of a Twt Subject (which would need to be called something better?); For example, letās say I produced the following Twt:
2024-09-18T23:08:00+10:00 Hllo World
And my feedās URI is https://example.com/twtxt.txt
. The hash for this Twt is therefore 229d24612a2
:
$ echo -n "https://example.com/twtxt.txt\n2024-09-18T23:08:00+10:00\nHllo World" | sha1sum | head -c 11
229d24612a2
You wish to correct your mistake, so you make an amendment to that Twt like so:
2024-09-18T23:10:43+10:00 (edit:#229d24612a2) Hello World
Which would then have a new Twt hash value of 026d77e03fa
:
$ echo -n "https://example.com/twtxt.txt\n2024-09-18T23:10:43+10:00\nHello World" | sha1sum | head -c 11
026d77e03fa
Clients would then take this edit:#229d24612a2
to mean, this Twt is an edit of 229d24612a2
and should be replaced in the clientās cache, or indicated as such to the user that this is the intended content.
@bender@twtxt.net Just replace the echo
with something like pbpaste
or similar. Youād just need to shell escape things like "
and such. Thatās all. Alternatives you can shove the 3 lines into a small file and cat file.txt | ...
With a SHA1 encoding the probability of a hash collision becomes, at various k (number of twts):
>>> import math
>>>
>>> def collision_probability(k, bits):
... n = 2 ** bits # Total unique hash values based on the number of bits
... probability = 1 - math.exp(- (k ** 2) / (2 * n))
... return probability * 100 # Return as percentage
...
>>> # Example usage:
>>> k_values = [100000, 1000000, 10000000]
>>> bits = 44 # Number of bits for the hash
>>>
>>> for k in k_values:
... print(f"Probability of collision for {k} hashes with {bits} bits: {collision_probability(k, bits):.4f}%")
...
Probability of collision for 100000 hashes with 44 bits: 0.0284%
Probability of collision for 1000000 hashes with 44 bits: 2.8022%
Probability of collision for 10000000 hashes with 44 bits: 94.1701%
>>> bits = 48
>>> for k in k_values:
... print(f"Probability of collision for {k} hashes with {bits} bits: {collision_probability(k, bits):.4f}%")
...
Probability of collision for 100000 hashes with 48 bits: 0.0018%
Probability of collision for 1000000 hashes with 48 bits: 0.1775%
Probability of collision for 10000000 hashes with 48 bits: 16.2753%
>>> bits = 52
>>> for k in k_values:
... print(f"Probability of collision for {k} hashes with {bits} bits: {collision_probability(k, bits):.4f}%")
...
Probability of collision for 100000 hashes with 52 bits: 0.0001%
Probability of collision for 1000000 hashes with 52 bits: 0.0111%
Probability of collision for 10000000 hashes with 52 bits: 1.1041%
>>>
If we adopted this scheme, we could have to increase the no. of characters (first N) from 11
to 12
and finally 13
as we approach globally larger enough Twts across the space. I think at least full crawl/scrape it was around ~500k (maybe)? https://search.twtxt.net/ says only ~99k
@quark@ferengi.one My money is on a SHA1SUM hash encoding to keep things much simpler:
$ echo -n "https://twtxt.net/user/prologic/twtxt.txt\n2020-07-18T12:39:52Z\nHello World! š" | sha1sum | head -c 11
87fd9b0ae4e
I think it was a mistake to take the last n base32 encoded characters of the blake2b 256bit encoded hash value. It should have been the first n. where n is >= 7
Taking the last n characters of a base32 encoded hash instead of the first n can be problematic for several reasons:
Hash Structure: Hashes are typically designed so that their outputs have specific statistical properties. The first few characters often have more entropy or variability, meaning they are less likely to have patterns. The last characters may not maintain this randomness, especially if the encoding method has a tendency to produce less varied endings.
Collision Resistance: When using hashes, the goal is to minimize the risk of collisions (different inputs producing the same output). By using the first few characters, you leverage the full distribution of the hash. The last characters may not distribute in the same way, potentially increasing the likelihood of collisions.
Encoding Characteristics: Base32 encoding has a specific structure and padding that might influence the last characters more than the first. If the data being hashed is similar, the last characters may be more similar across different hashes.
Use Cases: In many applications (like generating unique identifiers), the beginning of the hash is often the most informative and varied. Relying on the end might reduce the uniqueness of generated identifiers, especially if a prefix has a specific context or meaning.
In summary, using the first n characters generally preserves the intended randomness and collision resistance of the hash, making it a safer choice in most cases.
@quark@ferengi.one Bloody good question š God only knows š¤£
@bender@twtxt.net Welcome! š¤
@prologic@twtxt.net the real conclusion is, is it going to change, to what, and when? :-P
An event, in Portugal, in 2024, with a COVID-19 health and safety policy? It can be done!
I just found out about https://wiki.digitalrights.community/index.php?title=Global_Gathering_COVID-19_Policy , the COVID-19 policy for the #digitalrights āGlobal Gathering 2024ā event that is going to happen in September 27-29 in #Estoril and I must say Iām quite happy about it.
@movq@www.uninformativ.de Haha š
What I was referring to in the OP: Sometimes I check the workphone simply out of curiosity. š
@movq@www.uninformativ.de Fair š
Current Twt Hash spec and probability of hash collision:
The probability of a Twt Hash collision depends on the size of the hash and the number of possible values it can take. For the Twt Hash, which uses a Blake2b 256-bit hash, Base32 encoding, and takes the last 7 characters, the space of possible hash values is significantly reduced.
Breakdown:- Base32 encoding: Each character in the Base32 encoding represents 5 bits of information (since ( 2^5 = 32 )).
- 7 characters: With 7 characters, the total number of possible hashes is:
@quark@ferengi.one Add here:
* a0826a65 - Add debug sub-command to yarnc (7 weeks ago) <James Mills>
Iād recommend a git pull && make build
$ echo -n "https://twtxt.net/user/prologic/twtxt.txt\n2020-07-18T12:39:52Z\nHello World! š" | sha1sum | head -c 11
87fd9b0ae4e
$ echo -n "https://twtxt.net/user/prologic/twtxt.txt\n2020-07-18T12:39:52Z\nHello World! š" | sha256sum | base32 | tr -d '=' | tr 'A-Z' 'a-z' | tail -c 12
tdqmjaeawqu
@prologic@twtxt.net yes, that would work, except there is no debug
command on my local yarnc
. Are you talking about a potential future implementation here?
Just experimentingā¦
$ echo -n "https://twtxt.net/user/prologic/twtxt.txt\n2020-07-18T12:39:52Z\nHello World! š" | sha256sum | base64 | tr -d '=' | tail -c 12
NWY4MSAgLQo
It would appear that the blake2b
256bit digest algorithm is no longer supported by the openssl
tool, however blake2s256
is; Iām not sure why š¤
$ echo -n "https://twtxt.net/user/prologic/twtxt.txt\n2020-07-18T12:39:52Z\nHello World! š" | openssl dgst -blake2s256 -binary | base32 | tr -d '=' | tr 'A-Z' 'a-z' | tail -c 7
zq4fgq
Obviously produce the wrong hash, which should be o6dsrga
as indicated by the yarnc hash
utility:
$ yarnc hash -u https://twtxt.net/user/prologic/twtxt.txt -t 2020-07-18T12:39:52Z "Hello World! š"
o6dsrga
But at least the shell pipeline is ācorrectā.
FWIW the standard UNIX tools for Blake2b are openssl
and b2sum
ā Just trying to figure out how to make a shell pipeline again (if you really want that); as tools keep changing god damnit š¤£
@quark@ferengi.one Do you mean something like this?
$ ./yarnc debug ~/Public/twtxt.txt | tail -n 1
kp4zitq 2024-09-08T02:08:45Z (#wsdbfna) @<aelaraji https://aelaraji.com/twtxt.txt> My work has this thing called "compressed work", where you can **buy** extra time off (_as much as 4 additional weeks_) per year. It comes out of your pay though, so it's not exactly a 4-day work week but it could be useful, just haven't tired it yet as I'm not entirely sure how it'll affect my net pay
@prologic@twtxt.net I saw those, yes. I tried using yarnc
, and it would work for a simple twtxt. Now, for a more convoluted one it truly becomes a nightmare using that tool for the job. I know there are talks about changing this hash, so this might be a moot point right now, but it would be nice to have a tool that:
- Would calculate the hash of a twtxt in a file.
- Would calculate all hashes on a
twtxt.txt
(local and remote).
Again, something lovely to have after any looming changes occur.
@quark@ferengi.one Watch TV at the moment so unsure about āout of the box toolsā but there are 3 implementations on the spec page https://dev.twtxt.net/doc/twthashextension.html
@aelaraji@aelaraji.com Woah! Overkill, but nicely laid out. Hey, the ultimate goal is for it to work, so, mission accomplished! :-)
Could someone knowledgable reply with the steps a grandpa will take to calculate the hash of a twtxt from the CLI, using out-of-the-box tools? I swear I read about it somewhere, but canāt find it.
@aelaraji@aelaraji.com Sometimes thatās the most valuable though! Feedback!
@prologic@twtxt.net Iām glad to! it just kinda feel a bit off when itās all I can do š
@quark@ferengi.one Mine is a little overkill š but I need to do something for practice:
#!/bin/bash
set -e
trap 'echo "!! Something went wrong...!!"' ERR
#============= Variables ==========#
# Source files
LOCAL_DIR=$HOME/twtxt
TWTXT=$LOCAL_DIR/twtxt.txt
HTML=$LOCAL_DIR/log.html
TEMPLATE=$LOCAL_DIR/template.tmpl
# Destination
REMOTE_HOST=remotHostName # Host already setup in ~/.ssh/config
WEB_DIR="path/to/html/content"
GOPHER_DIR="path/to/phlog/content"
GEMINI_DIR="path/to/gemini-capsule/content"
DIST_DIRS=("$WEB_DIR" "$GOPHER_DIR" "$GEMINI_DIR")
#============ Functions ===========#
# Building log.html:
build_page() {
twtxt2html -T $TEMPLATE $TWTXT > $HTML
}
# Bulk Copy files to their destinations:
copy_files() {
for DIR in "${DIST_DIRS[@]}"; do
# Copy both `txt` and `html` files to the Web server and only `txt`
# to gemini and gopher server content folders
if [ "$DIR" == "$WEB_DIR" ]; then
scp -C "$TWTXT" "$HTML" "$REMOTE_HOST:$DIR/"
else
scp -C "$TWTXT" "$REMOTE_HOST:$DIR/"
fi
done
}
#========== Call to functions ===========$
build_page && copy_files
Adafruit Showcases New Feather Form-Factor Board Powered by RP2350
Adafruit is set to enhance its Feather product line with the new Feather RP2350, featuring Raspberry Piās latest RP2350 chip. This upcoming board introduces a novel HSTX Port along with support for MicroPython and CircuitPython, making it accessible for both beginner and experienced developers. This board transitions from the dual M0 cores of its predecessor,
Fanless PC with N97 CPU Dual GbE LAN and Dual HDMI Ports Supporting 4K at 60Hz
The QBiX-ADNAN97-A1 is an industrial-grade computing system engineered for robust performance and reliability. Featuring a compact, fanless design, it supports a DDR5 memory system, SATA 3.0, and dual GbE LAN ports, ensuring robust wired connectivity. As its name suggests, this industrial system features the Intel Processor N97, which is part of Intelās 7 series. The
LiteWing is an Open-Hardware, Wi-Fi-Controlled Drone Powered by the ESP32 Microcontroller
CircuitDigest recently launched LiteWing on Kickstarter, a Wi-Fi-controlled mini drone powered by the ESP32 microcontroller. Designed for hobbyists and engineers, LiteWing offers a fully programmable DIY platform, providing an affordable entry into drone technology for both beginners and advanced users. The droneās design features a minimalistic PCB-based frame, maki ⦠ā Read more
Iāve been using Codeium too the last week or so ! Itās pretty good and like @xuu@txt.sour.is said is a pretty desent Junior assistant, it helps me write good docs and the tab completion is amazing!
It of course completely sucks at doing anything āintelligentā or complex, but if you just use it as a fancier auto complete itās actually half way decent š
@quark@ferengi.one I admit I find the general āclick here to share blahā generally wasteful, useless and unengaging really. Not just Wordle.
I admittedly however, Iāve been guilty of doing this sometimes myself. š¤¦āāļø sometimes though I think itās OK to show your achievements. š
This might be quite unpopular, but I truly dislike Wordle. The reason isnāt rooted on any psychological issue, it is much, much more simple: people share their Wordle result(s)āI figure they feel good about themselvesāand for me it is only uneven, unaligned, wasteful noise. I donāt even want to show you an example, but I am sure you know what I am talking about.
Thank gods those posting their hideous squares have finally quieted down. LOL.
Testing the new custom template option. Got to modify it more, but baby steps.
@prologic@twtxt.net woot! Fast! I think you need to change your nick to āfastlogicā instead. :-D
@quark@ferengi.one LOL š No worries! š
@quark@ferengi.one All fixed! š„³ pleasure doing business with yāall. š¤£
Thank you for adding the feature so fast, @prologic@twtxt.net! Look at how beautiful this one renders now. Oh my!
@lyse@lyse.isobeef.org Just as an aside, shouldnāt you assume utf-8
anyway these days if not specified? š¤ I mean basically everything almost always uses utf-8
encoding right? š
jenny
nor yarnd
support it very well. Only at a very basic level.
@quark@ferengi.one Okay fair š
@movq@www.uninformativ.de So basically on-call, but you donāt get paid for it? š¤
jenny
nor yarnd
support it very well. Only at a very basic level.
@prologic@twtxt.net sorry but nope. Neither jenny
, nor yarnd
supports it at all. This was treated as a thread because I picked one of @falsifian@www.falsifian.orgās twtxts (with the āold subjectā), and replied to it (hence starting the thread).
@quark@ferengi.one aye aye captain š¤£
main.go
(but it can be done on a template now, so no reason to touch the code):
@quark@ferengi.one Itās a good thin yarnd
makes this user configurable via a preference 𤣠And displays both š
@quark@ferengi.one LOL š Thanks!
yarnd
(at least) doesn't support creating such a custom TwtSubject, but it will reply and respect and thread one if one was constructed.
@quark@ferengi.one You are right, whilst it technically works, its not well supported. Too much of the code would have to change to support that, and itās not worth the value.
yarnd
(at least) doesn't support creating such a custom TwtSubject, but it will reply and respect and thread one if one was constructed.
Oh, and you canāt imagine the level of control I am commandeering by restraining me from editing that previous āmissing-one-backtickā twtxt. LOL!
So yeah no, whilst it technically works, neither jenny
nor yarnd
support it very well. Only at a very basic level.
It actually has treated this as a thread, but it gets a bit weird, because we thread based on the content address of a root twt.
@aelaraji@aelaraji.com this is the little script I am using on my publish_command
:
#!/usr/bin/env bash
twtxt2html -t "Quark's twtxt feed" /var/www/sites/ferengi.one/twtxt.txt > /var/www/sites/ferengi.one/index.html
I named it twtxtit
. :-)
yarnd
(at least) doesn't support creating such a custom TwtSubject, but it will reply and respect and thread one if one was constructed.
@prologic@twtxt.net based on @falsifian@www.falsifian.orgās findings, I donāt believe this is quite accurate.
āyarnd
(_at least_) doesn't support creating such a custom TwtSubject, but it will reply and respect and thread one if one was constructed."
@falsifian@www.falsifian.org yes, that happened around 2 years ago, on commit 5923078ea5.
Make that three issues. Mostly because the other two were feeling kind of lonely. So, yeah. Ha!
@quark@ferengi.one It looks like the part about traditional topics has been removed from that page. Here is an old version that mentions it: https://web.archive.org/web/20221211165458/https://dev.twtxt.net/doc/twtsubjectextension.html . Still, I donāt see any description of what is actually allowed between the parentheses. May be worth noting that twtxt.net is displaying the twts with the subject stripped, so some piece of code is recognizing it as a subject (or, at least, something to be removed).
Opened a couple of issues on twtxt2html. Maybe @prologic@twtxt.net will get to them after he has completed his luxurious recharging cycle. LOL.
main.go
(but it can be done on a template now, so no reason to touch the code):
@lyse@lyse.isobeef.org fully agree. I have never been a fan of relative times to begin with, so that one will go away, foh sho! :-D