diff --git a/.github/workflows/build-pr.yml b/.github/workflows/build-pr.yml index 02c52f102..de070a21f 100644 --- a/.github/workflows/build-pr.yml +++ b/.github/workflows/build-pr.yml @@ -111,6 +111,16 @@ jobs: continue-on-error: true privileged: ${{ fromJSON(needs.metadata.outputs.privileged) }} + build_zimfile: + if: ${{ contains(github.event.pull_request.labels.*.name, 'ci:build zimfile') }} + needs: [submodule, metadata] + uses: ./.github/workflows/build-zimfile.yml + with: + ref: ${{github.event.pull_request.head.ref}} + repo: ${{github.event.pull_request.head.repo.full_name}} + secrets: + RO_DISCOURSE_API_KEY: ${{ secrets.RO_DISCOURSE_API_KEY }} + combine_build: needs: [build_english, build_i18n, build_blog, build_videos] if: | @@ -140,5 +150,5 @@ jobs: cleanup: if: ${{ always() }} - needs: [build_english, build_i18n, build_blog, build_videos] + needs: [build_english, build_i18n, build_blog, build_videos, build_zimfile] uses: privacyguides/.github/.github/workflows/cleanup.yml@main diff --git a/.github/workflows/build-zimfile.yml b/.github/workflows/build-zimfile.yml new file mode 100644 index 000000000..d129540eb --- /dev/null +++ b/.github/workflows/build-zimfile.yml @@ -0,0 +1,603 @@ +name: 🥝 Build Zimfile + +on: + workflow_call: + inputs: + ref: + required: true + type: string + repo: + required: true + type: string + secrets: + RO_DISCOURSE_API_KEY: + required: false + +permissions: + contents: read + +env: + VIDEOS_SITE_BASE_URL: https://www.privacyguides.org/videos/ + HOMEPAGE_CTA_ABOUT_LINK: about.html + HOMEPAGE_CTA_DONATE_LINK: about/donate.html + BUILD_OFFLINE: true + PRODUCTION: true + CARDS: false + GITREVISIONDATE: false + GITAUTHORS: false + +jobs: + package_eng: + runs-on: ubuntu-latest + permissions: + contents: read + + env: + LANGUAGE_SWITCHER: false + MAIN_SITE_BASE_URL: /en/index.html + MAIN_SITE_ABOUT_URL: /en/about.html + MAIN_SITE_RECOMMENDATIONS_URL: /en/tools.html + MAIN_SITE_KNOWLEDGE_BASE_URL: /en/basics/why-privacy-matters.html + ARTICLES_SITE_BASE_URL: /articles/index.html + + steps: + - name: Add GitHub Token to Environment + run: | + echo "GH_TOKEN=${{ secrets.GITHUB_TOKEN }}" >> "$GITHUB_ENV" + + - name: Download Repository + uses: actions/checkout@v4 + with: + repository: ${{ inputs.repo }} + ref: ${{ inputs.ref }} + persist-credentials: "false" + fetch-depth: 0 + + - name: Download Submodules + uses: actions/download-artifact@v4 + with: + pattern: repo-* + path: modules + + - name: Move mkdocs-material-insiders to mkdocs-material + run: | + rmdir modules/mkdocs-material + mv modules/repo-mkdocs-material-insiders modules/mkdocs-material + + - name: Move brand submodule to theme/assets/brand + run: | + rmdir theme/assets/brand + mv modules/repo-brand theme/assets/brand + + - name: Install Python (pipenv) + uses: actions/setup-python@v5 + with: + cache: "pipenv" + + - name: Install Python Dependencies + run: | + pip install pipenv + pipenv install + sudo apt install pngquant + + - name: Generate Donating Members List + continue-on-error: true + env: + DISCOURSE_API_KEY: ${{ secrets.RO_DISCOURSE_API_KEY }} + run: | + pip install requests + python tools/generate-members.py > includes/members.md + + - name: Build English + run: | + ./run.sh --build --production --insiders --offline --lang=en + + - name: Delete Unreferenced Assets + run: | + bash tools/delete-unreferenced.sh + env: + ASSETS_DIR: site/en/assets + SEARCH_DIR: site/en + + - name: Run generate-topics.sh for top posts + run: | + bash tools/generate-topics.sh \ + --source='https://discuss.privacyguides.net/top.json?period=weekly' \ + --tag="top posts" \ + --destination="./site/en/index.html" \ + --count=3 + + - name: Run generate-topics.sh for latest posts + run: | + bash tools/generate-topics.sh \ + --source='https://discuss.privacyguides.net/latest.json' \ + --tag="latest posts" \ + --destination="./site/en/index.html" \ + --count=12 + + - name: Build Articles + run: | + pipenv run mkdocs build --config-file mkdocs.blog.yml + + - name: Delete Unreferenced Assets + run: | + bash tools/delete-unreferenced.sh + env: + ASSETS_DIR: site/articles/assets + SEARCH_DIR: site/articles + + - name: Remove Duplicate Files + run: | + cd site && bash ../tools/symlink-duplicates.sh + ln -s en/index.html index.html + ln -s en/about/notices.html license + cd .. + + - name: Set zimfile name + run: | + echo "ZIMFILE_NAME=privacyguides.org_en_all_$(date +%Y)-$(date +%m).zim" >> "$GITHUB_ENV" + + - name: Create ZIM File + uses: addnab/docker-run-action@v3 + with: + image: ghcr.io/openzim/zim-tools:3.1.3 + options: -v ${{ github.workspace }}:/data + run: | + zimwriterfs \ + -w index.html \ + -I en/assets/brand/logos/png/square/pg-yellow.png \ + -l eng \ + -t "Privacy Guides" \ + -d "Your central privacy and security resource to protect yourself online." \ + -c "Privacy Guides" \ + -p "Privacy Guides" \ + -e "https://www.privacyguides.org" \ + -n "privacyguides.org_en_all" \ + /data/site/ /data/${{ env.ZIMFILE_NAME }} + + - name: Upload ZIM File + uses: actions/upload-artifact@v4 + with: + path: ${{ env.ZIMFILE_NAME }} + name: ${{ env.ZIMFILE_NAME }} + compression-level: 0 + + - name: Run zimcheck + uses: addnab/docker-run-action@v3 + continue-on-error: true + with: + image: ghcr.io/openzim/zim-tools:3.1.3 + options: -v ${{ github.workspace }}:/data + run: | + zimcheck /data/${{ env.ZIMFILE_NAME }} + + package_eng_kb: + runs-on: ubuntu-latest + permissions: + contents: read + + env: + LANGUAGE_SWITCHER: false + ARTICLES_SITE_BASE_URL: https://www.privacyguides.org/articles/ + + steps: + - name: Add GitHub Token to Environment + run: | + echo "GH_TOKEN=${{ secrets.GITHUB_TOKEN }}" >> "$GITHUB_ENV" + + - name: Download Repository + uses: actions/checkout@v4 + with: + repository: ${{ inputs.repo }} + ref: ${{ inputs.ref }} + persist-credentials: "false" + fetch-depth: 0 + + - name: Download Submodules + uses: actions/download-artifact@v4 + with: + pattern: repo-* + path: modules + + - name: Move mkdocs-material-insiders to mkdocs-material + run: | + rmdir modules/mkdocs-material + mv modules/repo-mkdocs-material-insiders modules/mkdocs-material + + - name: Move brand submodule to theme/assets/brand + run: | + rmdir theme/assets/brand + mv modules/repo-brand theme/assets/brand + + - name: Install Python (pipenv) + uses: actions/setup-python@v5 + with: + cache: "pipenv" + + - name: Install Python Dependencies + run: | + pip install pipenv + pipenv install + sudo apt install pngquant + + - name: Generate Donating Members List + continue-on-error: true + env: + DISCOURSE_API_KEY: ${{ secrets.RO_DISCOURSE_API_KEY }} + run: | + pip install requests + python tools/generate-members.py > includes/members.md + + - name: Build English + run: | + ./run.sh --build --production --insiders --offline --lang=en + + - name: Run generate-topics.sh for top posts + run: | + bash tools/generate-topics.sh \ + --source='https://discuss.privacyguides.net/top.json?period=weekly' \ + --tag="top posts" \ + --destination="./site/en/index.html" \ + --count=3 + + - name: Run generate-topics.sh for latest posts + run: | + bash tools/generate-topics.sh \ + --source='https://discuss.privacyguides.net/latest.json' \ + --tag="latest posts" \ + --destination="./site/en/index.html" \ + --count=12 + + - name: Delete Unreferenced Assets + run: | + bash tools/delete-unreferenced.sh + env: + ASSETS_DIR: site/en/assets + SEARCH_DIR: site/en + + - name: Remove Duplicate Files + run: | + cd site && bash ../tools/symlink-duplicates.sh + ln -s en/index.html index.html + ln -s en/about/notices.html license + cd .. + + - name: Set zimfile name + run: | + echo "ZIMFILE_NAME=privacyguides.org_en_kb_$(date +%Y)-$(date +%m).zim" >> "$GITHUB_ENV" + + - name: Create ZIM File + uses: addnab/docker-run-action@v3 + with: + image: ghcr.io/openzim/zim-tools:3.1.3 + options: -v ${{ github.workspace }}:/data + run: | + zimwriterfs \ + -w index.html \ + -I en/assets/brand/logos/png/square/pg-yellow.png \ + -l eng \ + -t "Privacy Guides" \ + -d "Knowledge base articles and recommendations from Privacy Guides." \ + -c "Privacy Guides" \ + -p "Privacy Guides" \ + -e "https://www.privacyguides.org" \ + -n "privacyguides.org_en_kb" \ + /data/site/ /data/${{ env.ZIMFILE_NAME }} + + - name: Upload ZIM File + uses: actions/upload-artifact@v4 + with: + path: ${{ env.ZIMFILE_NAME }} + name: ${{ env.ZIMFILE_NAME }} + compression-level: 0 + + - name: Run zimcheck + uses: addnab/docker-run-action@v3 + continue-on-error: true + with: + image: ghcr.io/openzim/zim-tools:3.1.3 + options: -v ${{ github.workspace }}:/data + run: | + zimcheck /data/${{ env.ZIMFILE_NAME }} + + package_eng_articles: + runs-on: ubuntu-latest + permissions: + contents: read + + env: + MAIN_SITE_BASE_URL: https://www.privacyguides.org/en/ + MAIN_SITE_ABOUT_URL: https://www.privacyguides.org/en/about/ + MAIN_SITE_RECOMMENDATIONS_URL: https://www.privacyguides.org/en/tools/ + MAIN_SITE_KNOWLEDGE_BASE_URL: https://www.privacyguides.org/en/basics/ + + steps: + - name: Add GitHub Token to Environment + run: | + echo "GH_TOKEN=${{ secrets.GITHUB_TOKEN }}" >> "$GITHUB_ENV" + + - name: Download Repository + uses: actions/checkout@v4 + with: + repository: ${{ inputs.repo }} + ref: ${{ inputs.ref }} + persist-credentials: "false" + fetch-depth: 0 + + - name: Download Submodules + uses: actions/download-artifact@v4 + with: + pattern: repo-* + path: modules + + - name: Move mkdocs-material-insiders to mkdocs-material + run: | + rmdir modules/mkdocs-material + mv modules/repo-mkdocs-material-insiders modules/mkdocs-material + + - name: Move brand submodule to theme/assets/brand + run: | + rmdir theme/assets/brand + mv modules/repo-brand theme/assets/brand + + - name: Install Python (pipenv) + uses: actions/setup-python@v5 + with: + cache: "pipenv" + + - name: Install Python Dependencies + run: | + pip install pipenv + pipenv install + sudo apt install pngquant + + - name: Build Articles + run: | + pipenv run mkdocs build --config-file mkdocs.blog.yml + + - name: Delete Unreferenced Assets + run: | + bash tools/delete-unreferenced.sh + env: + ASSETS_DIR: site/articles/assets + SEARCH_DIR: site/articles + + - name: Remove Duplicate Files + run: | + cd site && bash ../tools/symlink-duplicates.sh + ln -s articles/index.html index.html + cd .. + + - name: Set zimfile name + run: | + echo "ZIMFILE_NAME=privacyguides.org_en_articles_$(date +%Y)-$(date +%m).zim" >> "$GITHUB_ENV" + + - name: Create ZIM File + uses: addnab/docker-run-action@v3 + with: + image: ghcr.io/openzim/zim-tools:3.1.3 + options: -v ${{ github.workspace }}:/data + run: | + zimwriterfs \ + -w index.html \ + -I articles/assets/brand/logos/png/square/pg-yellow.png \ + -l eng \ + -t "Privacy Guides" \ + -d "Long-form articles from the Privacy Guides team and other contributors." \ + -c "Privacy Guides" \ + -p "Privacy Guides" \ + -e "https://www.privacyguides.org" \ + -n "privacyguides.org_en_articles" \ + /data/site/ /data/${{ env.ZIMFILE_NAME }} + + - name: Upload ZIM File + uses: actions/upload-artifact@v4 + with: + path: ${{ env.ZIMFILE_NAME }} + name: ${{ env.ZIMFILE_NAME }} + compression-level: 0 + + - name: Run zimcheck + uses: addnab/docker-run-action@v3 + continue-on-error: true + with: + image: ghcr.io/openzim/zim-tools:3.1.3 + options: -v ${{ github.workspace }}:/data + run: | + zimcheck /data/${{ env.ZIMFILE_NAME }} + + build_mul: + runs-on: ubuntu-latest + continue-on-error: true + permissions: + contents: read + + env: + MAIN_SITE_BASE_URL: /en/index.html + MAIN_SITE_ABOUT_URL: /en/about.html + MAIN_SITE_RECOMMENDATIONS_URL: /en/tools.html + MAIN_SITE_KNOWLEDGE_BASE_URL: /en/basics/why-privacy-matters.html + ARTICLES_SITE_BASE_URL: /articles/index.html + + strategy: + matrix: + lang: [en, es, fr, he, it, nl, ru, zh-Hant] + + steps: + - name: Add GitHub Token to Environment + run: | + echo "GH_TOKEN=${{ secrets.GITHUB_TOKEN }}" >> "$GITHUB_ENV" + + - name: Download Repository + uses: actions/checkout@v4 + with: + repository: ${{ inputs.repo }} + ref: ${{ inputs.ref }} + persist-credentials: "false" + fetch-depth: 0 + + - name: Download Submodules + uses: actions/download-artifact@v4 + with: + pattern: repo-* + path: modules + + - name: Move mkdocs-material-insiders to mkdocs-material + run: | + rmdir modules/mkdocs-material + mv modules/repo-mkdocs-material-insiders modules/mkdocs-material + + - name: Move brand submodule to theme/assets/brand + run: | + rmdir theme/assets/brand + mv modules/repo-brand theme/assets/brand + + - name: Copy Translation Files + if: matrix.lang != 'en' + run: | + cp -rl modules/repo-i18n/i18n . + cp -rl modules/repo-i18n/includes . + + - name: Install Python (pipenv) + uses: actions/setup-python@v5 + with: + cache: "pipenv" + + - name: Install Python Dependencies + run: | + pip install pipenv + pipenv install + sudo apt install pngquant + + - name: Generate Donating Members List + continue-on-error: true + env: + DISCOURSE_API_KEY: ${{ secrets.RO_DISCOURSE_API_KEY }} + run: | + pip install requests + python tools/generate-members.py > includes/members.md + + - name: Build Website + run: | + ./run.sh --build --production --insiders --offline --lang=${{ matrix.lang }} + + - name: Run generate-topics.sh for top posts + if: matrix.lang == 'en' + run: | + bash tools/generate-topics.sh \ + --source='https://discuss.privacyguides.net/top.json?period=weekly' \ + --tag="top posts" \ + --destination="./site/en/index.html" \ + --count=3 + + - name: Run generate-topics.sh for latest posts + if: matrix.lang == 'en' + run: | + bash tools/generate-topics.sh \ + --source='https://discuss.privacyguides.net/latest.json' \ + --tag="latest posts" \ + --destination="./site/en/index.html" \ + --count=12 + + - name: Delete Unreferenced Assets + run: | + bash tools/delete-unreferenced.sh + env: + ASSETS_DIR: site/${{ matrix.lang }}/assets + SEARCH_DIR: site/${{ matrix.lang }} + + - name: Build Articles + if: matrix.lang == 'en' + run: | + pipenv run mkdocs build --config-file mkdocs.blog.yml + + - name: Delete Unreferenced Assets + if: matrix.lang == 'en' + run: | + bash tools/delete-unreferenced.sh + env: + ASSETS_DIR: site/articles/assets + SEARCH_DIR: site/articles + + - name: Package Website + run: | + tar -czf site-zimready-${{ matrix.lang }}.tar.gz site + + - name: Upload Site + uses: actions/upload-artifact@v4 + with: + name: site-zimready-${{ matrix.lang }}.tar.gz + path: site-zimready-${{ matrix.lang }}.tar.gz + retention-days: 1 + compression-level: 0 + + package_mul: + runs-on: ubuntu-latest + needs: [build_mul] + permissions: + contents: read + + steps: + - name: Download Repository + uses: actions/checkout@v4 + with: + repository: ${{ inputs.repo }} + ref: ${{ inputs.ref }} + persist-credentials: "false" + fetch-depth: 0 + + - name: Download All Sites + uses: actions/download-artifact@v4 + with: + pattern: site-zimready-* + merge-multiple: true + + - name: List Files (for debugging) + run: | + for file in *.tar.gz; do tar -zxf "$file"; done + ls -la site/ + + - name: Remove Duplicate Files + run: | + cd site && bash ../tools/symlink-duplicates.sh + ln -s en/index.html index.html + ln -s en/about/notices.html license + cd .. + + - name: Set zimfile name + run: | + echo "ZIMFILE_NAME=privacyguides.org_mul_all_$(date +%Y)-$(date +%m).zim" >> "$GITHUB_ENV" + + - name: Create ZIM File + uses: addnab/docker-run-action@v3 + with: + image: ghcr.io/openzim/zim-tools:3.1.3 + options: -v ${{ github.workspace }}:/data + run: | + zimwriterfs \ + -w index.html \ + -I en/assets/brand/logos/png/square/pg-yellow.png \ + -l mul \ + -t "Privacy Guides" \ + -d "Your central privacy and security resource to protect yourself online." \ + -c "Privacy Guides" \ + -p "Privacy Guides" \ + -e "https://www.privacyguides.org" \ + -n "privacyguides.org_mul_all" \ + /data/site/ /data/${{ env.ZIMFILE_NAME }} + + - name: Upload ZIM File + uses: actions/upload-artifact@v4 + with: + path: ${{ env.ZIMFILE_NAME }} + name: ${{ env.ZIMFILE_NAME }} + compression-level: 0 + + - name: Run zimcheck + uses: addnab/docker-run-action@v3 + continue-on-error: true + with: + image: ghcr.io/openzim/zim-tools:3.1.3 + options: -v ${{ github.workspace }}:/data + run: | + zimcheck /data/${{ env.ZIMFILE_NAME }} diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index be92650ff..21a371832 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -193,7 +193,7 @@ jobs: DISCOURSE_API_KEY: ${{ secrets.RO_DISCOURSE_API_KEY }} run: | pip install requests - python generate-members.py > includes/members.md + python tools/generate-members.py > includes/members.md - name: Build Website run: | @@ -202,7 +202,7 @@ jobs: - name: Run generate-topics.sh for top posts if: inputs.lang == 'en' run: | - bash generate-topics.sh \ + bash tools/generate-topics.sh \ --source='https://discuss.privacyguides.net/top.json?period=weekly' \ --tag="top posts" \ --destination="./site/en/index.html" \ @@ -211,7 +211,7 @@ jobs: - name: Run generate-topics.sh for latest posts if: inputs.lang == 'en' run: | - bash generate-topics.sh \ + bash tools/generate-topics.sh \ --source='https://discuss.privacyguides.net/latest.json' \ --tag="latest posts" \ --destination="./site/en/index.html" \ @@ -289,47 +289,3 @@ jobs: name: members.md path: includes/members.md retention-days: 1 - - offline_package: - if: inputs.config == 'offline' && inputs.lang == 'en' - needs: build - runs-on: ubuntu-latest - continue-on-error: ${{ inputs.continue-on-error }} - permissions: - contents: read - - steps: - - uses: actions/download-artifact@v4 - with: - name: site-offline-en.tar.gz - - - run: | - tar -xzf site-offline-en.tar.gz - tar -czf offline.tar.gz site/en - zip -r -q offline.zip site/en - - - name: Upload tar.gz file - uses: actions/upload-artifact@v4 - with: - name: offline.tar.gz - path: offline.tar.gz - - - name: Upload zip file - uses: actions/upload-artifact@v4 - with: - name: offline.zip - path: offline.zip - - - name: Create ZIM File - uses: addnab/docker-run-action@v3 - with: - image: ghcr.io/openzim/zim-tools:3.1.3 - options: -v ${{ github.workspace }}:/data - run: | - zimwriterfs -w index.html -I assets/brand/logos/png/square/pg-yellow.png -l eng -t "Privacy Guides" -d "Your central privacy and security resource to protect yourself online." -c "Privacy Guides" -p "Jonah Aragon" -n "Privacy Guides" -e "https://github.com/privacyguides/privacyguides.org" /data/site/en /data/offline-privacy_guides.zim - - - name: Upload ZIM file - uses: actions/upload-artifact@v4 - with: - name: offline-privacy_guides.zim - path: offline-privacy_guides.zim diff --git a/.github/workflows/publish-release.yml b/.github/workflows/publish-release.yml index 3a5b12a81..1cd49a409 100644 --- a/.github/workflows/publish-release.yml +++ b/.github/workflows/publish-release.yml @@ -51,7 +51,7 @@ jobs: strategy: matrix: lang: [en, es, fr, he, it, nl, ru, zh-Hant] - build: [build, offline] + build: [build] permissions: contents: read uses: ./.github/workflows/build.yml @@ -88,6 +88,17 @@ jobs: continue-on-error: false context: production + build_zimfile: + needs: submodule + permissions: + contents: read + uses: ./.github/workflows/build-zimfile.yml + with: + repo: ${{ github.repository }} + ref: ${{ github.ref }} + secrets: + RO_DISCOURSE_API_KEY: ${{ secrets.RO_DISCOURSE_API_KEY }} + release: name: Create release notes needs: build @@ -98,14 +109,14 @@ jobs: steps: - uses: actions/download-artifact@v4 with: - pattern: offline* + pattern: *.zim merge-multiple: true - name: Create release notes uses: ncipollo/release-action@v1 with: generateReleaseNotes: true - artifacts: "offline.zip,offline.tar.gz,offline-privacy_guides.zim" + artifacts: "*.zim" makeLatest: true deploy: diff --git a/.github/workflows/update-discussions.yml b/.github/workflows/update-discussions.yml index 3cfb99fae..7c2bb2a7e 100644 --- a/.github/workflows/update-discussions.yml +++ b/.github/workflows/update-discussions.yml @@ -57,7 +57,7 @@ jobs: - name: Run generate-topics.sh for top posts run: | - bash generate-topics.sh \ + bash tools/generate-topics.sh \ --source='https://discuss.privacyguides.net/top.json?period=weekly' \ --tag="top posts" \ --destination="./site/en/index.html" \ @@ -65,7 +65,7 @@ jobs: - name: Run generate-topics.sh for latest posts run: | - bash generate-topics.sh \ + bash tools/generate-topics.sh \ --source='https://discuss.privacyguides.net/latest.json' \ --tag="latest posts" \ --destination="./site/en/index.html" \ diff --git a/blog/posts/digital-provenance.md b/blog/posts/digital-provenance.md index 0821a8216..b9048f1c7 100644 --- a/blog/posts/digital-provenance.md +++ b/blog/posts/digital-provenance.md @@ -14,7 +14,6 @@ preview: # The Power of Digital Provenance in the Age of AI ![Article cover showing a painterly background with cool colors and the Content Credentials logo](../assets/images/digital-provenance/cover.jpg) - With the popularity of generative AI, it's becoming more and more difficult to [distinguish](https://uwaterloo.ca/news/media/can-you-tell-ai-generated-people-real-ones) reality from fiction. Can this problem be solved using cryptography? What are the privacy implications of the currently proposed systems? diff --git a/blog/posts/welcome-to-privacy-guides.md b/blog/posts/welcome-to-privacy-guides.md index 27734ecfa..2e0fda349 100644 --- a/blog/posts/welcome-to-privacy-guides.md +++ b/blog/posts/welcome-to-privacy-guides.md @@ -19,7 +19,6 @@ schema_type: NewsArticle # Welcome to Privacy Guides ![Privacy Guides cover image](../assets/brand/images/png/cover.png) - We are excited to announce the launch of [Privacy Guides](https://www.privacyguides.org/) and [r/PrivacyGuides](https://www.reddit.com/r/PrivacyGuides/), and welcome the privacy community to participate in our crowdsourced software recommendations and share tips and tricks for keeping your data safe online. Our goal is to be a central resource for privacy and security-related tips that are usable by anybody, and to carry on the trusted legacy of PrivacyTools. diff --git a/docs/about.md b/docs/about.md index 98fdc5fc1..eb28d8817 100644 --- a/docs/about.md +++ b/docs/about.md @@ -37,7 +37,7 @@ The best way to get individual help is from our community on Discourse. If you n ![Signal contact QR code](assets/img/layout/signal-contact-qr.png){ align=right } -Have a tip for us, or need to share some sensitive information? The best way to get in touch with us securely is via `@privacyguides.01` on Signal. This group account is monitored by [Jonah](https://discuss.privacyguides.net/u/jonah), [Niek](https://discuss.privacyguides.net/u/niek-de-wilde), [Em](https://discuss.privacyguides.net/u/ematprivacyguides), and [Jordan](https://discuss.privacyguides.net/u/jordan). +Have a tip for us, or need to share some sensitive information? The best way to get in touch with us securely is via `@privacyguides.01` on Signal. This group account is monitored by [Jonah](https://discuss.privacyguides.net/u/jonah), [Niek](https://discuss.privacyguides.net/u/niek-de-wilde), [Em](https://discuss.privacyguides.net/u/em), and [Jordan](https://discuss.privacyguides.net/u/jordan). [:simple-signal: Chat on Signal](https://signal.me/#eu/zg9xcrIv5w-EtXt2FmTJgfWv01LmyTed8rpr7RDv35Mizq8ISZ9NJLmYtzsxI0Z4){ .md-button } @@ -130,7 +130,7 @@ Our staff are paid to contribute to supplemental content at Privacy Guides, like :material-text-account: Journalist - [:material-account: Profile](https://discuss.privacyguides.net/u/ematprivacyguides) + [:material-account: Profile](https://discuss.privacyguides.net/u/em) [:material-github:](https://github.com/EmAtPrivacyGuides "GitHub") [:material-mastodon:](https://infosec.exchange/@Em0nM4stodon "@Em0nM4stodon@infosec.exchange"){rel=me} diff --git a/mkdocs.blog.yml b/mkdocs.blog.yml index ee6f08692..2b6b9eb34 100644 --- a/mkdocs.blog.yml +++ b/mkdocs.blog.yml @@ -165,6 +165,7 @@ plugins: meta: {} optimize: enabled: !ENV [OPTIMIZE, PRODUCTION, NETLIFY, false] + cache_dir: !ENV [OPTIMIZE_CACHE, ".cache/plugin/optimize-articles"] typeset: {} social: cards: !ENV [CARDS, true] diff --git a/mkdocs.videos.yml b/mkdocs.videos.yml index 3627d9896..8007280e8 100644 --- a/mkdocs.videos.yml +++ b/mkdocs.videos.yml @@ -155,6 +155,7 @@ plugins: meta: {} optimize: enabled: !ENV [OPTIMIZE, PRODUCTION, NETLIFY, false] + cache_dir: !ENV [OPTIMIZE_CACHE, ".cache/plugin/optimize-videos"] typeset: {} social: cards: !ENV [CARDS, true] diff --git a/mkdocs.yml b/mkdocs.yml index 28114f4f0..993d024a6 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -122,10 +122,10 @@ extra: link: https://matrix.to/#/#privacyguides:matrix.org - icon: material/information-outline name: !ENV [HOMEPAGE_CTA_ABOUT_NAME, "Learn more about us"] - link: about/ + link: !ENV [HOMEPAGE_CTA_ABOUT_LINK, "about/"] - icon: material/hand-coin name: !ENV [HOMEPAGE_CTA_DONATE_NAME, "Donate to Privacy Guides"] - link: about/donate/ + link: !ENV [HOMEPAGE_CTA_DONATE_LINK, "about/donate/"] description: !ENV [ HOMEPAGE_CTA_DESCRIPTION, @@ -182,6 +182,7 @@ extra: - icon: simple/torbrowser link: http://www.xoe4vn5uwdztif6goazfbmogh6wh5jc4up35bqdflu6bkdc5cas5vjqd.onion/ name: !ENV [SOCIAL_TOR_SITE, "Hidden service"] + language_switcher: !ENV [LANGUAGE_SWITCHER, true] alternate: - name: English link: /en/ @@ -318,6 +319,7 @@ plugins: enable_creation_date: true optimize: enabled: !ENV [OPTIMIZE, PRODUCTION, NETLIFY, false] + cache_dir: !ENV [OPTIMIZE_CACHE, ".cache/plugin/optimize"] typeset: {} social: cards: !ENV [CARDS, true] diff --git a/run.sh b/run.sh index d24f3690e..c7796fc67 100755 --- a/run.sh +++ b/run.sh @@ -86,6 +86,7 @@ if [ "$language" != "en" ]; then export BUILD_SITE_DIR="site/$language" export BUILD_SITE_URL="https://www.privacyguides.org/$language" export BUILD_THEME_LANGUAGE="$language" + export OPTIMIZE_CACHE=".cache/plugin/optimize-$language" fi # Source per-language strings diff --git a/theme/partials/copyright.html b/theme/partials/copyright.html index f869f893d..998582636 100644 --- a/theme/partials/copyright.html +++ b/theme/partials/copyright.html @@ -29,7 +29,7 @@
{{ copyright.note }}
- + {% for icon in copyright.license %} {% include ".icons/" ~ icon ~ ".svg" %} {% endfor %} diff --git a/theme/partials/donate.html b/theme/partials/donate.html index 45548fc8e..dac9fa7c1 100644 --- a/theme/partials/donate.html +++ b/theme/partials/donate.html @@ -1,7 +1,7 @@
{% set icon = "material/heart" %} - + {% include ".icons/" ~ icon ~ ".svg" %}
diff --git a/theme/partials/header.html b/theme/partials/header.html index e2da3d2d1..639eb857e 100644 --- a/theme/partials/header.html +++ b/theme/partials/header.html @@ -121,7 +121,7 @@ {% endif %} - {% if config.extra.alternate %} + {% if config.extra.alternate and config.extra.language_switcher %} {% include "partials/alternate.html" %} {% endif %} diff --git a/tools/archive-releases.sh b/tools/archive-releases.sh new file mode 100755 index 000000000..3a239e148 --- /dev/null +++ b/tools/archive-releases.sh @@ -0,0 +1,19 @@ +#!/bin/bash +set -euo pipefail + +REPO="privacyguides/privacyguides.org" +BASE_DIR="releases" + +mkdir -p "$BASE_DIR" + +# Get all release tags using gh CLI +release_tags=$(gh release list -R "$REPO" --limit 1000 | awk '{print $1}') + +for tag in $release_tags; do + target_dir="$BASE_DIR/$tag" + mkdir -p "$target_dir" + echo "Downloading assets for release: $tag" + gh release download "$tag" -R "$REPO" --dir "$target_dir" +done + +echo "All releases downloaded." diff --git a/tools/delete-unreferenced.sh b/tools/delete-unreferenced.sh new file mode 100644 index 000000000..9466b42b8 --- /dev/null +++ b/tools/delete-unreferenced.sh @@ -0,0 +1,64 @@ +#!/bin/bash + +# Script to find and delete unreferenced asset files +# This script searches through all HTML, CSS, and JavaScript files to see if asset files are referenced + +set -e # Exit on any error + +echo -e "Starting unreferenced asset cleanup..." +echo "Assets directory: $ASSETS_DIR" +echo "Search directory: $SEARCH_DIR" +echo "" + +# Check if assets directory exists +if [ ! -d "$ASSETS_DIR" ]; then + echo -e "Error: Assets directory '$ASSETS_DIR' not found!" + exit 1 +fi + +# Find all asset files recursively +echo "Finding all asset files..." +ASSET_FILES=$(find "$ASSETS_DIR" -type f) +ASSET_COUNT=$(echo "$ASSET_FILES" | wc -l) +echo "Found $ASSET_COUNT asset files" +echo "" + +# Find all HTML, CSS, and JavaScript files +echo "Finding all HTML, CSS, and JavaScript files..." +SEARCH_FILES=$(find "$SEARCH_DIR" \( -name "*.html" -o -name "*.css" -o -name "*.js" \) -type f) +SEARCH_COUNT=$(echo "$SEARCH_FILES" | wc -l) +echo "Found $SEARCH_COUNT HTML, CSS, and JavaScript files" +echo "" + +# Process each asset file +echo "Checking each asset file for references..." +echo "" + +while IFS= read -r asset_file; do + if [ -z "$asset_file" ]; then + continue + fi + + # Get just the filename (without path) + asset_filename=$(basename "$asset_file") + + # Search for this filename in all HTML, CSS, and JavaScript files + found_reference=false + + while IFS= read -r search_file; do + if [ -z "$search_file" ]; then + continue + fi + + # Simple string search for the filename in the file + if grep -q "$asset_filename" "$search_file" 2>/dev/null; then + found_reference=true + break + fi + done <<< "$SEARCH_FILES" + + if [ "$found_reference" = false ]; then + echo -e "Unreferenced: $asset_file" + rm "$asset_file" + fi +done <<< "$ASSET_FILES" diff --git a/generate-members.py b/tools/generate-members.py similarity index 100% rename from generate-members.py rename to tools/generate-members.py diff --git a/generate-topics.sh b/tools/generate-topics.sh similarity index 92% rename from generate-topics.sh rename to tools/generate-topics.sh index 38423c20b..85d73f0be 100755 --- a/generate-topics.sh +++ b/tools/generate-topics.sh @@ -67,7 +67,9 @@ for row in $(echo "${topics}" | jq -r '.[] | @base64'); do html_output+="
" html_output+="

" html_output+="" - html_output+="" + if [[ -z "$BUILD_OFFLINE" ]]; then + html_output+="" + fi html_output+=" Posted by $author_username" html_output+="" html_output+="

" diff --git a/tools/symlink-duplicates.sh b/tools/symlink-duplicates.sh new file mode 100644 index 000000000..da3daf66f --- /dev/null +++ b/tools/symlink-duplicates.sh @@ -0,0 +1,20 @@ +#!/bin/bash +set -euo pipefail + +declare -A file_hashes + +find . -type f | while read -r file; do + hash=$(sha256sum "$file" | awk '{print $1}') + if [[ -n "${file_hashes[$hash]+_}" ]]; then + # Duplicate found, replace with symlink to first copy + first="${file_hashes[$hash]}" + # Remove the duplicate file + rm "$file" + # Create symlink (relative path) + ln -s "$(realpath --relative-to="$(dirname "$file")" "$first")" "$file" + echo "Replaced duplicate: $file -> $first" + else + # First time seeing this hash + file_hashes[$hash]="$file" + fi +done