{"id":13547856,"url":"https://github.com/porla/porla","last_synced_at":"2025-04-02T20:31:01.513Z","repository":{"id":11902494,"uuid":"110845316","full_name":"porla/porla","owner":"porla","description":"A high performance BitTorrent client for servers and seedboxes.","archived":false,"fork":false,"pushed_at":"2025-04-02T10:32:53.000Z","size":1803,"stargazers_count":237,"open_issues_count":32,"forks_count":32,"subscribers_count":6,"default_branch":"main","last_synced_at":"2025-04-02T13:42:50.348Z","etag":null,"topics":["automation","bittorrent","seedbox","server","torrent"],"latest_commit_sha":null,"homepage":"https://porla.org","language":"C++","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/porla.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}},"created_at":"2017-11-15T14:40:20.000Z","updated_at":"2025-04-01T13:25:29.000Z","dependencies_parsed_at":"2023-09-30T00:17:51.937Z","dependency_job_id":"cd1649e7-e2e8-479c-bab7-b84c6d10d26e","html_url":"https://github.com/porla/porla","commit_stats":{"total_commits":519,"total_committers":9,"mean_commits":"57.666666666666664","dds":"0.046242774566473965","last_synced_commit":"22fd5b06daad70bc1e58861b677f540a99b6a76c"},"previous_names":[],"tags_count":44,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/porla%2Fporla","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/porla%2Fporla/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/porla%2Fporla/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/porla%2Fporla/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/porla","download_url":"https://codeload.github.com/porla/porla/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246887877,"owners_count":20850156,"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":["automation","bittorrent","seedbox","server","torrent"],"created_at":"2024-08-01T12:01:02.123Z","updated_at":"2025-04-02T20:30:56.500Z","avatar_url":"https://github.com/porla.png","language":"C++","funding_links":[],"categories":["C++"],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e\n  \u003cimg src=\".github/images/logo.svg\" width=\"160px\"/\u003e\u003cbr/\u003e\n  Porla\n\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://discord.gg/FNVVRzqJAG\"\u003e\n    \u003cimg src=\"https://img.shields.io/discord/1031839440496234526?color=%237289da\u0026style=for-the-badge\" /\u003e\n  \u003c/a\u003e\n  \u003cimg src=\"https://img.shields.io/github/v/release/porla/porla?color=%2365325D\u0026style=for-the-badge\" /\u003e\n\u003c/p\u003e\n\nPorla is a powerful BitTorrent client with high performance and low memory\nusage. It is designed for headless operations on servers and seedboxes and can\neasily manage tens of thousands of torrents.\n\nThe focus of Porla is to provide a BitTorrent client that is _fast_, _correct_\nand _extensible_.\n\n\u003cp align=\"center\"\u003e\n   \u003cimg src=\".github/images/porla-torrents-list.png\"\u003e\u003cbr/\u003e\n\u003c/p\u003e\n\n### Features\n\n * Based on libtorrent with support for both BitTorrent v1 and v2.\n * Lua API for writing [plugins and workflows](https://porla.org/plugins/getting_started).\n * Supports multiple, distinct sessions with different settings.\n * Embedded query language to find torrents. Fast.\n * [HTTP API](https://porla.org/api/auth) with JWT auth.\n * Modern web UI.\n\n#### Plugins and workflows\n\nThe Lua API can be used to automate and integrate Porla with all types of\napplications and services, such as Discord and [ntfy.sh](https://ntfy.sh).\n\n#### Multiple sessions\n\nYou can easily set up multiple sessions to separate your public torrents from\nyour private torrents, for example. Each session binds to its own network\ndevice and port pair, and can have custom rate limits, queueing rules, etc.\n\n#### The Porla query language (PQL)\n\nTo make it easy to navigate and filter a large amount of torrents Porla has a\nsimple, embedded query language named PQL.\n\nWith PQL you can easily find torrents matching specific criterias.\n\n## Getting started\n\nDownload the latest release and put it somewhere safe. Then, run it. By default,\nPorla bind the web UI to `localhost:1337`. On first use you will be prompted to\nset up a user account.\n\n```shell\nporla\n```\n\nTo show all options available, suffix with `--help`.\n\n```shell\nporla --help\n```\n\nFor example, you can run `porla` with an in-memory SQLite database by passing\n`--db=:memory:`.\n\n```shell\nporla --db=:memory:\n```\n\n## Configuration\n\nYou can configure Porla in three ways - environment variables, command line\narguments, and a TOML config file.\n\nCommand line arguments have the highest priority, then the config file, and\nlastly the environment variables. The app will, however, run without any applied\nconfiguration and use sensible defaults instead.\n\n### Environment variables and command line args\n\n * `PORLA_CONFIG_FILE` or `--config-file` - path to a TOML config file with\n   additional configuration.\n * `PORLA_DB` or `--db` - path a file (which does not need to exist) that `porla`\n   will use to store its state.\n * `PORLA_HTTP_AUTH_DISABLED_YES_REALLY` - set to `true` to disable HTTP JWT\n   authentication (_not recommended_).\n * `PORLA_HTTP_BASE_PATH` or `--http-base-path` - set to a path where the HTTP parts\n   of Porla will be served. Defaults to `/`.\n * `PORLA_HTTP_HOST` or `--http-host` - set to an IP address which to bind the HTTP\n   server. Defaults to _127.0.0.1_.\n * `PORLA_HTTP_METRICS_ENABLED` or `--http-metrics-enabled` - set to true/false to\n   enable or disable the metrics endpoint. Defaults to _true_.\n * `PORLA_HTTP_PORT` or `--http-port` - set to the port to use for the HTTP server.\n   Defaults to _1337_.\n * `PORLA_LOG_LEVEL` or `--log-level` - the minimum log level to use. Valid values\n   are _trace_, _debug_, _info_, _warning_, _error_, _fatal_. Defaults to _info_.\n * `PORLA_SESSION_SETTINGS_BASE` or `--session-settings-base` - the libtorrent\n   settings base to use for session settings. Valid values are _default_,\n   _min\\_memory\\_usage_, _high\\_performance\\_seed_. Defaults to _default_.\n * `PORLA_STATE_DIR` or `--state-dir` - a path to a directory where Porla will\n   store its state.\n * `PORLA_TIMER_DHT_STATS` or `--timer-dht-stats` - the interval in milliseconds\n   to push DHT stats. Defaults to _5000_.\n * `PORLA_TIMER_SESSION_STATS` or `--timer-session-stats` - the interval in\n   milliseconds to push session stats. Defaults to _5000_.\n * `PORLA_TIMER_TORRENT_UPDATES` or `--timer-torrent-updates` - the interval in\n   milliseconds to push torrent state updates. Defaults to _1000_.\n * `PORLA_WORKFLOW_DIR` or `--workflow-dir` - the path to where Porla will load\n   user workflows from.\n\nRefer to [the official documentation](https://porla.org/configuration/) for\ninformation on how to set up the TOML configuration.\n\n## Development\n\nVarious bits and pieces of information regarding development.\n\n### Building\n\nWe try to make sure Porla is easy to get running directly from the Git\nrepository. Dependencies are managed with [vcpkg](https://github.com/microsoft/vcpkg).\n\n```shell\ngit clone --recursive https://github.com/porla/porla\ncd porla\ncmake -S . -B build -DCMAKE_BUILD_TYPE=Release -G Ninja\ncmake --build build\n```\n\nYou can also remove `-G Ninja` if you don't have Ninja available.\n\n### Updating the pre-built Dockerfile build environment\n\nTo reduce build times, we use a pre-built Docker layer with all the vcpkg\ndependencies already built. This needs to be updated whenever we update the\nvcpkg submodule or radically change the project structure.\n\n_Requires push access to the Porla container registry_.\n\n```shell\ndocker build -t porla-build-env -f Dockerfile.build-env .\ndocker tag porla-build-env ghcr.io/porla/build-env:\u003ctimestamp\u003e\ndocker push ghcr.io/porla/build-env:\u003ctimestamp\u003e\n```\n\n### Generating ANTLR4 grammar source files\n\nThis is only needed when `PorlaQueryLang.g4` is modified.\n\n```shell\nwget https://www.antlr.org/download/antlr-4.11.1-complete.jar\npushd src/query\njava -jar ../../antlr-4.11.1-complete.jar -Dlanguage=Cpp -visitor -no-listener -o _aux PorlaQueryLang.g4\npopd\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fporla%2Fporla","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fporla%2Fporla","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fporla%2Fporla/lists"}