{"id":16266961,"url":"https://github.com/wezm/feedlynx","last_synced_at":"2025-04-04T22:01:39.546Z","repository":{"id":245827021,"uuid":"818446788","full_name":"wezm/feedlynx","owner":"wezm","description":"Collect links to read or watch later in your RSS reader.","archived":false,"fork":false,"pushed_at":"2024-10-30T09:52:35.000Z","size":176,"stargazers_count":75,"open_issues_count":4,"forks_count":5,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-03-28T21:01:35.517Z","etag":null,"topics":["read-later","rss","rust","watch-later"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wezm.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE-APACHE","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},"funding":{"github":"wezm"}},"created_at":"2024-06-21T22:01:21.000Z","updated_at":"2025-03-15T19:04:09.000Z","dependencies_parsed_at":"2024-11-24T08:01:03.208Z","dependency_job_id":null,"html_url":"https://github.com/wezm/feedlynx","commit_stats":null,"previous_names":["wezm/feedlynx"],"tags_count":11,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wezm%2Ffeedlynx","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wezm%2Ffeedlynx/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wezm%2Ffeedlynx/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wezm%2Ffeedlynx/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wezm","download_url":"https://codeload.github.com/wezm/feedlynx/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247256093,"owners_count":20909240,"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":["read-later","rss","rust","watch-later"],"created_at":"2024-10-10T17:43:31.027Z","updated_at":"2025-04-04T22:01:39.495Z","avatar_url":"https://github.com/wezm.png","language":"Rust","funding_links":["https://github.com/sponsors/wezm"],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e\n  \u003cimg src=\"feedlynx.svg\" width=\"64\" alt=\"\"\u003e\u003cbr\u003e\n  Feedlynx\n\u003c/h1\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003cstrong\u003eFeedlynx helps you collect links to read or watch later. It generates\n    an RSS feed of the links you collect and runs on BSD, Linux, macOS, Windows,\n    and more.\u003c/strong\u003e\n\u003c/div\u003e\n\n\u003cbr\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"https://cirrus-ci.com/github/wezm/feedlynx\"\u003e\n    \u003cimg src=\"https://api.cirrus-ci.com/github/wezm/feedlynx.svg\" alt=\"Build Status\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://crates.io/crates/feedlynx\"\u003e\n    \u003cimg src=\"https://img.shields.io/crates/v/feedlynx.svg\" alt=\"Version\"\u003e\u003c/a\u003e\n  \u003cimg src=\"https://img.shields.io/crates/l/feedlynx.svg\" alt=\"License\"\u003e\n\u003c/div\u003e\n\n\u003cbr\u003e\n\nFeedlynx manages an Atom feed on disk. Each time a request to add a link is\nreceived the page at the URL is fetched to determine a title and description.\nThis information is then used to add a new entry to the feed. If the link is\nfrom YouTube then an embed for the video is generated.\n\nInstall\n-------\n\n### Pre-compiled Binary\n\nPre-compiled binaries are available for a number of platforms:\n\n* FreeBSD 13+ amd64\n* Linux x86\\_64\n* Linux aarch64\n* MacOS Universal\n* Windows x86\\_64\n\nCheck the [latest release] for download links.\n\n\u003c!--\n\n### Package Manager\n\nFeedlynx is packaged in these package managers:\n\n* Arch Linux: `feedlynx`\n* Brew: `feedlynx`\n* Chimera Linux: `feedlynx`\n\n--\u003e\n\n### From Source\n\nSee [Build From Source](#build-from-source) below.\n\nIntegrations\n------------\n\n### Browser Extensions\n\nSee \u003chttps://github.com/wezm/feedlynx-ext\u003e for browser extensions.\n\n### Apple Shortcuts (iOS, iPadOS, macOS)\n\nThis Shortcut allows you add links to Feedlynx using the system share sheet.\n\n\u003chttps://www.icloud.com/shortcuts/1629cde707ca432ead72403ffd9f4dbc\u003e\n\nUsage\n-----\n\n```\nUSAGE:\n    feedlynx [OPTIONS] FEED_PATH\n\nOPTIONS:\n    -h, --help\n            Prints this help information\n\n    -V, --version\n            Prints version information\n\nENVIRONMENT:\n\n    Required:\n\n        FEEDLYNX_PRIVATE_TOKEN\n            Used to authenticate requests to add a new link.\n\n        FEEDLYNX_FEED_TOKEN\n            Used in the path to the generated feed.\n\n    Optional:\n\n        FEEDLYNX_ADDRESS\n            The address to serve on, default `127.0.0.1`.\n\n        FEEDLYNX_PORT\n            The port to serve on, default `8001`.\n\n        FEEDLYNX_LOG\n            Controls the log level and filtering.\n```\n\nExample:\n\n    feedlynx path/to/feed.xml\n\nFeedlynx requires two environment variables to be set:\n\n* `FEEDLYNX_PRIVATE_TOKEN` used to authenticate requests to add a new link.\n* `FEEDLYNX_FEED_TOKEN` used in the path to the generated feed.\n\nBoth of these tokens must be at least 32 characters long and hard to guess.\nSuitable values can be generated with `feedlynx gen-token`, which will print\na randomly generated token.\n\nThe following environment variables may optionally be set:\n\n* `FEEDLYNX_ADDRESS` —- the address to serve on, default `127.0.0.1`.\n* `FEEDLYNX_PORT` —- the port to serve on, default `8001`.\n* `FEEDLYNX_LOG` — controls the log level and filtering.\n\nRun `feedlynx` with the path to the feed file to start the server. If the file\ndoes not exist it will be created. When the server starts the path on the\nserver for the feed is printed. This is what you would use to subscribe to the\nfeed in your feed reader.\n\n**Feed Trimming**\n\nWhen a new link is added links older than 30 days are considered for removal.\nFeedlynx will retain up to 50 entries. Entries older than 30 days in excess of\n50 entries will be removed, oldest first.\n\nThe limit was added to stop the feed growing forever since there is no way for\nFeedlynx to know when an item has been read. RSS readers need to download and\nprocess the whole feed whenever there are new items, so imposing a cap helps\nlimit the size and scope of that work.\n\n### Example\n\n    FEEDLYNX_PRIVATE_TOKEN=ExampleExampleExampleExample1234 \\\n    FEEDLYNX_FEED_TOKEN=FeedFeedFeedFeedFeedFeedFeedFeed \\\n    feedlynx feed.xml\n    [2024-06-24T08:52:11Z INFO  feedlynx] HTTP server running on: http://127.0.0.1:8001\n    [2024-06-24T08:52:11Z INFO  feedlynx::server] feed available at /feed/FeedFeedFeedFeedFeedFeedFeedFeed\n\nIf this instance of Feedlynx was hosted at `example.com` the URL of the feed\nwould be `https://example.com/feed/FeedFeedFeedFeedFeedFeedFeedFeed`.\n\nIn a Windows PowerShell terminal the above example would look something like this:\n\n    powershell -Command { $env:FEEDLYNX_PRIVATE_TOKEN=\"ExampleExampleExampleExample1234\"; $env:FEEDLYNX_FEED_TOKEN=\"FeedFeedFeedFeedFeedFeedFeedFeed\"; feedlynx.exe feed.xml }\n\n### Logging\n\nLogging is controlled with the `FEEDLYNX_LOG` environment variable.\nThe log levels from least verbose to most verbose are:\n\n* `off` (no logs)\n* `error`\n* `warn`\n* `info`\n* `debug`\n* `trace`\n\nThe default log level is `info`. To change the log level to `debug` use\n`FEEDLYNX_LOG=debug`. The `FEEDLYNX_LOG` variable also supports filtering. For\nexample to only show `trace` messages from `feedlynx` (and not some of the\nlibraries it uses) you would specify: `FEEDLYNX_LOG=trace=feedlynx`. For more\ndetails refer to the [env_logger documentation][env_logger].\n\nAt the `debug` level Feedlynx will print a web-server styled line for each\nrequest received.\n\n    [2024-06-24T07:48:39Z DEBUG feedlynx::server] 127.0.0.1:50202 \"GET /feed/FeedFeedFeedFeedFeedFeedFeedFeed\" 200 \"curl/8.8.0\"\n\nThis includes the remote address, request method and path, response status\ncode, and client user agent.\n\n### API\n\nThe server exposes three end-points:\n\n* `GET /` — shows a brief page about the Feedlynx server.\n* `POST /add` —  add a new link. Requires a body in `application/x-www-form-urlencoded` (web form) format.\n  - Fields:\n    - `url` (required) — the link to add.\n    - `token` (required) — the value of `FEEDLYNX_PRIVATE_TOKEN`.\n    - `title` (optional) — the title of the link.\n* `POST /info` — retrieve informatin about the server. Requires a body in `application/x-www-form-urlencoded` (web form) format.\n  - Fields:\n    - `token` (required) — the value of `FEEDLYNX_PRIVATE_TOKEN`.\n  - Response:\n    - JSON object. Keys:\n      - `status`: `\"ok\"` or `\"error\"`.\n      - `version`: present when status is `\"ok\"`. Contains server version.\n      - `message`: present when status is `\"error\"`. Contain an error message.\n* `GET /feed/\u003cFEEDLYNX_FEED_TOKEN\u003e` — the generated feed. Use this to subscribe to the feed in your feed reader.\n\n#### cURL Example\n\nThe following cURL command will add `https://github.com/wezm/feedlynx` to the\nFeedlynx feed:\n\n    curl -d 'url=https://github.com/wezm/feedlynx' \\\n         -d 'token=ExampleExampleExampleExample1234' \\\n         http://localhost:8001/add\n\nDeployment\n----------\n\nIt's recommended that Feedlynx be deployed behind a reverse proxy such as nginx\nthat can provide HTTPS termination. Feedlynx assumes that it is deployed to a\ndedicated domain or sub-domain. E.g. `https://feedlynx.example.com/`.\n\nBuild from Source\n-----------------\n\n**Minimum Supported Rust Version:** 1.79.0\n\nFeedlynx is implemented in Rust. See the Rust website for [instructions on\ninstalling the toolchain][rustup].\n\n### From Git Checkout or Release Tarball\n\nBuild the binary with:\n\n    cargo build --release --locked\n\nThe binary will be in `target/release/feedlynx`.\n\n### From crates.io\n\n    cargo install feedlynx\n\n### Compile-time Options (Cargo Features)\n\nFeedlynx supports the following compile-time options:\n\n* `rust-tls` (default): use the `rust-tls` crate for handling TLS connections.\n* `native-tls`: use the `native-tls` crate for handling TLS connections. This\n  might be a better option when building on Windows.\n\nTo build with `native-tls` invoke Cargo as follows:\n\n    cargo build --release --locked --no-default-features --features native-tls\n\nIf packaging Feedlynx for an operating system registry it might make sense to\nuse `native-tls`. On Linux and BSD systems that adds a dependency on OpenSSL.\n\n### Using a Container (Docker or Podman)\n\nA Dockerfile is included in the repository. A lightweight container image can\nbe built like this:\n\n    docker build -t feedlynx .\n\nThe container expects the path to the feed in `/data`, so we can use a volume\nmount to have persistent storage:\n\n    docker run -p 127.0.0.1:8001:8001 -v ./data:/data \\\n      -e FEEDLYNX_PRIVATE_TOKEN=ExampleExampleExampleExample1234 \\\n      -e FEEDLYNX_FEED_TOKEN=FeedFeedFeedFeedFeedFeedFeedFeed /data/feed.xml\n\nThe application then can be accessed at \u003chttp://localhost:8001\u003e like it would\nrun without a container. If using Podman, just replace the usage of the\n`docker` command with `podman`.\n\nCredits\n-------\n\nFeedlynx incorporates code from the following projects under the terms of the\nApache 2.0 licence:\n\n- base62 generation code from [nano-id].\n- Random number generation from [rustc] via [matklad] and [orhun]\n- UNIX signal handling from [habitat].\n- Windows signal handling from [ctrlc].\n\nThe adorable Feedlynx logo was drawn by [@DiDoesDigital](https://didoesdigital.com).\n\nLicence\n-------\n\nThis project is dual licenced under either of:\n\n- Apache License, Version 2.0 ([LICENSE-APACHE](https://github.com/wezm/feedlynx/blob/master/LICENSE-APACHE))\n- MIT license ([LICENSE-MIT](https://github.com/wezm/feedlynx/blob/master/LICENSE-MIT))\n\nat your option.\n\n[ctrlc]: https://github.com/Detegr/rust-ctrlc/blob/b543abe6c25bd54754bbbbcfcff566e046f8e609/src/platform/windows/mod.rs\n[env_logger]: https://docs.rs/env_logger/0.11.3/env_logger/index.html\n[habitat]: https://github.com/habitat-sh/habitat/blob/631af77f7705fb4ea68a5464f269e0c0b9283a91/components/core/src/os/signals/unix.rs\n[latest release]: https://github.com/wezm/feedlynx/releases/latest\n[matklad]: https://github.com/matklad/config/blob/b8ea0aad0f86d4575651a390a3c7aefb63229774/templates/snippets/src/lib.rs#L28L42\n[nano-id]: https://github.com/viz-rs/nano-id/blob/a9022772b2f1ce38929b5b81eccc670ac9d3ab23/src/lib.rs\n[orhun]: https://blog.orhun.dev/zero-deps-random-in-rust/\n[rustc]: https://github.com/matklad/config/blob/b8ea0aad0f86d4575651a390a3c7aefb63229774/templates/snippets/src/lib.rs#L28L42\n[rustup]: https://www.rust-lang.org/tools/install\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwezm%2Ffeedlynx","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwezm%2Ffeedlynx","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwezm%2Ffeedlynx/lists"}