diff --git a/docs/revanced-internals/Generals/Infrastructure/bulletin.md b/docs/revanced-internals/Generals/Infrastructure/bulletin.md new file mode 100644 index 0000000..d1902fc --- /dev/null +++ b/docs/revanced-internals/Generals/Infrastructure/bulletin.md @@ -0,0 +1,103 @@ +--- +title: ๐Ÿ—๏ธ Infrastructure Bulletin +description: Track changes through the ReVanced Infrastructure Bulletin +hide_table_of_contents: false +--- + +# ๐Ÿ—๏ธ Infrastructure Bulletin + +## Change `10072025-TESTING` (Testing only) + + - Merge Dependabot dependency update into one + + ```yml + version: 2 + multi-ecosystem-groups: + dependency: # (A) Can be named any + schedule: + interval: "weekly" + target-branch: dev + + updates: + - package-ecosystem: "github-actions" + directory: "/" + multi-ecosystem-group: "infrastructure" # Set this to (A) + patterns: # You must have patterns or else dependabot will fail to work + - "*" + ``` + +## Change `01072025` (Production ready) + + - Remove fetch-depth from checkout action + + ```diff + steps: + # Checkout action + - name: Checkout + uses: actions/checkout@v4 + - with: + - fetch-depth: 0 + ``` + +## Change `10062025` (Production ready) + + - Use semantic release actions instead of script + + ```diff + # see: https://github.com/cycjimmy/semantic-release-action + - - name: Release + - run: npx semantic-release + + - name: Release + + uses: cycjimmy/semantic-release-action@v4 + + id: release + + env: + + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + ``` + +- Remove revanced-bot repository access token + - Use ${{ secrets.GITHUB_TOKEN }} with `contents: write` permission instead + +## Change `01052025` (Production ready) + +- Specify `subject-name` on attestation action with the format of `ReVanced ` + + ```diff + - name: Attest + uses: actions/attest-build-provenance@v2 + with: + + subject-name: 'ReVanced Foobar ${{ steps.release.outputs.new_release_git_tag }}' + subject-path: revanced-foobar-*.apk # Standard globs allowed only + ``` + +## Change `01012025` (Production ready) + + - (Gradle-specific) Automatically update Gradle wrapper with CI + - See [update_gradle_wrapper.yml](/Generals/Infrastructure/github/ci_template/gradle-specific/update_gradle_wrapper.yml) + +## Change `01122024` (Production ready) + + - (Gradle-specific) Add Gradle cache action to CI + + ```diff + # see: https://github.com/burrunan/gradle-cache-action + + - name: Cache Gradle + + uses: burrunan/gradle-cache-action@v3 + ``` + +## Change `01112024` (Production ready) + + - Add attestation action to CI + + ```diff + + permissions: + + id-token: write + + attestations: write + # see: https://github.com/actions/attest-build-provenance + + - name: Attest + + uses: actions/attest-build-provenance@v2 + + with: + + subject-path: revanced-foobar-*.apk # Standard globs allowed only + ``` + + - Remove revanced-bot repository access token + - Use ${{ secrets.GITHUB_TOKEN }} with `contents: write` permission instead diff --git a/docs/revanced-internals/Generals/Infrastructure/github/attestation.md b/docs/revanced-internals/Generals/Infrastructure/github/attestation.md new file mode 100644 index 0000000..de13b29 --- /dev/null +++ b/docs/revanced-internals/Generals/Infrastructure/github/attestation.md @@ -0,0 +1,27 @@ +--- +title: ๐Ÿชช Securing build binaries +description: Improving attestability, transparency and security of the build binary. +hide_table_of_contents: false +--- + +# ๐Ÿชช Attestation + +Starting in 2025, ReVanced now required all repository to offered GitHub Attestation which provide SLSA v1.0 L2 by default + +To implement it, you need to add https://github.com/actions/attest-build-provenance + +## How to verify prebuilt library + +Requirements + - Have the latest version of GitHub CLI installed on your computer + +Verify the library by atttesting the file using this command: + +```bash +gh at verify {prebuilt location} --owner ReVanced +``` + +> โšก **DANGER** +> If you use libraries from 3rd party (not ReVanced), replace the owner parametre to their user/organisation. +> **Make sure that you trust them first**, then update the ownership in the documentation to let everyone know +> that ownership is changed. (Optional) diff --git a/docs/revanced-internals/Generals/Infrastructure/github/ci_secrets_registry.md b/docs/revanced-internals/Generals/Infrastructure/github/ci_secrets_registry.md new file mode 100644 index 0000000..6f81b39 --- /dev/null +++ b/docs/revanced-internals/Generals/Infrastructure/github/ci_secrets_registry.md @@ -0,0 +1,47 @@ +--- +title: ๐Ÿ—๏ธ Infrastructure Variable / Secrets (GitHub) +description: ReVanced Infrastructure's variable and secrets configuration (GitHub) +hide_table_of_contents: false +--- + +# ๐Ÿ—๏ธ Infra variable / secrets + +Like with every organisation, variables, secrets are part of the +CI infra system. Here's an list to find. + +* DMCA Guild: ${{ vars.RV_DMCA_GUID }} +* Google Tag Manager ID: ${{ vars.RV_GOOGLE_TAG_MANAGER_ID }} +* ReVanced API: ${{ vars.RV_API_URL }} +* Cloudflare Account: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} +* Cloudflare API Token: ${{ secrets.CLOUDFLARE_API_TOKEN }} +* Crowdin Project ID: ${{ secrets.CROWDIN_PROJECT_ID }} +* Crowdin Token ${{ secrets.CROWDIN_PERSONAL_TOKEN }} +* GPG Private Key: ${{ secrets.GPG_PRIVATE_KEY }} +* GPG Password: ${{ secrets.GPG_PASSPHRASE }} +* GPG Fingerprint: ${{ vars.GPG_FINGERPRINT }} +* Discord Bot Portainer webhook: ${{ secrets.DISCORD_BOT_PORTAINER_WEBHOOK_URL }} +* Websocket API Portainer webhook: ${{ secrets.WEBSOCKET_API_PORTAINER_WEBHOOK_URL }} +* GitHub Registry Container deletion permission: ${{ secrets.DELETE_PACKAGES_TOKEN }} +* Keystore binary data: ${{ secrets.KEYSTORE }} +* Keystore Password: ${{ secrets.KEYSTORE_PASSWORD }} +* Keystore Entry Alias: ${{ secrets.KEYSTORE_ENTRY_ALIAS }} +* Keystore Entry Password: ${{ secrets.KEYSTORE_ENTRY_PASSWORD }} +* ReVanced Documentation push permission: ${{ secrets.DOCUMENTATION_REPO_ACCESS_TOKEN }} + +## Deprecation/Discouraged + +* Repository Push permission: ${{ secrets.REPOSITORY_PUSH_ACCESS }} + +## Removed + +* ReVanced Manager Extra Environment Configuration (Sentry.io Data Source Name aka. Logging, and OTA Crowdin Translation Delivery): ${{ secrets.SECRETS }} + +## Migration + +* ${{ secrets.SIGNING_KEY_PASSWORD }} -> ${{ secrets.KEYSTORE_ENTRY_PASSWORD }} +* ${{ secrets.SIGNING_KEY_ALIAS }} -> ${{ secrets.KEYSTORE_ENTRY_ALIAS }} +* ${{ secrets.SIGNING_KEYSTORE_PASSWORD }} -> ${{ secrets.KEYSTORE_PASSWORD }} +* ${{ secrets.SIGNING_KEYSTORE }} -> ${{ secrets.KEYSTORE }} + +* ${{ secrets.SECRETS }} -> Removed +* ${{ secrets.REPOSITORY_PUSH_ACCESS }} -> ${{ secrets.GITHUB_TOKEN }} with `contents: write` permission diff --git a/docs/revanced-internals/Generals/Infrastructure/github/ci_template/gradle-specific/release.yml b/docs/revanced-internals/Generals/Infrastructure/github/ci_template/gradle-specific/release.yml new file mode 100644 index 0000000..89e030c --- /dev/null +++ b/docs/revanced-internals/Generals/Infrastructure/github/ci_template/gradle-specific/release.yml @@ -0,0 +1,60 @@ +name: Release + +on: + workflow_dispatch: + push: + branches: + - main + - dev + +jobs: + release: + name: Release + permissions: + contents: write + attestations: write + id-token: write + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Java + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '17' + + - name: Cache Gradle + uses: burrunan/gradle-cache-action@v3 + + - name: Build + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: ./gradlew assembleRelease # TODO: Change this to the correct task for your project + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 'lts/*' + cache: 'npm' + + - name: Install dependencies + run: npm install + + - name: Release + uses: cycjimmy/semantic-release-action@v4 + id: release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Attest + if: steps.release.outputs.new_release_published == 'true' + uses: actions/attest-build-provenance@v2 + with: + subject-name: 'ReVanced {repository name} ${{ steps.release.outputs.new_release_git_tag }}' + # TODO: Change this to the correct repository name for your project + subject-path: changeme + # TODO: Change this to the correct path for your project diff --git a/docs/revanced-internals/Generals/Infrastructure/github/ci_template/gradle-specific/update_gradle_wrapper.yml b/docs/revanced-internals/Generals/Infrastructure/github/ci_template/gradle-specific/update_gradle_wrapper.yml new file mode 100644 index 0000000..e043ff7 --- /dev/null +++ b/docs/revanced-internals/Generals/Infrastructure/github/ci_template/gradle-specific/update_gradle_wrapper.yml @@ -0,0 +1,18 @@ +name: Update Gradle wrapper + +on: + schedule: + - cron: 0 0 1 * * + workflow_dispatch: + +jobs: + update: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Update Gradle Wrapper + uses: gradle-update/update-gradle-wrapper-action@v1 + with: + target-branch: dev diff --git a/docs/revanced-internals/Generals/Infrastructure/github/ci_template/open_pull_request.yml b/docs/revanced-internals/Generals/Infrastructure/github/ci_template/open_pull_request.yml new file mode 100644 index 0000000..75b8e67 --- /dev/null +++ b/docs/revanced-internals/Generals/Infrastructure/github/ci_template/open_pull_request.yml @@ -0,0 +1,26 @@ +name: Open a PR to main + +on: + push: + branches: + - dev + workflow_dispatch: + +env: + MESSAGE: Merge branch `${{ github.head_ref || github.ref_name }}` to `main` + +jobs: + pull-request: + name: Open pull request + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Open pull request + uses: repo-sync/pull-request@v2 + with: + destination_branch: 'main' + pr_title: 'chore: ${{ env.MESSAGE }}' + pr_body: 'This pull request will ${{ env.MESSAGE }}.' + pr_draft: true diff --git a/docs/revanced-internals/Generals/Infrastructure/github/ci_template/semantic-release/blank_release.yml b/docs/revanced-internals/Generals/Infrastructure/github/ci_template/semantic-release/blank_release.yml new file mode 100644 index 0000000..b7b2a90 --- /dev/null +++ b/docs/revanced-internals/Generals/Infrastructure/github/ci_template/semantic-release/blank_release.yml @@ -0,0 +1,44 @@ +name: Release + +on: + workflow_dispatch: + push: + branches: + - main + - dev + +jobs: + release: + name: Release + permissions: + contents: write + attestations: write + id-token: write + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 'lts/*' + cache: 'npm' + + - name: Install dependencies + run: npm install + + - name: Release + uses: cycjimmy/semantic-release-action@v4 + id: release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Attest + if: steps.release.outputs.new_release_published == 'true' + uses: actions/attest-build-provenance@v2 + with: + subject-name: 'ReVanced {repository name} ${{ steps.release.outputs.new_release_git_tag }}' + # TODO: Change this to the correct repository name for your project + subject-path: changeme + # TODO: Change this to the correct path for your project diff --git a/docs/revanced-internals/Generals/Policies/contribution.md b/docs/revanced-internals/Generals/Policies/contribution.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/revanced-internals/Generals/Policies/invoice/invoicing-legacy.md b/docs/revanced-internals/Generals/Policies/invoice/invoicing-legacy.md new file mode 100644 index 0000000..fb812b4 --- /dev/null +++ b/docs/revanced-internals/Generals/Policies/invoice/invoicing-legacy.md @@ -0,0 +1,127 @@ +--- +title: ๐Ÿฆ ReVanced Invoicing System [Legacy] +description: How to generate invoice using ReVanced Invoicing system. [Legacy] +hide_table_of_contents: true +--- + +> **WARNING** +> This documentation is out of dated, please use newer version here. + +# ๐Ÿฆ ReVanced Invoicing System + +> **WARNING** +> You must have an `@revanced.app` email address to use the invoicing system. +> Please contact team if you haven't gotten access to the email yet. + +To generate an invoice to ReVanced, go to https://invoicing.revanced.app/ + +You'll be met with CloudFlare Zero Trust login page, enter your organisation email and +the OTP code will be sent to your email. + +## ๐Ÿง‘โ€๐Ÿญ Generating invoices + +> **DANGER** +> The invoices generation always assumed the legal reference under the EU VAT Directive law, +> this will be flagged by admin immediately so you need to replace it with your own law. +> +> **This guide DOES NOT offer you free legal advises** nor liable for any damages. + +> **DANGER** +> If you don't have identification, toggle tax obligation off. +> +> **You are under the penalty of perjury if it's found out you actually have an government-issued identification.** + +> **CAUTION** +> If you need the middle-man, be prepared to present identifications such as +> government-issued National ID card, passport, or any if requested by admin. + +### Replacing the legal reference + +> **DANGER** +> **This guide DOES NOT offer you free legal advises** nor liable for any damages. + +To replace the legal reference in your invoice, download or clone the repository: + +```bash +git clone https://github.com/ReVanced/revanced-invoicing +``` + +Open the editor of your choice and change `index.js` line 43-35 with your own law on +***how will you be managing this income with the your country's tax agency, if you don't know consult with your tax advisor.*** + +### Generating invoices + +1. Fill out your actual home address into form +2. Fill out your Tax ID (this usually refered to government-issued Tax ID or National ID, **please check with your country tax code** or else tick not eligble) +3. Select the services you provided, you can choose multiple services if applicable. +4. IF you are acting as a middle-man for someone else, follow these steps: + 1. In the "Payment Aggregation and Distribution" section, increase the number by 1 for each person you are representing. (0 = no middle-man) + 2. The total payout will increase as a multiple of your own payout and the amount of people you are middle-manning for. For instance, if your designated payout amount is 30โ‚ฌ, and you're middle-manning for three people, your total payout will be increased by 30โ‚ฌ * 3, resulting in an additional 90โ‚ฌ added to your payout. + 3. Make sure that the person you're middle-maning to **had** the required identifications (e.g., National ID) as this will be in use later when requested by Open Collective administrators. +5. Enter your own payout amount, **make sure to be in sync with the rest of the team as all team members get equal amount.** +6. Submit the invoice then a PDF file will be downloaded. + +## ๐Ÿงพ Submitting invoices + +### Open Collective + +> **WARNING** +> You must have an configured **Open Collective** account to submit the invoice. +> Please register or configure your account if you haven't, or let someone be the middle-man for you. + +> **CAUTION** +> If you need the middle-man, be prepared to present identifications such as +> government-issued National ID card, passport, or any if requested by admin. + +#### Invoicing page + +##### New invoicing submission page + +![This image shows the flow of expenses creations by asking who's paying and who's getting paid immediately](new-invoice-submit.png) + +To submit an invoice to ReVanced's Open Collective, go to ReVanced's collective page and +submit expense, from there choose **Invoice**, say that you have an invoice, +upload the PDF file that were generated by invoice system, and input the reference number. +(the number is displayed on the PDF file) + +After that set the expense item description to `Voluntary IT Work (Team Split), {Month} {Year}`, set the date to current date for the expense submission then fill out the total amount from your generated invoice. + +> **TIP** +> Set the item currency to โ‚ฌEUR for easy currency conversion. + +> **NOTE** +> Additional Attachment is not needed. + +Set the title to *Payout split*, *Team member payout, {Year}*, or whatever the team decided on, and add the `payout` tag. + +Wait for further approvals from ReVanced fund administrators, and Open Collective *Europe* administrators. + +##### Old invoicing submission page + +![This image shows the flow of expenses creations start off by type of expense, invoice or reimbursement immediately](old-invoice-submit.png) + +To submit an invoice to ReVanced's Open Collective, go to ReVanced's collective page and +submit expense, from there choose **Invoice**, select your payout method, set the expense title to *Payout split*, *Team member payout, {Year}*, or whatever the team decided on, and add the `payout` tag, upload the PDF file that were generated by invoice system, and input the reference number. +(the number is displayed on the PDF file) + +> **NOTE** +> Additional Attachment is not needed. + +After that set the expense item description to `Voluntary IT Work (Team Split), {Month} {Year}`, set the date to current date for the expense submission then fill out the total amount from your generated invoice. + +> **TIP** +> Set the item currency to โ‚ฌEUR for easy currency conversion. + +Wait for further approvals from ReVanced fund administrators, and Open Collective *Europe* administrators. + +#### Making amendment to invoices + +In any case should ReVanced or the Open Collective *Europe* administrators need you to amend your invoice, follow the step to #Generating-invoices again, after you have done making adjustment, generate it, then edit your invoice to replace the problematic invoice, and update the expense date to current date from your generated invoice. + +#### Making amendment to ***already payed out*** invoices + +In any case should the Open Collective *Europe* administrators need you to amend your already payed invoice, follow the step to #Generating-invoices again, after you have done making adjustment, edit the generated date and reference to your invoice. + +1. Change the *reference*, *creation* & *due date* from line 107-109 of `index.js` to when your invoice was originally issue. + +Generate it, then submit it to whenever Open Collective Europe want you to, usually to `oce (at) opencollective.com` diff --git a/docs/revanced-internals/Generals/Policies/invoice/invoicing.md b/docs/revanced-internals/Generals/Policies/invoice/invoicing.md new file mode 100644 index 0000000..02c425d --- /dev/null +++ b/docs/revanced-internals/Generals/Policies/invoice/invoicing.md @@ -0,0 +1,115 @@ +--- +title: ๐Ÿฆ ReVanced Invoicing System +description: How to generate invoice using ReVanced Invoicing system. +hide_table_of_contents: false +--- + +# ๐Ÿฆ ReVanced Invoicing System + +> **WARNING** +> You must have an `@revanced.app` email address to use the invoicing system. +> Please contact team if you haven't gotten access to the email yet. + +To generate an invoice to ReVanced, go to https://invoicing.revanced.app/ + +You'll be met with CloudFlare Zero Trust login page, enter your organisation email and +the OTP code will be sent to your email. + +## ๐Ÿง‘โ€๐Ÿญ Generating invoices + +> **DANGER** +> If you don't have identification, toggle tax obligation off. +> +> **You are under the penalty of perjury if it's found out you actually have an government-issued identification.** + +> **CAUTION** +> If you need the middle-man, be prepared to present identifications such as +> government-issued National ID card, passport, or any if requested by admin. + +### Replacing the legal reference + +> **DANGER** +> **This guide DOES NOT offer you free legal advises** nor liable for any damages. + +To replace the legal reference in your invoice, scroll down to the amendment section, +toggle the acknowledgment check then proceed to enter your own legal statement. + +Typically with your own law on +***how will you be managing this income with the your country's tax agency, if you don't know consult with your tax advisor.*** + +### Generating invoices + +1. Fill out your actual home address into form +2. Fill out your Tax ID (this usually refered to government-issued Tax ID or National ID, **please check with your country tax code** or else tick not eligble) +3. Select the services you provided, you can choose multiple services if applicable. +4. IF you are acting as a middle-man for someone else, follow these steps: + 1. In the "Payment Aggregation and Distribution" section, increase the number by 1 for each person you are representing. (0 = no middle-man) + 2. The total payout will increase as a multiple of your own payout and the amount of people you are middle-manning for. For instance, if your designated payout amount is 30โ‚ฌ, and you're middle-manning for three people, your total payout will be increased by 30โ‚ฌ * 3, resulting in an additional 90โ‚ฌ added to your payout. + 3. Make sure that the person you're middle-maning to **had** the required identifications (e.g., National ID) as this will be in use later when requested by Open Collective administrators. +5. Enter your own payout amount, **make sure to be in sync with the rest of the team as all team members get equal amount.** +6. Submit the invoice then a PDF file will be downloaded. + +## ๐Ÿงพ Submitting invoices + +### Open Collective + +> **WARNING** +> You must have an configured **Open Collective** account to submit the invoice. +> Please register or configure your account if you haven't, or let someone be the middle-man for you. + +> **CAUTION** +> If you need the middle-man, be prepared to present identifications such as +> government-issued National ID card, passport, or any if requested by admin. + +#### Invoicing page + +##### New invoicing submission page + +![This image shows the flow of expenses creations by asking who's paying and who's getting paid immediately](new-invoice-submit.png) + +To submit an invoice to ReVanced's Open Collective, go to ReVanced's collective page and +submit expense, from there choose **Invoice**, say that you have an invoice, +upload the PDF file that were generated by invoice system, and input the reference number. +(the number is displayed on the PDF file) + +After that set the expense item description to `Voluntary IT Work (Team Split), {Month} {Year}`, set the date to current date for the expense submission then fill out the total amount from your generated invoice. + +> **TIP** +> Set the item currency to โ‚ฌEUR for easy currency conversion. + +> **NOTE** +> Additional Attachment is not needed. + +Set the title to *Payout split*, *Team member payout, {Year}*, or whatever the team decided on, and add the `payout` tag. + +Wait for further approvals from ReVanced fund administrators, and Open Collective *Europe* administrators. + +##### Old invoicing submission page + +![This image shows the flow of expenses creations start off by type of expense, invoice or reimbursement immediately](old-invoice-submit.png) + +To submit an invoice to ReVanced's Open Collective, go to ReVanced's collective page and +submit expense, from there choose **Invoice**, select your payout method, set the expense title to *Payout split*, *Team member payout, {Year}*, or whatever the team decided on, and add the `payout` tag, upload the PDF file that were generated by invoice system, and input the reference number. +(the number is displayed on the PDF file) + +> **NOTE** +> Additional Attachment is not needed. + +After that set the expense item description to `Voluntary IT Work (Team Split), {Month} {Year}`, set the date to current date for the expense submission then fill out the total amount from your generated invoice. + +> **TIP** +> Set the item currency to โ‚ฌEUR for easy currency conversion. + +Wait for further approvals from ReVanced fund administrators, and Open Collective *Europe* administrators. + +#### Making amendment to invoices + +In any case should ReVanced or the Open Collective *Europe* administrators need you to amend your invoice, follow the step to #Generating-invoices again, after you have done making adjustment, generate it, then edit your invoice to replace the problematic invoice, and update the expense date to current date from your generated invoice. + +#### Making amendment to ***already payed out*** invoices + +In any case should the Open Collective *Europe* administrators need you to amend your already payed invoice, follow the step to #Generating-invoices again, after you have done making adjustment, edit the generated date to your invoice. + +1. Change the *creation* & *due date* from amendment section to when your originally issued invoice. + +Generate it, then submit it to whenever Open Collective Europe want you to, usually to oce@opencollective.com diff --git a/docs/revanced-internals/Generals/Policies/invoice/new-invoice-submit.png b/docs/revanced-internals/Generals/Policies/invoice/new-invoice-submit.png new file mode 100644 index 0000000..c3cf2dc Binary files /dev/null and b/docs/revanced-internals/Generals/Policies/invoice/new-invoice-submit.png differ diff --git a/docs/revanced-internals/Generals/Policies/invoice/old-invoice-submit.png b/docs/revanced-internals/Generals/Policies/invoice/old-invoice-submit.png new file mode 100644 index 0000000..f2f7a77 Binary files /dev/null and b/docs/revanced-internals/Generals/Policies/invoice/old-invoice-submit.png differ diff --git a/docs/revanced-internals/Generals/revanced-repository.md b/docs/revanced-internals/Generals/revanced-repository.md new file mode 100644 index 0000000..e73db71 --- /dev/null +++ b/docs/revanced-internals/Generals/revanced-repository.md @@ -0,0 +1,41 @@ +--- +title: ๐Ÿง‘โ€๐Ÿณ Setting up a ReVanced repository for the first time +description: How to configure a repository to be ReVanced compliants. +hide_table_of_contents: false +--- + +# ๐Ÿง‘โ€๐Ÿณ How do you setup an authentic ReVanced Repository? + +To cook up your very first, authentic ReVanced Repository, +you need to make sure it has: + +## Proper README Structure + +Every repository at ReVanced will feature the iconic structure of... + +## Consistent CI Configuration + +Each CI is configured with GitHub Actions, over time this might before Forgejo + +Always preferred 'single quote' over "double quote" when possible + +## Contributing guidelines + +## Security Policy + +There are no rules on how long should you support a software after it release. + +## Issue template + +## Misc + +To make sure that every new contributor receive a warm welcome, +create `config.yml` file in `.github` directory and add the following content: + +```yml +firstPRMergeComment: > + โค๏ธ Thank you for contributing to ReVanced. Join us on [Discord](https://revanced.app/discord) to receive a role for your contribution. +``` + +To make sure that dependencies are all getting updated automatically, +create `dependabot.yml` file in `.github` directory and set it up to your project requirements. diff --git a/docs/revanced-internals/Repository/ReVanced AAPT2/merging.md b/docs/revanced-internals/Repository/ReVanced AAPT2/merging.md new file mode 100644 index 0000000..c099f3b --- /dev/null +++ b/docs/revanced-internals/Repository/ReVanced AAPT2/merging.md @@ -0,0 +1,17 @@ +--- +title: โ€๐Ÿคโ€ Merging AOSP changes into AAPT2 +description: Consistency, structuring of the sentences. +hide_table_of_contents: false +--- + + +# โ€๐Ÿคโ€ Translation guide 101 + +This translation guidelines can be applied to any repository that work with translation system + +## How to translate @ ReVanced + +Well to start off: +1. Use neutral gender-specific words +2. Opt for word that's closest to the original meaning or transliterate it (if you can't, leave the word as-is) +3. If possible, try to stay as close to the original length of the word diff --git a/docs/revanced-internals/Repository/ReVanced AAPT2/prebuilts/TODO.md b/docs/revanced-internals/Repository/ReVanced AAPT2/prebuilts/TODO.md new file mode 100644 index 0000000..a71801f --- /dev/null +++ b/docs/revanced-internals/Repository/ReVanced AAPT2/prebuilts/TODO.md @@ -0,0 +1,26 @@ +--- +title: ๐Ÿ“” Prebuilt verification +description: Handling prebuilt libraries that exists in ReVanced Manager. +hide_table_of_contents: false +--- + +# ๐Ÿ“” How to handle prebuilts library + +ReVanced Manager uses prebuilt library from AAPT2 in order to handle Android APK resources files, +such file are meant to be verified by GitHub Attestation within the ReVanced organisation. + +## How to verify prebuilt library + +Requirements + - Have the latest version of GitHub CLI installed on your computer + +Verify the library by atttesting the file using this command: + +```bash +gh at verify {prebuilt location} --owner ReVanced +``` + +> โšก **DANGER** +> If you use libraries from 3rd party (not ReVanced), replace the owner parametre to their user/organisation. +> **Make sure that you trust them first**, then update the ownership in the documentation to let everyone know +> that ownership is changed. (Optional) diff --git a/docs/revanced-internals/Repository/ReVanced AAPT2/release/TODO.md b/docs/revanced-internals/Repository/ReVanced AAPT2/release/TODO.md new file mode 100644 index 0000000..0f8ca90 --- /dev/null +++ b/docs/revanced-internals/Repository/ReVanced AAPT2/release/TODO.md @@ -0,0 +1,177 @@ +--- +title: ๐Ÿ”ฅ Releasing the ReVanced Manager +description: Before-takeoff checklist for releasing the ReVanced Manager. +hide_table_of_contents: false +--- + +# ๐Ÿ”ฅ How to ensure a release goes smoothly + +> **NOTE** +> This guide is for ReVanced Manager (Flutter) only! + +## ๐Ÿง‘โ€๐Ÿ’ป Development + +### Rule-of-Engagement + +Standard ReVanced procedure + +During development, every user must PR to `dev` branch, pushing directly is an option +but not recommended unless the patch is absolutely needed. + +### Setup + +Requirements: + + - More than 4 GB of available memory[^1] + - Java Development Kit 17 of any kinds + - Latest Android SDK + - Flutter 3.29 + - Any code editor of your choice + - Optionally, Android device with `arm64-v8a`, `armeabi`, or `x86_64` architecture(s) + +Quirks: + + - It's not possible to support `x86` architecture due to limitation with Flutter SDK + +Once you have set up all that, make sure that you have the files required for compliation by +running these commands on the root of your repository: + +```bash +flutter pub get # [1] Get the dependencies required for Flutter apps. +dart run slang # [2] Build translation strings. +dart run build_runner -d # [3] Build generated files. +``` + +### Assemble + +You can assemble up to 3 variants, `release`, `debug`, and `profile` + +Before you build, make sure that you have the files required for compliation by running these commands *once last time*: + +```bash +flutter pub get # [1] Get the dependencies required for Flutter apps. +dart run slang # [2] Build translation strings. +dart run build_runner -d # [3] Build generated files. +``` + +> **WARNING** +> If there's translation changes, you need to run `dart run slang` again to generate the translation strings. + +#### Release + +This is your standard run-of-the-mill variant that's shown to average user, +the build will be stable and fast without any assisted development tools. + +Log retrieval methods (sorted by recommendation) + * Android logcat + * Built in Share logs in manager's settings + +To build it, run: + +```bash +flutter build apk # By default this will build release variant. +``` + +> **NOTE** +> This will build the APK with `debug` signature, the manager's identifier will be `development` +> If you need `release` identifier, specify keystores for the projects. + +#### Debug + +This variant comes with developer-assisted tools provided by Flutter to help during development, +the build will be incredibily and painfully inefficient and slow depending on devices tier + +Log retrieval methods (sorted by recommendation) + * Flutter commands + * Android logcat + * Built in Share logs in manager's settings + +To build it, run: + +```bash +flutter build apk --debug +``` + +> **TIP** +> During development you can connect your Android device using ADB and run `flutter run` to install the APK and +> get access to Flutter's hot reload. If you have installed the `debug` APK already, you can open the app then +> run `flutter attach` to reconnect it. + +#### Profile + +This variant comes with developer-assisted tools specifically for profiling, +the build will be stable and fast just like `release` variant. + +Log retrieval methods (sorted by recommendation) + * Flutter commands + * Android logcat + * Built in Share logs in manager's settings + +```bash +flutter build apk --profile +``` + +> **TIP** +> If you have installed the `profile` APK already, you can open the app then run `flutter attach` to reconnect it. +> However you won't be able to do any debugging or hot reload except profiling. + +### Format check + +Note that format check should be done every time as it can cause *lots of* merge conflicts, +if a repository goes without format check for a long time, +leave it as is as it's very destructive if done later on or gradually format it if it's absolutely needed. + +```bash +dart format file.dart # If you want to format a specific of the file +dart format . # If you want to format all of the files +``` + +## โœ… Quality Assurance + +Tests are carried by *ad-hoc* basis, you can test the ReVanced Manager by using either Android emulator or +physical Android device with any of the supported API levels ***and the newest/development levels for compatibility***. + +You should test the areas that have been primarily affected by changes then follow by lastly, patching the app. + +## ๐Ÿ›ซ Ready-Set-Go! (Release) + +Standard ReVanced procedure + +Every changes pushed to `dev` branch, a bot will open a draft PR merging `dev` changes to `main` which is +the golden branch, once you've tested the app, mark the PR as ready, approve it then wait for another +maintainers or trusted contributors to approve it, merge it then the workflow will handle everything for you. + +### Pre-Semantic Release procedure + +If you're dealing with legacy branch and wish to create a release, *hopefully you shouldn't* +this is how we did it. + +#### Update the version code in `pubspec.yaml` + +```yaml +# Version format: A.B.C.D+A X X B X X C X X +# +# A is the major version +# B is the minor version +# C is the patch version +# D is build modifier (e.g., -dev.1) +# +# All as defined by Semantic Versioning + +version: version+versionCode # example: 1.9.3+100900300 +``` + +#### Create tag on the repository + +```bash +git tag v(version) +git push --tags +``` + +You could optionally write description for the tag or do `git tag -s v(version)` if you wish to create signed tag + +#### Sit back, relax + +The release workflow should release the build as intended if there isn't any compliation errors. + +[^1]: Estimation based on *project memory requirements + 1 GB buffer*, so *3072 + 1024* = 4096 MB or ~4 GB diff --git a/docs/revanced-internals/Repository/ReVanced AAPT2/setup.md b/docs/revanced-internals/Repository/ReVanced AAPT2/setup.md new file mode 100644 index 0000000..ffea05d --- /dev/null +++ b/docs/revanced-internals/Repository/ReVanced AAPT2/setup.md @@ -0,0 +1,28 @@ +--- +title: โ€๐Ÿง‘โ€๐Ÿ’ป Building AAPT2 +description: Consistency, structuring of the sentences. +hide_table_of_contents: false +--- + + +# โ€๐Ÿง‘โ€๐Ÿ’ป Building AAPT2 + +## Setup Android NDK + +... + +## Clone the repository and submodules + +```bash +git clone https://github.com/ReVanced/aapt2 +cd aapt2 +git submodule update --init --depth 1 +``` + +Notice how there's `--depth 1` argument in the command for cloning the submodule, +this is intentional as we are cloning the Android Open Source Project, +which have lots of commits and takes lots of storages. + +## Build the AAPT2 Library + +... diff --git a/docs/revanced-internals/Repository/ReVanced API/Migration-implementers.md b/docs/revanced-internals/Repository/ReVanced API/Migration-implementers.md new file mode 100644 index 0000000..24976b3 --- /dev/null +++ b/docs/revanced-internals/Repository/ReVanced API/Migration-implementers.md @@ -0,0 +1,31 @@ +--- +title: ๐Ÿš€ ReVanced API Migration guide (user) +description: Migrating off deprecated/removed configuration for consumer-side. +hide_table_of_contents: false +--- + +# How to migrating to latest version of ReVanced API + +This guide is exclusively for implementers + +## V2 (v1.3.0) -> V3/V4 (v1.4.0, v1.5.0, v1.6.0) + +The following API have been removed: + +| API | Replacement | +|:----------------------------------|:-----------------------| +| `/v1/{repo}/latest` | `/v1/{repo}` | +| `/v1/{repo}/latest/version` | `/v1/{repo}/version` | +| `/v1/{repo}/latest/list` | `/v1/{repo}/list` | +| `/v1/{repo}/latest/keys` | `/v1/{repo}/keys` | + +## V1 (v1.0.0, v1.1.0) -> V2 (v1.2.0, v1.3.0) + +The following API have been deprecated: + +| API | Replacement | +|:----------------------------------|:-----------------------| +| `/v1/{repo}/latest` | `/v1/{repo}` | +| `/v1/{repo}/latest/version` | `/v1/{repo}/version` | +| `/v1/{repo}/latest/list` | `/v1/{repo}/list` | +| `/v1/{repo}/latest/keys` | `/v1/{repo}/keys` | diff --git a/docs/revanced-internals/Repository/ReVanced API/Migration.md b/docs/revanced-internals/Repository/ReVanced API/Migration.md new file mode 100644 index 0000000..6024dd5 --- /dev/null +++ b/docs/revanced-internals/Repository/ReVanced API/Migration.md @@ -0,0 +1,124 @@ +--- +title: ๐Ÿš€ ReVanced API Migration guide (host) +description: Migrating off deprecated/removed configuration for hostees. +hide_table_of_contents: false +--- + +# ๐Ÿš€ How to migrating to latest version of ReVanced API + +This guide is exclusively for API hosters + +## V4 (v1.5.0) -> V4 (v1.6.0) + +Add `status` field to lead user to uptime status page. + +```json +{ + "status": "https://status.revanced.app", +} +``` + +## V2 (v1.3.0) -> V3 (v1.4.0, v1.5.0) + +Never include a field for `integrations` as it's removed because ReVanced Patches now merged with ReVanced Integrations repository rendering Integrations repo useless. + +```diff +organization = "foobar" +patches = { ... } +-integrations = { ... } +manager = { ... } +contributors-repositories = [ ...] +api-version = 1 +cors-allowed-hosts = [ ... ] +endpoint = "http://example.com" +old-api-endpoint = "https://old-api.example.com" +static-files-path = "static/root" +versioned-static-files-path = "static/versioned" +about-json-file-path = "about.json" +``` + +Your `configuration.toml` look like this before v1.4.0 + +```diff +organization = "foobar" +patches = { ... } +manager = { ... } +contributors-repositories = [ ...] +api-version = 1 +cors-allowed-hosts = [ ... ] +endpoint = "http://example.com" +old-api-endpoint = "https://old-api.example.com" +static-files-path = "static/root" +versioned-static-files-path = "static/versioned" +about-json-file-path = "about.json" +``` + +This is now the next format of `configuration.toml` after v1.4.0 + +Legends: +* Blue, modified +* Green, added +* Red, removed + +```diff ++++ api-version = "v1" +cors-allowed-hosts = [ + "example.com", + "*.example.com" +] +endpoint = "https://api.example.com" +static-files-path = "static/root" +versioned-static-files-path = "static/versioned" ++backend-service-name = "GitHub" +about-json-file-path = "about.json" +organization = "foobar" + +[patches] +repository = "revanced-patches" +asset-regex = "rvp$" +signature-asset-regex = "asc$" +public-key-file = "static/root/keys.asc" +public-key-id = 1234567890 + +[manager] +repository = "revanced-manager" +asset-regex = "apk$" + ++++ [contributors-repositories] ++++ revanced-patcher = "ReVanced Patcher" ++++ revanced-patches = "ReVanced Patches" ++++ revanced-website = "ReVanced Website" ++++ revanced-cli = "ReVanced CLI" ++++ revanced-manager = "ReVanced Manager" +``` + + +## V1 (v1.0.0, v1.1.0) -> V2 (v1.2.0, v1.3.0) + +In `configuration.toml`, you need to specify the directory to static & versioned static, and about information to the API. + +```diff +organization = "foobar" +patches = { ... } +integrations = { ... } +manager = { ... } +contributors-repositories = [ ...] +api-version = 1 +cors-allowed-hosts = [ ... ] +endpoint = "http://example.com" +old-api-endpoint = "https://old-api.example.com" ++static-files-path = "static/root" ++versioned-static-files-path = "static/versioned" ++about-json-file-path = "about.json" +``` + +### Static files + +Hostee need to offer a directory to the API about static & versioned static files. + +This is use to store your public gpg key. + +### About configuration + +Starting in v1.1.0, API providers need to config an about information. +See example for more information. diff --git a/docs/revanced-internals/Repository/ReVanced Documentation/emoji-glossary.md b/docs/revanced-internals/Repository/ReVanced Documentation/emoji-glossary.md new file mode 100644 index 0000000..9af6ca7 --- /dev/null +++ b/docs/revanced-internals/Repository/ReVanced Documentation/emoji-glossary.md @@ -0,0 +1,25 @@ +--- +title: ๐Ÿ’ซ Emoji Glossary +description: Learn what emoji usually meant in ReVanced documentation. +hide_table_of_contents: true +--- + +# ๐Ÿ’ซ Emoji Glossary + +This glossary is NOT rule, but meant to keep thing consistent in this documentation. + +* ๐Ÿ‘‹ Welcome +* โœ…/๐Ÿฅž Approve +* ๐Ÿ”ฅ Breaking/Disapprove/Error +* ๐ŸŽจ Design/Art +* ๐Ÿ—๏ธ Infra/CI/CD +* ๐Ÿฆ Bank/Invoice/Financial +* ๐Ÿš€ API/CDN +* โš ๏ธ Warning (Generic/General) +* ๐Ÿ”’ Security +* ๐Ÿชช Credential +* ๐Ÿง‘โ€๐Ÿ’ป Code +* ๐Ÿ’€ Skull lmao cry? +* ๐ŸŒ Translation +* โœ๏ธ Writing +* ๐Ÿ’ซ Dictionary/Glossary diff --git a/docs/revanced-internals/Repository/ReVanced Manager/prebuilts/1.md b/docs/revanced-internals/Repository/ReVanced Manager/prebuilts/1.md new file mode 100644 index 0000000..a71801f --- /dev/null +++ b/docs/revanced-internals/Repository/ReVanced Manager/prebuilts/1.md @@ -0,0 +1,26 @@ +--- +title: ๐Ÿ“” Prebuilt verification +description: Handling prebuilt libraries that exists in ReVanced Manager. +hide_table_of_contents: false +--- + +# ๐Ÿ“” How to handle prebuilts library + +ReVanced Manager uses prebuilt library from AAPT2 in order to handle Android APK resources files, +such file are meant to be verified by GitHub Attestation within the ReVanced organisation. + +## How to verify prebuilt library + +Requirements + - Have the latest version of GitHub CLI installed on your computer + +Verify the library by atttesting the file using this command: + +```bash +gh at verify {prebuilt location} --owner ReVanced +``` + +> โšก **DANGER** +> If you use libraries from 3rd party (not ReVanced), replace the owner parametre to their user/organisation. +> **Make sure that you trust them first**, then update the ownership in the documentation to let everyone know +> that ownership is changed. (Optional) diff --git a/docs/revanced-internals/Repository/ReVanced Manager/release/1.md b/docs/revanced-internals/Repository/ReVanced Manager/release/1.md new file mode 100644 index 0000000..68c4942 --- /dev/null +++ b/docs/revanced-internals/Repository/ReVanced Manager/release/1.md @@ -0,0 +1,177 @@ +--- +title: ๐Ÿ”ฅ Releasing the ReVanced Manager +description: Before-takeoff checklist for releasing the ReVanced Manager. +hide_table_of_contents: false +--- + +# ๐Ÿ”ฅ How to ensure a release goes smoothly + +> **NOTE** +> This guide is for ReVanced Manager (Flutter) only! + +## ๐Ÿง‘โ€๐Ÿ’ป Development + +### Rule-of-Engagement + +Standard ReVanced procedure + +During development, every user must PR to `dev` branch, pushing directly is an option +but not recommended unless the patch is absolutely needed. + +### Setup + +Requirements: + + - More than 4 GB of available memory[^1] + - Java Development Kit 17 of any kinds + - Latest Android SDK + - Flutter 3.29 SDK + - Any code editor of your choice + - Optionally, Android device with `arm64-v8a`, `armeabi`, or `x86_64` architecture(s) + +Quirks: + + - It's not possible to support `x86` architecture due to limitation with Flutter SDK + +Once you have set up all that, make sure that you have the files required for compliation by +running these commands on the root of your repository: + +```bash +flutter pub get # [1] Get the dependencies required for Flutter apps. +dart run slang # [2] Build translation strings. +dart run build_runner -d # [3] Build generated files. +``` + +### Assemble + +You can assemble up to 3 variants, `release`, `debug`, and `profile` + +Before you build, make sure that you have the files required for compliation by running these commands *once last time*: + +```bash +flutter pub get # [1] Get the dependencies required for Flutter apps. +dart run slang # [2] Build translation strings. +dart run build_runner -d # [3] Build generated files. +``` + +> **WARNING** +> If there's translation changes, you need to run `dart run slang` again to generate the translation strings. + +#### Release + +This is your standard run-of-the-mill variant that's shown to average user, +the build will be stable and fast without any assisted development tools. + +Log retrieval methods (sorted by recommendation) + - Android logcat + - Built in Share logs in manager's settings + +To build it, run: + +```bash +flutter build apk # By default this will build release variant. +``` + +> **NOTE** +> This will build the APK with `debug` signature, the manager's identifier will be `development` +> If you need `release` identifier, specify keystores for the projects. + +#### Debug + +This variant comes with developer-assisted tools provided by Flutter to help during development, +the build will be incredibily and painfully inefficient and slow depending on devices tier + +Log retrieval methods (sorted by recommendation) + - Flutter commands + - Android logcat + - Built in Share logs in manager's settings + +To build it, run: + +```bash +flutter build apk --debug +``` + +> **TIP** +> During development you can connect your Android device using ADB and run `flutter run` to install the APK and +> get access to Flutter's hot reload. If you have installed the `debug` APK already, you can open the app then +> run `flutter attach` to reconnect it. + +#### Profile + +This variant comes with developer-assisted tools specifically for profiling, +the build will be stable and fast just like `release` variant. + +Log retrieval methods (sorted by recommendation) + - Flutter commands + - Android logcat + - Built in Share logs in manager's settings + +```bash +flutter build apk --profile +``` + +> **TIP** +> If you have installed the `profile` APK already, you can open the app then run `flutter attach` to reconnect it. +> However you won't be able to do any debugging or hot reload except profiling. + +### Format check + +Note that format check should be done every time as it can cause *lots of* merge conflicts, +if a repository goes without format check for a long time, +leave it as is as it's very destructive if done later on or gradually format it if it's absolutely needed. + +```bash +dart format file.dart # If you want to format a specific of the file +dart format . # If you want to format all of the files +``` + +## โœ… Quality Assurance + +Tests are carried by *ad-hoc* basis, you can test the ReVanced Manager by using either Android emulator or +physical Android device with any of the supported API levels ***and the newest/development levels for compatibility***. + +You should test the areas that have been primarily affected by changes then follow by lastly, patching the app. + +## ๐Ÿ›ซ Ready-Set-Go! (Release) + +Standard ReVanced procedure + +Every changes pushed to `dev` branch, a bot will open a draft PR merging `dev` changes to `main` which is +the golden branch, once you've tested the app, mark the PR as ready, approve it then wait for another +maintainers or trusted contributors to approve it, merge it then the workflow will handle everything for you. + +### Pre-Semantic Release procedure + +If you're dealing with legacy branch and wish to create a release, *hopefully you shouldn't* +this is how we did it. + +#### Update the version code in `pubspec.yaml` + +```yaml +# Version format: A.B.C.D+A X X B X X C X X +# +# A is the major version +# B is the minor version +# C is the patch version +# D is build modifier (e.g., -dev.1) +# +# All as defined by Semantic Versioning + +version: version+versionCode # example: 1.9.3+100900300 +``` + +#### Create tag on the repository + +```bash +git tag v(version) +git push --tags +``` + +You could optionally write description for the tag or do `git tag -s v(version)` if you wish to create signed tag + +#### Sit back, relax + +The release workflow should release the build as intended if there isn't any compliation errors. + +[^1]: Estimation based on *project memory requirements + 1 GB buffer*, so *3072 + 1024* = 4096 MB or ~4 GB diff --git a/docs/revanced-internals/Repository/ReVanced Manager/translations.md b/docs/revanced-internals/Repository/ReVanced Manager/translations.md new file mode 100644 index 0000000..ad19cd8 --- /dev/null +++ b/docs/revanced-internals/Repository/ReVanced Manager/translations.md @@ -0,0 +1,16 @@ +--- +title: ๐ŸŒ Translation guidelines +description: Consistency, structuring of the sentences. +hide_table_of_contents: false +--- + +# ๐ŸŒ Translation guide 101 + +This translation guidelines can be applied to any repository that work with translation system + +## How to translate @ ReVanced + +Well to start off: +1. Use neutral gender-specific words +2. Opt for word that's closest to the original meaning or transliterate it (if you can't, leave the word as-is) +3. If possible, try to stay as close to the original length of the word diff --git a/docs/revanced-internals/merge-README.md b/docs/revanced-internals/merge-README.md new file mode 100644 index 0000000..734235b --- /dev/null +++ b/docs/revanced-internals/merge-README.md @@ -0,0 +1,59 @@ +# ๐Ÿ—ฃ๏ธ๐Ÿ”ฅ๐Ÿ”ฅ๐Ÿ—ฃ๏ธ๐Ÿ”ฅ๐Ÿ—ฃ๏ธ ReVanced Team + +Welcome to ReVanced team! + +If you're done or don't want this to be shown anymore you can always toggle off in user visiblity. + +## ๐Ÿ”— Quick links + + - ReVanced Invoicing + - Figma design + +## โ“ About + +Development @ ReVanced can be complex, it doesn't have to be like that to necessary be like that because you been accepted to ReVanced which means you can read! Hooray! + +## ๐Ÿ’ช Features + +This guidelines will provides you the necessary building block to make an repository ReVanced(tm)-style, and write like a ReVanced member. + +## ๐Ÿš€ How to get started + +General + - How do you setup an authentic ReVanced Repository? + - ๐Ÿ“œ Issue template + - ๐Ÿค– CI Bizzare Adventure + - Syncing `dev` to `main` + - Semantic Release + - Attestation + - Project-specific (e.g., Gradle, Node) + - ๐Ÿ“” I need to use prebuilt, how to handle prebuilt library + - ๐ŸŒ Translation strings + +ReVanced Invoicing + - ๐Ÿงพ Generating Invoice + - Replacing legal frameworks + - ๐Ÿš€ Submitting Invoice + - Submitting to Open Collective + - Expense Creation + - How to take care of Open Collective Europe + +ReVanced API + - ๐Ÿ”ญ Migration Guide + - V1 -> V2 + - V2 -> V3 + - V3 -> V4 + - ๐Ÿ”ญ See OpenAPI specs + +ReVanced Documentation style guidelines + - ๐Ÿ“œ Template + - โœ๏ธ (as a writer I do not know the secret to replicate the writing style) + - ๐Ÿฑ Emoji Glossary + +ReVanced Manager + - ๐Ÿ“” Handle prebuilt library + - ๐ŸŒ Crowdin Translation + - ๐Ÿš€ How to ensure a release goes smoothly + - ๐Ÿง‘โ€๐Ÿ’ป Development + - โœ… Quality Assurance + - ๐Ÿ›ซ Ready-Set-Go! Release