├── .eleventy.js ├── .github ├── dependabot.yml └── workflows │ ├── ci.yaml │ └── deploy.yaml ├── .gitignore ├── .htmlvalidate.mjs ├── .swcrc ├── README.md ├── _site ├── .htaccess ├── .well-known │ └── org.flathub.VerifiedApps.txt ├── css │ ├── TLbanner.css │ └── style.css ├── donate.html ├── download.html ├── favicon.ico ├── favicon.svg ├── img │ ├── QBt-download-150.webp │ ├── TLbannerNew.xcf │ ├── flags │ │ ├── fr.svg │ │ ├── gr.svg │ │ ├── hu.svg │ │ └── pl.svg │ ├── github.svg │ ├── os │ │ ├── altlinux.webp │ │ ├── archlinux.svg │ │ ├── blackPanther-dark.webp │ │ ├── debian.svg │ │ ├── docker.webp │ │ ├── ecs_logo.webp │ │ ├── fedoralogo.webp │ │ ├── flatpak.svg │ │ ├── freebsd.svg │ │ ├── gentoo.svg │ │ ├── haiku.webp │ │ ├── macoslogo.webp │ │ ├── mageia.webp │ │ ├── opensuse.svg │ │ ├── pardus.webp │ │ ├── slackware.webp │ │ ├── tux.svg │ │ ├── ubuntu.svg │ │ └── winlogo.webp │ ├── qb_banner.webp │ ├── qb_oldbanner.webp │ ├── review2_5_qBittorrent_award.webp │ ├── rss-color.svg │ ├── screenshots │ │ └── linux │ │ │ ├── 1.webp │ │ │ ├── 2.webp │ │ │ ├── 3.webp │ │ │ ├── 4.webp │ │ │ └── 5.webp │ ├── tar-logo.svg │ ├── team │ │ ├── Chocobo1.webp │ │ ├── chris.webp │ │ └── glassez.jpeg │ ├── translate.svg │ └── user_font_awesome.svg ├── index.html ├── news.html ├── news_feed.atom ├── openapi-demo │ ├── authcontroller.yml │ ├── index.html │ ├── main.yml │ ├── rapidoc-min.js │ └── transfercontroller.yml ├── screenshots.html ├── scripts │ └── download.js ├── team.html └── versions.json ├── atom_generator ├── package.json ├── src │ └── main.ts └── tsconfig.json ├── eslint.config.mjs ├── package.json ├── src ├── .htaccess ├── .well-known │ └── org.flathub.VerifiedApps.txt ├── _includes │ └── base.liquid ├── css │ ├── TLbanner.css │ └── style.css ├── donate.liquid ├── download.liquid ├── favicon.ico ├── favicon.svg ├── img │ ├── QBt-download-150.webp │ ├── TLbannerNew.xcf │ ├── flags │ │ ├── fr.svg │ │ ├── gr.svg │ │ ├── hu.svg │ │ └── pl.svg │ ├── github.svg │ ├── os │ │ ├── altlinux.webp │ │ ├── archlinux.svg │ │ ├── blackPanther-dark.webp │ │ ├── debian.svg │ │ ├── docker.webp │ │ ├── ecs_logo.webp │ │ ├── fedoralogo.webp │ │ ├── flatpak.svg │ │ ├── freebsd.svg │ │ ├── gentoo.svg │ │ ├── haiku.webp │ │ ├── macoslogo.webp │ │ ├── mageia.webp │ │ ├── opensuse.svg │ │ ├── pardus.webp │ │ ├── slackware.webp │ │ ├── tux.svg │ │ ├── ubuntu.svg │ │ └── winlogo.webp │ ├── qb_banner.webp │ ├── qb_oldbanner.webp │ ├── review2_5_qBittorrent_award.webp │ ├── rss-color.svg │ ├── screenshots │ │ └── linux │ │ │ ├── 1.webp │ │ │ ├── 2.webp │ │ │ ├── 3.webp │ │ │ ├── 4.webp │ │ │ └── 5.webp │ ├── tar-logo.svg │ ├── team │ │ ├── Chocobo1.webp │ │ ├── chris.webp │ │ └── glassez.jpeg │ ├── translate.svg │ └── user_font_awesome.svg ├── index.md ├── news.md ├── old_news.md ├── openapi-demo │ ├── authcontroller.yml │ ├── index.html │ ├── main.yml │ ├── rapidoc-min.js │ └── transfercontroller.yml ├── screenshots.liquid ├── scripts │ └── download.ts ├── team.liquid └── versions.json ├── stylelint.config.mjs └── tsconfig.json /.eleventy.js: -------------------------------------------------------------------------------- 1 | import ChildProcess from "node:child_process"; 2 | import MarkdownItAnchor from "markdown-it-anchor"; 3 | import * as Fs from 'node:fs'; 4 | import * as FsPromises from 'node:fs/promises'; 5 | import * as Util from 'node:util'; 6 | 7 | export default (eleventyConfig) => { 8 | const sourceDir = "src"; 9 | 10 | // Copy folders as-is 11 | eleventyConfig.addPassthroughCopy(`${sourceDir}/.well-known`); 12 | eleventyConfig.addPassthroughCopy(`${sourceDir}/css`); 13 | eleventyConfig.addPassthroughCopy(`${sourceDir}/img`); 14 | eleventyConfig.addPassthroughCopy(`${sourceDir}/openapi-demo`); 15 | // Copy files as-is 16 | eleventyConfig.addPassthroughCopy(`${sourceDir}/.htaccess`); 17 | eleventyConfig.addPassthroughCopy(`${sourceDir}/favicon.ico`); 18 | eleventyConfig.addPassthroughCopy(`${sourceDir}/favicon.svg`); 19 | eleventyConfig.addPassthroughCopy(`${sourceDir}/versions.json`); 20 | 21 | // Additional watch targets 22 | eleventyConfig.addWatchTarget(`${sourceDir}/scripts/*.ts`); 23 | 24 | // Ignored files 25 | eleventyConfig.ignores.add(`${sourceDir}/old_news.md`); 26 | 27 | eleventyConfig.amendLibrary("md", (mdLib) => { 28 | // https://github.com/valeriangalliat/markdown-it-anchor#usage 29 | const options = { 30 | permalink: MarkdownItAnchor.permalink.headerLink() 31 | }; 32 | mdLib.use(MarkdownItAnchor, options); 33 | }); 34 | 35 | // Run after the build ends 36 | eleventyConfig.on("eleventy.after", async ({ dir }) => { 37 | const run = (cmd) => { 38 | const exec = Util.promisify(ChildProcess.exec); 39 | return exec(cmd).then( 40 | (result) => { console.log(result.stdout); }, 41 | (result) => { console.error(result.stderr); } 42 | ); 43 | }; 44 | 45 | const compileTS = () => { 46 | //return run("tsc"); 47 | return run(`swc --out-dir ${dir.output} src/scripts/*.ts`); 48 | }; 49 | const generateAtomFeed = () => { 50 | return run(`npm run -w atom_generator generate -- -i ../${dir.output}/news.html -o ../${dir.output}/news_feed.atom`); 51 | }; 52 | const preserveFileDate = () => { 53 | const targets = [ 54 | [`${sourceDir}/news.md`, `${dir.output}/news.html`] 55 | ]; 56 | const promises = targets.map((target) => { 57 | const src = target[0]; 58 | const dest = target[1]; 59 | const srcStat = Fs.statSync(src); 60 | return FsPromises.utimes(dest, srcStat.atime, srcStat.mtime); 61 | }); 62 | return Promise.allSettled(promises); 63 | }; 64 | 65 | return Promise.allSettled([ 66 | preserveFileDate(), 67 | compileTS(), 68 | generateAtomFeed() 69 | ]); 70 | }); 71 | 72 | return { 73 | dir: { 74 | input: sourceDir 75 | } 76 | }; 77 | }; 78 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | 3 | updates: 4 | - package-ecosystem: "github-actions" 5 | directory: "/" 6 | groups: 7 | github-actions: 8 | patterns: 9 | - "*" 10 | schedule: 11 | interval: "monthly" 12 | -------------------------------------------------------------------------------- /.github/workflows/ci.yaml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: [pull_request, push] 4 | 5 | permissions: {} 6 | 7 | concurrency: 8 | group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} 9 | cancel-in-progress: ${{ github.head_ref != '' }} 10 | 11 | jobs: 12 | ci: 13 | name: Check 14 | runs-on: ubuntu-latest 15 | permissions: 16 | security-events: write 17 | steps: 18 | - name: Checkout repository 19 | uses: actions/checkout@v5 20 | with: 21 | persist-credentials: false 22 | 23 | - name: Setup nodejs 24 | uses: actions/setup-node@v6 25 | with: 26 | node-version: 'lts/*' 27 | 28 | - name: Install tools 29 | run: | 30 | npm install 31 | npm ls 32 | npm ls --all 33 | 34 | - name: Lint code 35 | run: npm run lint 36 | 37 | - name: Format code 38 | run: | 39 | npm run format 40 | git diff --exit-code 41 | 42 | - name: Build code 43 | run: | 44 | rm -r _site 45 | npm run build 46 | git diff \ 47 | --exit-code \ 48 | ':(exclude)_site/news_feed.atom' 49 | git diff \ 50 | --exit-code \ 51 | -I '.*' \ 52 | _site/news_feed.atom 53 | 54 | - name: Check html 55 | run: | 56 | npm run check-html 57 | 58 | - name: Upload build artifacts 59 | uses: actions/upload-artifact@v5 60 | with: 61 | name: website 62 | path: _site 63 | 64 | - name: Check GitHub Actions workflow 65 | env: 66 | GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} 67 | run: | 68 | pip install zizmor 69 | zizmor \ 70 | --format sarif \ 71 | --persona auditor \ 72 | ./ \ 73 | | jq '(.runs[].results |= map(select(.ruleId != "zizmor/unpinned-uses"))) 74 | | (.runs[].tool.driver.rules |= map(select(.id != "zizmor/unpinned-uses")))' \ 75 | > "${{ runner.temp }}/zizmor_results.sarif" 76 | 77 | - name: Upload zizmor results 78 | uses: github/codeql-action/upload-sarif@v4 79 | with: 80 | category: zizmor 81 | sarif_file: "${{ runner.temp }}/zizmor_results.sarif" 82 | -------------------------------------------------------------------------------- /.github/workflows/deploy.yaml: -------------------------------------------------------------------------------- 1 | name: Deploy to GitHub Pages 2 | 3 | on: 4 | push: 5 | branches: ["master"] 6 | # Allows you to run this workflow manually from the Actions tab 7 | workflow_dispatch: 8 | 9 | permissions: {} 10 | 11 | # Allow one concurrent deployment 12 | concurrency: 13 | group: "pages" 14 | cancel-in-progress: true 15 | 16 | jobs: 17 | Deploy: 18 | runs-on: ubuntu-latest 19 | permissions: 20 | contents: read 21 | id-token: write 22 | pages: write 23 | environment: 24 | name: github-pages 25 | url: ${{ steps.deployment.outputs.page_url }} 26 | steps: 27 | - name: Checkout 28 | uses: actions/checkout@v5 29 | with: 30 | persist-credentials: false 31 | 32 | - name: Setup Pages 33 | uses: actions/configure-pages@v5 34 | 35 | - name: Upload artifact 36 | uses: actions/upload-pages-artifact@v4 37 | 38 | - name: Deploy to GitHub Pages 39 | id: deployment 40 | uses: actions/deploy-pages@v4 41 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .eslintcache 2 | .stylelintcache 3 | node_modules 4 | package-lock.json 5 | -------------------------------------------------------------------------------- /.htmlvalidate.mjs: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "html-validate"; 2 | 3 | export default defineConfig({ 4 | extends: [ 5 | "html-validate:document", 6 | "html-validate:recommended" 7 | ], 8 | rules: { 9 | "heading-level": "off", 10 | "no-inline-style": "off", 11 | "require-sri": ["error", { target: "crossorigin" }], 12 | "valid-id": ["error", { relaxed: true }], 13 | "wcag/h71": "off" 14 | } 15 | }); 16 | -------------------------------------------------------------------------------- /.swcrc: -------------------------------------------------------------------------------- 1 | { 2 | "jsc": { 3 | "parser": { 4 | "syntax": "typescript" 5 | }, 6 | "target": "es2022" 7 | }, 8 | "module": { 9 | "type": "commonjs" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | qBittorrent-website 2 | === 3 | [![GitHub Actions CI Status](https://github.com/qbittorrent/qBittorrent-website/workflows/CI/badge.svg)](https://github.com/qbittorrent/qBittorrent-website/actions) 4 | 5 | This repository contains the official qBittorrent website: https://www.qbittorrent.org/ \ 6 | A backup mirror is hosted at: https://qbittorrent.github.io/qBittorrent-website/ 7 | 8 | Anyone is welcome to submit PRs that fix problems and improve things. 9 | 10 | You can also submit redesigns but first open a bug report informing us and maybe show some mockups. Otherwise, you run the risk of wasting your time in case we won't agree with the redesign. 11 | 12 | ### How to build 13 | The site uses [11ty](https://www.11ty.dev/) as a static site generator. 14 | In the git repo folder do: 15 | ```shell 16 | npm install 17 | npm run build 18 | ``` 19 | Then the site is generated under the `_site` subfolder. 20 | 21 | You can also run the following to start up a local development server: 22 | ```shell 23 | npm run serve 24 | ``` 25 | -------------------------------------------------------------------------------- /_site/.htaccess: -------------------------------------------------------------------------------- 1 | # rewrite rules 2 | 3 | # these are required for "per-directory rewrites" 4 | Options FollowSymLinks 5 | RewriteEngine On 6 | 7 | # uncomment following line if your webserver's URL is not directly related to physical file paths. 8 | RewriteBase / 9 | 10 | # disable image 'hotlinking': https://httpd.apache.org/docs/current/rewrite/access.html 11 | RewriteCond "%{HTTP_REFERER}" "!^$" 12 | RewriteCond "%{HTTP_REFERER}" "!www.qbittorrent.org" [NC] 13 | RewriteRule "\.(gif|jpg|png|svg)$" "-" [NC,F] 14 | 15 | # redirect `/file.php` to `/file` 16 | RewriteCond %{REQUEST_URI} ^/([^.]+)\.php$ [NC] 17 | RewriteRule ^(.*)$ /%1 [L,R=301] 18 | 19 | # under the hood, map `/file` back to `/file.html` 20 | RewriteCond %{REQUEST_FILENAME}.html -f 21 | RewriteRule ^(.*)$ %{REQUEST_URI}.html 22 | 23 | # redirect http -> https 24 | RewriteCond %{HTTPS} off 25 | RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [END,R=301] 26 | 27 | # redirect from top level domain to www 28 | RewriteCond %{HTTP_HOST} !^www\. [NC] 29 | RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [L,R=301] 30 | 31 | 32 | 33 | Header always set Content-Security-Policy "default-src 'self'; form-action 'none'; frame-ancestors 'self'; style-src-attr 'self' 'unsafe-inline';" 34 | Header always set Referrer-Policy "same-origin" 35 | Header always set Strict-Transport-Security "max-age=31536000" 36 | 37 | Header always set X-Content-Type-Options "nosniff" 38 | Header always set X-Frame-Options "SAMEORIGIN" 39 | Header always set X-XSS-Protection "1; mode=block" 40 | 41 | 42 | # control "max-age" & "Cache-Control" in HTTP header 43 | 44 | # for etag, exclude INode 45 | FileETag All -INode 46 | 47 | ExpiresActive On 48 | ExpiresDefault "access plus 7 days" 49 | 50 | ExpiresByType application/atom+xml "access plus 2 hour" 51 | ExpiresByType text/css "access plus 2 hours" 52 | ExpiresByType text/html "access plus 2 hours" 53 | 54 | -------------------------------------------------------------------------------- /_site/.well-known/org.flathub.VerifiedApps.txt: -------------------------------------------------------------------------------- 1 | # https://docs.flathub.org/docs/for-app-authors/verification 2 | 3 | # org.qbittorrent.qBittorrent 4 | dc1eb2a8-a568-4d09-a974-8365f33dc01f 5 | -------------------------------------------------------------------------------- /_site/css/TLbanner.css: -------------------------------------------------------------------------------- 1 | /* 2 | * https://codepo8.github.io/css-fork-on-github-ribbon/ 3 | */ 4 | 5 | #forkongithub a { 6 | background: #235092; 7 | color: #ffffff; 8 | font-family: arial, sans-serif; 9 | font-size: 1rem; 10 | font-weight: bold; 11 | line-height: 1.2rem; 12 | padding: 5px 40px; 13 | position: relative; 14 | text-align: center; 15 | text-decoration: none; 16 | transition: 0.5s; 17 | } 18 | 19 | #forkongithub a:hover { 20 | background: #cc1111; 21 | color: #ffffff; 22 | } 23 | 24 | #forkongithub a::before, 25 | #forkongithub a::after { 26 | background: #ffffff; 27 | content: ""; 28 | display: block; 29 | height: 1px; 30 | left: 0; 31 | position: absolute; 32 | top: 1px; 33 | width: 100%; 34 | } 35 | 36 | #forkongithub a::after { 37 | bottom: 1px; 38 | top: auto; 39 | } 40 | 41 | @media screen and (width >= 0) { 42 | #forkongithub { 43 | display: block; 44 | height: 200px; 45 | left: 0; 46 | overflow: hidden; 47 | pointer-events: none; 48 | position: absolute; 49 | top: 0; 50 | width: 200px; 51 | z-index: 9999; 52 | } 53 | 54 | #forkongithub a { 55 | box-shadow: 4px 4px 10px rgb(0 0 0 / 80%); 56 | left: -70px; 57 | pointer-events: auto; 58 | position: absolute; 59 | top: 50px; 60 | transform: rotate(-45deg); 61 | width: 200px; 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /_site/css/style.css: -------------------------------------------------------------------------------- 1 | /* 2 | * CSS By Christophe Dumez 3 | * Copyright (c) 2006 4 | */ 5 | 6 | body { 7 | background-color: #2f67ba; 8 | color: #282f33; 9 | font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; 10 | font-size: 16px; 11 | margin: 0; 12 | padding: 0; 13 | text-align: center; 14 | } 15 | 16 | div #LogoChris { 17 | margin: auto; 18 | max-width: 600px; 19 | min-height: 200px; 20 | position: relative; 21 | } 22 | 23 | div #mainBox { 24 | margin: 0 auto; 25 | width: 800px; 26 | } 27 | 28 | div .codePart { 29 | /*border: solid double rgb(47,103,186);*/ 30 | border-color: #2f67ba; 31 | border-style: solid double groove; 32 | font-style: italic; 33 | margin: 0 auto; 34 | width: 400px; 35 | } 36 | 37 | div .flexbox .osIcon { 38 | margin-top: 20px; 39 | min-width: 135px; 40 | } 41 | 42 | div .flexbox { 43 | align-items: flex-start; 44 | display: flex; 45 | justify-content: flex-start; 46 | } 47 | 48 | div .flexbox_screenshots { 49 | align-items: flex-start; 50 | display: flex; 51 | flex-flow: row wrap; 52 | gap: 1.5em 1em; 53 | } 54 | 55 | div .flexbox_screenshots figure { 56 | margin: 0; 57 | text-align: center; 58 | } 59 | 60 | div .flexbox_screenshots figure img { 61 | margin-left: auto; 62 | margin-right: auto; 63 | } 64 | 65 | @media only screen and (width <= 760px) and (orientation: portrait) { 66 | div .flexbox .box1 { 67 | min-width: auto; 68 | } 69 | 70 | div .flexbox { 71 | flex-direction: column; 72 | width: auto; 73 | } 74 | } 75 | 76 | div .teamInfo { 77 | float: left; 78 | } 79 | 80 | fieldset.teamFieldset { 81 | background-color: #efefef; 82 | } 83 | 84 | h2 { 85 | /* background-color: #ADD15A; */ 86 | color: #4394e8; 87 | display: block; 88 | font-family: "Trebuchet MS", Arial, Helvetica, sans-serif; 89 | font-size: 2em; 90 | margin: 0; 91 | } 92 | 93 | h2 a.header-anchor { 94 | color: inherit; 95 | text-decoration: none; 96 | } 97 | 98 | h3 { 99 | /* background-color: #ADD15A; */ 100 | border-bottom: 1px solid #d9dee1; 101 | clear: both; 102 | color: #282f33; 103 | display: block; 104 | font-family: "Trebuchet MS", Arial, Helvetica, sans-serif; 105 | font-size: 1.4em; 106 | /*font-weight: lighter;*/ 107 | margin: 15px 0 10px; 108 | } 109 | 110 | h3 a.header-anchor { 111 | color: inherit; 112 | text-decoration: none; 113 | } 114 | 115 | img { 116 | border: 0; 117 | display: block; 118 | } 119 | 120 | img.banner { 121 | max-width: 100%; 122 | position: absolute; 123 | top: 50%; 124 | } 125 | 126 | img.flag { 127 | display: inline-block; 128 | height: 1.1em; 129 | vertical-align: middle; 130 | } 131 | 132 | img.rss { 133 | display: initial; 134 | float: right; 135 | height: 1.2em; 136 | } 137 | 138 | img.teamUserIcon { 139 | height: 8em; 140 | width: 8em; 141 | } 142 | 143 | ol { 144 | padding-left: 2em; 145 | } 146 | 147 | p.copyright { 148 | color: #ffffff; 149 | font-size: 0.75em; 150 | margin: 0 auto; 151 | max-width: 800px; 152 | padding: 0; 153 | padding-top: 15px; 154 | text-align: center; 155 | } 156 | 157 | .copyright a { 158 | color: #ffffff; 159 | } 160 | 161 | ul { 162 | padding-left: 2em; 163 | } 164 | 165 | .invisible { 166 | display: none; 167 | } 168 | 169 | .menu ul li a { 170 | color: #ffffff; 171 | font-family: "Trebuchet MS", Arial, Helvetica, sans-serif; 172 | font-size: 1.05em; 173 | text-decoration: none; 174 | } 175 | 176 | .menu ul li a:hover { 177 | color: #aad5ff; 178 | } 179 | 180 | .menu ul li { 181 | border-left: 1px solid #49565d; 182 | display: inline; 183 | margin-left: 5px; 184 | padding-left: 10px; 185 | } 186 | 187 | .menu ul li.first { 188 | border-left: 0 solid #49565d; 189 | margin-left: 0; 190 | padding-left: 0; 191 | } 192 | 193 | .menu ul li.last { 194 | border-right: 0 solid #49565d; 195 | margin-right: 0; 196 | padding-right: 0; 197 | } 198 | 199 | .menu ul { 200 | list-style-type: none; 201 | margin: 0; 202 | padding: 0 0 15px; 203 | text-align: center; 204 | } 205 | 206 | .menu { 207 | background-color: transparent; 208 | } 209 | 210 | .nobr { 211 | white-space: nowrap; 212 | } 213 | 214 | .stretcher a { 215 | color: #0e4fb0; 216 | } 217 | 218 | .stretcher a:hover { 219 | text-decoration: none; 220 | } 221 | 222 | .stretcher { 223 | font-size: 0.875em; 224 | padding: 0 30px; 225 | } 226 | 227 | .wordBreak { 228 | word-break: break-all; 229 | } 230 | 231 | .wrapper { 232 | background-color: #ffffff; 233 | border: 2px solid white; 234 | border-radius: 20px; 235 | box-shadow: inset 0 55px 25px -25px #e6e6e6; 236 | margin: 0 auto; 237 | max-width: 920px; 238 | text-align: left; 239 | } 240 | 241 | .wrapper-bottom { 242 | padding-bottom: 15px; 243 | } 244 | 245 | .wrapper-top { 246 | padding-top: 15px; 247 | } 248 | 249 | .releaseParagraph { 250 | font-size: 130%; 251 | margin-bottom: 3pt; 252 | } 253 | 254 | summary:hover { 255 | cursor: pointer; 256 | } 257 | 258 | .downloadsOptions { 259 | font-size: 85%; 260 | } 261 | 262 | .downloads-table { 263 | width: 100%; 264 | } 265 | 266 | .downloads-table, 267 | .downloads-table th, 268 | .downloads-table td { 269 | border: 1px solid black; 270 | border-collapse: collapse; 271 | } 272 | 273 | .downloads-table tr:not(:first-child):hover { 274 | background-color: #cfe0f3; 275 | } 276 | 277 | .downloadNotesDiv { 278 | background-color: lemonchiffon; 279 | border-left: 4pt solid gold; 280 | padding: 1em; 281 | } 282 | -------------------------------------------------------------------------------- /_site/donate.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | qBittorrent Official Website 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | Latest: v5.1.2 29 | 30 | 31 |
32 |
33 | 34 |
35 | 36 | 48 | 49 |
50 |
51 |
52 |
53 |
54 |

Donation options

55 |

qBittorrent is developed by volunteers on their spare time. If you like this piece of software, consider making a donation.
56 | Donations are welcome as a "Thank you" for the software. You can choose to donate for the costs of the server (website, forum, domain name) and/or to the lead programmers. You are encouraged to give a slight preference to server costs. eg 70% to server and 30% to lead programmers. 57 |

58 |

Donation info (lead programmers are mentioned by their github username):

59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 |
MemberRoleDonation link
server iconServerWebsite, forum, domain namePayPal
glassez avatarglassezLead programmerTake a look at his donation page.
Chocobo1 avatarChocobo1Lead programmerTake a look at his donation page.
92 | 93 |
94 |
95 |
96 |
97 |
98 | 105 |
106 | 107 | 108 | -------------------------------------------------------------------------------- /_site/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/_site/favicon.ico -------------------------------------------------------------------------------- /_site/favicon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /_site/img/QBt-download-150.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/_site/img/QBt-download-150.webp -------------------------------------------------------------------------------- /_site/img/TLbannerNew.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/_site/img/TLbannerNew.xcf -------------------------------------------------------------------------------- /_site/img/flags/fr.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /_site/img/flags/gr.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /_site/img/flags/hu.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /_site/img/flags/pl.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /_site/img/github.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /_site/img/os/altlinux.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/_site/img/os/altlinux.webp -------------------------------------------------------------------------------- /_site/img/os/archlinux.svg: -------------------------------------------------------------------------------- 1 | TMTM -------------------------------------------------------------------------------- /_site/img/os/blackPanther-dark.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/_site/img/os/blackPanther-dark.webp -------------------------------------------------------------------------------- /_site/img/os/debian.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /_site/img/os/docker.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/_site/img/os/docker.webp -------------------------------------------------------------------------------- /_site/img/os/ecs_logo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/_site/img/os/ecs_logo.webp -------------------------------------------------------------------------------- /_site/img/os/fedoralogo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/_site/img/os/fedoralogo.webp -------------------------------------------------------------------------------- /_site/img/os/flatpak.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /_site/img/os/gentoo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /_site/img/os/haiku.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/_site/img/os/haiku.webp -------------------------------------------------------------------------------- /_site/img/os/macoslogo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/_site/img/os/macoslogo.webp -------------------------------------------------------------------------------- /_site/img/os/mageia.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/_site/img/os/mageia.webp -------------------------------------------------------------------------------- /_site/img/os/opensuse.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /_site/img/os/pardus.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/_site/img/os/pardus.webp -------------------------------------------------------------------------------- /_site/img/os/slackware.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/_site/img/os/slackware.webp -------------------------------------------------------------------------------- /_site/img/os/ubuntu.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /_site/img/os/winlogo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/_site/img/os/winlogo.webp -------------------------------------------------------------------------------- /_site/img/qb_banner.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/_site/img/qb_banner.webp -------------------------------------------------------------------------------- /_site/img/qb_oldbanner.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/_site/img/qb_oldbanner.webp -------------------------------------------------------------------------------- /_site/img/review2_5_qBittorrent_award.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/_site/img/review2_5_qBittorrent_award.webp -------------------------------------------------------------------------------- /_site/img/rss-color.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /_site/img/screenshots/linux/1.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/_site/img/screenshots/linux/1.webp -------------------------------------------------------------------------------- /_site/img/screenshots/linux/2.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/_site/img/screenshots/linux/2.webp -------------------------------------------------------------------------------- /_site/img/screenshots/linux/3.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/_site/img/screenshots/linux/3.webp -------------------------------------------------------------------------------- /_site/img/screenshots/linux/4.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/_site/img/screenshots/linux/4.webp -------------------------------------------------------------------------------- /_site/img/screenshots/linux/5.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/_site/img/screenshots/linux/5.webp -------------------------------------------------------------------------------- /_site/img/tar-logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /_site/img/team/Chocobo1.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/_site/img/team/Chocobo1.webp -------------------------------------------------------------------------------- /_site/img/team/chris.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/_site/img/team/chris.webp -------------------------------------------------------------------------------- /_site/img/team/glassez.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/_site/img/team/glassez.jpeg -------------------------------------------------------------------------------- /_site/img/translate.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /_site/img/user_font_awesome.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /_site/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | qBittorrent Official Website 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | Latest: v5.1.2 29 | 30 | 31 |
32 |
33 | 34 |
35 | 36 | 48 | 49 |
50 |
51 |
52 |
53 |
54 | 55 |

About qBittorrent

56 |

download link 57 | The qBittorrent project aims to provide an open-source software alternative to µTorrent.

58 |

Additionally, qBittorrent runs and provides the same features on all major platforms (FreeBSD, Linux, macOS, OS/2, Windows).

59 |

qBittorrent is based on the Qt toolkit and libtorrent-rasterbar library.

60 |

Help qBittorrent

61 |

qBittorrent is developed by volunteers in their spare time.

62 |

If you like this piece of software, please make a donation and help it survive.

63 |

See our donation page for more info.

64 |

If you want to help in translating qBittorrent, see these instructions.

65 |

qBittorrent Features

66 |
    67 |
  • Polished µTorrent-like User Interface
  • 68 |
  • No Ads
  • 69 |
  • Well-integrated and extensible Search Engine 70 |
      71 |
    • Simultaneous search in many Torrent search sites
    • 72 |
    • Category-specific search requests (e.g. Books, Music, Software)
    • 73 |
    74 |
  • 75 |
  • RSS feed support with advanced download filters (incl. regex)
  • 76 |
  • Many Bittorrent extensions supported: 77 |
      78 |
    • Magnet links
    • 79 |
    • Distributed hash table (DHT), peer exchange protocol (PEX), local peer discovery (LSD)
    • 80 |
    • Private torrents
    • 81 |
    • Encrypted connections
    • 82 |
    • and many more...
    • 83 |
    84 |
  • 85 |
  • Remote control through Web user interface, written with AJAX 86 |
      87 |
    • Nearly identical to the regular GUI
    • 88 |
    89 |
  • 90 |
  • Sequential downloading (Download in order)
  • 91 |
  • Advanced control over torrents, trackers and peers 92 |
      93 |
    • Torrents queueing and prioritizing
    • 94 |
    • Torrent content selection and prioritizing
    • 95 |
    96 |
  • 97 |
  • Bandwidth scheduler
  • 98 |
  • Torrent creation tool
  • 99 |
  • IP Filtering (eMule & PeerGuardian format compatible)
  • 100 |
  • IPv6 compliant
  • 101 |
  • UPnP / NAT-PMP port forwarding support
  • 102 |
  • Available on all platforms: Windows, Linux, macOS, FreeBSD, OS/2
  • 103 |
  • Available in ~70 languages
  • 104 |
105 |

Go ahead and try qBittorrent, you won't regret it!

106 | 107 |
108 |
109 |
110 |
111 |
112 | 119 |
120 | 121 | 122 | -------------------------------------------------------------------------------- /_site/openapi-demo/authcontroller.yml: -------------------------------------------------------------------------------- 1 | login: 2 | post: 3 | summary: Login 4 | description: Login and get SID cookie 5 | security: [ ] 6 | requestBody: 7 | required: true 8 | content: 9 | application/x-www-form-urlencoded: 10 | schema: 11 | type: object 12 | properties: 13 | username: 14 | type: string 15 | password: 16 | type: string 17 | required: ['username', 'password'] 18 | responses: 19 | '200': 20 | description: Login success or failure based on the response string. If login succeeded, the authorization cookie will be set. The cookie name might be configured to a different name by the user. 21 | headers: 22 | SID: 23 | required: false 24 | content: 25 | text/plain; charset=UTF-8: 26 | schema: 27 | oneOf: 28 | - type: string 29 | const: 'Ok.' 30 | - type: string 31 | const: 'Fails.' 32 | '403': 33 | $ref: 'main.yml#/components/responses/403forbidden' 34 | logout: 35 | get: 36 | summary: Logout 37 | description: Logout and unset auth cookie. The cookie name might be configured to a different name by the user. 38 | responses: 39 | '200': 40 | description: OK 41 | headers: 42 | SID: 43 | required: false 44 | -------------------------------------------------------------------------------- /_site/openapi-demo/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /_site/openapi-demo/main.yml: -------------------------------------------------------------------------------- 1 | openapi: '3.1.0' 2 | info: 3 | description: This is the specification for qBittorrent's web API 4 | title: qBittorrent WebAPI 5 | version: '2.11.2' 6 | servers: 7 | - url: 'https://localhost:{port}/api/v2' 8 | variables: 9 | port: 10 | default: "8080" 11 | components: 12 | securitySchemes: 13 | defaultApiKey: 14 | description: API key cookie provided when logged in successfully. The cookie name might be configured to a different name by the user. 15 | type: apiKey 16 | name: SID 17 | in: cookie 18 | responses: 19 | 200simpleOK: 20 | description: OK 21 | 200TextOK: 22 | description: OK 23 | content: 24 | text/plain; charset=UTF-8: 25 | schema: 26 | type: string 27 | 400badRequest: 28 | description: Bad Request 29 | content: 30 | text/plain; charset=UTF-8: 31 | schema: 32 | type: string 33 | 401unauthorized: 34 | description: Unauthorized 35 | content: 36 | text/plain; charset=UTF-8: 37 | schema: 38 | type: string 39 | 403forbidden: 40 | description: Forbidden 41 | content: 42 | text/plain; charset=UTF-8: 43 | schema: 44 | type: string 45 | 404notFound: 46 | description: Not Found 47 | content: 48 | text/plain; charset=UTF-8: 49 | schema: 50 | type: string 51 | 405methodNotAllowed: 52 | description: Method Not Allowed 53 | content: 54 | text/plain; charset=UTF-8: 55 | schema: 56 | type: string 57 | 409conflict: 58 | description: Conflict 59 | content: 60 | text/plain; charset=UTF-8: 61 | schema: 62 | type: string 63 | 415unsupportedMediaType: 64 | description: Unsupported Media Type 65 | content: 66 | text/plain; charset=UTF-8: 67 | schema: 68 | type: string 69 | 500internalServerError: 70 | description: Internal Server Error 71 | content: 72 | text/plain; charset=UTF-8: 73 | schema: 74 | type: string 75 | security: 76 | - defaultApiKey: [] 77 | paths: 78 | /transfer/info: 79 | $ref: 'transfercontroller.yml#/info' 80 | /transfer/uploadLimit: 81 | $ref: 'transfercontroller.yml#/uploadLimit' 82 | /transfer/downloadLimit: 83 | $ref: 'transfercontroller.yml#/downloadLimit' 84 | /transfer/setUploadLimit: 85 | $ref: 'transfercontroller.yml#/setUploadLimit' 86 | /transfer/setDownloadLimit: 87 | $ref: 'transfercontroller.yml#/setDownloadLimit' 88 | /transfer/toggleSpeedLimitsMode: 89 | $ref: 'transfercontroller.yml#/toggleSpeedLimitsMode' 90 | /transfer/speedLimitsMode: 91 | $ref: 'transfercontroller.yml#/speedLimitsMode' 92 | /transfer/setSpeedLimitsMode: 93 | $ref: 'transfercontroller.yml#/setSpeedLimitsMode' 94 | /transfer/banPeers: 95 | $ref: 'transfercontroller.yml#/banPeers' 96 | /auth/login: 97 | $ref: 'authcontroller.yml#/login' 98 | /auth/logout: 99 | $ref: 'authcontroller.yml#/logout' 100 | -------------------------------------------------------------------------------- /_site/openapi-demo/transfercontroller.yml: -------------------------------------------------------------------------------- 1 | info: 2 | get: 3 | summary: Get the global transfer information 4 | responses: 5 | '200': 6 | description: OK 7 | content: 8 | application/json: 9 | schema: 10 | type: object 11 | properties: 12 | dl_info_speed: 13 | description: Global download rate in bytes per second 14 | type: number 15 | dl_info_data: 16 | description: Data downloaded this session in bytes 17 | type: number 18 | dl_rate_limit: 19 | description: Download rate limit in bytes per second 20 | type: number 21 | up_info_speed: 22 | description: Global upload rate in bytes per second 23 | type: number 24 | up_info_data: 25 | description: Data uploaded this session in bytes 26 | type: number 27 | up_rate_limit: 28 | description: Upload rate limit in bytes per second 29 | type: number 30 | dht_nodes: 31 | description: Number of DHT nodes connected to 32 | type: number 33 | connection_status: 34 | description: Connection status 35 | type: string 36 | enum: 37 | - connected 38 | - firewalled 39 | - disconnected 40 | required: 41 | - 'dl_info_speed' 42 | - 'dl_info_data' 43 | - 'dl_rate_limit' 44 | - 'up_info_speed' 45 | - 'up_info_data' 46 | - 'up_rate_limit' 47 | - 'dht_nodes' 48 | - 'connection_status' 49 | '403': 50 | $ref: 'main.yml#/components/responses/403forbidden' 51 | uploadLimit: 52 | get: 53 | summary: Get upload speed limit 54 | responses: 55 | '200': 56 | $ref: 'main.yml#/components/responses/200TextOK' 57 | '403': 58 | $ref: 'main.yml#/components/responses/403forbidden' 59 | downloadLimit: 60 | get: 61 | summary: Get download speed limit 62 | responses: 63 | '200': 64 | $ref: 'main.yml#/components/responses/200TextOK' 65 | '403': 66 | $ref: 'main.yml#/components/responses/403forbidden' 67 | setUploadLimit: 68 | post: 69 | summary: Set upload speed limit 70 | requestBody: 71 | required: true 72 | content: 73 | application/x-www-form-urlencoded: 74 | schema: 75 | type: object 76 | properties: 77 | limit: 78 | description: Speed limit in bytes per second. Negative values disable the limit. Non-negative values below 1024 are clamped to 1024. 79 | type: number 80 | required: ['limit'] 81 | responses: 82 | '200': 83 | $ref: 'main.yml#/components/responses/200simpleOK' 84 | '403': 85 | $ref: 'main.yml#/components/responses/403forbidden' 86 | setDownloadLimit: 87 | post: 88 | summary: Set download speed limit 89 | requestBody: 90 | required: true 91 | content: 92 | application/x-www-form-urlencoded: 93 | schema: 94 | type: object 95 | properties: 96 | limit: 97 | description: Speed limit in bytes per second. Negative values disable the limit. Non-negative values below 1024 are clamped to 1024. 98 | type: number 99 | required: ['limit'] 100 | responses: 101 | '200': 102 | $ref: 'main.yml#/components/responses/200simpleOK' 103 | '403': 104 | $ref: 'main.yml#/components/responses/403forbidden' 105 | toggleSpeedLimitsMode: 106 | post: 107 | summary: Toggle speed limit mode 108 | description: Toggle speed limit mode between normal and alternative 109 | responses: 110 | '200': 111 | $ref: 'main.yml#/components/responses/200simpleOK' 112 | '403': 113 | $ref: 'main.yml#/components/responses/403forbidden' 114 | speedLimitsMode: 115 | get: 116 | summary: Get speed limit mode 117 | description: '`1` means alternative mode and `0` normal mode' 118 | responses: 119 | '200': 120 | description: OK 121 | content: 122 | text/plain; charset=UTF-8: 123 | schema: 124 | type: number 125 | enum: 126 | - 0 127 | - 1 128 | '403': 129 | $ref: 'main.yml#/components/responses/403forbidden' 130 | setSpeedLimitsMode: 131 | post: 132 | summary: Set speed limit mode 133 | requestBody: 134 | required: true 135 | content: 136 | application/x-www-form-urlencoded: 137 | schema: 138 | type: object 139 | properties: 140 | mode: 141 | description: '`1` means alternative mode and `0` normal mode.' 142 | type: number 143 | enum: 144 | - 0 145 | - 1 146 | required: ['mode'] 147 | responses: 148 | '200': 149 | $ref: 'main.yml#/components/responses/200simpleOK' 150 | '400': 151 | $ref: 'main.yml#/components/responses/400badRequest' 152 | '403': 153 | $ref: 'main.yml#/components/responses/403forbidden' 154 | banPeers: 155 | post: 156 | summary: Ban peers 157 | requestBody: 158 | required: true 159 | content: 160 | application/x-www-form-urlencoded: 161 | schema: 162 | type: object 163 | properties: 164 | peers: 165 | description: List of peer IPs to ban. Each list item is separated by the `|` character. 166 | type: string 167 | required: ['peers'] 168 | responses: 169 | '200': 170 | $ref: 'main.yml#/components/responses/200simpleOK' 171 | '403': 172 | $ref: 'main.yml#/components/responses/403forbidden' 173 | -------------------------------------------------------------------------------- /_site/screenshots.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | qBittorrent Official Website 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | Latest: v5.1.2 29 | 30 | 31 |
32 |
33 | 34 |
35 | 36 | 48 | 49 |
50 |
51 |
52 |
53 |
54 |

Screenshots

55 | 56 |

57 | Linux 58 |

59 |
60 |
61 | 62 | Main window (General tab collapsed) 63 | 64 |
Main window (General tab collapsed)
65 |
66 |
67 | 68 | Main window (General tab expanded) 69 | 70 |
Main window (General tab expanded)
71 |
72 |
73 | 74 | Options dialog 75 | 76 |
Options dialog
77 |
78 |
79 | 80 | Search engine 81 | 82 |
Search engine
83 |
84 |
85 | 86 | Search engine 87 | 88 |
Running headless (nox) version
89 |
90 |
91 | 92 |
93 |
94 |
95 |
96 |
97 | 104 |
105 | 106 | 107 | -------------------------------------------------------------------------------- /_site/scripts/download.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | document.addEventListener("DOMContentLoaded", ()=>{ 3 | const distroSelect = document.getElementById("distroSelect"); 4 | const showOption = (element)=>{ 5 | const hideOptionDivs = (element)=>{ 6 | for (const option of element.options)document.getElementById(`${option.value}Div`)?.classList.add("invisible"); 7 | }; 8 | // reset all 9 | if (element.id === "OSSelect") { 10 | hideOptionDivs(element); 11 | distroSelect.value = "emptyDist"; 12 | } 13 | hideOptionDivs(distroSelect); 14 | // show selected 15 | document.getElementById(`${element.value}Div`)?.classList.remove("invisible"); 16 | }; 17 | const osSelect = document.getElementById("OSSelect"); 18 | osSelect.addEventListener("change", (_event)=>{ 19 | showOption(osSelect); 20 | }); 21 | osSelect.value = "emptyOS"; 22 | distroSelect.addEventListener("change", (_event)=>{ 23 | showOption(distroSelect); 24 | }); 25 | distroSelect.value = "emptyDist"; 26 | }); 27 | -------------------------------------------------------------------------------- /_site/team.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | qBittorrent Official Website 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | Latest: v5.1.2 29 | 30 | 31 |
32 |
33 | 34 |
35 | 36 | 48 | 49 |
50 |
51 |
52 |
53 |
54 |

Project Maintainer

55 |
56 |
57 | no image 58 |
59 |
60 |
    61 |
  • Nickname: sledgehammer999
  • 62 |
  • Role: Project maintainer and main developer
  • 63 |
  • Country: Greek
  • 64 |
  • Mail: sledgehammer999 (at) qbittorrent (dot) org
  • 65 |
66 |
67 |
68 | 69 |

Forum Administrator

70 |
71 |
72 | no image 73 |
74 |
75 |
    76 |
  • Name: Zsolt Peter Basak
  • 77 |
  • Role: Forum administrator and owner
  • 78 |
  • Country: Hungarian
  • 79 |
  • Mail: zsoltpeterbasak (at) gmail (dot) com
  • 80 |
81 |
82 |
83 | 84 |

Team Members

85 |
86 |
87 | github icon 88 |
89 |
90 | 93 |
94 |
95 | 96 |

Contributors

97 |
98 |
99 | github icon 100 |
101 |
102 | 105 |
106 |
107 | 108 |

Translators

109 |
110 |
111 | translation icon 112 |
113 |
114 | 117 |
118 |
119 | 120 |

Project Founder (Emeritus)

121 |
122 |
123 | Christophe Dumez image 124 |
125 |
126 |
    127 |
  • Name: Christophe Dumez
  • 128 |
  • Role: Project founder and developer (inactive)
  • 129 |
  • Country: French
  • 130 |
  • Mail: chris (at) qbittorrent (dot) org
  • 131 |
132 |
133 |
134 | 135 |

Project Graphist (Emeritus)

136 |
137 |
138 | no image 139 |
140 |
141 |
    142 |
  • Name: Mateusz Toboła (aka "Tobejodok")
  • 143 |
  • Role: Software and website artwork
  • 144 |
  • Country: Polish
  • 145 |
  • Mail: tobejodok (at) qbittorrent (dot) org
  • 146 |
147 |
148 |
149 | 150 |
151 |
152 |
153 |
154 |
155 | 162 |
163 | 164 | 165 | -------------------------------------------------------------------------------- /_site/versions.json: -------------------------------------------------------------------------------- 1 | { 2 | "win": { "version": "5.1.2"}, 3 | "macos": { "version": "5.1.2"} 4 | } 5 | -------------------------------------------------------------------------------- /atom_generator/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "atom_generator", 3 | "version": "1.0.0", 4 | "main": "src/main.ts", 5 | "scripts": { 6 | "generate": "ts-node src/main.ts" 7 | }, 8 | "author": "Chocobo1 (Mike Tzou)", 9 | "license": "GPL-3.0-or-later", 10 | "description": "Parse HTML file and generate Atom feed", 11 | "dependencies": { 12 | "cheerio": "^1.1.0", 13 | "commander": "^12.1.0", 14 | "swc": "*", 15 | "ts-node": "*", 16 | "xmlbuilder2": "^3.1.1" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /atom_generator/src/main.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Atom Generator - Parse HTML file and generate Atom feed 3 | * Copyright (C) 2024 Mike Tzou (Chocobo1) 4 | * 5 | * This program is free software: you can redistribute it and/or 6 | * modify it under the terms of the GNU General Public License 7 | * as published by the Free Software Foundation, either version 3 8 | * of the License, or (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see . 17 | */ 18 | 19 | import * as Cheerio from 'cheerio'; 20 | import * as Commander from 'commander'; 21 | import * as Fs from 'node:fs'; 22 | import * as Xmlbuilder2 from 'xmlbuilder2'; 23 | 24 | function generateAtom(path: string): string { 25 | /* Example: 26 | 27 | 28 | qBittorrent News 29 | https://www.qbittorrent.org/news_feed.atom 30 | 31 | The qBittorrent project 32 | 33 | 34 | 35 | 2024-07-01T01:02:03Z 36 | 37 | qBittorrent v4.6.4 and v5.0.0beta1 releases 38 | https://www.qbittorrent.org/news#sun-mar-24th-2024---qbittorrent-v4.6.4-and-v5.0.0beta1-releases 39 | 40 | 2024-03-23T00:00:00.000Z 41 | 2024-03-23T00:00:00.000Z 42 | 43 | The qBittorrent project 44 | 45 | 46 | qBittorrent v4.6.4 and v5.0.0beta1 were released... 47 | ...Full changes 48 | 49 | 50 | 51 | */ 52 | 53 | // helpers 54 | const toDate = (dateStr: string): Date => { 55 | dateStr = dateStr 56 | .replaceAll(/(\d)nd/g, '$1') 57 | .replaceAll(/(\d)rd/g, '$1') 58 | .replaceAll(/(\d)st/g, '$1') 59 | .replaceAll(/(\d)th/g, '$1') 60 | + " 00:00Z"; 61 | return new Date(dateStr); 62 | }; 63 | 64 | // build feed 65 | const lastModifiedDate = Fs.statSync(path).mtime; 66 | const docOptions = { 67 | encoding: 'UTF-8' 68 | }; 69 | const doc = Xmlbuilder2.create(docOptions) 70 | .ele('feed', { xmlns: 'http://www.w3.org/2005/Atom' }) 71 | .ele('title').txt('qBittorrent News').up() 72 | .ele('id').txt('https://www.qbittorrent.org/news_feed.atom').up() 73 | .ele('contributor') 74 | .ele('name').txt('The qBittorrent project').up().up() 75 | .ele('link', { href: 'https://www.qbittorrent.org/news_feed.atom', rel: 'self' }).up() 76 | .ele('link', { href: 'https://www.qbittorrent.org/news'}).up() 77 | .ele('updated').txt(lastModifiedDate.toISOString()).up() 78 | .doc(); 79 | const feedElement = doc.first(); 80 | 81 | // process html 82 | const html: string = Fs.readFileSync(path, { encoding: 'utf8' }); 83 | 84 | for (let startIdx = html.indexOf('

= 0; ) { 85 | const endIdx = html.indexOf('

= 0) 87 | ? endIdx 88 | : html.indexOf('', (startIdx + 4))); // don't include footer in the last post 89 | const post = html.slice(startIdx, postEndIdx); 90 | startIdx = endIdx; 91 | 92 | // parse 93 | const $ = Cheerio.load(post, undefined, false); 94 | const h3Element = $('h3'); 95 | const [postDate, entryTitle] = h3Element.text().split('-').map(s => s.trim()); 96 | 97 | // generate feed entry 98 | const entryLink = `https://www.qbittorrent.org/news#${h3Element.attr('id')}`; 99 | const entryDate = toDate(postDate).toISOString(); 100 | const entryContent = post.split('

')[1].trim(); 101 | const entry = Xmlbuilder2.fragment(docOptions) 102 | .ele('entry') 103 | .ele('title').txt(entryTitle).up() 104 | .ele('id').txt(entryLink).up() 105 | .ele('link', { href: entryLink}).up() 106 | .ele('updated').txt(entryDate).up() 107 | .ele('published').txt(entryDate).up() 108 | .ele('author') 109 | .ele('name').txt('The qBittorrent project').up().up() 110 | .ele('content', { type: 'html' }).txt(entryContent).up() 111 | .doc(); 112 | feedElement.import(entry); 113 | } 114 | 115 | const xmlString = doc.end({ prettyPrint: true }); 116 | return xmlString; 117 | } 118 | 119 | function main() { 120 | Commander.program 121 | .description("Parse HTML file and generate ATOM feed") 122 | .requiredOption('-i ', "News.html file path") 123 | .requiredOption('-o ', "Atom feed output file path") 124 | .parse(); 125 | 126 | const options = Commander.program.opts(); 127 | const inputPath = options.i[0]; 128 | const outputPath = options.o; 129 | 130 | const atomData = generateAtom(inputPath); 131 | Fs.writeFileSync(outputPath, atomData); 132 | } 133 | main(); 134 | -------------------------------------------------------------------------------- /atom_generator/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": 3 | { 4 | "module": "nodenext", 5 | "noImplicitAny": true, 6 | "strict": true, 7 | "target": "ES2022" 8 | }, 9 | "ts-node": { 10 | "swc": true 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import ESLint from "@eslint/js"; 2 | import Globals from "globals"; 3 | import Html from "eslint-plugin-html"; 4 | import Stylistic from '@stylistic/eslint-plugin'; 5 | import TsESLint from 'typescript-eslint'; 6 | 7 | export default [ 8 | ESLint.configs.recommended, 9 | Stylistic.configs['disable-legacy'], 10 | ...TsESLint.configs.strictTypeChecked, 11 | ...TsESLint.configs.stylisticTypeChecked, 12 | { 13 | files: [ 14 | "**/*.html", 15 | "**/*.ts" 16 | ], 17 | languageOptions: { 18 | ecmaVersion: 2023, 19 | globals: { 20 | ...Globals.browser 21 | }, 22 | parserOptions: { 23 | projectService: true, 24 | tsconfigDirName: import.meta.dirname, 25 | } 26 | }, 27 | plugins: { 28 | Html, 29 | Stylistic 30 | }, 31 | rules: { 32 | "curly": ["error", "multi-or-nest", "consistent"], 33 | "eqeqeq": "error", 34 | "guard-for-in": "error", 35 | "no-undef": "off", 36 | "no-unused-vars": "off", 37 | "no-var": "error", 38 | "operator-assignment": "error", 39 | "prefer-arrow-callback": "error", 40 | "prefer-const": "error", 41 | "radix": "error", 42 | "@typescript-eslint/no-unused-vars": [ 43 | "error", 44 | { 45 | "argsIgnorePattern": "^_", 46 | "caughtErrorsIgnorePattern": "^_", 47 | "varsIgnorePattern": "^_", 48 | } 49 | ], 50 | "Stylistic/no-mixed-operators": [ 51 | "error", 52 | { 53 | "groups": [ 54 | ["&", "|", "^", "~", "<<", ">>", ">>>", "==", "!=", "===", "!==", ">", ">=", "<", "<=", "&&", "||", "in", "instanceof"] 55 | ] 56 | } 57 | ], 58 | "Stylistic/nonblock-statement-body-position": ["error", "below"], 59 | "Stylistic/quotes": [ 60 | "error", 61 | "double", 62 | { 63 | "avoidEscape": true, 64 | "allowTemplateLiterals": "avoidEscape" 65 | } 66 | ], 67 | "Stylistic/semi": "error", 68 | "Stylistic/spaced-comment": ["error", "always", { "exceptions": ["*"] }] 69 | } 70 | } 71 | ]; 72 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "qBittorrent-website", 3 | "description": "qBittorrent website", 4 | "repository": { 5 | "type": "git", 6 | "url": "https://github.com/qbittorrent/qBittorrent-website.git" 7 | }, 8 | "scripts": { 9 | "build": "eleventy", 10 | "check-html": "html-validate _site/*.html", 11 | "format": "prettier --write **.css", 12 | "lint": "tsc --noEmit && eslint --cache src/scripts/**.ts && stylelint --cache **/*.css", 13 | "serve": "eleventy --serve" 14 | }, 15 | "type": "module", 16 | "devDependencies": { 17 | "@11ty/eleventy": "3", 18 | "@stylistic/eslint-plugin": "*", 19 | "eslint": "*", 20 | "eslint-plugin-html": "*", 21 | "html-validate": "*", 22 | "js-beautify": "*", 23 | "markdown-it-anchor": "*", 24 | "prettier": "*", 25 | "stylelint": "*", 26 | "stylelint-config-standard": "*", 27 | "stylelint-order": "*", 28 | "swc": "*", 29 | "typescript": "*", 30 | "typescript-eslint": "*" 31 | }, 32 | "workspaces": [ 33 | "atom_generator" 34 | ] 35 | } 36 | -------------------------------------------------------------------------------- /src/.htaccess: -------------------------------------------------------------------------------- 1 | # rewrite rules 2 | 3 | # these are required for "per-directory rewrites" 4 | Options FollowSymLinks 5 | RewriteEngine On 6 | 7 | # uncomment following line if your webserver's URL is not directly related to physical file paths. 8 | RewriteBase / 9 | 10 | # disable image 'hotlinking': https://httpd.apache.org/docs/current/rewrite/access.html 11 | RewriteCond "%{HTTP_REFERER}" "!^$" 12 | RewriteCond "%{HTTP_REFERER}" "!www.qbittorrent.org" [NC] 13 | RewriteRule "\.(gif|jpg|png|svg)$" "-" [NC,F] 14 | 15 | # redirect `/file.php` to `/file` 16 | RewriteCond %{REQUEST_URI} ^/([^.]+)\.php$ [NC] 17 | RewriteRule ^(.*)$ /%1 [L,R=301] 18 | 19 | # under the hood, map `/file` back to `/file.html` 20 | RewriteCond %{REQUEST_FILENAME}.html -f 21 | RewriteRule ^(.*)$ %{REQUEST_URI}.html 22 | 23 | # redirect http -> https 24 | RewriteCond %{HTTPS} off 25 | RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [END,R=301] 26 | 27 | # redirect from top level domain to www 28 | RewriteCond %{HTTP_HOST} !^www\. [NC] 29 | RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [L,R=301] 30 | 31 | 32 | 33 | Header always set Content-Security-Policy "default-src 'self'; form-action 'none'; frame-ancestors 'self'; style-src-attr 'self' 'unsafe-inline';" 34 | Header always set Referrer-Policy "same-origin" 35 | Header always set Strict-Transport-Security "max-age=31536000" 36 | 37 | Header always set X-Content-Type-Options "nosniff" 38 | Header always set X-Frame-Options "SAMEORIGIN" 39 | Header always set X-XSS-Protection "1; mode=block" 40 | 41 | 42 | # control "max-age" & "Cache-Control" in HTTP header 43 | 44 | # for etag, exclude INode 45 | FileETag All -INode 46 | 47 | ExpiresActive On 48 | ExpiresDefault "access plus 7 days" 49 | 50 | ExpiresByType application/atom+xml "access plus 2 hour" 51 | ExpiresByType text/css "access plus 2 hours" 52 | ExpiresByType text/html "access plus 2 hours" 53 | 54 | -------------------------------------------------------------------------------- /src/.well-known/org.flathub.VerifiedApps.txt: -------------------------------------------------------------------------------- 1 | # https://docs.flathub.org/docs/for-app-authors/verification 2 | 3 | # org.qbittorrent.qBittorrent 4 | dc1eb2a8-a568-4d09-a974-8365f33dc01f 5 | -------------------------------------------------------------------------------- /src/_includes/base.liquid: -------------------------------------------------------------------------------- 1 | --- 2 | latest_ver: 5.1.2 3 | --- 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | qBittorrent Official Website 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | Latest: v{{latest_ver}} 32 | 33 | 34 |
35 |
36 | 37 |
38 | 39 | 51 | 52 |
53 |
54 |
55 |
56 |
57 | {{content}} 58 |
59 |
60 |
61 |
62 |
63 | 70 |
71 | 72 | 73 | -------------------------------------------------------------------------------- /src/css/TLbanner.css: -------------------------------------------------------------------------------- 1 | /* 2 | * https://codepo8.github.io/css-fork-on-github-ribbon/ 3 | */ 4 | 5 | #forkongithub a { 6 | background: #235092; 7 | color: #ffffff; 8 | font-family: arial, sans-serif; 9 | font-size: 1rem; 10 | font-weight: bold; 11 | line-height: 1.2rem; 12 | padding: 5px 40px; 13 | position: relative; 14 | text-align: center; 15 | text-decoration: none; 16 | transition: 0.5s; 17 | } 18 | 19 | #forkongithub a:hover { 20 | background: #cc1111; 21 | color: #ffffff; 22 | } 23 | 24 | #forkongithub a::before, 25 | #forkongithub a::after { 26 | background: #ffffff; 27 | content: ""; 28 | display: block; 29 | height: 1px; 30 | left: 0; 31 | position: absolute; 32 | top: 1px; 33 | width: 100%; 34 | } 35 | 36 | #forkongithub a::after { 37 | bottom: 1px; 38 | top: auto; 39 | } 40 | 41 | @media screen and (width >= 0) { 42 | #forkongithub { 43 | display: block; 44 | height: 200px; 45 | left: 0; 46 | overflow: hidden; 47 | pointer-events: none; 48 | position: absolute; 49 | top: 0; 50 | width: 200px; 51 | z-index: 9999; 52 | } 53 | 54 | #forkongithub a { 55 | box-shadow: 4px 4px 10px rgb(0 0 0 / 80%); 56 | left: -70px; 57 | pointer-events: auto; 58 | position: absolute; 59 | top: 50px; 60 | transform: rotate(-45deg); 61 | width: 200px; 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /src/css/style.css: -------------------------------------------------------------------------------- 1 | /* 2 | * CSS By Christophe Dumez 3 | * Copyright (c) 2006 4 | */ 5 | 6 | body { 7 | background-color: #2f67ba; 8 | color: #282f33; 9 | font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; 10 | font-size: 16px; 11 | margin: 0; 12 | padding: 0; 13 | text-align: center; 14 | } 15 | 16 | div #LogoChris { 17 | margin: auto; 18 | max-width: 600px; 19 | min-height: 200px; 20 | position: relative; 21 | } 22 | 23 | div #mainBox { 24 | margin: 0 auto; 25 | width: 800px; 26 | } 27 | 28 | div .codePart { 29 | /*border: solid double rgb(47,103,186);*/ 30 | border-color: #2f67ba; 31 | border-style: solid double groove; 32 | font-style: italic; 33 | margin: 0 auto; 34 | width: 400px; 35 | } 36 | 37 | div .flexbox .osIcon { 38 | margin-top: 20px; 39 | min-width: 135px; 40 | } 41 | 42 | div .flexbox { 43 | align-items: flex-start; 44 | display: flex; 45 | justify-content: flex-start; 46 | } 47 | 48 | div .flexbox_screenshots { 49 | align-items: flex-start; 50 | display: flex; 51 | flex-flow: row wrap; 52 | gap: 1.5em 1em; 53 | } 54 | 55 | div .flexbox_screenshots figure { 56 | margin: 0; 57 | text-align: center; 58 | } 59 | 60 | div .flexbox_screenshots figure img { 61 | margin-left: auto; 62 | margin-right: auto; 63 | } 64 | 65 | @media only screen and (width <= 760px) and (orientation: portrait) { 66 | div .flexbox .box1 { 67 | min-width: auto; 68 | } 69 | 70 | div .flexbox { 71 | flex-direction: column; 72 | width: auto; 73 | } 74 | } 75 | 76 | div .teamInfo { 77 | float: left; 78 | } 79 | 80 | fieldset.teamFieldset { 81 | background-color: #efefef; 82 | } 83 | 84 | h2 { 85 | /* background-color: #ADD15A; */ 86 | color: #4394e8; 87 | display: block; 88 | font-family: "Trebuchet MS", Arial, Helvetica, sans-serif; 89 | font-size: 2em; 90 | margin: 0; 91 | } 92 | 93 | h2 a.header-anchor { 94 | color: inherit; 95 | text-decoration: none; 96 | } 97 | 98 | h3 { 99 | /* background-color: #ADD15A; */ 100 | border-bottom: 1px solid #d9dee1; 101 | clear: both; 102 | color: #282f33; 103 | display: block; 104 | font-family: "Trebuchet MS", Arial, Helvetica, sans-serif; 105 | font-size: 1.4em; 106 | /*font-weight: lighter;*/ 107 | margin: 15px 0 10px; 108 | } 109 | 110 | h3 a.header-anchor { 111 | color: inherit; 112 | text-decoration: none; 113 | } 114 | 115 | img { 116 | border: 0; 117 | display: block; 118 | } 119 | 120 | img.banner { 121 | max-width: 100%; 122 | position: absolute; 123 | top: 50%; 124 | } 125 | 126 | img.flag { 127 | display: inline-block; 128 | height: 1.1em; 129 | vertical-align: middle; 130 | } 131 | 132 | img.rss { 133 | display: initial; 134 | float: right; 135 | height: 1.2em; 136 | } 137 | 138 | img.teamUserIcon { 139 | height: 8em; 140 | width: 8em; 141 | } 142 | 143 | ol { 144 | padding-left: 2em; 145 | } 146 | 147 | p.copyright { 148 | color: #ffffff; 149 | font-size: 0.75em; 150 | margin: 0 auto; 151 | max-width: 800px; 152 | padding: 0; 153 | padding-top: 15px; 154 | text-align: center; 155 | } 156 | 157 | .copyright a { 158 | color: #ffffff; 159 | } 160 | 161 | ul { 162 | padding-left: 2em; 163 | } 164 | 165 | .invisible { 166 | display: none; 167 | } 168 | 169 | .menu ul li a { 170 | color: #ffffff; 171 | font-family: "Trebuchet MS", Arial, Helvetica, sans-serif; 172 | font-size: 1.05em; 173 | text-decoration: none; 174 | } 175 | 176 | .menu ul li a:hover { 177 | color: #aad5ff; 178 | } 179 | 180 | .menu ul li { 181 | border-left: 1px solid #49565d; 182 | display: inline; 183 | margin-left: 5px; 184 | padding-left: 10px; 185 | } 186 | 187 | .menu ul li.first { 188 | border-left: 0 solid #49565d; 189 | margin-left: 0; 190 | padding-left: 0; 191 | } 192 | 193 | .menu ul li.last { 194 | border-right: 0 solid #49565d; 195 | margin-right: 0; 196 | padding-right: 0; 197 | } 198 | 199 | .menu ul { 200 | list-style-type: none; 201 | margin: 0; 202 | padding: 0 0 15px; 203 | text-align: center; 204 | } 205 | 206 | .menu { 207 | background-color: transparent; 208 | } 209 | 210 | .nobr { 211 | white-space: nowrap; 212 | } 213 | 214 | .stretcher a { 215 | color: #0e4fb0; 216 | } 217 | 218 | .stretcher a:hover { 219 | text-decoration: none; 220 | } 221 | 222 | .stretcher { 223 | font-size: 0.875em; 224 | padding: 0 30px; 225 | } 226 | 227 | .wordBreak { 228 | word-break: break-all; 229 | } 230 | 231 | .wrapper { 232 | background-color: #ffffff; 233 | border: 2px solid white; 234 | border-radius: 20px; 235 | box-shadow: inset 0 55px 25px -25px #e6e6e6; 236 | margin: 0 auto; 237 | max-width: 920px; 238 | text-align: left; 239 | } 240 | 241 | .wrapper-bottom { 242 | padding-bottom: 15px; 243 | } 244 | 245 | .wrapper-top { 246 | padding-top: 15px; 247 | } 248 | 249 | .releaseParagraph { 250 | font-size: 130%; 251 | margin-bottom: 3pt; 252 | } 253 | 254 | summary:hover { 255 | cursor: pointer; 256 | } 257 | 258 | .downloadsOptions { 259 | font-size: 85%; 260 | } 261 | 262 | .downloads-table { 263 | width: 100%; 264 | } 265 | 266 | .downloads-table, 267 | .downloads-table th, 268 | .downloads-table td { 269 | border: 1px solid black; 270 | border-collapse: collapse; 271 | } 272 | 273 | .downloads-table tr:not(:first-child):hover { 274 | background-color: #cfe0f3; 275 | } 276 | 277 | .downloadNotesDiv { 278 | background-color: lemonchiffon; 279 | border-left: 4pt solid gold; 280 | padding: 1em; 281 | } 282 | -------------------------------------------------------------------------------- /src/donate.liquid: -------------------------------------------------------------------------------- 1 | --- 2 | layout: base.liquid 3 | permalink: "{{ page.filePathStem }}.html" 4 | --- 5 |

Donation options

6 |

qBittorrent is developed by volunteers on their spare time. If you like this piece of software, consider making a donation.
7 | Donations are welcome as a "Thank you" for the software. You can choose to donate for the costs of the server (website, forum, domain name) and/or to the lead programmers. You are encouraged to give a slight preference to server costs. eg 70% to server and 30% to lead programmers. 8 |

9 |

Donation info (lead programmers are mentioned by their github username):

10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 |
MemberRoleDonation link
server iconServerWebsite, forum, domain namePayPal
glassez avatarglassezLead programmerTake a look at his donation page.
Chocobo1 avatarChocobo1Lead programmerTake a look at his donation page.
43 | -------------------------------------------------------------------------------- /src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/src/favicon.ico -------------------------------------------------------------------------------- /src/favicon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/img/QBt-download-150.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/src/img/QBt-download-150.webp -------------------------------------------------------------------------------- /src/img/TLbannerNew.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/src/img/TLbannerNew.xcf -------------------------------------------------------------------------------- /src/img/flags/fr.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/img/flags/gr.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/img/flags/hu.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/img/flags/pl.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/img/github.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/img/os/altlinux.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/src/img/os/altlinux.webp -------------------------------------------------------------------------------- /src/img/os/archlinux.svg: -------------------------------------------------------------------------------- 1 | TMTM -------------------------------------------------------------------------------- /src/img/os/blackPanther-dark.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/src/img/os/blackPanther-dark.webp -------------------------------------------------------------------------------- /src/img/os/debian.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/img/os/docker.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/src/img/os/docker.webp -------------------------------------------------------------------------------- /src/img/os/ecs_logo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/src/img/os/ecs_logo.webp -------------------------------------------------------------------------------- /src/img/os/fedoralogo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/src/img/os/fedoralogo.webp -------------------------------------------------------------------------------- /src/img/os/flatpak.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/img/os/freebsd.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/img/os/gentoo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/img/os/haiku.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/src/img/os/haiku.webp -------------------------------------------------------------------------------- /src/img/os/macoslogo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/src/img/os/macoslogo.webp -------------------------------------------------------------------------------- /src/img/os/mageia.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/src/img/os/mageia.webp -------------------------------------------------------------------------------- /src/img/os/opensuse.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/img/os/pardus.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/src/img/os/pardus.webp -------------------------------------------------------------------------------- /src/img/os/slackware.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/src/img/os/slackware.webp -------------------------------------------------------------------------------- /src/img/os/ubuntu.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/img/os/winlogo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/src/img/os/winlogo.webp -------------------------------------------------------------------------------- /src/img/qb_banner.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/src/img/qb_banner.webp -------------------------------------------------------------------------------- /src/img/qb_oldbanner.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/src/img/qb_oldbanner.webp -------------------------------------------------------------------------------- /src/img/review2_5_qBittorrent_award.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/src/img/review2_5_qBittorrent_award.webp -------------------------------------------------------------------------------- /src/img/rss-color.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/img/screenshots/linux/1.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/src/img/screenshots/linux/1.webp -------------------------------------------------------------------------------- /src/img/screenshots/linux/2.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/src/img/screenshots/linux/2.webp -------------------------------------------------------------------------------- /src/img/screenshots/linux/3.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/src/img/screenshots/linux/3.webp -------------------------------------------------------------------------------- /src/img/screenshots/linux/4.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/src/img/screenshots/linux/4.webp -------------------------------------------------------------------------------- /src/img/screenshots/linux/5.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/src/img/screenshots/linux/5.webp -------------------------------------------------------------------------------- /src/img/tar-logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/img/team/Chocobo1.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/src/img/team/Chocobo1.webp -------------------------------------------------------------------------------- /src/img/team/chris.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/src/img/team/chris.webp -------------------------------------------------------------------------------- /src/img/team/glassez.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qbittorrent/qBittorrent-website/7333ec0e77a18f75f348beaf6d26afaf12d1ac3c/src/img/team/glassez.jpeg -------------------------------------------------------------------------------- /src/img/translate.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/img/user_font_awesome.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: base.liquid 3 | --- 4 | 5 | ### About qBittorrent 6 | download link 7 | The qBittorrent project aims to provide an open-source software alternative to µTorrent. 8 | 9 | Additionally, qBittorrent runs and provides the same features on all major platforms (FreeBSD, Linux, macOS, OS/2, Windows). 10 | 11 | qBittorrent is based on the Qt toolkit and libtorrent-rasterbar library. 12 | 13 | 14 | ### Help qBittorrent 15 | qBittorrent is developed by [volunteers](team) in their spare time. 16 | 17 | If you like this piece of software, please make a donation and help it survive. 18 | 19 | See our [donation page](donate) for more info. 20 | 21 | If you want to help in translating qBittorrent, see these instructions. 22 | 23 | 24 | ### qBittorrent Features 25 | * Polished µTorrent-like User Interface 26 | * No Ads 27 | * Well-integrated and extensible Search Engine 28 | * Simultaneous search in many Torrent search sites 29 | * Category-specific search requests (e.g. Books, Music, Software) 30 | * RSS feed support with advanced download filters (incl. regex) 31 | * Many Bittorrent extensions supported: 32 | * Magnet links 33 | * Distributed hash table (DHT), peer exchange protocol (PEX), local peer discovery (LSD) 34 | * Private torrents 35 | * Encrypted connections 36 | * and many more... 37 | * Remote control through Web user interface, written with AJAX 38 | * Nearly identical to the regular GUI 39 | * Sequential downloading (Download in order) 40 | * Advanced control over torrents, trackers and peers 41 | * Torrents queueing and prioritizing 42 | * Torrent content selection and prioritizing 43 | * Bandwidth scheduler 44 | * Torrent creation tool 45 | * IP Filtering (eMule & PeerGuardian format compatible) 46 | * IPv6 compliant 47 | * UPnP / NAT-PMP port forwarding support 48 | * Available on all platforms: Windows, Linux, macOS, FreeBSD, OS/2 49 | * Available in ~70 languages 50 | 51 | **Go ahead and try qBittorrent, you won't regret it!** 52 | -------------------------------------------------------------------------------- /src/openapi-demo/authcontroller.yml: -------------------------------------------------------------------------------- 1 | login: 2 | post: 3 | summary: Login 4 | description: Login and get SID cookie 5 | security: [ ] 6 | requestBody: 7 | required: true 8 | content: 9 | application/x-www-form-urlencoded: 10 | schema: 11 | type: object 12 | properties: 13 | username: 14 | type: string 15 | password: 16 | type: string 17 | required: ['username', 'password'] 18 | responses: 19 | '200': 20 | description: Login success or failure based on the response string. If login succeeded, the authorization cookie will be set. The cookie name might be configured to a different name by the user. 21 | headers: 22 | SID: 23 | required: false 24 | content: 25 | text/plain; charset=UTF-8: 26 | schema: 27 | oneOf: 28 | - type: string 29 | const: 'Ok.' 30 | - type: string 31 | const: 'Fails.' 32 | '403': 33 | $ref: 'main.yml#/components/responses/403forbidden' 34 | logout: 35 | get: 36 | summary: Logout 37 | description: Logout and unset auth cookie. The cookie name might be configured to a different name by the user. 38 | responses: 39 | '200': 40 | description: OK 41 | headers: 42 | SID: 43 | required: false 44 | -------------------------------------------------------------------------------- /src/openapi-demo/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/openapi-demo/main.yml: -------------------------------------------------------------------------------- 1 | openapi: '3.1.0' 2 | info: 3 | description: This is the specification for qBittorrent's web API 4 | title: qBittorrent WebAPI 5 | version: '2.11.2' 6 | servers: 7 | - url: 'https://localhost:{port}/api/v2' 8 | variables: 9 | port: 10 | default: "8080" 11 | components: 12 | securitySchemes: 13 | defaultApiKey: 14 | description: API key cookie provided when logged in successfully. The cookie name might be configured to a different name by the user. 15 | type: apiKey 16 | name: SID 17 | in: cookie 18 | responses: 19 | 200simpleOK: 20 | description: OK 21 | 200TextOK: 22 | description: OK 23 | content: 24 | text/plain; charset=UTF-8: 25 | schema: 26 | type: string 27 | 400badRequest: 28 | description: Bad Request 29 | content: 30 | text/plain; charset=UTF-8: 31 | schema: 32 | type: string 33 | 401unauthorized: 34 | description: Unauthorized 35 | content: 36 | text/plain; charset=UTF-8: 37 | schema: 38 | type: string 39 | 403forbidden: 40 | description: Forbidden 41 | content: 42 | text/plain; charset=UTF-8: 43 | schema: 44 | type: string 45 | 404notFound: 46 | description: Not Found 47 | content: 48 | text/plain; charset=UTF-8: 49 | schema: 50 | type: string 51 | 405methodNotAllowed: 52 | description: Method Not Allowed 53 | content: 54 | text/plain; charset=UTF-8: 55 | schema: 56 | type: string 57 | 409conflict: 58 | description: Conflict 59 | content: 60 | text/plain; charset=UTF-8: 61 | schema: 62 | type: string 63 | 415unsupportedMediaType: 64 | description: Unsupported Media Type 65 | content: 66 | text/plain; charset=UTF-8: 67 | schema: 68 | type: string 69 | 500internalServerError: 70 | description: Internal Server Error 71 | content: 72 | text/plain; charset=UTF-8: 73 | schema: 74 | type: string 75 | security: 76 | - defaultApiKey: [] 77 | paths: 78 | /transfer/info: 79 | $ref: 'transfercontroller.yml#/info' 80 | /transfer/uploadLimit: 81 | $ref: 'transfercontroller.yml#/uploadLimit' 82 | /transfer/downloadLimit: 83 | $ref: 'transfercontroller.yml#/downloadLimit' 84 | /transfer/setUploadLimit: 85 | $ref: 'transfercontroller.yml#/setUploadLimit' 86 | /transfer/setDownloadLimit: 87 | $ref: 'transfercontroller.yml#/setDownloadLimit' 88 | /transfer/toggleSpeedLimitsMode: 89 | $ref: 'transfercontroller.yml#/toggleSpeedLimitsMode' 90 | /transfer/speedLimitsMode: 91 | $ref: 'transfercontroller.yml#/speedLimitsMode' 92 | /transfer/setSpeedLimitsMode: 93 | $ref: 'transfercontroller.yml#/setSpeedLimitsMode' 94 | /transfer/banPeers: 95 | $ref: 'transfercontroller.yml#/banPeers' 96 | /auth/login: 97 | $ref: 'authcontroller.yml#/login' 98 | /auth/logout: 99 | $ref: 'authcontroller.yml#/logout' 100 | -------------------------------------------------------------------------------- /src/openapi-demo/transfercontroller.yml: -------------------------------------------------------------------------------- 1 | info: 2 | get: 3 | summary: Get the global transfer information 4 | responses: 5 | '200': 6 | description: OK 7 | content: 8 | application/json: 9 | schema: 10 | type: object 11 | properties: 12 | dl_info_speed: 13 | description: Global download rate in bytes per second 14 | type: number 15 | dl_info_data: 16 | description: Data downloaded this session in bytes 17 | type: number 18 | dl_rate_limit: 19 | description: Download rate limit in bytes per second 20 | type: number 21 | up_info_speed: 22 | description: Global upload rate in bytes per second 23 | type: number 24 | up_info_data: 25 | description: Data uploaded this session in bytes 26 | type: number 27 | up_rate_limit: 28 | description: Upload rate limit in bytes per second 29 | type: number 30 | dht_nodes: 31 | description: Number of DHT nodes connected to 32 | type: number 33 | connection_status: 34 | description: Connection status 35 | type: string 36 | enum: 37 | - connected 38 | - firewalled 39 | - disconnected 40 | required: 41 | - 'dl_info_speed' 42 | - 'dl_info_data' 43 | - 'dl_rate_limit' 44 | - 'up_info_speed' 45 | - 'up_info_data' 46 | - 'up_rate_limit' 47 | - 'dht_nodes' 48 | - 'connection_status' 49 | '403': 50 | $ref: 'main.yml#/components/responses/403forbidden' 51 | uploadLimit: 52 | get: 53 | summary: Get upload speed limit 54 | responses: 55 | '200': 56 | $ref: 'main.yml#/components/responses/200TextOK' 57 | '403': 58 | $ref: 'main.yml#/components/responses/403forbidden' 59 | downloadLimit: 60 | get: 61 | summary: Get download speed limit 62 | responses: 63 | '200': 64 | $ref: 'main.yml#/components/responses/200TextOK' 65 | '403': 66 | $ref: 'main.yml#/components/responses/403forbidden' 67 | setUploadLimit: 68 | post: 69 | summary: Set upload speed limit 70 | requestBody: 71 | required: true 72 | content: 73 | application/x-www-form-urlencoded: 74 | schema: 75 | type: object 76 | properties: 77 | limit: 78 | description: Speed limit in bytes per second. Negative values disable the limit. Non-negative values below 1024 are clamped to 1024. 79 | type: number 80 | required: ['limit'] 81 | responses: 82 | '200': 83 | $ref: 'main.yml#/components/responses/200simpleOK' 84 | '403': 85 | $ref: 'main.yml#/components/responses/403forbidden' 86 | setDownloadLimit: 87 | post: 88 | summary: Set download speed limit 89 | requestBody: 90 | required: true 91 | content: 92 | application/x-www-form-urlencoded: 93 | schema: 94 | type: object 95 | properties: 96 | limit: 97 | description: Speed limit in bytes per second. Negative values disable the limit. Non-negative values below 1024 are clamped to 1024. 98 | type: number 99 | required: ['limit'] 100 | responses: 101 | '200': 102 | $ref: 'main.yml#/components/responses/200simpleOK' 103 | '403': 104 | $ref: 'main.yml#/components/responses/403forbidden' 105 | toggleSpeedLimitsMode: 106 | post: 107 | summary: Toggle speed limit mode 108 | description: Toggle speed limit mode between normal and alternative 109 | responses: 110 | '200': 111 | $ref: 'main.yml#/components/responses/200simpleOK' 112 | '403': 113 | $ref: 'main.yml#/components/responses/403forbidden' 114 | speedLimitsMode: 115 | get: 116 | summary: Get speed limit mode 117 | description: '`1` means alternative mode and `0` normal mode' 118 | responses: 119 | '200': 120 | description: OK 121 | content: 122 | text/plain; charset=UTF-8: 123 | schema: 124 | type: number 125 | enum: 126 | - 0 127 | - 1 128 | '403': 129 | $ref: 'main.yml#/components/responses/403forbidden' 130 | setSpeedLimitsMode: 131 | post: 132 | summary: Set speed limit mode 133 | requestBody: 134 | required: true 135 | content: 136 | application/x-www-form-urlencoded: 137 | schema: 138 | type: object 139 | properties: 140 | mode: 141 | description: '`1` means alternative mode and `0` normal mode.' 142 | type: number 143 | enum: 144 | - 0 145 | - 1 146 | required: ['mode'] 147 | responses: 148 | '200': 149 | $ref: 'main.yml#/components/responses/200simpleOK' 150 | '400': 151 | $ref: 'main.yml#/components/responses/400badRequest' 152 | '403': 153 | $ref: 'main.yml#/components/responses/403forbidden' 154 | banPeers: 155 | post: 156 | summary: Ban peers 157 | requestBody: 158 | required: true 159 | content: 160 | application/x-www-form-urlencoded: 161 | schema: 162 | type: object 163 | properties: 164 | peers: 165 | description: List of peer IPs to ban. Each list item is separated by the `|` character. 166 | type: string 167 | required: ['peers'] 168 | responses: 169 | '200': 170 | $ref: 'main.yml#/components/responses/200simpleOK' 171 | '403': 172 | $ref: 'main.yml#/components/responses/403forbidden' 173 | -------------------------------------------------------------------------------- /src/screenshots.liquid: -------------------------------------------------------------------------------- 1 | --- 2 | layout: base.liquid 3 | permalink: "{{ page.filePathStem }}.html" 4 | --- 5 |

Screenshots

6 | 7 |

8 | Linux 9 |

10 |
11 |
12 | 13 | Main window (General tab collapsed) 14 | 15 |
Main window (General tab collapsed)
16 |
17 |
18 | 19 | Main window (General tab expanded) 20 | 21 |
Main window (General tab expanded)
22 |
23 |
24 | 25 | Options dialog 26 | 27 |
Options dialog
28 |
29 |
30 | 31 | Search engine 32 | 33 |
Search engine
34 |
35 |
36 | 37 | Search engine 38 | 39 |
Running headless (nox) version
40 |
41 |
42 | -------------------------------------------------------------------------------- /src/scripts/download.ts: -------------------------------------------------------------------------------- 1 | document.addEventListener("DOMContentLoaded", () => { 2 | const distroSelect = document.getElementById("distroSelect") as HTMLSelectElement; 3 | 4 | const showOption = (element: HTMLSelectElement) => { 5 | const hideOptionDivs = (element: HTMLSelectElement) => { 6 | for (const option of element.options) 7 | document.getElementById(`${option.value}Div`)?.classList.add("invisible"); 8 | }; 9 | 10 | // reset all 11 | if (element.id === "OSSelect") { 12 | hideOptionDivs(element); 13 | distroSelect.value = "emptyDist"; 14 | } 15 | hideOptionDivs(distroSelect); 16 | 17 | // show selected 18 | document.getElementById(`${element.value}Div`)?.classList.remove("invisible"); 19 | }; 20 | 21 | const osSelect = document.getElementById("OSSelect") as HTMLSelectElement; 22 | osSelect.addEventListener("change", (_event) => { 23 | showOption(osSelect); 24 | }); 25 | osSelect.value = "emptyOS"; 26 | 27 | distroSelect.addEventListener("change", (_event) => { 28 | showOption(distroSelect); 29 | }); 30 | distroSelect.value = "emptyDist"; 31 | }); 32 | -------------------------------------------------------------------------------- /src/team.liquid: -------------------------------------------------------------------------------- 1 | --- 2 | layout: base.liquid 3 | permalink: "{{ page.filePathStem }}.html" 4 | --- 5 |

Project Maintainer

6 |
7 |
8 | no image 9 |
10 |
11 |
    12 |
  • Nickname: sledgehammer999
  • 13 |
  • Role: Project maintainer and main developer
  • 14 |
  • Country: Greek
  • 15 |
  • Mail: sledgehammer999 (at) qbittorrent (dot) org
  • 16 |
17 |
18 |
19 | 20 |

Forum Administrator

21 |
22 |
23 | no image 24 |
25 |
26 |
    27 |
  • Name: Zsolt Peter Basak
  • 28 |
  • Role: Forum administrator and owner
  • 29 |
  • Country: Hungarian
  • 30 |
  • Mail: zsoltpeterbasak (at) gmail (dot) com
  • 31 |
32 |
33 |
34 | 35 |

Team Members

36 |
37 |
38 | github icon 39 |
40 |
41 | 44 |
45 |
46 | 47 |

Contributors

48 |
49 |
50 | github icon 51 |
52 |
53 | 56 |
57 |
58 | 59 |

Translators

60 |
61 |
62 | translation icon 63 |
64 |
65 | 68 |
69 |
70 | 71 |

Project Founder (Emeritus)

72 |
73 |
74 | Christophe Dumez image 75 |
76 |
77 |
    78 |
  • Name: Christophe Dumez
  • 79 |
  • Role: Project founder and developer (inactive)
  • 80 |
  • Country: French
  • 81 |
  • Mail: chris (at) qbittorrent (dot) org
  • 82 |
83 |
84 |
85 | 86 |

Project Graphist (Emeritus)

87 |
88 |
89 | no image 90 |
91 |
92 |
    93 |
  • Name: Mateusz Toboła (aka "Tobejodok")
  • 94 |
  • Role: Software and website artwork
  • 95 |
  • Country: Polish
  • 96 |
  • Mail: tobejodok (at) qbittorrent (dot) org
  • 97 |
98 |
99 |
100 | -------------------------------------------------------------------------------- /src/versions.json: -------------------------------------------------------------------------------- 1 | { 2 | "win": { "version": "5.1.2"}, 3 | "macos": { "version": "5.1.2"} 4 | } 5 | -------------------------------------------------------------------------------- /stylelint.config.mjs: -------------------------------------------------------------------------------- 1 | export default { 2 | extends: "stylelint-config-standard", 3 | plugins: [ 4 | "stylelint-order" 5 | ], 6 | rules: { 7 | "color-hex-length": "long", 8 | "comment-empty-line-before": null, 9 | "comment-whitespace-inside": null, 10 | "no-descending-specificity": null, 11 | "order/properties-alphabetical-order": true, 12 | "selector-class-pattern": null, 13 | "selector-id-pattern": null 14 | } 15 | }; 16 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": 3 | { 4 | "esModuleInterop": true, 5 | "module": "preserve", 6 | "noImplicitAny": true, 7 | "outDir": "_site/scripts", 8 | "removeComments": true, 9 | "strict": true, 10 | "target": "ES2023" 11 | }, 12 | "include": ["src/scripts/*.ts"], 13 | } 14 | --------------------------------------------------------------------------------