
Show HN: Twtxt – Decentralised, minimalist microblogging service for hackers - buckket
https://github.com/buckket/twtxt
======
Terretta
Roughly, the .plan or .project file from finger?

In Unix, finger is a program you can use to find information about computer
users. It usually lists the login name, the full name, and possibly other
details about the user you are fingering. These details may include the office
location and phone number (if known), login time, idle time, time mail was
last read, and the user's plan and project files. The information listed
varies, and you may not be able to get any information from some sites.

In some cases, you may be able to use the finger command to verify an address
or find more information for someone at another institution about whom you
already have some information. The finger command is available on most Unix
systems. It differs from the whois command, which you can use simply to find
the email address of someone at another institution.

To use finger, at your Unix prompt, enter:

    
    
        finger username@node.domain
    

Replace node.domain with the appropriate machine and domain address, and
username with the name of the person or the person's username, for example:

    
    
        finger dvader@mentor.cc.purdue.edu
    

See: [https://kb.iu.edu/d/aasp](https://kb.iu.edu/d/aasp)

~~~
kzhahou
I think you're being DV'd because people think you're saying "this is just
finger." But I think you're actually reminding people of that old service,
which won't be familiar to newer generation, and was ubiquitous back in the
day.

~~~
achillean
And there are still 4,000+ servers running it publicly:

[https://www.shodan.io/report/ohcbBDbi](https://www.shodan.io/report/ohcbBDbi)

For comparison: finger[1] is more common on the Internet than Apache
Cassandra[2].

[1]
[https://www.shodan.io/search?query=port%3A79+idle](https://www.shodan.io/search?query=port%3A79+idle)

[2]
[https://www.shodan.io/search?query=product%3Acassandra](https://www.shodan.io/search?query=product%3Acassandra)

------
blorgle
Check out Freenet
([https://freenetproject.org/](https://freenetproject.org/)), it is the
perfect platform for implementing static content social media like this. There
is already a decent microblogging plugin called Sone which works out of the
box and handles unique names, Web of Trust, etc.

[https://wiki.freenetproject.org/Sone](https://wiki.freenetproject.org/Sone)

~~~
ArneBab
I’ve been using Sone for years, and once the Spam-blocking in Freenet is set
up (this provides reusable IDs), Sone works great and is a joy to use.

------
plomlompom
Just hacked together a prototype for a hosted twtxt server in Go:
[http://github.com/plomlompom/htwtxt](http://github.com/plomlompom/htwtxt)

This could be used to allow server-less users to login and twt via a browser
to URLs hosted by someone running the server. I'm still pretty new to Go and
building / setting up web servers, so don't expect too much (expect
session/cookie handling to be messy, and security in general to be bad).

I set up a quick testing version at (http)
[http://test.plomlompom.com:8000/](http://test.plomlompom.com:8000/) and
(https, bad certificate)
[https://test.plomlompom.com:8001/](https://test.plomlompom.com:8001/) – just
for testing and playing around, don't expect anything hosted there to be up
for too long.

------
detaro
Seems like something like this would be a perfect use case for IPFS[0],
although I bet there already is something similar for it out there.

[0] [https://ipfs.io/](https://ipfs.io/)

------
xena
I made a prototype aggregator: [https://twtxtlist.cf/](https://twtxtlist.cf/)

It's written in Nim and is probably good enough.

~~~
buckket
Cool, added a link to it in twtxt’s README.

------
unicornporn
Also: [https://quitter.se/](https://quitter.se/) (StatusNet/GNU social)

~~~
synchronise
So how does this compare to Sone and Twister?

I know both of those services are P2P but beyond that not much.

~~~
chc4
GNU Social isn't P2P, but federated. You don't have to host your own node to
be able to use it, which massively raises the barrier to entry, but instead
lets you register on any server in the federation as an entry point into the
network.

There are both upsides and downsides, of course. It's more centralized along
with having censorship by your hosting node. However, it doesn't force you to
leak your IP address to attackers or run software and be a sysadmin, along
with saving bandwidth. It also doesn't have some of the difficulties that
proper P2P does: Twister is on top of Bitcoin (costs to use) while Sone is
over Freenet (Sybil attacks and routing issues)

~~~
synchronise
Twister is derived from Bitcoin, but actually uses its own fork.

IIRC, the blockchain is used to store account credentials and nothing else.

------
vr_
Similar, but based on git:
[https://github.com/wilhelmtell/dis](https://github.com/wilhelmtell/dis)

------
masukomi
is it me or is this going to result in massively long data files that you KEEP
having to re-downloading in their entirety every time you want to get an
update from someone you follow?

~~~
klapinat0r
This could be solved by archiving/rotating _old_ entries, and have the
webserver return the n latest.

For instance, you could let nginx do this:

    
    
      location /masukomi.txt {
         default_type 'text/plain';
         content_by_lua 'local tail = io.popen("tail -n 20 ".."/chroot/twtxt/masukomi.txt", "r")
         for line in tail:lines() do
           print(c, line)
         end
         ';
      }

~~~
toyg
The problem is that if you didn't fetch the file at the right time, you will
lose some history after rotation happens. At the very least, it needs a
standard way to deal with that (like a mandated date-based URL format?), which
has to be specified in the format.

Also, no DM and no @-replies. For those, you need a registry of some sort, but
decentralized registries enable name-squatting.

Before you know it, you have reinvented the WWW, except limited to 140 chars.

~~~
klapinat0r
> _if you didn 't fetch the file at the right time, you will lose some history
> after rotation_

Very true, and that's a trade-off, not unlike what Twitter does today. In my
pseudo-code I didn't make the -n part of the url (it easily could be, but
that'd add changes to the client). So I agree with your criticism, but a
"since" lookup would be a fairly easy extension of the client (i.e. part of
query, so unsupported frontends still work), as the data file already contains
date.

> _Before you know it, you have reinvented the WWW_

Yes. :)

------
akkartik
Are the nicknames created by each follower independently? In other words,
would [http://bobsplace.xyz/twtxt](http://bobsplace.xyz/twtxt) be bob for me
but bobsplace for somebody else? How do @replies work then?

This looks really neat. I'm put off by the python requirement, but this seems
simple enough that I might try to put a C client together, or even something
in my new language that I've been meaning to add networking libraries to..

~~~
buckket
Yes, it’s up to each user how he names the URLs he’s following.

This makes it hard to implement global @replies, therefore there’s no
recommend way of handling those at the moment. You could just write "@<NICK>:"
and hope that the person you had in mind follows you and feels concerned.

~~~
akkartik
I see. So by default all @mentions show up on all followers' timeline, just
like regular tweets?

~~~
buckket
Yes, because there is no difference between an @reply and an ordinary tweet.
Not technically at least. It’s just text. But implementing a filter on your
side should be trivial if that’s what you want.

Maybe I’ll implement something which makes it easy for users to specify custom
filters and/or highlights.

~~~
JoshTriplett
Given the decentralized nature, it'd be nice to parse any @reply , add
metadata that indicates the full URL, and thus translate into a local user's
nicknames.

~~~
plomlompom
Should be easy to add metadata by convention inside the messages, appended to
them following some kind of control string, like "META". Clients could
interpret anything from that string on by rules yet to be defined.

------
chishaku
It would be great if there was a directory of users.

I'd use it if I knew people in my network or people I'd be interested in
following were already using it.

~~~
sliken
Not sure I'd want to be in a directory, but wouldn't mind if someone queried
based on my email address.

How about a DHT where sha160(emailaddress) would return the URL I use. Could
even use the mainline torrent DHT.

~~~
JoshTriplett
Brute-forcing email addresses doesn't seem particularly hard, and a mechanism
like that would then allow checking for email address validity and
corresponding URL.

------
d0m
It's really cool. What happens if you add a new tweet with a date in the past?
Isn't a bit weird to be able to change the history?

~~~
technomancy
It hasn't proven to be a problem for email, where the dates are also
completely up to the sender to fabricate.

------
Cyberdog
Has there ever been a product or service which has billed itself as "X for
hackers" which has actually been successful?

~~~
sliken
How about hacker news?

------
optimuspaul
I don't understand why anyone would want to go to the trouble to do this. It
feels like a huge step backwards.

~~~
746F7475
Yeah. What is the benefit of using twtxt? Ok, it's decentralized, but what
actual benefit does that bring? Just anybody can't see what you are saying?
But is the communication encrypted somehow?

Don't get me wrong, this is a cool idea and I'm all for building stuff 'just
because', but I wouldn't it be just simpler/better to create cli wrapper for
Twitter? (which probably exists). That all being said I'm not a big Twitter
user, so maybe I'm missing some vital point here that is obvious to regular
'microbloggers'

~~~
technomancy
> What is the benefit of using twtxt? Ok, it's decentralized, but what actual
> benefit does that bring?

Right now Twitter is up in arms about proposed changes which make users not
have control over their feeds; there will be algorithmic curation so you only
see the most popular content from your followers. "Just create a CLI wrapper"
only works assuming the APIs are not effected by the changes they are making
to the main product, which doesn't really make sense.

~~~
746F7475
So why not just make a Twitter clone? As in a website that had same
functionality? This extra CLI abstraction will just make it harder to adopt,
which again might be by design, but at that point a question comes to mind:
why not just start a newgroup-ish email feed?

Again I don't quite get what Twitter is for, so maybe I'm missing something,
but at least the publicity isn't an issue here since this seems to make it
pretty hard to actually find people to follow.

~~~
technomancy
> why not just start a newgroup-ish email feed?

Have you ever tried to run a mail server before? It's a nightmare wrapped in a
fiasco.

------
mrcactu5
i really hate the bells and whistles in most apps these days. even as i build
them.

hack chat is kind of nice. same "minimalist" feel
[https://news.ycombinator.com/item?id=10036770](https://news.ycombinator.com/item?id=10036770)

------
nyan4
"Decentralised"? How is this different from a static site generator and an RSS
reader?

~~~
buckket
It’s simpler, but it shares similarities, no doubt.

~~~
masukomi
actually... it seems more complicated. Existing tech: use existing tools
written in your language / usage style of choice to generate a site. Consume
with one of probably hundreds of RSS readers from which you can pick the one
you like the most. this: new tool, not supported by existing apps, glaring
limitations, requires non-default python dev environment, etc. etc...

------
reednj
It asks you to enter a username when you set it up, but when you follow
someone you have to set a username for them yourself. Am I missing something?
It seems that the username is never exposed

------
teamhappy
Is the name related to TUWAT.TXT[1] by any chance?

[1]:
[https://berlin.ccc.de/wiki/TUWAT.TXT](https://berlin.ccc.de/wiki/TUWAT.TXT)

~~~
buckket
Funny thinking about it, but no. It's just a combination of "twitter" and
"txt".

------
udfalkso
Made me think of [http://bitcoinmegaphone.com/](http://bitcoinmegaphone.com/)

