{"id":35009945,"url":"https://github.com/jcs/mastofollow","last_synced_at":"2026-05-20T08:31:18.946Z","repository":{"id":251837925,"uuid":"838594208","full_name":"jcs/mastofollow","owner":"jcs","description":null,"archived":false,"fork":false,"pushed_at":"2024-08-06T02:24:26.000Z","size":9,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-10-06T19:04:29.993Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jcs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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}},"created_at":"2024-08-06T01:14:28.000Z","updated_at":"2024-08-07T14:39:43.000Z","dependencies_parsed_at":"2024-08-06T03:51:14.441Z","dependency_job_id":null,"html_url":"https://github.com/jcs/mastofollow","commit_stats":null,"previous_names":["jcs/mastofollow"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/jcs/mastofollow","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jcs%2Fmastofollow","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jcs%2Fmastofollow/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jcs%2Fmastofollow/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jcs%2Fmastofollow/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jcs","download_url":"https://codeload.github.com/jcs/mastofollow/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jcs%2Fmastofollow/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33251981,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-20T04:48:54.280Z","status":"ssl_error","status_checked_at":"2026-05-20T04:48:10.851Z","response_time":356,"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":[],"created_at":"2025-12-27T04:57:38.916Z","updated_at":"2026-05-20T08:31:18.938Z","avatar_url":"https://github.com/jcs.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"## mastofollow\n\n### why\n\nIf you run your own Mastodon instance, you may also be frustrated by the\nproblem where you gain a new follower, you click through to view their profile,\nbut Mastodon just shows you this:\n\n![notdisplayed](https://github.com/user-attachments/assets/a2e269b6-7b2a-4441-9de4-0b590e9f22f4)\n\nI tell myself I'll do it later, and then I forget, and now I have a growing\nlist of followers that I haven't followed back because I can't quickly see\ntheir list of recent posts to determine if they're a bot or a weirdo or someone\nthat only reposts political things.\n\n### what\n\nThis is a hacky Ruby script that will:\n\n1. Fetch your list of followers (paginating as necessary)\n2. Fetch your list of followings and remove them from followers list\n2. Fetch the RSS feed of each remaining follower and gather their recent\nstatuses\n3. Sort all statuses in reverse chronological order\n4. Dump out static HTML files of each page of statuses (100 at a time)\n5. Spin up a WEBrick to provide a quick interface to view the static files\n\nOnce the HTML files are created, you can view them locally and see each status\nwith its image attachments and user avatars as a single feed.\nFrom there, hopefully you can find some good content and follow some users\nback.\n\n### how\n\n\t$ git clone https://github.com/jcs/mastofollow\n\t$ cd mastofollow\n\tmastofollow$ bundle install\n\t[...]\n\tmastofollow$ bundle exec ruby mastofollow.rb https://example.com/@you\n\tfetching followers page 1...\n\tfetching followers page 2...\n\t[...]\n\tfetching https://.../users/steve.rss [1/...]\n\tfetching https://.../users/jakob.rss [2/...]\n\nWhere the `https://example.com/@you` argument is your canonical Mastodon URL.\n\nAfter fetching everything, navigate to `http://127.0.0.1:8000/statuses.html` to\nview the timeline.\nIt will look rather basic, like this:\n\n![demo](https://github.com/user-attachments/assets/f71bd585-8bce-4a1e-8e84-204bc7ae4895)\n\n### but\n\nThis program naively assumes that most followers will be using Mastodon\nand Mastodon provides an RSS feed at `https://example.com/user.rss`.\nIt does not do proper WebFinger lookups or ActivityPub parsing.\nIf particular followers are not using Mastodon or their server does not provide\na `.rss` response, they will be skipped.\nIf their RSS feed does not provide `pubDate` dates for statuses, they will be\nskipped.\n\nThe internal state of statuses is written out to `statuses.json` for further\ninquiry, but everything is done in memory and each run starts over.\nA SQLite backend or something could be added to reduce memory and browse\nstatuses in something other than static HTML, but this worked enough for me.\nDon't run it too often.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjcs%2Fmastofollow","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjcs%2Fmastofollow","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjcs%2Fmastofollow/lists"}