@prologic@twtxt.net oh, what illness did you get?
@prologic@twtxt.net I installed my own on my vps :)
@abucci@anthony.buc.ci doing well, 12 in the afternoon here, just came home from a walk in the woods with our dog, really warm and sunny today.
Hi, I am playing with making an event sourcing database. Its super alpha but I thought I would share since others are talking about databases and such.
Itâs super basic. Using tidwall/wal as the disk backing. The first use case I am playing with is an implementation of msgbus. I can post events to it and read them back in reverse order.

I plan to expand it to handle other event sourcing type things like aggregates and projections.
Find it here: sour-is/ev
@prologic@twtxt.net @movq@www.uninformativ.de @lyse@lyse.isobeef.org
Hi, I am playing with making an event sourcing database. Its super alpha but I thought I would share since others are talking about databases and such.
Itâs super basic. Using tidwall/wal as the disk backing. The first use case I am playing with is an implementation of msgbus. I can post events to it and read them back in reverse order.

I plan to expand it to handle other event sourcing type things like aggregates and projections.
Find it here: sour-is/ev
@prologic@twtxt.net @movq@www.uninformativ.de @lyse@lyse.isobeef.org
@carsten@yarn.zn80.net Nice images!
@niplav@niplav.github.io if heâs willing to be even more nerdy he could use https://lojban.org/publications/cll/cll_v1.1_xhtml-section-chunks/section-evidentials.html and possibly color-code them in some less important color than red
@win0err@kolesnikov.se I agree with @prologic@twtxt.net about the text size. Adding content="width=device-width" to your viewport meta tag will help massively with scaling on different device widths.
Eg. The first screenshot is the current site with a device width of 440px and the second is with the updated viewport meta tag.


Other than that, I like the aesthetic of it đ It gives me early-ish internet vibes, which I wasnât online for (Iâm a â90s baby) but Iâve seen some pretty early websites.
@prologic@twtxt.net: 1. I use classic twtxt client written in Python from console, I like simplicity; 2. Thanks for the feedback about my website! Itâs better viewed with old 800x600 monitors, haha
@prologic@twtxt.net, thanks for the information! Iâll update my twtxt.txt file :-)
I grepped access logs and found at least three subscribers! @apex@rawtext.club, @prologic@twtxt.net, and @darch@neotxt.dk, hi there!
Seems I forgot how to use my twtxt client
twtxt auf home.bonn.cafe installiert - von github.com:win0err/twtxt
Hmm, @prologic@twtxt.net / @lyse@lyse.isobeef.org: Should we remove the section âTraditional Human-Readable Topicsâ from the spec? Or mark is as deprecated? I havenât seen this being used in the wild for years. đ€
@chronolink@chrono.tilde.cafe Replies are not part of the original twtxt format. They were added later as an extension by Yarn.social: https://dev.twtxt.net/doc/twtsubjectextension.html (only the section âMachine-Parsable Conversation Groupingâ is used these days)
@prologic@twtxt.net Oh.. reading comprehension is strong today.. you went to US and now back.
@prologic@twtxt.net Oh.. reading comprehension is strong today.. you went to US and now back.
@prologic@twtxt.net Hol-Up. You are state side now? Thatâs a pretty big change!
@prologic@twtxt.net Hol-Up. You are state side now? Thatâs a pretty big change!
@movq@www.uninformativ.de I usually only use eggs for baking or fry them for potatoes and spinach. @prologic@twtxt.net Why donât you have them anymore? Did the fox get them all when the door didnât close in time? ]:->
Como ya tengo la cuenta de https://twtxt.net/~eaplmx en inglés, usaré esta de Text-plano en español. Veamos qué tal funciona!
**R to @mind_booster: Foi tambĂ©m em 1997 que saiu o jogo Diablo, cujo impacto nos ânovos internautasâ vai muito alĂ©m da comunidade de gaming:
https://twtxt.net/twt/vqon7aa**
Foi tambĂ©m em 1997 que saiu o jogo Diablo, cujo impacto nos ânovos internautasâ vai muito alĂ©m da comunidade de gaming:
I realized my twtxt client isnât validating what it pulls once it gets a valid response when a domain started returning js-heavy parking pages for every URL. Oops. Weekend project, I guess. đ€Šđ»
@niplav@niplav.github.io Do you have a particular meaning in mind for âlong siteâ, or do you mean all the possible meanings for âlong siteâ?
@niplav@niplav.github.io and I thought evidentials were invented by the Lojban people or maybe North American amerinds, not Eastern Europeans
@niplav@niplav.github.io I have a favorite line of prose written around here somewhere but itâs only understandable by a tiny slice of gamers with literal-Boomer media sensibilities. Posting it would break the Internet.
Look at the twtxt.net api: https://dev.twtxt.net/doc/api.html
O client do twtxt para o Emacs precisa de um upgrade.
Ainda sem ideia como fazer a migração para o twtxt de uma forma razoåvel e indolor. O caminho faz-se andando.
So it happened - the twtxt.xyz domain finally expired
@prologic moving around servers, managed to break my twtxt client so using literally the first one I could find
I canât get twtxt to work properly on my machine so I hope this works
@novaburst@twt.nfld.uk Ah.. that is probably the XMPP verify code.. it doesnt really work that well. I aught to take it out.
@novaburst@twt.nfld.uk Ah.. that is probably the XMPP verify code.. it doesnt really work that well. I aught to take it out.
@tkanos@twtxt.net Yep. https://twitter.com/jack/status/1510314535671922689
@tkanos@twtxt.net Yep. https://twitter.com/jack/status/1510314535671922689
@mutefall@twtxt.net interesting.. were you working on one of the two universities that used it between 1989 and 1991?
@mutefall@twtxt.net interesting.. were you working on one of the two universities that used it between 1989 and 1991?
#event Upcomming Meetup in Copennhagen: algolab(the_art_of_live_coding) @ StĂžberiet / Computer Klub
hey @xuu@txt.sour.is iâm trying to sort of get running your keyproofs thing on my hashbangâs site root, but I get this:
Apr 01 02:55:25 de1 sour.is-keyproofs[9084]: 2:55AM ERR home/novaburst/keyproofs/main.go:73 > Application Failed error=": missing jid"
@prologic@twtxt.net yeah. For commercial use even. Just need to put an attribution note in the project README
@prologic@twtxt.net yeah. For commercial use even. Just need to put an attribution note in the project README
maxlenght?, I found a workaround by writing from Goryon on mobile, on PC i can simply change the limit with the inspector but isn't it there for a reason?
@mckinley@twtxt.net Agreed! đ
Can we all vote on the new default being 1024 then perhaps? đ€
+1 from me
@xuu@txt.sour.is So that means weâre allowed to use it right? đ
@prologic@twtxt.net if we do adopt this one it is CC-BY from twitter. https://twemoji.twitter.com
@prologic@twtxt.net if we do adopt this one it is CC-BY from twitter. https://twemoji.twitter.com
@prologic@twtxt.net @ullarah@txt.quisquiliae.com I often see messages longer than what the textbox limit is, isnât it limited by the maxlenght?, I found a workaround by writing from Goryon on mobile, on PC i can simply change the limit with the inspector but isnât it there for a reason?
I too would like to express a bit more if possible, especially if i have to refer to users and link URLs and images for example, having a limit that isnât too much of a limit is kind of pointless i think. đ€
@lyse@lyse.isobeef.org Excellent use of old denim, and also excellent use of long-form twt!
@lyse@lyse.isobeef.org Excellent use of old denim, and also excellent use of long-form twt!
@adi@twtxt.net Also, I noticed you followed me on Twitter, but you might enjoy @anths if you want techie stuff instead of Oregon politics. đ€Ł
I just spent an hour setting up the header of my twtxt.txt file ÂŻ_(ă)_/ÂŻ
Iâve made some fixes to twtxt to make it work with Python 3.7+. I hope @buckket@buckket.org will apply this patch!
Back to twtxt from the cli with twet https://github.com/jdtron/twet
Back to twtxt from the cli with twet https://github.com/jdtron/twet
Hello! world. First post on twtxt
@novaburst@twt.nfld.uk I doubt there will ever be a 2.0 ⊠It may end up like java and they strip off the 1.
@novaburst@twt.nfld.uk I doubt there will ever be a 2.0 ⊠It may end up like java and they strip off the 1.
@ullarah@txt.quisquiliae.com works for me! A tricky bitmight be if it splits within a codeblock so markdown canât parse
@ullarah@txt.quisquiliae.com works for me! A tricky bitmight be if it splits within a codeblock so markdown canât parse
@ullarah@txt.quisquiliae.com Didnât we talk about at some point a way to set the maximum height of te panels with some UX way to read the rest? đ€ Is that still on the cards or a bad ideas? đ€
#!/bin/sh
# Validate environment
if ! command -v msgbus > /dev/null; then
printf "missing msgbus command. Use: go install git.mills.io/prologic/msgbus/cmd/msgbus@latest"
exit 1
fi
if ! command -v salty > /dev/null; then
printf "missing salty command. Use: go install go.mills.io/salty/cmd/salty@latest"
exit 1
fi
if ! command -v salty-keygen > /dev/null; then
printf "missing salty-keygen command. Use: go install go.mills.io/salty/cmd/salty-keygen@latest"
exit 1
fi
if [ -z "$SALTY_IDENTITY" ]; then
export SALTY_IDENTITY="$HOME/.config/salty/$USER.key"
fi
get_user () {
user=$(grep user: "$SALTY_IDENTITY" | awk '{print $3}')
if [ -z "$user" ]; then
user="$USER"
fi
echo "$user"
}
stream () {
if [ -z "$SALTY_IDENTITY" ]; then
echo "SALTY_IDENTITY not set"
exit 2
fi
jq -r '.payload' | base64 -d | salty -i "$SALTY_IDENTITY" -d
}
lookup () {
if [ $# -lt 1 ]; then
printf "Usage: %s nick@domain\n" "$(basename "$0")"
exit 1
fi
user="$1"
nick="$(echo "$user" | awk -F@ '{ print $1 }')"
domain="$(echo "$user" | awk -F@ '{ print $2 }')"
curl -qsSL "https://$domain/.well-known/salty/${nick}.json"
}
readmsgs () {
topic="$1"
if [ -z "$topic" ]; then
topic=$(get_user)
fi
export SALTY_IDENTITY="$HOME/.config/salty/$topic.key"
if [ ! -f "$SALTY_IDENTITY" ]; then
echo "identity file missing for user $topic" >&2
exit 1
fi
msgbus sub "$topic" "$0"
}
sendmsg () {
if [ $# -lt 2 ]; then
printf "Usage: %s nick@domain.tld <message>\n" "$(basename "$0")"
exit 0
fi
if [ -z "$SALTY_IDENTITY" ]; then
echo "SALTY_IDENTITY not set"
exit 2
fi
user="$1"
message="$2"
salty_json="$(mktemp /tmp/salty.XXXXXX)"
lookup "$user" > "$salty_json"
endpoint="$(jq -r '.endpoint' < "$salty_json")"
topic="$(jq -r '.topic' < "$salty_json")"
key="$(jq -r '.key' < "$salty_json")"
rm "$salty_json"
message="[$(date +%FT%TZ)] <$(get_user)> $message"
echo "$message" \
| salty -i "$SALTY_IDENTITY" -r "$key" \
| msgbus -u "$endpoint" pub "$topic"
}
make_user () {
mkdir -p "$HOME/.config/salty"
if [ $# -lt 1 ]; then
user=$USER
else
user=$1
fi
identity_file="$HOME/.config/salty/$user.key"
if [ -f "$identity_file" ]; then
printf "user key exists!"
exit 1
fi
# Check for msgbus env.. probably can make it fallback to looking for a config file?
if [ -z "$MSGBUS_URI" ]; then
printf "missing MSGBUS_URI in environment"
exit 1
fi
salty-keygen -o "$identity_file"
echo "# user: $user" >> "$identity_file"
pubkey=$(grep key: "$identity_file" | awk '{print $4}')
cat <<- EOF
Create this file in your webserver well-known folder. https://hostname.tld/.well-known/salty/$user.json
{
"endpoint": "$MSGBUS_URI",
"topic": "$user",
"key": "$pubkey"
}
EOF
}
# check if streaming
if [ ! -t 1 ]; then
stream
exit 0
fi
# Show Help
if [ $# -lt 1 ]; then
printf "Commands: send read lookup"
exit 0
fi
CMD=$1
shift
case $CMD in
send)
sendmsg "$@"
;;
read)
readmsgs "$@"
;;
lookup)
lookup "$@"
;;
make-user)
make_user "$@"
;;
esac
#!/bin/sh
# Validate environment
if ! command -v msgbus > /dev/null; then
printf "missing msgbus command. Use: go install git.mills.io/prologic/msgbus/cmd/msgbus@latest"
exit 1
fi
if ! command -v salty > /dev/null; then
printf "missing salty command. Use: go install go.mills.io/salty/cmd/salty@latest"
exit 1
fi
if ! command -v salty-keygen > /dev/null; then
printf "missing salty-keygen command. Use: go install go.mills.io/salty/cmd/salty-keygen@latest"
exit 1
fi
if [ -z "$SALTY_IDENTITY" ]; then
export SALTY_IDENTITY="$HOME/.config/salty/$USER.key"
fi
get_user () {
user=$(grep user: "$SALTY_IDENTITY" | awk '{print $3}')
if [ -z "$user" ]; then
user="$USER"
fi
echo "$user"
}
stream () {
if [ -z "$SALTY_IDENTITY" ]; then
echo "SALTY_IDENTITY not set"
exit 2
fi
jq -r '.payload' | base64 -d | salty -i "$SALTY_IDENTITY" -d
}
lookup () {
if [ $# -lt 1 ]; then
printf "Usage: %s nick@domain\n" "$(basename "$0")"
exit 1
fi
user="$1"
nick="$(echo "$user" | awk -F@ '{ print $1 }')"
domain="$(echo "$user" | awk -F@ '{ print $2 }')"
curl -qsSL "https://$domain/.well-known/salty/${nick}.json"
}
readmsgs () {
topic="$1"
if [ -z "$topic" ]; then
topic=$(get_user)
fi
export SALTY_IDENTITY="$HOME/.config/salty/$topic.key"
if [ ! -f "$SALTY_IDENTITY" ]; then
echo "identity file missing for user $topic" >&2
exit 1
fi
msgbus sub "$topic" "$0"
}
sendmsg () {
if [ $# -lt 2 ]; then
printf "Usage: %s nick@domain.tld <message>\n" "$(basename "$0")"
exit 0
fi
if [ -z "$SALTY_IDENTITY" ]; then
echo "SALTY_IDENTITY not set"
exit 2
fi
user="$1"
message="$2"
salty_json="$(mktemp /tmp/salty.XXXXXX)"
lookup "$user" > "$salty_json"
endpoint="$(jq -r '.endpoint' < "$salty_json")"
topic="$(jq -r '.topic' < "$salty_json")"
key="$(jq -r '.key' < "$salty_json")"
rm "$salty_json"
message="[$(date +%FT%TZ)] <$(get_user)> $message"
echo "$message" \
| salty -i "$SALTY_IDENTITY" -r "$key" \
| msgbus -u "$endpoint" pub "$topic"
}
make_user () {
mkdir -p "$HOME/.config/salty"
if [ $# -lt 1 ]; then
user=$USER
else
user=$1
fi
identity_file="$HOME/.config/salty/$user.key"
if [ -f "$identity_file" ]; then
printf "user key exists!"
exit 1
fi
# Check for msgbus env.. probably can make it fallback to looking for a config file?
if [ -z "$MSGBUS_URI" ]; then
printf "missing MSGBUS_URI in environment"
exit 1
fi
salty-keygen -o "$identity_file"
echo "# user: $user" >> "$identity_file"
pubkey=$(grep key: "$identity_file" | awk '{print $4}')
cat <<- EOF
Create this file in your webserver well-known folder. https://hostname.tld/.well-known/salty/$user.json
{
"endpoint": "$MSGBUS_URI",
"topic": "$user",
"key": "$pubkey"
}
EOF
}
# check if streaming
if [ ! -t 1 ]; then
stream
exit 0
fi
# Show Help
if [ $# -lt 1 ]; then
printf "Commands: send read lookup"
exit 0
fi
CMD=$1
shift
case $CMD in
send)
sendmsg "$@"
;;
read)
readmsgs "$@"
;;
lookup)
lookup "$@"
;;
make-user)
make_user "$@"
;;
esac
ssh client, because that's me, no-matter where I am. The only exception to this rule is I usually create a separate key for any "work" / " company" I am a part of.
@prologic@twtxt.net I have seen single use keys that are signed by a central PKI .. Keybase has one that uses a chatbot to generate the keys on the fly.
It just comes down to your threat model :)
ssh client, because that's me, no-matter where I am. The only exception to this rule is I usually create a separate key for any "work" / " company" I am a part of.
@prologic@twtxt.net I have seen single use keys that are signed by a central PKI .. Keybase has one that uses a chatbot to generate the keys on the fly.
It just comes down to your threat model :)
ssh client, because that's me, no-matter where I am. The only exception to this rule is I usually create a separate key for any "work" / " company" I am a part of.
@prologic@twtxt.net for shame! lol me too.
ssh client, because that's me, no-matter where I am. The only exception to this rule is I usually create a separate key for any "work" / " company" I am a part of.
@prologic@twtxt.net for shame! lol me too.
@prologic@twtxt.net yarn builds in 1.18!
@prologic@twtxt.net yarn builds in 1.18!
@prologic@twtxt.net Re: Chat system, What if the base specification included a system for per-user arbitrary JSON storage on the server? Kind of like XEP-0049, but expanded upon. Two kinds of objects: public and private. Public objects can be queried by anyone, private objects cannot and must be encrypted with the userâs private key. Public keys could be stored there, as well as anything else defined by extensions. Roster, user block list, avatar, etc.
@prologic@twtxt.net hmm so each individual feed on your pod subâs my feed? Wouldnât that flood your server for each post?
@prologic@twtxt.net hmm so each individual feed on your pod subâs my feed? Wouldnât that flood your server for each post?
@prologic@twtxt.net ⊠Australia, or The US when visiting www.om.gay
@prologic@twtxt.net itâs already been set-up, depending where you are youâll be connected to Norway, South AfricaâŠ
@prologic@twtxt.net basically spread the load, got rclone to spoof out the content, et voilĂ
@prologic@twtxt.net on the cheap, I have 4 web hosting accounts used for various things in the past in places
@niplav@niplav.github.io 3œ hours a weekâŠclosing your 30-minute Exercise ring right on the dot, with no extra time?
From now on, my twtxt feed is gpg signed. I hope this works for everyone.
Hmm. I havenât used twtxt in a while. How are you doing?
@prologic@twtxt.net if you need to translate Ukrainian Lingvanex appears to be the best https://lingvanex.com/demo/
@prologic@twtxt.net Iâve got a better translator it seems - https://txt.om.gay/hostmaster-ua.txt
@kevin@txt.om.gay You got an English translation of this page? đ€ 
#makeartnotwar #GLSL #shaders code at https://www.shadertoy.com/view/fs2fRm if you want to use it
@prologic@twtxt.net my cat was admitted to hospital last night before I posted that, she didnât make it
@kevin@txt.om.gay I kind of concur with this sentiment, but also 2019 and 2021 can also go fuck off equally as much đ Whatâs up mate? Whatâs getting up your nerves? đ€
Look at you all using naked links!
Try https://twtxt.net!
Look at you all using naked links!
Try https://twtxt.net!
@david@netbros.com Do you always link that?
@benk@kwiecien.us I havenât actually looked at the original twtxt client, which means the following is ill-conceived speculation, but I believe that it only fetched feeds when you ârefreshedâ, with a minimum time between feed fetches. Sure, youâll fetch feed unnecessarily now and then, but not nearly as often as polling every 5 minutes ;)
@screem@yarn.yarnpods.com we have had to really shorten our process. I think long interviews were scaring off talent.
@screem@yarn.yarnpods.com we have had to really shorten our process. I think long interviews were scaring off talent.
also at gemini://om.gay/twtxt.txt and gopher://oh.mg:70/0/twtxt.txt
