{"id":25875936,"url":"https://github.com/andrewarrow/t1m3l1n3","last_synced_at":"2026-02-15T19:03:23.011Z","repository":{"id":136258186,"uuid":"352111156","full_name":"andrewarrow/t1m3l1n3","owner":"andrewarrow","description":"command line timeline server and client, decentralized micro-blogging follow/unfollow network, in golang.","archived":false,"fork":false,"pushed_at":"2021-04-09T02:21:26.000Z","size":190,"stargazers_count":1,"open_issues_count":6,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-09-03T12:52:34.365Z","etag":null,"topics":["blockchain","blockchain-technology","decentralized","decentralized-applications","microblogging","microblogging-service","social-media","social-network","twitter"],"latest_commit_sha":null,"homepage":"","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"unlicense","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/andrewarrow.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2021-03-27T15:44:40.000Z","updated_at":"2021-04-16T16:30:58.000Z","dependencies_parsed_at":null,"dependency_job_id":"8d9c5012-348c-4088-9a27-89d5e6591c48","html_url":"https://github.com/andrewarrow/t1m3l1n3","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/andrewarrow/t1m3l1n3","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrewarrow%2Ft1m3l1n3","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrewarrow%2Ft1m3l1n3/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrewarrow%2Ft1m3l1n3/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrewarrow%2Ft1m3l1n3/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/andrewarrow","download_url":"https://codeload.github.com/andrewarrow/t1m3l1n3/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrewarrow%2Ft1m3l1n3/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29487397,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-15T15:33:17.885Z","status":"ssl_error","status_checked_at":"2026-02-15T15:32:53.698Z","response_time":118,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["blockchain","blockchain-technology","decentralized","decentralized-applications","microblogging","microblogging-service","social-media","social-network","twitter"],"created_at":"2025-03-02T10:20:10.603Z","updated_at":"2026-02-15T19:03:22.995Z","avatar_url":"https://github.com/andrewarrow.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"# t1m3l1n3\ncommand line timeline server and client, decentralized micro-blogging\nfollow/unfollow network, in golang.\n\n![logo](https://repository-images.githubusercontent.com/352111156/bb7aef80-938d-11eb-8f1d-64f98d44309e)\n\n# Vision\nPicture a 64x64 chessboard and place a pawn in every square.\nBy default in these universes, you follow 63 other people and they\neach follow you.\n\nNow find your row and remove a pawn from column 7 and 14.\nYou are not following user 7 and user 14 anymore.\n\nWhen they go to post something, a pointer to their latest message\nwill be placed in each user's inbox; if the user follows them.\n\nThis is what Following []unit64 is for and it means:\n\n```\n1111111111111111111111111111111111111111111111111111111111111111\n1111111011111101111111111111111111111111111111111111111111111111\n1111111111111111111111111111111111111111111111111111111111111111\n```\n\nA giant, efficient grid to run a small twitter like message\nboard for just 64 people.\n\nWhen this universe first boots up, all usernames are available\nand it's first come first served to grab a two to twenty-two length\nusername. You send in your desired name, and a public key, and\nforever more this node will give you and your private key the right\nto post as you.\n\nBut this is just one node, and this code is open source. Anyone\ncan start a new node with the same username you just picked can\nbe given to someone else.\n\nUniverses are chained together. And just like the blockchain, you \nwant to attach your node to a good chain that's going to be accepted\nin lots of other places. The world can only vet and maintain so many\ndifferent chains of universes. If your chain can't govern itself\nyou might break apart and join other lead nodes.\n\nIt's all about a decentralized twitter/timeline system that one\ncompany does not control. All it takes is $5 a month to rent a\ndigitalocean server and place your one node in the system.\n\nAs more and more people start to adopt TL, it will be harder to get\nfirst name usernames and still have your chain taken seriously by\nthe N major other chains. And for free speach and who gets to set\nthe rules? It's the person with the $5 credit card bill's decision.\nThere will be certain community standards some chains allow.\n\n# So anyone can take my username for themselves in a new node?\n\nYes, but they would be all alone, claiming to be you in a node that no\none else agrees is valid.\n\n# What if a bunch of people agree it's valid?\n\nThen yes, there is competition for your username. The same way the username\n\"goodname\" on twitter is in competition for \"goodname\" on another social\nmedia site.\n\n# Which one wins?\n\nThey both co-exist but you vote with your attention and your wallet. You\ncan choose to accept the TL chain where most of your friends are. You can\nchose to spend your $5 a month node on the chain you like. You can even get\ntwo nodes and spend $10 a month or as much as you want.\n\n# So how many chains are there?\n\nA lot. Most of them small. Over time only a few will dominate the scene as\n\"the big chains\" and you can probably guess there will be one that leans left\npolitically and one that leans right. Is there a center one? Sure. Is there more\nthan one center one? Sure. When you see something that offends you, define your\nown guidelines and break off into a new chain.\n\n# What about illegal content or hate speach?\n\nRead your contract with digitalocean or whoever you are renting your $5 a month\nserver from. I woudln't want illegal content on my server! When you are in a major\nchain, certain messages are flagged for violations and removed. Can everyone agree\non which messages MUST be removed? No. Can a bunch of people agree on some basic\nguidelines? Yes.\n\n# Can you detach your name/public key from one node and move to another?\n\nYes, when someone installs the TL client for the first time, they are given \nthe default chain. But you can configure your client to speak to another chain.\nThink of some very popular blogger like Matt Taibbi. You know where the REAL\nMatt Taibbi is blogging from right? At the time of writing this (March 2021) \nit's substack. But if he were to suddenly abandon that account and appear \nsomewhere else, you'd follow that new Matt Taibbi account on some other chain.\n\n# Where does my $5/mo go, to the universe or node creator?\n\nIt goes to digitalocean or aws or any cloud provider you want to use to rent a\nserver that has CPU, RAM, Internet Access, and hard drive space. With one node\nyou are the sysop for 64 people. You are paying the bill for these 64 people to\ntalk and follow each other you are part of this decentralized social media\nsystem. The whole point is if many individuals pay the hosting costs, there is \nno one big company paying ALL the hosting and therefore making ALL the rules.\n\nBut 64 people isn't very many people. So you need to band together with another 64\nand another 64 and on and on.\n\n# About\nanyone is free to take the server binary and run it on a machine with\na nice amount of RAM and publish the IP or domain name of your\npublic TL server to the main list.\n\n# Download the client\nWhen you run the client it will connect to the main server to get a copy\nof the main list. Then it will pick a random server from that list to query\nfor your timeline ls command.\n\n# Sample Use\n\n```\n[~/TL/client] $ ./client \n\n  client ls        # List recent timelines\n  client profile   # List recent timelines\n  client post      # Post new timeline with --text=hi\n  client auth      # Set your username --name=\n  client toggle    # Toggle follow --name=\n  client idplease  # tell me what server/node i'm connected to\n  client taken     # taken usernames\n\n[~/TL/client] $ ./client ls\nInbox\n[~/TL/client] $ ./client post --text=hi\n[~/TL/client] $ ./client ls\nInbox\n01.               andrew   less than a minute hi\n[~/TL/client] $ ./client auth --name=bob\nOk you are now: bob\n[~/TL/client] $ ./client post --text=hi\n[~/TL/client] $ ./client ls\nInbox\n01.                  bob   less than a minute hi\n02.               andrew   less than a minute hi\n[~/TL/client] $ ./client profile\nProfile\n01.                  bob   less than a minute hi\n[~/TL/client] $ ./client profile --name=andrew\nProfile\n01.               andrew             1 minute hi\n[~/TL/client] $ ./client auth --name=andrew\nThis username already taken!\n[~/TL/client] $ ./client auth --name=andrew2\nOk you are now: andrew2\n[~/TL/client] $ ./client idplease\nlocalhost:8080\n\n[~/TL/client] $ ./client taken\n{\"users\":[{\"ts\":1617232944,\"username\":\"andrew\"},{\"ts\":1617241169,\"username\":\"andrew2\"},{\"ts\":1617238813,\"username\":\"bob\"}]}\n[~/TL/client] $ ./client auth --name=sue\nOk you are now: sue\n[~/TL/client] $ ./client taken\n{\"users\":[{\"ts\":1617242196,\"username\":\"sue\"},{\"ts\":1617232944,\"username\":\"andrew\"},{\"ts\":1617241169,\"username\":\"andrew2\"},{\"ts\":1617238813,\"username\":\"bob\"}]}\n\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandrewarrow%2Ft1m3l1n3","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fandrewarrow%2Ft1m3l1n3","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandrewarrow%2Ft1m3l1n3/lists"}