{"id":13574043,"url":"https://github.com/benbusby/farside","last_synced_at":"2025-05-15T01:07:40.058Z","repository":{"id":37588597,"uuid":"419886612","full_name":"benbusby/farside","owner":"benbusby","description":"A smart redirecting gateway for various frontend services","archived":false,"fork":false,"pushed_at":"2025-05-13T00:22:50.000Z","size":837,"stargazers_count":841,"open_issues_count":39,"forks_count":48,"subscribers_count":8,"default_branch":"main","last_synced_at":"2025-05-13T01:27:09.746Z","etag":null,"topics":["badgerdb","go","golang","privacy","redirect"],"latest_commit_sha":null,"homepage":"https://farside.link","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/benbusby.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}},"created_at":"2021-10-21T21:50:04.000Z","updated_at":"2025-05-13T00:22:53.000Z","dependencies_parsed_at":"2024-03-13T02:46:04.833Z","dependency_job_id":"8ee78ec8-4f7d-4021-a028-f8eb9c78f530","html_url":"https://github.com/benbusby/farside","commit_stats":{"total_commits":1103,"total_committers":30,"mean_commits":"36.766666666666666","dds":0.1967361740707162,"last_synced_commit":"0c295d136f5d10928146badb3a45b0f88ec5fa2e"},"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/benbusby%2Ffarside","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/benbusby%2Ffarside/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/benbusby%2Ffarside/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/benbusby%2Ffarside/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/benbusby","download_url":"https://codeload.github.com/benbusby/farside/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254254041,"owners_count":22039792,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["badgerdb","go","golang","privacy","redirect"],"created_at":"2024-08-01T15:00:45.558Z","updated_at":"2025-05-15T01:07:35.046Z","avatar_url":"https://github.com/benbusby.png","language":"Go","funding_links":[],"categories":["Social Networks and Platforms","Go","Elixir","Alternative Frontends","Redirection"],"sub_categories":["Android","Tools","Other services"],"readme":"\u003cdiv align=\"center\" style=\"margin-bottom: 10px;\"\u003e\n\u003cimg src=\"https://benbusby.com/assets/images/farside.svg\" alt=\"Farside\"\u003e\n\u003c/div\u003e\n\u003cbr\u003e\n\n\u003cdiv align=\"center\"\u003e\n\n[![Latest Release](https://img.shields.io/github/v/release/benbusby/farside?label=Release)](https://github.com/benbusby/farside/releases)\n[![MIT License](https://img.shields.io/github/license/benbusby/earthbound-themes.svg)](http://opensource.org/licenses/MIT)\n[![Tests](https://github.com/benbusby/farside/actions/workflows/tests.yml/badge.svg)](https://github.com/benbusby/farside/actions/workflows/tests.yml)\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://sr.ht/~benbusby/farside\"\u003eSourceHut\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"https://github.com/benbusby/farside\"\u003eGitHub\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003c/div\u003e\n\nContents\n1. [About](#about)\n2. [Demo](#demo)\n3. [How It Works](#how-it-works)\n4. [Cloudflare](#regarding-cloudflare)\n5. [Development](#development)\n    1. [Environment Variables](#environment-variables)\n6. [Search Integration](#search-integration)\n    1. [Kagi](#kagi)\n    2. [Whoogle Search](#whoogle-search)\n\n## About\n\nA redirecting service for FOSS alternative frontends.\n\n[Farside](https://farside.link) provides links that automatically redirect to\nworking instances of privacy-oriented alternative frontends, such as Nitter,\nLibreddit, etc. This allows for users to have more reliable access to the\navailable public instances for a particular service, while also helping to\ndistribute traffic more evenly across all instances and avoid performance\nbottlenecks and rate-limiting.\n\nFarside also integrates smoothly with basic redirector extensions in most\nbrowsers. For a simple example setup,\n[refer to the wiki](https://github.com/benbusby/farside/wiki/Browser-Extension).\n\n## Demo\n\nFarside's links work with the following structure: `farside.link/\u003cservice\u003e/\u003cpath\u003e`\n\nFor example:\n\n\u003ctable\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eService\u003c/td\u003e\n        \u003ctd\u003ePage\u003c/td\u003e\n        \u003ctd\u003eFarside Link\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ca href=\"https://sr.ht/~edwardloveall/Scribe/\"\u003eScribe\u003c/a\u003e\u003c/td\u003e\n        \u003ctd\u003eView Medium post\u003c/td\u003e\n        \u003ctd\u003e\u003ca href=\"https://farside.link/scribe/@ftrain/big-data-small-effort-b62607a43a8c\"\u003ehttps://farside.link/scribe/@ftrain/big-data-small-effort-b62607a43a8c\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ca href=\"https://github.com/spikecodes/libreddit\"\u003eLibreddit\u003c/a\u003e\u003c/td\u003e\n        \u003ctd\u003e/r/popular\u003c/td\u003e\n        \u003ctd\u003e\u003ca href=\"https://farside.link/libreddit/r/popular\"\u003ehttps://farside.link/libreddit/r/popular\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ca href=\"https://gitdab.com/cadence/breezewiki\"\u003eBreezeWiki\u003c/a\u003e\u003c/td\u003e\n        \u003ctd\u003eBalatro Wiki\u003c/td\u003e\n        \u003ctd\u003e\u003ca href=\"https://farside.link/breezewiki/balatrogame\"\u003ehttps://farside.link/https://balatrogame.fandom.com\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ca href=\"https://github.com/searxng/searxng\"\u003eSearXNG\u003c/a\u003e\u003c/td\u003e\n        \u003ctd\u003eSearch \"EFF\"\u003c/td\u003e\n        \u003ctd\u003e\u003ca href=\"https://farside.link/searxng/search?q=EFF\"\u003ehttps://farside.link/searxng/search?q=EFF\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ca href=\"https://codeberg.org/ManeraKai/simplytranslate\"\u003eSimplyTranslate\u003c/a\u003e\u003c/td\u003e\n        \u003ctd\u003eTranslate \"hola\"\u003c/td\u003e\n        \u003ctd\u003e\u003ca href=\"https://farside.link/simplytranslate/?engine=google\u0026text=hola\"\u003ehttps://farside.link/simplytranslate/?engine=google\u0026text=hola\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ca href=\"https://github.com/TheDavidDelta/lingva-translate\"\u003eLingva\u003c/a\u003e\u003c/td\u003e\n        \u003ctd\u003eTranslate \"bonjour\"\u003c/td\u003e\n        \u003ctd\u003e\u003ca href=\"https://farside.link/lingva/auto/en/bonjour\"\u003ehttps://farside.link/lingva/auto/en/bonjour\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ca href=\"https://codeberg.org/video-prize-ranch/rimgo\"\u003eRimgo\u003c/a\u003e\u003c/td\u003e\n        \u003ctd\u003eView photo album\u003c/td\u003e\n        \u003ctd\u003e\u003ca href=\"https://farside.link/rimgo/a/H8M4rcp\"\u003ehttps://farside.link/rimgo/a/H8M4rcp\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003csup\u003eNote: This table doesn't include all available services. For a complete list of supported frontends, see: https://farside.link\u003c/sup\u003e\n\nFarside also accepts URLs to \"parent\" services, and will redirect to an appropriate front end service, for example:\n\n- https://farside.link/https://balatrogame.fandom.com/wiki/Abandoned_Deck will redirect to a [BreezeWiki](https://gitdab.com/cadence/breezewiki) instance\n- https://farside.link/reddit.com/r/popular will redirect to a [Libreddit](https://github.com/spikecodes/libreddit) or [Teddit](https://codeberg.org/teddit/teddit) instance\n- etc.\n\n## How It Works\n\nThe app runs with an internally scheduled cron task that queries all instances\nfor services defined in [services.json](services.json) every 5 minutes. For\neach instance, as long as the instance takes \u003c5 seconds to respond and returns\na successful response code, the instance is added to a list of available\ninstances for that particular service. If not, it is discarded until the next\nupdate period.\n\nFarside's routing is very minimal, with only the following routes:\n\n- `/`\n  - The app home page, displaying all live instances for every service\n- `/:service/*glob`\n  - The main endpoint for redirecting a user to a working instance of a\n    particular service with the specified path\n  - Ex: `/libreddit/r/popular` would navigate to `\u003clibreddit instance\n    URL\u003e/r/popular`\n    - If the service provided is actually a URL to a \"parent\" service\n      (i.e. \"youtube.com\" instead of \"piped\" or \"invidious\"), Farside\n      will determine the correct frontend to use for the specified URL.\n  - Note that a path is not required. `/libreddit` for example will still\n    redirect the user to a working libreddit instance\n- `/_/:service/*glob`\n  - Achieves the same redirect as the main `/:service/*glob` endpoint, but\n    preserves a short landing page in the browser's history to allow quickly\n    jumping between instances by navigating back.\n  - Ex: `/_/nitter` -\u003e nitter instance A -\u003e (navigate back one page) -\u003e nitter\n    instance B -\u003e ...\n  - *Note: Uses Javascript to preserve the page in history*\n\nWhen a service is requested with the `/:service/...` endpoint, Farside requests\nthe list of working instances from the db and returns a random one from the list\nand adds that instance as a new entry in the db to remove from subsequent\nrequests for that service. For example:\n\nA user navigates to `/nitter` and is redirected to `nitter.net`. The next user\nto request `/nitter` will be guaranteed to not be directed to `nitter.net`, and\nwill instead be redirected to a separate (random) working instance. That\ninstance will now take the place of `nitter.net` as the \"reserved\" instance, and\n`nitter.net` will be returned to the list of available Nitter instances.\n\nThis \"reserving\" of previously chosen instances is performed in an attempt to\nensure better distribution of traffic to available instances for each service.\n\nFarside also has built-in IP ratelimiting for all requests, enforcing only one\nrequest per second per IP.\n\n## Regarding Cloudflare\nInstances for each supported service that are deployed behind Cloudflare are\nnot included when using [farside.link](https://farside.link). If you would like\nto also access instances that use Cloudflare (in addition to instances that do\nnot), you can either use [cf.farside.link](https://cf.farside.link) instead, or\ndeploy your own instance of Farside and set\n`FARSIDE_SERVICES_JSON=services-full.json` when running.\n\nIf you do decide to use [cf.farside.link](https://cf.farside.link) or use the\nfull instance list provided by `services-full.json`, please be aware that\nCloudflare takes steps to block site visitors using Tor (and some VPNs), and\nthat their mission to centralize the entire web behind their service ultimately\ngoes against what Farside is trying to solve. Use at your own discretion.\n\n## Development\n\n- Install [Go](https://go.dev/doc/install)\n- Compile with `go build`\n\n### Environment Variables\n\n\u003ctable\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eName\u003c/td\u003e\n        \u003ctd\u003ePurpose\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eFARSIDE_TEST\u003c/td\u003e\n        \u003ctd\u003eIf enabled, bypasses the instance availability check and adds all instances to the pool\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eFARSIDE_PORT\u003c/td\u003e\n        \u003ctd\u003eThe port to run Farside on (default: `4001`)\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eFARSIDE_DB_DIR\u003c/td\u003e\n        \u003ctd\u003eThe path to the directory to use for storing instance data (default: `./`)\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eFARSIDE_CF_ENABLED\u003c/td\u003e\n        \u003ctd\u003eSet to 1 to enable redirecting to instances behind cloudflare\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eFARSIDE_CRON\u003c/td\u003e\n        \u003ctd\u003eSet to 0 to deactivate the periodic instance availability check\u003c/td\u003e\n    \u003c/tr\u003e\n\u003c/table\u003e\n\n## Search Integration\n\n### Kagi\n\nhttps://kagi.com\n\nOn the settings page, go to `Search \u003e Advanced \u003e Open Redirects` and setup your redirects.\n\nWith the exception of BreezeWiki, most redirect rules can just extract the path of the\nlink you're visiting and append them to whichever Farside redirect you want to use.\n\nFor example:\n\n##### Medium -\u003e Scribe\n\n`^https://medium.com/(.*)|https://farside.link/scribe/$1`\n\n##### Fandom -\u003e BreezeWiki\n\n`^https://([^/]+).fandom.com/(.*)|https://farside.link/breezewiki/$1/$2`\n\n### Whoogle Search\n\nhttps://github.com/benbusby/whoogle-search\n\nWhoogle automatically routes eligible links through Farside when the `Replace\nSocial Media Links` option in the home page settings menu is enabled.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbenbusby%2Ffarside","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbenbusby%2Ffarside","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbenbusby%2Ffarside/lists"}