diff --git a/.github/workflows/on_icon_addition_approved.yml b/.github/workflows/on_icon_addition_approved.yml index af4c1dda..6801116b 100644 --- a/.github/workflows/on_icon_addition_approved.yml +++ b/.github/workflows/on_icon_addition_approved.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest # This condition ensures the job only runs when the 'approved' label is added and the issue title starts with 'feat(icons): add ' if: | - contains(github.event.issue.labels.*.name, 'approved') && + contains(github.event.issue.labels.*.name, 'approved') && startsWith(github.event.issue.title, 'feat(icons): add ') env: ICON_TYPE: ${{ contains(github.event.issue.labels.*.name, 'normal-icon') && 'normal' || 'monochrome' }} @@ -49,8 +49,6 @@ jobs: INPUT_ISSUE_FORM: ${{ steps.parse_issue_form.outputs.ISSUE_FORM }} - name: Generate File Tree run: python scripts/generate_file_tree.py svg png webp - - name: Generate ICONS.md - run: python scripts/generate_icons_page.py - name: Generate full metadata file run: python scripts/generate_metadata.py - name: Extract icon name diff --git a/.github/workflows/on_icon_update_approved.yml b/.github/workflows/on_icon_update_approved.yml index 3c99fd74..e87de189 100644 --- a/.github/workflows/on_icon_update_approved.yml +++ b/.github/workflows/on_icon_update_approved.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest # This condition ensures the job only runs when the 'approved' label is updated and the issue title starts with 'feat(icons): update ' if: | - contains(github.event.issue.labels.*.name, 'approved') && + contains(github.event.issue.labels.*.name, 'approved') && startsWith(github.event.issue.title, 'feat(icons): update ') env: ICON_TYPE: ${{ contains(github.event.issue.labels.*.name, 'normal-icon') && 'normal' || 'monochrome' }} @@ -49,8 +49,6 @@ jobs: INPUT_ISSUE_FORM: ${{ steps.parse_issue_form.outputs.ISSUE_FORM }} - name: Generate File Tree run: python scripts/generate_file_tree.py svg png webp - - name: Generate ICONS.md - run: python scripts/generate_icons_page.py - name: Generate full metadata file run: python scripts/generate_metadata.py - name: Extract icon name diff --git a/.github/workflows/update_icons_and_resources.yml b/.github/workflows/update_icons_and_resources.yml index d830a226..27872c2b 100644 --- a/.github/workflows/update_icons_and_resources.yml +++ b/.github/workflows/update_icons_and_resources.yml @@ -77,14 +77,9 @@ jobs: with: python-version: "3.9" - - name: Generate ICONS.md - run: python scripts/generate_icons_page.py - - name: Commit and Push Changes run: | git config --global user.email "homarr-labs@proton.me" git config --global user.name "Dashboard Icons Bot" - git add ICONS.md - git commit -m "ci(github-actions): generate ICONS.md" || exit 0 git pull --rebase origin ${{ github.ref_name }} git push origin HEAD:${{ github.ref_name }} diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 22158bc6..b43ad10c 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -1,30 +1,42 @@ -## Code of Conduct +# Code of Conduct -We are committed to creating a welcoming and harassment-free environment for everyone who contributes to our icon repository. This includes people of all genders, gender identities, sexual orientations, disabilities, appearances, body sizes, races, ages, religions, and nationalities. +## Our Commitment -### Communication +We are committed to maintaining a welcoming and inclusive environment for everyone who contributes to our icon collection. This includes people of all backgrounds, identities, and experiences. -All communication should be appropriate for a professional audience, respectful, constructive, and considerate of people from different backgrounds. Please aim to create a positive and inclusive atmosphere. +## Expected Behavior -### Prohibited Behavior +- Be respectful and constructive in all communications +- Focus on what's best for the community +- Show empathy towards other community members +- Be open to different viewpoints and experiences -We do not tolerate harassment, intimidation, discrimination, or any other inappropriate conduct, whether in communication or behavior. Prohibited actions include: +## Unacceptable Behavior -- The use of sexual language or imagery -- Deliberate intimidation or stalking -- Unwelcome sexual attention or harassment -- Inappropriate physical contact -- Disruptions during events or conversations -- Discrimination of any kind +The following behaviors are unacceptable: -### Reporting +- Harassment, discrimination, or intimidation +- Offensive comments related to personal characteristics +- Unwelcome sexual attention or advances +- Disruptive behavior in community spaces +- Any other conduct that could reasonably be considered inappropriate -If you witness or experience behavior that violates this code of conduct, please report it immediately to [homarr-labs@proton.me](mailto:homarr-labs@proton.me). All reports will be reviewed confidentially and promptly, and appropriate actions will be taken. +## Reporting -### Consequences +If you experience or witness behavior that violates this code: -Anyone violating this code of conduct may face consequences, such as warnings, removal from the repository, or a ban from future participation. We take violations seriously to ensure a safe and welcoming environment for everyone. +1. Contact us at [homarr-labs@proton.me](mailto:homarr-labs@proton.me) +2. Provide as much detail as possible about the incident +3. All reports will be reviewed confidentially -### Acknowledgment +## Enforcement -By contributing to this repository, you agree to adhere to this code of conduct. Thank you for helping us create an inclusive and supportive environment for all contributors. +Violations of this code may result in: + +- Warning +- Temporary suspension +- Permanent ban from the community + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org/), version 2.0. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4a077095..9c2ec4fc 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,104 +1,104 @@ -![Contributions Welcome](https://img.shields.io/badge/contributions-welcome-brightgreen?style=flat-square) +# Contributing to Dashboard Icons -## Contribution Guidelines - -Thank you for your interest in contributing to the icon repository! To ensure smooth collaboration, please follow these guidelines. Your contributions help make this project better. +Thank you for your interest in contributing to our icon collection! These guidelines will help ensure smooth collaboration and maintain the quality of our collection. ## Table of Contents -- [Contribution Guidelines](#contribution-guidelines) -- [Table of Contents](#table-of-contents) -- [Icon Specifications](#icon-specifications) - - [Format](#format) - - [Cropping](#cropping) - - [Light and Dark Versions](#light-and-dark-versions) - - [File Naming](#file-naming) - - [Quality Requirements](#quality-requirements) -- [Git Commit Messages](#git-commit-messages) -- [Contribution Process](#contribution-process) -- [Code of Conduct](#code-of-conduct) -- [Contact](#contact) +- [Contributing to Dashboard Icons](#contributing-to-dashboard-icons) + - [Table of Contents](#table-of-contents) + - [Icon Specifications](#icon-specifications) + - [Format Requirements](#format-requirements) + - [Quality Standards](#quality-standards) + - [Light \& Dark Variants](#light--dark-variants) + - [File Naming](#file-naming) + - [Requesting New Icons](#requesting-new-icons) + - [Improving the Repository](#improving-the-repository) + - [Code of Conduct](#code-of-conduct) + - [Questions?](#questions) ## Icon Specifications -### Format +### Format Requirements -- **SVG Format Required**: All icons should be submitted in SVG format. If an SVG version is unavailable, a PNG version will suffice, and a WEBP version will be generated accordingly. -- **Automatic PNG and WEBP Generation**: PNG and WEBP versions are generated automatically from the SVG (or PNG) files using the following settings: - - **Dimensions**: - - Height: 512 pixels - - Width: Auto (maintaining aspect ratio) - - **Transparency**: Enabled +- **SVG Format**: All icons must be submitted in SVG format +- **Auto-Generated Formats**: PNG and WEBP versions are generated automatically with: + - Height: 512 pixels + - Width: Auto (maintaining aspect ratio) + - Transparency: Enabled -### Cropping +### Quality Standards -- **Remove Empty Space**: Crop any empty space from your SVG files to ensure the icon is properly centered and sized. You can use [SVG Crop](https://svgcrop.com/) to assist with this. +- **Clean SVG**: No embedded raster images in SVG files +- **Proper Cropping**: Remove empty space for proper centering + - Use [SVG Crop](https://svgcrop.com/) for assistance +- **No Upscaling**: Maintain original quality without artificial enlargement -### Light and Dark Versions +### Light & Dark Variants -- **Monochrome or Single Primary Color Icons**: - - If your icon is monochrome, please provide additional versions if applicable: - - **`-light` Version**: For icons primarily dark or using black as a main color, provide a `-light` version for light backgrounds. - - **`-dark` Version**: For icons primarily light or using white as a main color, provide a `-dark` version for dark backgrounds. - - **Examples**: - - A black logo should include a `-light` version where black is inverted. - - A multicolored logo using black should provide a `-light` version with the black replaced. - - **Tool Recommendation**: [DEEditor](https://deeditor.com/) can help adjust icon colors if needed. +For monochrome or single-color icons: + +- **Light Variant**: Required for dark backgrounds + - Invert black elements + - Adjust colors for visibility +- **Dark Variant**: Required for light backgrounds + - Invert white elements + - Adjust colors for visibility + +**Tool Recommendation**: [DEEditor](https://deeditor.com/) for color adjustments ### File Naming -- **Kebab Case**: Name your files using kebab case (lowercase words separated by hyphens). For example, "Nextcloud Calendar" becomes `nextcloud-calendar.svg`. - - **Note**: Filenames are automatically converted to kebab case, but please double-check your naming to avoid conflicts or errors. +- **Kebab Case**: Use lowercase with hyphens + - Example: "Nextcloud Calendar" → `nextcloud-calendar.svg` +- **Variant Suffixes**: + - `-light` for dark backgrounds + - `-dark` for light backgrounds -### Quality Requirements +## Requesting New Icons -- **No Upscaled Images**: Icons should maintain their original quality without artificial enlargement. -- **No Embedded Raster Images in SVGs**: Ensure that SVG files are true vector graphics without embedded raster images. +To request a new icon: -## Git Commit Messages +1. **Create an Issue**: + - Use the appropriate [issue template](https://github.com/homarr-labs/dashboard-icons/issues/new/choose) + - Choose between "Light & dark icon" or "Normal icon" template -- **Use Semantic Commits**: Follow the format (scope): description: - - `feat(icons): add nextcloud-calendar` when adding new icons. +2. **Provide Information**: + - Service/application name + - Official logo or icon source + - Any specific requirements or notes -## Contribution Process +3. **Upload Icon** (optional): + - Attach the SVG file directly to the issue + - Include both light and dark variants if applicable -### Adding an icon +4. **Wait for Review**: + - Our team will review your request + - We may request adjustments if needed + - Once approved, we'll add the icon to the collection -To add an icon to the repository, follow these steps: +## Improving the Repository -1. **Create issue**: Create an issue from one of the add [templates](https://github.com/homarr-labs/dashboard-icons/issues/new/choose): - - **Light & dark icon**: Use this template to request a new icon with both light and dark versions. - - **Normal icon**: Use this template to request a new icon with a single version. -2. **Fill out the template**: Provide the requested information in the template. You can upload the icons directly to the issue. -3. **Wait for approval**: Wait for the issue to be approved by a maintainer. If any changes are needed, they will be requested in the issue. -4. **Maintainer approves & merges**: Once the issue is approved, a pull request with all the necessary changes will be created and merged by a maintainer. +To contribute to the repository itself: -### Updating an icon +1. **Fork the Repository** +2. **Make Your Changes**: + - Documentation improvements + - Website enhancements + - Repository maintenance + - Bug fixes -To update an icon in the repository, follow these steps: - -1. **Create issue**: Create an issue from the update [template](https://github.com/homarr-labs/dashboard-icons/issues/new/choose). - - **Light & dark icon**: Use this template to request a new icon with both light and dark versions. - - **Normal icon**: Use this template to request a new icon with a single version. -2. **Fill out the template**: Provide the requested information in the template. You can upload the icons directly to the issue. -3. **Wait for approval**: Wait for the issue to be approved by a maintainer. If any changes are needed, they will be requested in the issue. -4. **Maintainer approves & merges**: Once the issue is approved, a pull request with all the necessary changes will be created and merged by a maintainer. - -### Change metadata / any other change - -To change the metadata of an existing icon or any other change, follow these steps: - -1. **Fork the Repository**: Create a fork of this repository on your GitHub account. -2. **Clone the Repository**: Clone your forked repository to your local machine. -3. **Add Your Icons**: Place your SVG icon(s) into the appropriate directory, following the specifications above. -4. **Commit Your Changes**: Commit your additions with clear and descriptive commit messages using Gitmoji. -5. **Push to Your Fork**: Push your committed changes to your forked repository on GitHub. -6. **Create a Pull Request**: Submit a pull request to the main repository for review. +3. **Submit a Pull Request**: + - Use semantic commit messages following the format: `(scope): description` + - `feat(icons): add nextcloud-calendar` + - `fix(website): correct icon preview` + - `docs(readme): update installation instructions` + - Reference any related issues + - Follow our [Code of Conduct](CODE_OF_CONDUCT.md) ## Code of Conduct By contributing, you agree to abide by our [Code of Conduct](CODE_OF_CONDUCT.md). Please review it to understand the expectations for all participants. -## Contact +## Questions? -If you have any questions or need assistance, feel free to reach out at [homarr-labs@proton.me](mailto:homarr-labs@proton.me). I'm happy to help. +If you have any questions or need assistance, contact us at [homarr-labs@proton.me](mailto:homarr-labs@proton.me). diff --git a/ICONS.md b/ICONS.md deleted file mode 100644 index f7240081..00000000 --- a/ICONS.md +++ /dev/null @@ -1,2228 +0,0 @@ -[![jsDelivr hits (GitHub)](https://img.shields.io/jsdelivr/gh/hy/homarr-labs/dashboard-icons?style=flat-square&color=%23A020F0)](https://www.jsdelivr.com/package/gh/homarr-labs/dashboard-icons) -[![jsDelivr hits (GitHub)](https://img.shields.io/jsdelivr/gh/hy/walkxcode/dashboard-icons?style=flat-square&color=%23A020F0)](https://www.jsdelivr.com/package/gh/walkxcode/dashboard-icons) - -## Dashboard Icons - -The best source for dashboard icons.
-[**← Back to repository**](https://github.com/homarr-labs/dashboard-icons/) - - -| Name | Links | Preview | -|------|-------|---------| -| 13ft | ✅ WebPPNGSVG | 13ft | -| 1password | ✅ WebPPNGSVG | 1password | -| 1password-dark | ✅ WebPPNGSVG | 1password-dark | -| 2fauth | ✅ WebPPNGSVG | 2fauth | -| 2fauth-light | ✅ WebPPNGSVG | 2fauth-light | -| 3cx | ✅ WebPPNGSVG | 3cx | -| 3cx-light | ✅ WebPPNGSVG | 3cx-light | -| 5etools | ✅ WebPPNGSVG | 5etools | -| 5etools-dark | ✅ WebPPNGSVG | 5etools-dark | -| 7zip | ✅ WebPPNGSVG | 7zip | -| act | ✅ WebPPNGSVG | act | -| activepieces | ✅ WebPPNGSVG | activepieces | -| actual-budget | ✅ WebPPNGSVG | actual-budget | -| adblock | ✅ WebPPNG ❌ SVG | adblock | -| adguard-home | ✅ WebPPNGSVG | adguard-home | -| adminer | ✅ WebPPNGSVG | adminer | -| adobe | ✅ WebPPNGSVG | adobe | -| ads-b-exchange | ✅ WebPPNG ❌ SVG | ads-b-exchange | -| adventure-log | ✅ WebPPNGSVG | adventure-log | -| affine | ✅ WebPPNGSVG | affine | -| affine-light | ✅ WebPPNGSVG | affine-light | -| airsonic | ✅ WebPPNGSVG | airsonic | -| airtable | ✅ WebPPNGSVG | airtable | -| airtel | ✅ WebPPNGSVG | airtel | -| airvpn | ✅ WebPPNGSVG | airvpn | -| akkoma | ✅ WebPPNGSVG | akkoma | -| akkoma-light | ✅ WebPPNGSVG | akkoma-light | -| alarmpi | ✅ WebPPNG ❌ SVG | alarmpi | -| albert-heijn | ✅ WebPPNGSVG | albert-heijn | -| alertmanager | ✅ WebPPNGSVG | alertmanager | -| alexa | ✅ WebPPNGSVG | alexa | -| algo | ✅ WebPPNG ❌ SVG | algo | -| aliexpress | ✅ WebPPNGSVG | aliexpress | -| alist | ✅ WebPPNGSVG | alist | -| alloy | ✅ WebPPNGSVG | alloy | -| alltube | ✅ WebPPNG ❌ SVG | alltube | -| alltube-light | ✅ WebPPNG ❌ SVG | alltube-light | -| alma-linux | ✅ WebPPNGSVG | alma-linux | -| alpine-linux | ✅ WebPPNGSVG | alpine-linux | -| amazon | ✅ WebPPNGSVG | amazon | -| amazon-light | ✅ WebPPNGSVG | amazon-light | -| amazon-prime | ✅ WebPPNGSVG | amazon-prime | -| amazon-web-services | ✅ WebPPNGSVG | amazon-web-services | -| amazon-web-services-light | ✅ WebPPNGSVG | amazon-web-services-light | -| amcrest | ✅ WebPPNG ❌ SVG | amcrest | -| amcrest-cloud | ✅ WebPPNG ❌ SVG | amcrest-cloud | -| amd | ✅ WebPPNGSVG | amd | -| amd-light | ✅ WebPPNGSVG | amd-light | -| ami | ✅ WebPPNG ❌ SVG | ami | -| ami-alt | ✅ WebPPNG ❌ SVG | ami-alt | -| ami-alt-light | ✅ WebPPNG ❌ SVG | ami-alt-light | -| amp | ✅ WebPPNG ❌ SVG | amp | -| ampache | ✅ WebPPNG ❌ SVG | ampache | -| android | ✅ WebPPNGSVG | android | -| android-auto | ✅ WebPPNGSVG | android-auto | -| android-auto-dark | ✅ WebPPNGSVG | android-auto-dark | -| android-robot | ✅ WebPPNGSVG | android-robot | -| anonaddy | ✅ WebPPNGSVG | anonaddy | -| ansible | ✅ WebPPNGSVG | ansible | -| ansible-light | ✅ WebPPNGSVG | ansible-light | -| anything-llm | ✅ WebPPNGSVG | anything-llm | -| anything-llm-light | ✅ WebPPNGSVG | anything-llm-light | -| apache | ✅ WebPPNGSVG | apache | -| apache-airflow | ✅ WebPPNGSVG | apache-airflow | -| apache-answer | ✅ WebPPNGSVG | apache-answer | -| apache-cassandra | ✅ WebPPNGSVG | apache-cassandra | -| apache-cloudstack | ✅ WebPPNGSVG | apache-cloudstack | -| apache-druid | ✅ WebPPNGSVG | apache-druid | -| apache-openoffice | ✅ WebPPNGSVG | apache-openoffice | -| apache-solr | ✅ WebPPNGSVG | apache-solr | -| apache-subversion | ✅ WebPPNGSVG | apache-subversion | -| apache-tomcat | ✅ WebPPNGSVG | apache-tomcat | -| apache-tomcat-light | ✅ WebPPNGSVG | apache-tomcat-light | -| apc | ✅ WebPPNGSVG | apc | -| apiscp | ✅ WebPPNGSVG | apiscp | -| app-store | ✅ WebPPNGSVG | app-store | -| appdaemon | ✅ WebPPNG ❌ SVG | appdaemon | -| appflowy | ✅ WebPPNGSVG | appflowy | -| apple | ✅ WebPPNGSVG | apple | -| apple-alt | ✅ WebPPNGSVG | apple-alt | -| apple-light | ✅ WebPPNGSVG | apple-light | -| apple-music | ✅ WebPPNGSVG | apple-music | -| apple-tv-plus | ✅ WebPPNGSVG | apple-tv-plus | -| apple-tv-plus-light | ✅ WebPPNGSVG | apple-tv-plus-light | -| apprise | ✅ WebPPNG ❌ SVG | apprise | -| appwrite | ✅ WebPPNGSVG | appwrite | -| ara-records-ansible | ✅ WebPPNGSVG | ara-records-ansible | -| arch-linux | ✅ WebPPNGSVG | arch-linux | -| archisteamfarm | ✅ WebPPNG ❌ SVG | archisteamfarm | -| archivebox | ✅ WebPPNG ❌ SVG | archivebox | -| archiveteam-warrior | ✅ WebPPNG ❌ SVG | archiveteam-warrior | -| archiveteam-warrior-light | ✅ WebPPNG ❌ SVG | archiveteam-warrior-light | -| arduino | ✅ WebPPNGSVG | arduino | -| argo-cd | ✅ WebPPNGSVG | argo-cd | -| ariang | ✅ WebPPNG ❌ SVG | ariang | -| arm | ✅ WebPPNGSVG | arm | -| arris | ✅ WebPPNG ❌ SVG | arris | -| arris-light | ✅ WebPPNG ❌ SVG | arris-light | -| artifacthub | ✅ WebPPNGSVG | artifacthub | -| artifactory | ✅ WebPPNGSVG | artifactory | -| aruba | ✅ WebPPNGSVG | aruba | -| asana | ✅ WebPPNGSVG | asana | -| asciinema | ✅ WebPPNGSVG | asciinema | -| asrock-rack | ✅ WebPPNGSVG | asrock-rack | -| asrock-rack-ipmi | ✅ WebPPNGSVG | asrock-rack-ipmi | -| assetgrid | ✅ WebPPNGSVG | assetgrid | -| asterisk | ✅ WebPPNG ❌ SVG | asterisk | -| astral | ✅ WebPPNGSVG | astral | -| astuto | ✅ WebPPNGSVG | astuto | -| astuto-light | ✅ WebPPNGSVG | astuto-light | -| asus | ✅ WebPPNGSVG | asus | -| asus-rog | ✅ WebPPNGSVG | asus-rog | -| asus-router | ✅ WebPPNGSVG | asus-router | -| asustor | ✅ WebPPNGSVG | asustor | -| at-t | ✅ WebPPNGSVG | at-t | -| atlassian | ✅ WebPPNGSVG | atlassian | -| atlassian-bamboo | ✅ WebPPNGSVG | atlassian-bamboo | -| atlassian-bitbucket | ✅ WebPPNGSVG | atlassian-bitbucket | -| atlassian-confluence | ✅ WebPPNGSVG | atlassian-confluence | -| atlassian-jira | ✅ WebPPNGSVG | atlassian-jira | -| atlassian-opsgenie | ✅ WebPPNGSVG | atlassian-opsgenie | -| atlassian-trello | ✅ WebPPNGSVG | atlassian-trello | -| atuin | ✅ WebPPNGSVG | atuin | -| atuin-light | ✅ WebPPNGSVG | atuin-light | -| audacity | ✅ WebPPNGSVG | audacity | -| audiobookshelf | ✅ WebPPNGSVG | audiobookshelf | -| auracast | ✅ WebPPNGSVG | auracast | -| authelia | ✅ WebPPNGSVG | authelia | -| authentik | ✅ WebPPNGSVG | authentik | -| authman | ✅ WebPPNGSVG | authman | -| auto-mcs | ✅ WebPPNG ❌ SVG | auto-mcs | -| autobrr | ✅ WebPPNGSVG | autobrr | -| automad | ✅ WebPPNGSVG | automad | -| automad-light | ✅ WebPPNGSVG | automad-light | -| avg | ✅ WebPPNGSVG | avg | -| avigilon | ✅ WebPPNGSVG | avigilon | -| avm-fritzbox | ✅ WebPPNGSVG | avm-fritzbox | -| avm-fritzbox-light | ✅ WebPPNGSVG | avm-fritzbox-light | -| aws | ✅ WebPPNGSVG | aws | -| aws-ecs | ✅ WebPPNGSVG | aws-ecs | -| aws-light | ✅ WebPPNGSVG | aws-light | -| awwesome | ✅ WebPPNGSVG | awwesome | -| awx | ✅ WebPPNG ❌ SVG | awx | -| axis | ✅ WebPPNG ❌ SVG | axis | -| azuracast | ✅ WebPPNGSVG | azuracast | -| azure | ✅ WebPPNGSVG | azure | -| azure-container-instances | ✅ WebPPNGSVG | azure-container-instances | -| azure-container-service | ✅ WebPPNGSVG | azure-container-service | -| azure-devops | ✅ WebPPNGSVG | azure-devops | -| azure-dns | ✅ WebPPNGSVG | azure-dns | -| babybuddy | ✅ WebPPNG ❌ SVG | babybuddy | -| backblaze | ✅ WebPPNGSVG | backblaze | -| backrest | ✅ WebPPNGSVG | backrest | -| backrest-light | ✅ WebPPNGSVG | backrest-light | -| bacula | ✅ WebPPNG ❌ SVG | bacula | -| badge | ✅ WebPPNG ❌ SVG | badge | -| baikal | ✅ WebPPNG ❌ SVG | baikal | -| balena-cloud | ✅ WebPPNGSVG | balena-cloud | -| balena-etcher | ✅ WebPPNGSVG | balena-etcher | -| bar-assistant | ✅ WebPPNGSVG | bar-assistant | -| barcodebuddy | ✅ WebPPNG ❌ SVG | barcodebuddy | -| baserow | ✅ WebPPNGSVG | baserow | -| basilisk | ✅ WebPPNG ❌ SVG | basilisk | -| bastillion | ✅ WebPPNG ❌ SVG | bastillion | -| bazarr | ✅ WebPPNGSVG | bazarr | -| bazarr-dark | ✅ WebPPNGSVG | bazarr-dark | -| beaver-habit-tracker | ✅ WebPPNGSVG | beaver-habit-tracker | -| beaver-habit-tracker-light | ✅ WebPPNGSVG | beaver-habit-tracker-light | -| beef | ✅ WebPPNGSVG | beef | -| beef-light | ✅ WebPPNGSVG | beef-light | -| beets | ✅ WebPPNG ❌ SVG | beets | -| benotes | ✅ WebPPNG ❌ SVG | benotes | -| beszel | ✅ WebPPNGSVG | beszel | -| beszel-light | ✅ WebPPNGSVG | beszel-light | -| betanin | ✅ WebPPNG ❌ SVG | betanin | -| bewcloud | ✅ WebPPNGSVG | bewcloud | -| bible-gateway | ✅ WebPPNG ❌ SVG | bible-gateway | -| bibliogram | ✅ WebPPNG ❌ SVG | bibliogram | -| biblioreads | ✅ WebPPNGSVG | biblioreads | -| biblioreads-light | ✅ WebPPNGSVG | biblioreads-light | -| biedronka | ✅ WebPPNG ❌ SVG | biedronka | -| bigcapital | ✅ WebPPNGSVG | bigcapital | -| bing | ✅ WebPPNGSVG | bing | -| binner | ✅ WebPPNGSVG | binner | -| binner-dark | ✅ WebPPNGSVG | binner-dark | -| birdnet | ✅ WebPPNG ❌ SVG | birdnet | -| bitbucket | ✅ WebPPNGSVG | bitbucket | -| bitcoin | ✅ WebPPNGSVG | bitcoin | -| bithumen | ✅ WebPPNG ❌ SVG | bithumen | -| bitwarden | ✅ WebPPNGSVG | bitwarden | -| blocky | ✅ WebPPNGSVG | blocky | -| blogger | ✅ WebPPNGSVG | blogger | -| blue-iris | ✅ WebPPNG ❌ SVG | blue-iris | -| bluesky | ✅ WebPPNGSVG | bluesky | -| bluetooth | ✅ WebPPNGSVG | bluetooth | -| bluewallet | ✅ WebPPNG ❌ SVG | bluewallet | -| bobcat-miner | ✅ WebPPNG ❌ SVG | bobcat-miner | -| booklogr | ✅ WebPPNGSVG | booklogr | -| booklogr-light | ✅ WebPPNGSVG | booklogr-light | -| booksonic | ✅ WebPPNG ❌ SVG | booksonic | -| bookstack | ✅ WebPPNGSVG | bookstack | -| bootstrap | ✅ WebPPNGSVG | bootstrap | -| borg | ✅ WebPPNGSVG | borg | -| borgmatic | ✅ WebPPNGSVG | borgmatic | -| borgmatic-light | ✅ WebPPNGSVG | borgmatic-light | -| boundary | ✅ WebPPNGSVG | boundary | -| box | ✅ WebPPNGSVG | box | -| brave | ✅ WebPPNGSVG | brave | -| brave-dev | ✅ WebPPNG ❌ SVG | brave-dev | -| brewpi | ✅ WebPPNG ❌ SVG | brewpi | -| brillcam | ✅ WebPPNG ❌ SVG | brillcam | -| broadcastchannel | ✅ WebPPNGSVG | broadcastchannel | -| broadcastchannel-light | ✅ WebPPNGSVG | broadcastchannel-light | -| brocade | ✅ WebPPNGSVG | brocade | -| brother | ✅ WebPPNGSVG | brother | -| browserless | ✅ WebPPNGSVG | browserless | -| browserless-light | ✅ WebPPNGSVG | browserless-light | -| browsh | ✅ WebPPNGSVG | browsh | -| btcpay-server | ✅ WebPPNG ❌ SVG | btcpay-server | -| buddy | ✅ WebPPNG ❌ SVG | buddy | -| budget-zero | ✅ WebPPNG ❌ SVG | budget-zero | -| budgetbee | ✅ WebPPNGSVG | budgetbee | -| budgetbee-light | ✅ WebPPNGSVG | budgetbee-light | -| budibase | ✅ WebPPNGSVG | budibase | -| buffalo | ✅ WebPPNG ❌ SVG | buffalo | -| bunkerweb | ✅ WebPPNGSVG | bunkerweb | -| buxfer | ✅ WebPPNG ❌ SVG | buxfer | -| bytestash | ✅ WebPPNGSVG | bytestash | -| c | ✅ WebPPNGSVG | c | -| cabot | ✅ WebPPNG ❌ SVG | cabot | -| cacti | ✅ WebPPNGSVG | cacti | -| caddy | ✅ WebPPNGSVG | caddy | -| cadvisor | ✅ WebPPNG ❌ SVG | cadvisor | -| cal-com | ✅ WebPPNGSVG | cal-com | -| cal-com-light | ✅ WebPPNGSVG | cal-com-light | -| calckey | ✅ WebPPNG ❌ SVG | calckey | -| caldera | ✅ WebPPNG ❌ SVG | caldera | -| calibre | ✅ WebPPNGSVG | calibre | -| calibre-web | ✅ WebPPNGSVG | calibre-web | -| camera-ui | ✅ WebPPNG ❌ SVG | camera-ui | -| canonical | ✅ WebPPNGSVG | canonical | -| caprover | ✅ WebPPNGSVG | caprover | -| cardigann | ✅ WebPPNG ❌ SVG | cardigann | -| cardigann-light | ✅ WebPPNG ❌ SVG | cardigann-light | -| carrefour | ✅ WebPPNGSVG | carrefour | -| casaos | ✅ WebPPNGSVG | casaos | -| castopod | ✅ WebPPNGSVG | castopod | -| cc | ✅ WebPPNGSVG | cc | -| cc-light | ✅ WebPPNGSVG | cc-light | -| centos | ✅ WebPPNGSVG | centos | -| ceph | ✅ WebPPNGSVG | ceph | -| cert-manager | ✅ WebPPNGSVG | cert-manager | -| cert-warden | ✅ WebPPNGSVG | cert-warden | -| cert-warden-light | ✅ WebPPNGSVG | cert-warden-light | -| cessna | ✅ WebPPNGSVG | cessna | -| chainguard | ✅ WebPPNGSVG | chainguard | -| changedetection | ✅ WebPPNGSVG | changedetection | -| channels-dvr | ✅ WebPPNGSVG | channels-dvr | -| chatgpt | ✅ WebPPNGSVG | chatgpt | -| chatpad-ai | ✅ WebPPNGSVG | chatpad-ai | -| checkmk | ✅ WebPPNGSVG | checkmk | -| cherry | ✅ WebPPNG ❌ SVG | cherry | -| chevereto | ✅ WebPPNGSVG | chevereto | -| chiefonboarding | ✅ WebPPNG ❌ SVG | chiefonboarding | -| chirpy | ✅ WebPPNGSVG | chirpy | -| chowdown | ✅ WebPPNG ❌ SVG | chowdown | -| chrome | ✅ WebPPNGSVG | chrome | -| chrome-beta | ✅ WebPPNG ❌ SVG | chrome-beta | -| chrome-canary | ✅ WebPPNGSVG | chrome-canary | -| chrome-dev | ✅ WebPPNGSVG | chrome-dev | -| chrome-devtools | ✅ WebPPNGSVG | chrome-devtools | -| chrome-remote-desktop | ✅ WebPPNGSVG | chrome-remote-desktop | -| chromecast | ✅ WebPPNG ❌ SVG | chromecast | -| chromecast-light | ✅ WebPPNG ❌ SVG | chromecast-light | -| chromium | ✅ WebPPNGSVG | chromium | -| chronograf | ✅ WebPPNG ❌ SVG | chronograf | -| cilium | ✅ WebPPNGSVG | cilium | -| cilium-light | ✅ WebPPNGSVG | cilium-light | -| cinny | ✅ WebPPNGSVG | cinny | -| cinny-light | ✅ WebPPNGSVG | cinny-light | -| ciphermail | ✅ WebPPNGSVG | ciphermail | -| cisco | ✅ WebPPNGSVG | cisco | -| clash | ✅ WebPPNG ❌ SVG | clash | -| claude-ai | ✅ WebPPNGSVG | claude-ai | -| claude-ai-light | ✅ WebPPNGSVG | claude-ai-light | -| clickhouse | ✅ WebPPNGSVG | clickhouse | -| cloud66 | ✅ WebPPNGSVG | cloud66 | -| cloud9 | ✅ WebPPNGSVG | cloud9 | -| cloud9-light | ✅ WebPPNGSVG | cloud9-light | -| cloudbeaver | ✅ WebPPNGSVG | cloudbeaver | -| cloudcmd | ✅ WebPPNG ❌ SVG | cloudcmd | -| cloudflare | ✅ WebPPNGSVG | cloudflare | -| cloudflare-pages | ✅ WebPPNGSVG | cloudflare-pages | -| cloudflare-zero-trust | ✅ WebPPNGSVG | cloudflare-zero-trust | -| cloudpanel | ✅ WebPPNGSVG | cloudpanel | -| cloudstream | ✅ WebPPNGSVG | cloudstream | -| cobalt | ✅ WebPPNGSVG | cobalt | -| cobalt-dark | ✅ WebPPNGSVG | cobalt-dark | -| cockpit | ✅ WebPPNGSVG | cockpit | -| cockpit-cms | ✅ WebPPNGSVG | cockpit-cms | -| cockpit-cms-light | ✅ WebPPNGSVG | cockpit-cms-light | -| cockpit-light | ✅ WebPPNGSVG | cockpit-light | -| code | ✅ WebPPNGSVG | code | -| code-server | ✅ WebPPNG ❌ SVG | code-server | -| codeberg | ✅ WebPPNGSVG | codeberg | -| coder | ✅ WebPPNGSVG | coder | -| coder-light | ✅ WebPPNGSVG | coder-light | -| codestats | ✅ WebPPNGSVG | codestats | -| codestats-light | ✅ WebPPNGSVG | codestats-light | -| codex | ✅ WebPPNGSVG | codex | -| codex-light | ✅ WebPPNGSVG | codex-light | -| codimd | ✅ WebPPNG ❌ SVG | codimd | -| codimd-light | ✅ WebPPNG ❌ SVG | codimd-light | -| collabora-online | ✅ WebPPNGSVG | collabora-online | -| commafeed | ✅ WebPPNGSVG | commafeed | -| commafeed-light | ✅ WebPPNGSVG | commafeed-light | -| commento | ✅ WebPPNGSVG | commento | -| commento-light | ✅ WebPPNGSVG | commento-light | -| compreface | ✅ WebPPNGSVG | compreface | -| concourse | ✅ WebPPNGSVG | concourse | -| confluence | ✅ WebPPNGSVG | confluence | -| consul | ✅ WebPPNGSVG | consul | -| contabo | ✅ WebPPNGSVG | contabo | -| converse | ✅ WebPPNGSVG | converse | -| converse-light | ✅ WebPPNGSVG | converse-light | -| cooler-control | ✅ WebPPNGSVG | cooler-control | -| coolify | ✅ WebPPNGSVG | coolify | -| copyq | ✅ WebPPNGSVG | copyq | -| coredns | ✅ WebPPNGSVG | coredns | -| coreos | ✅ WebPPNGSVG | coreos | -| cosign | ✅ WebPPNGSVG | cosign | -| costco | ✅ WebPPNGSVG | costco | -| couchdb | ✅ WebPPNGSVG | couchdb | -| couchpotato | ✅ WebPPNG ❌ SVG | couchpotato | -| counter-analytics | ✅ WebPPNGSVG | counter-analytics | -| counter-strike-2 | ✅ WebPPNG ❌ SVG | counter-strike-2 | -| counter-strike-global-offensive | ✅ WebPPNG ❌ SVG | counter-strike-global-offensive | -| cozy | ✅ WebPPNGSVG | cozy | -| cpanel | ✅ WebPPNGSVG | cpanel | -| cpp | ✅ WebPPNGSVG | cpp | -| crafty-controller | ✅ WebPPNGSVG | crafty-controller | -| crater-invoice | ✅ WebPPNG ❌ SVG | crater-invoice | -| crazydomains | ✅ WebPPNG ❌ SVG | crazydomains | -| cribl | ✅ WebPPNG ❌ SVG | cribl | -| cribl-light | ✅ WebPPNG ❌ SVG | cribl-light | -| cronicle | ✅ WebPPNGSVG | cronicle | -| cross-seed | ✅ WebPPNG ❌ SVG | cross-seed | -| cross-seed-square | ✅ WebPPNG ❌ SVG | cross-seed-square | -| crowdsec | ✅ WebPPNGSVG | crowdsec | -| cryptomator | ✅ WebPPNGSVG | cryptomator | -| cryptpad | ✅ WebPPNGSVG | cryptpad | -| csharp | ✅ WebPPNGSVG | csharp | -| css | ✅ WebPPNGSVG | css | -| css-light | ✅ WebPPNGSVG | css-light | -| ctfreak | ✅ WebPPNGSVG | ctfreak | -| cups | ✅ WebPPNGSVG | cups | -| cups-light | ✅ WebPPNGSVG | cups-light | -| cura | ✅ WebPPNGSVG | cura | -| cyberchef | ✅ WebPPNGSVG | cyberchef | -| czkawka | ✅ WebPPNGSVG | czkawka | -| d-link | ✅ WebPPNGSVG | d-link | -| dagster-dark | ✅ WebPPNGSVG | dagster-dark | -| dagster-light | ✅ WebPPNGSVG | dagster-light | -| dahua | ✅ WebPPNG ❌ SVG | dahua | -| dalibo | ✅ WebPPNGSVG | dalibo | -| dart | ✅ WebPPNGSVG | dart | -| dashdot | ✅ WebPPNG ❌ SVG | dashdot | -| dashy | ✅ WebPPNG ❌ SVG | dashy | -| datadog | ✅ WebPPNGSVG | datadog | -| davical | ✅ WebPPNGSVG | davical | -| davis | ✅ WebPPNG ❌ SVG | davis | -| dawarich | ✅ WebPPNGSVG | dawarich | -| dc-os | ✅ WebPPNGSVG | dc-os | -| dd-wrt | ✅ WebPPNG ❌ SVG | dd-wrt | -| dd-wrt-light | ✅ WebPPNG ❌ SVG | dd-wrt-light | -| ddclient | ✅ WebPPNGSVG | ddclient | -| ddns-updater | ✅ WebPPNGSVG | ddns-updater | -| debian-linux | ✅ WebPPNGSVG | debian-linux | -| deemix | ✅ WebPPNG ❌ SVG | deemix | -| deepseek | ✅ WebPPNGSVG | deepseek | -| deezer | ✅ WebPPNGSVG | deezer | -| defguard | ✅ WebPPNGSVG | defguard | -| dell | ✅ WebPPNGSVG | dell | -| deluge | ✅ WebPPNGSVG | deluge | -| deno | ✅ WebPPNGSVG | deno | -| deno-light | ✅ WebPPNGSVG | deno-light | -| denon | ✅ WebPPNGSVG | denon | -| denon-light | ✅ WebPPNGSVG | denon-light | -| deployarr | ✅ WebPPNGSVG | deployarr | -| develancacheui | ✅ WebPPNG ❌ SVG | develancacheui | -| devtooly | ✅ WebPPNG ❌ SVG | devtooly | -| devtooly-light | ✅ WebPPNG ❌ SVG | devtooly-light | -| dia | ✅ WebPPNGSVG | dia | -| diagrams-net | ✅ WebPPNGSVG | diagrams-net | -| diamond-aircraft | ✅ WebPPNGSVG | diamond-aircraft | -| dietpi | ✅ WebPPNG ❌ SVG | dietpi | -| digital-ocean | ✅ WebPPNGSVG | digital-ocean | -| dillinger | ✅ WebPPNGSVG | dillinger | -| dillinger-light | ✅ WebPPNGSVG | dillinger-light | -| dim | ✅ WebPPNG ❌ SVG | dim | -| dim-light | ✅ WebPPNG ❌ SVG | dim-light | -| directadmin | ✅ WebPPNGSVG | directadmin | -| directus | ✅ WebPPNGSVG | directus | -| discord | ✅ WebPPNGSVG | discord | -| discourse | ✅ WebPPNGSVG | discourse | -| discourse-light | ✅ WebPPNGSVG | discourse-light | -| diskover | ✅ WebPPNG ❌ SVG | diskover | -| disney-plus | ✅ WebPPNGSVG | disney-plus | -| diun | ✅ WebPPNG ❌ SVG | diun | -| diyhue | ✅ WebPPNG ❌ SVG | diyhue | -| dlna | ✅ WebPPNGSVG | dlna | -| docassemble | ✅ WebPPNGSVG | docassemble | -| docassemble-light | ✅ WebPPNGSVG | docassemble-light | -| docker | ✅ WebPPNGSVG | docker | -| docker-amd | ✅ WebPPNG ❌ SVG | docker-amd | -| docker-amvd | ✅ WebPPNG ❌ SVG | docker-amvd | -| docker-compose | ✅ WebPPNG ❌ SVG | docker-compose | -| docker-engine | ✅ WebPPNGSVG | docker-engine | -| docker-gc | ✅ WebPPNG ❌ SVG | docker-gc | -| docker-mailserver | ✅ WebPPNGSVG | docker-mailserver | -| docker-mailserver-light | ✅ WebPPNGSVG | docker-mailserver-light | -| docker-moby | ✅ WebPPNGSVG | docker-moby | -| docker-volume-backup | ✅ WebPPNGSVG | docker-volume-backup | -| dockge | ✅ WebPPNGSVG | dockge | -| docking-station | ✅ WebPPNGSVG | docking-station | -| dockstarter | ✅ WebPPNG ❌ SVG | dockstarter | -| dockwatch | ✅ WebPPNG ❌ SVG | dockwatch | -| docsify | ✅ WebPPNGSVG | docsify | -| docspell | ✅ WebPPNGSVG | docspell | -| documenso | ✅ WebPPNGSVG | documenso | -| docusaurus | ✅ WebPPNGSVG | docusaurus | -| docuseal | ✅ WebPPNGSVG | docuseal | -| dogpile | ✅ WebPPNG ❌ SVG | dogpile | -| dokemon | ✅ WebPPNGSVG | dokemon | -| dokuwiki | ✅ WebPPNGSVG | dokuwiki | -| dolibarr | ✅ WebPPNG ❌ SVG | dolibarr | -| dolphin | ✅ WebPPNG ❌ SVG | dolphin | -| domainmod | ✅ WebPPNG ❌ SVG | domainmod | -| domoticz | ✅ WebPPNG ❌ SVG | domoticz | -| donetick | ✅ WebPPNGSVG | donetick | -| dopplertask | ✅ WebPPNG ❌ SVG | dopplertask | -| double-commander | ✅ WebPPNGSVG | double-commander | -| double-take | ✅ WebPPNGSVG | double-take | -| double-take-dark | ✅ WebPPNGSVG | double-take-dark | -| dovecot | ✅ WebPPNGSVG | dovecot | -| dozzle | ✅ WebPPNGSVG | dozzle | -| draw-io | ✅ WebPPNGSVG | draw-io | -| draytek | ✅ WebPPNGSVG | draytek | -| dream-host | ✅ WebPPNGSVG | dream-host | -| dream-host-dark | ✅ WebPPNGSVG | dream-host-dark | -| drone | ✅ WebPPNG ❌ SVG | drone | -| dropbox | ✅ WebPPNGSVG | dropbox | -| dropout | ✅ WebPPNGSVG | dropout | -| dropout-light | ✅ WebPPNGSVG | dropout-light | -| droppy | ✅ WebPPNGSVG | droppy | -| droppy-dark | ✅ WebPPNGSVG | droppy-dark | -| dub | ✅ WebPPNGSVG | dub | -| dub-light | ✅ WebPPNGSVG | dub-light | -| duckdns | ✅ WebPPNGSVG | duckdns | -| duckdns-light | ✅ WebPPNGSVG | duckdns-light | -| duckduckgo | ✅ WebPPNGSVG | duckduckgo | -| dumbpad | ✅ WebPPNGSVG | dumbpad | -| duo | ✅ WebPPNGSVG | duo | -| duplicacy | ✅ WebPPNG ❌ SVG | duplicacy | -| duplicati | ✅ WebPPNGSVG | duplicati | -| easy-gate | ✅ WebPPNGSVG | easy-gate | -| easy-gate-light | ✅ WebPPNGSVG | easy-gate-light | -| ebay | ✅ WebPPNGSVG | ebay | -| eblocker | ✅ WebPPNGSVG | eblocker | -| edge | ✅ WebPPNGSVG | edge | -| edge-dev | ✅ WebPPNGSVG | edge-dev | -| edgeos | ✅ WebPPNG ❌ SVG | edgeos | -| edgeos-light | ✅ WebPPNG ❌ SVG | edgeos-light | -| elastic | ✅ WebPPNGSVG | elastic | -| elastic-beats | ✅ WebPPNGSVG | elastic-beats | -| elastic-kibana | ✅ WebPPNGSVG | elastic-kibana | -| elastic-logstash | ✅ WebPPNGSVG | elastic-logstash | -| elasticsearch | ✅ WebPPNGSVG | elasticsearch | -| electron | ✅ WebPPNGSVG | electron | -| electronic-arts | ✅ WebPPNGSVG | electronic-arts | -| element | ✅ WebPPNGSVG | element | -| eleventy | ✅ WebPPNGSVG | eleventy | -| eleventy-light | ✅ WebPPNGSVG | eleventy-light | -| elysian | ✅ WebPPNGSVG | elysian | -| emacs | ✅ WebPPNGSVG | emacs | -| embraer | ✅ WebPPNGSVG | embraer | -| emby | ✅ WebPPNGSVG | emby | -| embystat | ✅ WebPPNG ❌ SVG | embystat | -| emq | ✅ WebPPNGSVG | emq | -| emq-light | ✅ WebPPNGSVG | emq-light | -| emqx | ✅ WebPPNGSVG | emqx | -| emulatorjs | ✅ WebPPNGSVG | emulatorjs | -| enbizcard | ✅ WebPPNGSVG | enbizcard | -| enclosed | ✅ WebPPNGSVG | enclosed | -| enclosed-light | ✅ WebPPNGSVG | enclosed-light | -| endless | ✅ WebPPNGSVG | endless | -| endless-light | ✅ WebPPNGSVG | endless-light | -| endurain | ✅ WebPPNGSVG | endurain | -| enhance | ✅ WebPPNGSVG | enhance | -| epic-games | ✅ WebPPNGSVG | epic-games | -| epic-games-light | ✅ WebPPNGSVG | epic-games-light | -| epson-iprint | ✅ WebPPNG ❌ SVG | epson-iprint | -| ersatztv | ✅ WebPPNG ❌ SVG | ersatztv | -| erste | ✅ WebPPNGSVG | erste | -| erste-george | ✅ WebPPNGSVG | erste-george | -| esphome | ✅ WebPPNGSVG | esphome | -| esphome-alt | ✅ WebPPNGSVG | esphome-alt | -| esphome-alt-light | ✅ WebPPNGSVG | esphome-alt-light | -| esphome-light | ✅ WebPPNGSVG | esphome-light | -| espressif | ✅ WebPPNGSVG | espressif | -| etcd | ✅ WebPPNGSVG | etcd | -| etesync | ✅ WebPPNGSVG | etesync | -| ethereum | ✅ WebPPNGSVG | ethereum | -| etherpad | ✅ WebPPNGSVG | etherpad | -| evcc | ✅ WebPPNGSVG | evcc | -| evebox | ✅ WebPPNG ❌ SVG | evebox | -| eweka | ✅ WebPPNG ❌ SVG | eweka | -| excalidraw | ✅ WebPPNGSVG | excalidraw | -| ezbookkeeping | ✅ WebPPNG ❌ SVG | ezbookkeeping | -| f-droid | ✅ WebPPNGSVG | f-droid | -| f5-networks | ✅ WebPPNG ❌ SVG | f5-networks | -| facebook | ✅ WebPPNGSVG | facebook | -| facebook-messenger | ✅ WebPPNGSVG | facebook-messenger | -| falcon-christmas | ✅ WebPPNG ❌ SVG | falcon-christmas | -| falcon-player | ✅ WebPPNGSVG | falcon-player | -| falcon-player-dark | ✅ WebPPNGSVG | falcon-player-dark | -| fast-com | ✅ WebPPNGSVG | fast-com | -| fast-com-light | ✅ WebPPNGSVG | fast-com-light | -| fasten-health | ✅ WebPPNGSVG | fasten-health | -| fastmail | ✅ WebPPNGSVG | fastmail | -| fedora | ✅ WebPPNGSVG | fedora | -| fedora-alt | ✅ WebPPNGSVG | fedora-alt | -| feedbase | ✅ WebPPNGSVG | feedbase | -| feedbase-light | ✅ WebPPNGSVG | feedbase-light | -| feedbin | ✅ WebPPNGSVG | feedbin | -| feedbin-light | ✅ WebPPNGSVG | feedbin-light | -| feedly | ✅ WebPPNGSVG | feedly | -| feedlynx | ✅ WebPPNGSVG | feedlynx | -| feedlynx-light | ✅ WebPPNGSVG | feedlynx-light | -| feishin | ✅ WebPPNG ❌ SVG | feishin | -| fenrus | ✅ WebPPNGSVG | fenrus | -| fenrus-light | ✅ WebPPNGSVG | fenrus-light | -| ferdi | ✅ WebPPNG ❌ SVG | ferdi | -| ferdium | ✅ WebPPNGSVG | ferdium | -| fermentrack | ✅ WebPPNG ❌ SVG | fermentrack | -| ferretdb | ✅ WebPPNGSVG | ferretdb | -| fider | ✅ WebPPNGSVG | fider | -| filebot | ✅ WebPPNGSVG | filebot | -| filebrowser | ✅ WebPPNGSVG | filebrowser | -| filecloud | ✅ WebPPNGSVG | filecloud | -| fileflows | ✅ WebPPNGSVG | fileflows | -| filegator | ✅ WebPPNGSVG | filegator | -| filepizza | ✅ WebPPNG ❌ SVG | filepizza | -| filerun | ✅ WebPPNGSVG | filerun | -| files | ✅ WebPPNGSVG | files | -| filestash | ✅ WebPPNGSVG | filestash | -| filezilla | ✅ WebPPNGSVG | filezilla | -| finamp | ✅ WebPPNGSVG | finamp | -| findroid | ✅ WebPPNGSVG | findroid | -| fios | ✅ WebPPNGSVG | fios | -| fios-light | ✅ WebPPNGSVG | fios-light | -| firebase | ✅ WebPPNGSVG | firebase | -| firefly | ✅ WebPPNGSVG | firefly | -| firefly-iii | ✅ WebPPNGSVG | firefly-iii | -| firefox | ✅ WebPPNGSVG | firefox | -| firefox-beta | ✅ WebPPNGSVG | firefox-beta | -| firefox-developer-edition | ✅ WebPPNGSVG | firefox-developer-edition | -| firefox-lite | ✅ WebPPNGSVG | firefox-lite | -| firefox-nightly | ✅ WebPPNGSVG | firefox-nightly | -| firefox-reality | ✅ WebPPNGSVG | firefox-reality | -| firefox-send | ✅ WebPPNGSVG | firefox-send | -| fireshare | ✅ WebPPNG ❌ SVG | fireshare | -| firewalla | ✅ WebPPNGSVG | firewalla | -| fittrackee | ✅ WebPPNGSVG | fittrackee | -| fladder | ✅ WebPPNGSVG | fladder | -| flame | ✅ WebPPNG ❌ SVG | flame | -| flaresolverr | ✅ WebPPNGSVG | flaresolverr | -| flarum | ✅ WebPPNGSVG | flarum | -| flat-notes | ✅ WebPPNG ❌ SVG | flat-notes | -| flathub | ✅ WebPPNGSVG | flathub | -| flatnotes | ✅ WebPPNGSVG | flatnotes | -| flatpak | ✅ WebPPNGSVG | flatpak | -| flexget | ✅ WebPPNG ❌ SVG | flexget | -| flightaware | ✅ WebPPNG ❌ SVG | flightaware | -| flightradar24 | ✅ WebPPNGSVG | flightradar24 | -| flightradar24-light | ✅ WebPPNGSVG | flightradar24-light | -| flogo | ✅ WebPPNG ❌ SVG | flogo | -| flood | ✅ WebPPNGSVG | flood | -| fluent-reader | ✅ WebPPNGSVG | fluent-reader | -| fluffychat | ✅ WebPPNGSVG | fluffychat | -| fluffychat-dark | ✅ WebPPNGSVG | fluffychat-dark | -| fluidd | ✅ WebPPNGSVG | fluidd | -| flux-cd | ✅ WebPPNGSVG | flux-cd | -| fly-io | ✅ WebPPNGSVG | fly-io | -| focalboard | ✅ WebPPNGSVG | focalboard | -| foldingathome | ✅ WebPPNGSVG | foldingathome | -| fontawesome | ✅ WebPPNGSVG | fontawesome | -| foreflight | ✅ WebPPNGSVG | foreflight | -| foreflight-dark | ✅ WebPPNGSVG | foreflight-dark | -| forgejo | ✅ WebPPNGSVG | forgejo | -| forte | ✅ WebPPNGSVG | forte | -| forte-light | ✅ WebPPNGSVG | forte-light | -| fortinet | ✅ WebPPNGSVG | fortinet | -| foscam | ✅ WebPPNG ❌ SVG | foscam | -| fossil | ✅ WebPPNGSVG | fossil | -| foundry-vtt | ✅ WebPPNG ❌ SVG | foundry-vtt | -| franz | ✅ WebPPNGSVG | franz | -| free-dns | ✅ WebPPNG ❌ SVG | free-dns | -| freebox-delta | ✅ WebPPNG ❌ SVG | freebox-delta | -| freebox-pop | ✅ WebPPNG ❌ SVG | freebox-pop | -| freebox-revolution | ✅ WebPPNG ❌ SVG | freebox-revolution | -| freedombox | ✅ WebPPNGSVG | freedombox | -| freeipa | ✅ WebPPNGSVG | freeipa | -| freenas | ✅ WebPPNGSVG | freenas | -| freenom | ✅ WebPPNGSVG | freenom | -| freepbx | ✅ WebPPNGSVG | freepbx | -| freescout | ✅ WebPPNG ❌ SVG | freescout | -| freshping | ✅ WebPPNGSVG | freshping | -| freshping-dark | ✅ WebPPNGSVG | freshping-dark | -| freshrss | ✅ WebPPNGSVG | freshrss | -| friendica | ✅ WebPPNGSVG | friendica | -| frigate | ✅ WebPPNGSVG | frigate | -| frigate-light | ✅ WebPPNGSVG | frigate-light | -| fritzbox | ✅ WebPPNGSVG | fritzbox | -| fritzbox-light | ✅ WebPPNGSVG | fritzbox-light | -| fronius | ✅ WebPPNGSVG | fronius | -| fulcio | ✅ WebPPNGSVG | fulcio | -| funkwhale | ✅ WebPPNGSVG | funkwhale | -| funkwhale-light | ✅ WebPPNGSVG | funkwhale-light | -| fusionauth | ✅ WebPPNGSVG | fusionauth | -| fusionauth-light | ✅ WebPPNGSVG | fusionauth-light | -| fusionpbx | ✅ WebPPNG ❌ SVG | fusionpbx | -| gamevault | ✅ WebPPNG ❌ SVG | gamevault | -| gameyfin | ✅ WebPPNG ❌ SVG | gameyfin | -| gameyfin-light | ✅ WebPPNG ❌ SVG | gameyfin-light | -| gaps | ✅ WebPPNG ❌ SVG | gaps | -| garage | ✅ WebPPNGSVG | garage | -| gaseous | ✅ WebPPNG ❌ SVG | gaseous | -| gatsby | ✅ WebPPNGSVG | gatsby | -| gatus | ✅ WebPPNGSVG | gatus | -| gboard | ✅ WebPPNGSVG | gboard | -| geckoview | ✅ WebPPNGSVG | geckoview | -| gentoo-linux | ✅ WebPPNGSVG | gentoo-linux | -| gerbera | ✅ WebPPNGSVG | gerbera | -| get-iplayer | ✅ WebPPNGSVG | get-iplayer | -| ghost | ✅ WebPPNG ❌ SVG | ghost | -| ghost-light | ✅ WebPPNG ❌ SVG | ghost-light | -| ghostfolio | ✅ WebPPNGSVG | ghostfolio | -| gigaset | ✅ WebPPNGSVG | gigaset | -| gimp | ✅ WebPPNGSVG | gimp | -| git | ✅ WebPPNGSVG | git | -| gitbook | ✅ WebPPNGSVG | gitbook | -| gitea | ✅ WebPPNGSVG | gitea | -| gitee | ✅ WebPPNGSVG | gitee | -| github | ✅ WebPPNGSVG | github | -| github-light | ✅ WebPPNGSVG | github-light | -| gitlab | ✅ WebPPNGSVG | gitlab | -| gitsign | ✅ WebPPNGSVG | gitsign | -| gladys-assistant | ✅ WebPPNGSVG | gladys-assistant | -| glance | ✅ WebPPNGSVG | glance | -| glance-light | ✅ WebPPNGSVG | glance-light | -| glances | ✅ WebPPNGSVG | glances | -| glances-light | ✅ WebPPNGSVG | glances-light | -| glpi | ✅ WebPPNGSVG | glpi | -| gluetun | ✅ WebPPNGSVG | gluetun | -| gmail | ✅ WebPPNGSVG | gmail | -| go | ✅ WebPPNGSVG | go | -| go2rtc | ✅ WebPPNG ❌ SVG | go2rtc | -| goaccess | ✅ WebPPNGSVG | goaccess | -| goaccess-light | ✅ WebPPNGSVG | goaccess-light | -| godaddy | ✅ WebPPNGSVG | godaddy | -| godaddy-alt | ✅ WebPPNGSVG | godaddy-alt | -| gogs | ✅ WebPPNG ❌ SVG | gogs | -| gollum | ✅ WebPPNGSVG | gollum | -| gonic | ✅ WebPPNGSVG | gonic | -| goodreads | ✅ WebPPNGSVG | goodreads | -| google | ✅ WebPPNGSVG | google | -| google-admin | ✅ WebPPNGSVG | google-admin | -| google-admob | ✅ WebPPNGSVG | google-admob | -| google-alerts | ✅ WebPPNGSVG | google-alerts | -| google-analytics | ✅ WebPPNGSVG | google-analytics | -| google-assistant | ✅ WebPPNGSVG | google-assistant | -| google-calendar | ✅ WebPPNGSVG | google-calendar | -| google-chat | ✅ WebPPNGSVG | google-chat | -| google-chrome | ✅ WebPPNGSVG | google-chrome | -| google-classroom | ✅ WebPPNGSVG | google-classroom | -| google-cloud-platform | ✅ WebPPNGSVG | google-cloud-platform | -| google-cloud-print | ✅ WebPPNGSVG | google-cloud-print | -| google-compute-engine | ✅ WebPPNGSVG | google-compute-engine | -| google-contacts | ✅ WebPPNGSVG | google-contacts | -| google-docs | ✅ WebPPNGSVG | google-docs | -| google-domains | ✅ WebPPNGSVG | google-domains | -| google-drive | ✅ WebPPNGSVG | google-drive | -| google-earth | ✅ WebPPNGSVG | google-earth | -| google-fi | ✅ WebPPNGSVG | google-fi | -| google-finance | ✅ WebPPNG ❌ SVG | google-finance | -| google-fit | ✅ WebPPNGSVG | google-fit | -| google-fonts | ✅ WebPPNGSVG | google-fonts | -| google-forms | ✅ WebPPNGSVG | google-forms | -| google-gemini | ✅ WebPPNGSVG | google-gemini | -| google-home | ✅ WebPPNGSVG | google-home | -| google-keep | ✅ WebPPNGSVG | google-keep | -| google-lens | ✅ WebPPNGSVG | google-lens | -| google-maps | ✅ WebPPNGSVG | google-maps | -| google-meet | ✅ WebPPNGSVG | google-meet | -| google-messages | ✅ WebPPNGSVG | google-messages | -| google-news | ✅ WebPPNGSVG | google-news | -| google-one | ✅ WebPPNGSVG | google-one | -| google-pay | ✅ WebPPNGSVG | google-pay | -| google-photos | ✅ WebPPNGSVG | google-photos | -| google-play | ✅ WebPPNGSVG | google-play | -| google-play-books | ✅ WebPPNGSVG | google-play-books | -| google-play-games | ✅ WebPPNGSVG | google-play-games | -| google-podcasts | ✅ WebPPNGSVG | google-podcasts | -| google-scholar | ✅ WebPPNGSVG | google-scholar | -| google-search-console | ✅ WebPPNGSVG | google-search-console | -| google-sheets | ✅ WebPPNGSVG | google-sheets | -| google-shopping | ✅ WebPPNGSVG | google-shopping | -| google-sites | ✅ WebPPNGSVG | google-sites | -| google-slides | ✅ WebPPNGSVG | google-slides | -| google-street-view | ✅ WebPPNGSVG | google-street-view | -| google-tag-manager | ✅ WebPPNGSVG | google-tag-manager | -| google-translate | ✅ WebPPNGSVG | google-translate | -| google-tv | ✅ WebPPNGSVG | google-tv | -| google-voice | ✅ WebPPNGSVG | google-voice | -| google-wallet | ✅ WebPPNGSVG | google-wallet | -| google-wifi | ✅ WebPPNGSVG | google-wifi | -| gose | ✅ WebPPNGSVG | gose | -| gotify | ✅ WebPPNGSVG | gotify | -| gotosocial | ✅ WebPPNGSVG | gotosocial | -| gpt4free | ✅ WebPPNGSVG | gpt4free | -| grafana | ✅ WebPPNGSVG | grafana | -| gramps | ✅ WebPPNGSVG | gramps | -| grandstream | ✅ WebPPNGSVG | grandstream | -| grav | ✅ WebPPNGSVG | grav | -| grav-light | ✅ WebPPNGSVG | grav-light | -| graylog | ✅ WebPPNGSVG | graylog | -| greenbone | ✅ WebPPNGSVG | greenbone | -| greenbone-light | ✅ WebPPNGSVG | greenbone-light | -| grimoire | ✅ WebPPNGSVG | grimoire | -| grist | ✅ WebPPNGSVG | grist | -| grocy | ✅ WebPPNGSVG | grocy | -| grype | ✅ WebPPNG ❌ SVG | grype | -| guacamole | ✅ WebPPNGSVG | guacamole | -| guacamole-light | ✅ WebPPNGSVG | guacamole-light | -| habitica | ✅ WebPPNGSVG | habitica | -| habitica-dark | ✅ WebPPNGSVG | habitica-dark | -| hacker-news | ✅ WebPPNGSVG | hacker-news | -| hammond | ✅ WebPPNGSVG | hammond | -| hammond-light | ✅ WebPPNGSVG | hammond-light | -| handbrake | ✅ WebPPNGSVG | handbrake | -| haproxy | ✅ WebPPNGSVG | haproxy | -| haptic | ✅ WebPPNGSVG | haptic | -| haptic-light | ✅ WebPPNGSVG | haptic-light | -| harbor | ✅ WebPPNGSVG | harbor | -| hard-forum | ✅ WebPPNG ❌ SVG | hard-forum | -| harvester | ✅ WebPPNGSVG | harvester | -| hasheous | ✅ WebPPNGSVG | hasheous | -| hashicorp-boundary | ✅ WebPPNGSVG | hashicorp-boundary | -| hashicorp-consul | ✅ WebPPNGSVG | hashicorp-consul | -| hashicorp-nomad | ✅ WebPPNGSVG | hashicorp-nomad | -| hashicorp-packer | ✅ WebPPNGSVG | hashicorp-packer | -| hashicorp-terraform | ✅ WebPPNGSVG | hashicorp-terraform | -| hashicorp-vagrant | ✅ WebPPNGSVG | hashicorp-vagrant | -| hashicorp-vault | ✅ WebPPNGSVG | hashicorp-vault | -| hashicorp-waypoint | ✅ WebPPNGSVG | hashicorp-waypoint | -| hastypaste | ✅ WebPPNGSVG | hastypaste | -| hasura | ✅ WebPPNGSVG | hasura | -| hathway | ✅ WebPPNGSVG | hathway | -| hatsh | ✅ WebPPNGSVG | hatsh | -| hatsh-light | ✅ WebPPNGSVG | hatsh-light | -| hbo | ✅ WebPPNGSVG | hbo | -| hbo-light | ✅ WebPPNGSVG | hbo-light | -| hdhomerun | ✅ WebPPNGSVG | hdhomerun | -| hdhomerun-light | ✅ WebPPNGSVG | hdhomerun-light | -| headlamp | ✅ WebPPNGSVG | headlamp | -| headlamp-dark | ✅ WebPPNGSVG | headlamp-dark | -| headphones | ✅ WebPPNG ❌ SVG | headphones | -| headscale | ✅ WebPPNGSVG | headscale | -| healthchecks | ✅ WebPPNGSVG | healthchecks | -| hedgedoc | ✅ WebPPNGSVG | hedgedoc | -| heimdall | ✅ WebPPNGSVG | heimdall | -| heimdall-light | ✅ WebPPNGSVG | heimdall-light | -| helium-token | ✅ WebPPNGSVG | helium-token | -| helm | ✅ WebPPNGSVG | helm | -| helper-scripts | ✅ WebPPNG ❌ SVG | helper-scripts | -| hemmelig | ✅ WebPPNGSVG | hemmelig | -| hemmelig-light | ✅ WebPPNGSVG | hemmelig-light | -| hetzner | ✅ WebPPNGSVG | hetzner | -| hexo | ✅ WebPPNGSVG | hexo | -| heyform | ✅ WebPPNGSVG | heyform | -| hifiberry | ✅ WebPPNGSVG | hifiberry | -| hikvision | ✅ WebPPNGSVG | hikvision | -| hilook | ✅ WebPPNGSVG | hilook | -| hivedav | ✅ WebPPNGSVG | hivedav | -| hoarder | ✅ WebPPNGSVG | hoarder | -| hoarder-light | ✅ WebPPNGSVG | hoarder-light | -| hollo | ✅ WebPPNGSVG | hollo | -| hollo-light | ✅ WebPPNGSVG | hollo-light | -| homarr | ✅ WebPPNGSVG | homarr | -| home-assistant | ✅ WebPPNGSVG | home-assistant | -| home-assistant-alt | ✅ WebPPNGSVG | home-assistant-alt | -| homebox | ✅ WebPPNGSVG | homebox | -| homebox-light | ✅ WebPPNGSVG | homebox-light | -| homebridge | ✅ WebPPNGSVG | homebridge | -| homepage | ✅ WebPPNG ❌ SVG | homepage | -| homer | ✅ WebPPNGSVG | homer | -| homeseer | ✅ WebPPNG ❌ SVG | homeseer | -| homey | ✅ WebPPNGSVG | homey | -| honda-jet | ✅ WebPPNGSVG | honda-jet | -| honeygain | ✅ WebPPNG ❌ SVG | honeygain | -| hoobs | ✅ WebPPNGSVG | hoobs | -| hoppscotch | ✅ WebPPNGSVG | hoppscotch | -| hortusfox | ✅ WebPPNG ❌ SVG | hortusfox | -| hostinger | ✅ WebPPNGSVG | hostinger | -| hotio | ✅ WebPPNGSVG | hotio | -| hp | ✅ WebPPNGSVG | hp | -| html | ✅ WebPPNGSVG | html | -| html-light | ✅ WebPPNGSVG | html-light | -| huawei | ✅ WebPPNGSVG | huawei | -| hubitat | ✅ WebPPNGSVG | hubitat | -| hubzilla | ✅ WebPPNGSVG | hubzilla | -| hugging-face | ✅ WebPPNGSVG | hugging-face | -| huginn | ✅ WebPPNGSVG | huginn | -| hugo | ✅ WebPPNGSVG | hugo | -| hulu | ✅ WebPPNGSVG | hulu | -| humhub | ✅ WebPPNGSVG | humhub | -| hydra | ✅ WebPPNGSVG | hydra | -| hyperion | ✅ WebPPNG ❌ SVG | hyperion | -| hyperpipe | ✅ WebPPNGSVG | hyperpipe | -| hyperpipe-light | ✅ WebPPNGSVG | hyperpipe-light | -| i2p | ✅ WebPPNGSVG | i2p | -| i2p-light | ✅ WebPPNGSVG | i2p-light | -| i2pd | ✅ WebPPNGSVG | i2pd | -| icecast | ✅ WebPPNGSVG | icecast | -| icinga | ✅ WebPPNGSVG | icinga | -| icinga-full | ✅ WebPPNGSVG | icinga-full | -| icinga-full-light | ✅ WebPPNGSVG | icinga-full-light | -| icinga-light | ✅ WebPPNGSVG | icinga-light | -| icloud | ✅ WebPPNGSVG | icloud | -| idrac | ✅ WebPPNGSVG | idrac | -| ihatemoney | ✅ WebPPNG ❌ SVG | ihatemoney | -| ilo | ✅ WebPPNGSVG | ilo | -| immich | ✅ WebPPNGSVG | immich | -| immich-frame | ✅ WebPPNGSVG | immich-frame | -| immich-frame-light | ✅ WebPPNGSVG | immich-frame-light | -| immich-kiosk | ✅ WebPPNGSVG | immich-kiosk | -| immich-kiosk-light | ✅ WebPPNGSVG | immich-kiosk-light | -| incus | ✅ WebPPNGSVG | incus | -| infisical | ✅ WebPPNGSVG | infisical | -| influxdb | ✅ WebPPNGSVG | influxdb | -| infoblox | ✅ WebPPNGSVG | infoblox | -| infomaniak-k | ✅ WebPPNGSVG | infomaniak-k | -| infomaniak-kdrive-dark | ✅ WebPPNGSVG | infomaniak-kdrive-dark | -| infomaniak-kdrive-light | ✅ WebPPNGSVG | infomaniak-kdrive-light | -| infomaniak-kmeet-dark | ✅ WebPPNGSVG | infomaniak-kmeet-dark | -| infomaniak-kmeet-light | ✅ WebPPNGSVG | infomaniak-kmeet-light | -| infomaniak-swisstransfer-dark | ✅ WebPPNGSVG | infomaniak-swisstransfer-dark | -| infomaniak-swisstransfer-light | ✅ WebPPNGSVG | infomaniak-swisstransfer-light | -| inoreader | ✅ WebPPNGSVG | inoreader | -| insanelymac | ✅ WebPPNG ❌ SVG | insanelymac | -| instagram | ✅ WebPPNGSVG | instagram | -| inventree | ✅ WebPPNGSVG | inventree | -| invidious | ✅ WebPPNGSVG | invidious | -| invisioncommunity | ✅ WebPPNGSVG | invisioncommunity | -| invoice-ninja | ✅ WebPPNGSVG | invoice-ninja | -| invoice-ninja-light | ✅ WebPPNGSVG | invoice-ninja-light | -| invoiceninja | ✅ WebPPNG ❌ SVG | invoiceninja | -| invoiceninja-light | ✅ WebPPNG ❌ SVG | invoiceninja-light | -| invoke-ai | ✅ WebPPNGSVG | invoke-ai | -| iobroker | ✅ WebPPNGSVG | iobroker | -| ionos | ✅ WebPPNGSVG | ionos | -| ipboard | ✅ WebPPNGSVG | ipboard | -| ipcamtalk | ✅ WebPPNG ❌ SVG | ipcamtalk | -| ipfs | ✅ WebPPNGSVG | ipfs | -| ipfs-light | ✅ WebPPNGSVG | ipfs-light | -| irc | ✅ WebPPNG ❌ SVG | irc | -| iredmail | ✅ WebPPNG ❌ SVG | iredmail | -| ispconfig | ✅ WebPPNGSVG | ispconfig | -| ispy | ✅ WebPPNG ❌ SVG | ispy | -| it-tools | ✅ WebPPNGSVG | it-tools | -| it-tools-light | ✅ WebPPNGSVG | it-tools-light | -| jackett | ✅ WebPPNGSVG | jackett | -| jackett-light | ✅ WebPPNGSVG | jackett-light | -| jaeger | ✅ WebPPNGSVG | jaeger | -| jamstack | ✅ WebPPNGSVG | jamstack | -| java | ✅ WebPPNGSVG | java | -| javascript | ✅ WebPPNGSVG | javascript | -| javascript-light | ✅ WebPPNGSVG | javascript-light | -| jdownloader | ✅ WebPPNG ❌ SVG | jdownloader | -| jdownloader2 | ✅ WebPPNG ❌ SVG | jdownloader2 | -| jeedom | ✅ WebPPNGSVG | jeedom | -| jekyll | ✅ WebPPNGSVG | jekyll | -| jellyfin | ✅ WebPPNGSVG | jellyfin | -| jellyfin-vue | ✅ WebPPNGSVG | jellyfin-vue | -| jellyseerr | ✅ WebPPNGSVG | jellyseerr | -| jellystat | ✅ WebPPNGSVG | jellystat | -| jelu | ✅ WebPPNGSVG | jelu | -| jenkins | ✅ WebPPNGSVG | jenkins | -| jetbrains-fleet | ✅ WebPPNG ❌ SVG | jetbrains-fleet | -| jetbrains-youtrack | ✅ WebPPNGSVG | jetbrains-youtrack | -| jetkvm | ✅ WebPPNGSVG | jetkvm | -| jetkvm-full | ✅ WebPPNGSVG | jetkvm-full | -| jfrog | ✅ WebPPNGSVG | jfrog | -| jio | ✅ WebPPNGSVG | jio | -| jiohotstar | ✅ WebPPNG ❌ SVG | jiohotstar | -| jira | ✅ WebPPNGSVG | jira | -| jitsi | ✅ WebPPNGSVG | jitsi | -| jitsi-meet | ✅ WebPPNGSVG | jitsi-meet | -| joal | ✅ WebPPNG ❌ SVG | joal | -| joomla | ✅ WebPPNGSVG | joomla | -| joplin | ✅ WebPPNGSVG | joplin | -| julia | ✅ WebPPNGSVG | julia | -| jupyter | ✅ WebPPNGSVG | jupyter | -| jwt-io | ✅ WebPPNGSVG | jwt-io | -| jwt-io-light | ✅ WebPPNGSVG | jwt-io-light | -| kagi | ✅ WebPPNGSVG | kagi | -| kaizoku | ✅ WebPPNG ❌ SVG | kaizoku | -| kamatera | ✅ WebPPNGSVG | kamatera | -| kanboard | ✅ WebPPNGSVG | kanboard | -| kanboard-light | ✅ WebPPNGSVG | kanboard-light | -| kanidm | ✅ WebPPNGSVG | kanidm | -| kapacitor | ✅ WebPPNG ❌ SVG | kapacitor | -| kapowarr | ✅ WebPPNGSVG | kapowarr | -| karakeep | ✅ WebPPNGSVG | karakeep | -| karakeep-dark | ✅ WebPPNGSVG | karakeep-dark | -| kasm | ✅ WebPPNGSVG | kasm | -| kasm-workspaces | ✅ WebPPNGSVG | kasm-workspaces | -| kasten-k10 | ✅ WebPPNGSVG | kasten-k10 | -| kaufland | ✅ WebPPNGSVG | kaufland | -| kavita | ✅ WebPPNGSVG | kavita | -| kbin | ✅ WebPPNGSVG | kbin | -| keenetic | ✅ WebPPNGSVG | keenetic | -| keenetic-alt | ✅ WebPPNGSVG | keenetic-alt | -| keenetic-new | ✅ WebPPNG ❌ SVG | keenetic-new | -| keepassxc | ✅ WebPPNGSVG | keepassxc | -| keila | ✅ WebPPNGSVG | keila | -| kerberos | ✅ WebPPNGSVG | kerberos | -| kestra | ✅ WebPPNGSVG | kestra | -| keycloak | ✅ WebPPNGSVG | keycloak | -| keyoxide | ✅ WebPPNGSVG | keyoxide | -| keyoxide-alt | ✅ WebPPNGSVG | keyoxide-alt | -| kibana | ✅ WebPPNGSVG | kibana | -| kick | ✅ WebPPNGSVG | kick | -| kick-light | ✅ WebPPNGSVG | kick-light | -| kimai | ✅ WebPPNGSVG | kimai | -| kinto | ✅ WebPPNGSVG | kinto | -| kitana | ✅ WebPPNGSVG | kitana | -| kitchenowl | ✅ WebPPNGSVG | kitchenowl | -| kiwix | ✅ WebPPNGSVG | kiwix | -| kiwix-light | ✅ WebPPNGSVG | kiwix-light | -| kleinanzeigen | ✅ WebPPNGSVG | kleinanzeigen | -| klipper | ✅ WebPPNGSVG | klipper | -| ko-fi | ✅ WebPPNGSVG | ko-fi | -| kodi | ✅ WebPPNGSVG | kodi | -| koel | ✅ WebPPNGSVG | koel | -| koillection | ✅ WebPPNGSVG | koillection | -| koillection-light | ✅ WebPPNGSVG | koillection-light | -| kometa | ✅ WebPPNG ❌ SVG | kometa | -| komga | ✅ WebPPNGSVG | komga | -| komodo | ✅ WebPPNGSVG | komodo | -| kontoj | ✅ WebPPNGSVG | kontoj | -| kook | ✅ WebPPNGSVG | kook | -| kopia | ✅ WebPPNGSVG | kopia | -| kotlin | ✅ WebPPNGSVG | kotlin | -| kpn | ✅ WebPPNGSVG | kpn | -| krakend | ✅ WebPPNGSVG | krakend | -| krusader | ✅ WebPPNGSVG | krusader | -| kubecraft | ✅ WebPPNG ❌ SVG | kubecraft | -| kubernetes | ✅ WebPPNGSVG | kubernetes | -| kubernetes-dashboard | ✅ WebPPNGSVG | kubernetes-dashboard | -| kutt | ✅ WebPPNGSVG | kutt | -| kyoo | ✅ WebPPNGSVG | kyoo | -| lancache | ✅ WebPPNG ❌ SVG | lancache | -| lancommander | ✅ WebPPNGSVG | lancommander | -| lancommander-light | ✅ WebPPNGSVG | lancommander-light | -| lanraragi | ✅ WebPPNG ❌ SVG | lanraragi | -| lark | ✅ WebPPNGSVG | lark | -| lastpass | ✅ WebPPNGSVG | lastpass | -| lazylibrarian | ✅ WebPPNG ❌ SVG | lazylibrarian | -| leanote | ✅ WebPPNGSVG | leanote | -| leantime | ✅ WebPPNGSVG | leantime | -| lemmy | ✅ WebPPNGSVG | lemmy | -| lemmy-light | ✅ WebPPNGSVG | lemmy-light | -| lemonldap-ng | ✅ WebPPNG ❌ SVG | lemonldap-ng | -| lets-encrypt | ✅ WebPPNGSVG | lets-encrypt | -| libreddit | ✅ WebPPNGSVG | libreddit | -| libreddit-light | ✅ WebPPNGSVG | libreddit-light | -| libremdb | ✅ WebPPNG ❌ SVG | libremdb | -| librenms | ✅ WebPPNGSVG | librenms | -| libreoffice | ✅ WebPPNGSVG | libreoffice | -| libreoffice-light | ✅ WebPPNGSVG | libreoffice-light | -| librephotos | ✅ WebPPNG ❌ SVG | librephotos | -| librephotos-light | ✅ WebPPNG ❌ SVG | librephotos-light | -| librespeed | ✅ WebPPNGSVG | librespeed | -| librespeed-light | ✅ WebPPNGSVG | librespeed-light | -| librewolf | ✅ WebPPNGSVG | librewolf | -| librex | ✅ WebPPNG ❌ SVG | librex | -| librey | ✅ WebPPNG ❌ SVG | librey | -| librum | ✅ WebPPNGSVG | librum | -| lidarr | ✅ WebPPNGSVG | lidarr | -| lidl | ✅ WebPPNGSVG | lidl | -| lightning-terminal | ✅ WebPPNG ❌ SVG | lightning-terminal | -| lighttpd | ✅ WebPPNGSVG | lighttpd | -| limesurvey | ✅ WebPPNGSVG | limesurvey | -| linguacafe | ✅ WebPPNGSVG | linguacafe | -| linkace | ✅ WebPPNGSVG | linkace | -| linkding | ✅ WebPPNGSVG | linkding | -| linkedin | ✅ WebPPNGSVG | linkedin | -| linkstack | ✅ WebPPNGSVG | linkstack | -| linksys | ✅ WebPPNG ❌ SVG | linksys | -| linkwarden | ✅ WebPPNG ❌ SVG | linkwarden | -| linode | ✅ WebPPNGSVG | linode | -| linux | ✅ WebPPNGSVG | linux | -| linux-mint | ✅ WebPPNGSVG | linux-mint | -| linuxgsm | ✅ WebPPNGSVG | linuxgsm | -| linuxserver-io | ✅ WebPPNGSVG | linuxserver-io | -| liremdb | ✅ WebPPNGSVG | liremdb | -| listmonk | ✅ WebPPNGSVG | listmonk | -| littlelink-custom | ✅ WebPPNGSVG | littlelink-custom | -| lnbits | ✅ WebPPNGSVG | lnbits | -| lobe-chat | ✅ WebPPNGSVG | lobe-chat | -| locals | ✅ WebPPNGSVG | locals | -| locals-light | ✅ WebPPNGSVG | locals-light | -| lodestone | ✅ WebPPNGSVG | lodestone | -| logitech | ✅ WebPPNGSVG | logitech | -| logitech-gaming | ✅ WebPPNGSVG | logitech-gaming | -| logitech-legacy | ✅ WebPPNGSVG | logitech-legacy | -| logitech-light | ✅ WebPPNGSVG | logitech-light | -| logseq | ✅ WebPPNGSVG | logseq | -| logstash | ✅ WebPPNGSVG | logstash | -| logto | ✅ WebPPNGSVG | logto | -| loki | ✅ WebPPNGSVG | loki | -| longhorn | ✅ WebPPNGSVG | longhorn | -| lsio | ✅ WebPPNG ❌ SVG | lsio | -| lua | ✅ WebPPNGSVG | lua | -| lubelogger | ✅ WebPPNG ❌ SVG | lubelogger | -| lunasea | ✅ WebPPNGSVG | lunasea | -| lychee | ✅ WebPPNG ❌ SVG | lychee | -| lynx | ✅ WebPPNGSVG | lynx | -| lynx-light | ✅ WebPPNGSVG | lynx-light | -| lyrion | ✅ WebPPNGSVG | lyrion | -| lyrion-dark | ✅ WebPPNGSVG | lyrion-dark | -| mail-in-a-box | ✅ WebPPNGSVG | mail-in-a-box | -| mailchimp | ✅ WebPPNGSVG | mailchimp | -| mailchimp-light | ✅ WebPPNGSVG | mailchimp-light | -| mailcow | ✅ WebPPNGSVG | mailcow | -| mailcowsogo | ✅ WebPPNG ❌ SVG | mailcowsogo | -| mailfence | ✅ WebPPNGSVG | mailfence | -| mailgun | ✅ WebPPNGSVG | mailgun | -| mailhog | ✅ WebPPNG ❌ SVG | mailhog | -| mailjet | ✅ WebPPNGSVG | mailjet | -| mailu | ✅ WebPPNG ❌ SVG | mailu | -| mainsail | ✅ WebPPNGSVG | mainsail | -| maintainerr | ✅ WebPPNGSVG | maintainerr | -| mak | ✅ WebPPNG ❌ SVG | mak | -| makemkv | ✅ WebPPNG ❌ SVG | makemkv | -| maloja | ✅ WebPPNG ❌ SVG | maloja | -| mango | ✅ WebPPNG ❌ SVG | mango | -| manjaro-linux | ✅ WebPPNGSVG | manjaro-linux | -| mantisbt | ✅ WebPPNG ❌ SVG | mantisbt | -| manyfold | ✅ WebPPNGSVG | manyfold | -| maptiler | ✅ WebPPNGSVG | maptiler | -| marginalia | ✅ WebPPNG ❌ SVG | marginalia | -| mariadb | ✅ WebPPNGSVG | mariadb | -| marktplaats | ✅ WebPPNGSVG | marktplaats | -| mastodon | ✅ WebPPNGSVG | mastodon | -| matomo | ✅ WebPPNGSVG | matomo | -| matrix | ✅ WebPPNGSVG | matrix | -| matrix-light | ✅ WebPPNGSVG | matrix-light | -| matrix-synapse | ✅ WebPPNGSVG | matrix-synapse | -| matrix-synapse-light | ✅ WebPPNGSVG | matrix-synapse-light | -| matter | ✅ WebPPNGSVG | matter | -| matter-light | ✅ WebPPNGSVG | matter-light | -| matterbridge | ✅ WebPPNGSVG | matterbridge | -| mattermost | ✅ WebPPNGSVG | mattermost | -| mautic | ✅ WebPPNGSVG | mautic | -| max | ✅ WebPPNGSVG | max | -| mayan-edms | ✅ WebPPNGSVG | mayan-edms | -| mayan-edms-light | ✅ WebPPNGSVG | mayan-edms-light | -| maybe | ✅ WebPPNGSVG | maybe | -| mazanoke | ✅ WebPPNG ❌ SVG | mazanoke | -| mbin | ✅ WebPPNGSVG | mbin | -| mcmyadmin | ✅ WebPPNG ❌ SVG | mcmyadmin | -| mealie | ✅ WebPPNGSVG | mealie | -| medama | ✅ WebPPNGSVG | medama | -| mediathekview | ✅ WebPPNGSVG | mediathekview | -| mediawiki | ✅ WebPPNGSVG | mediawiki | -| medium-dark | ✅ WebPPNGSVG | medium-dark | -| medium-light | ✅ WebPPNGSVG | medium-light | -| mediux | ✅ WebPPNGSVG | mediux | -| medusa | ✅ WebPPNGSVG | medusa | -| medusa-light | ✅ WebPPNGSVG | medusa-light | -| mega-nz | ✅ WebPPNGSVG | mega-nz | -| mega-nz-dark | ✅ WebPPNGSVG | mega-nz-dark | -| meilisearch | ✅ WebPPNGSVG | meilisearch | -| memories | ✅ WebPPNGSVG | memories | -| memories-light | ✅ WebPPNGSVG | memories-light | -| memos | ✅ WebPPNG ❌ SVG | memos | -| mempool | ✅ WebPPNG ❌ SVG | mempool | -| meraki | ✅ WebPPNGSVG | meraki | -| mercusys | ✅ WebPPNGSVG | mercusys | -| mergeable | ✅ WebPPNGSVG | mergeable | -| mergeable-dark | ✅ WebPPNGSVG | mergeable-dark | -| meshcentral | ✅ WebPPNG ❌ SVG | meshcentral | -| meshping | ✅ WebPPNGSVG | meshping | -| meshping-light | ✅ WebPPNGSVG | meshping-light | -| meshtastic | ✅ WebPPNGSVG | meshtastic | -| meta | ✅ WebPPNGSVG | meta | -| metabase | ✅ WebPPNGSVG | metabase | -| metallb | ✅ WebPPNGSVG | metallb | -| metube | ✅ WebPPNGSVG | metube | -| microbin | ✅ WebPPNG ❌ SVG | microbin | -| microsoft | ✅ WebPPNGSVG | microsoft | -| microsoft-365 | ✅ WebPPNGSVG | microsoft-365 | -| microsoft-365-admin-center | ✅ WebPPNGSVG | microsoft-365-admin-center | -| microsoft-access | ✅ WebPPNGSVG | microsoft-access | -| microsoft-azure | ✅ WebPPNGSVG | microsoft-azure | -| microsoft-bing | ✅ WebPPNGSVG | microsoft-bing | -| microsoft-copilot | ✅ WebPPNGSVG | microsoft-copilot | -| microsoft-edge | ✅ WebPPNGSVG | microsoft-edge | -| microsoft-excel | ✅ WebPPNGSVG | microsoft-excel | -| microsoft-exchange | ✅ WebPPNGSVG | microsoft-exchange | -| microsoft-office | ✅ WebPPNGSVG | microsoft-office | -| microsoft-onedrive | ✅ WebPPNGSVG | microsoft-onedrive | -| microsoft-onenote | ✅ WebPPNGSVG | microsoft-onenote | -| microsoft-outlook | ✅ WebPPNGSVG | microsoft-outlook | -| microsoft-powerpoint | ✅ WebPPNGSVG | microsoft-powerpoint | -| microsoft-sharepoint | ✅ WebPPNGSVG | microsoft-sharepoint | -| microsoft-sql-server | ✅ WebPPNGSVG | microsoft-sql-server | -| microsoft-sql-server-light | ✅ WebPPNGSVG | microsoft-sql-server-light | -| microsoft-teams | ✅ WebPPNGSVG | microsoft-teams | -| microsoft-to-do | ✅ WebPPNGSVG | microsoft-to-do | -| microsoft-windows | ✅ WebPPNGSVG | microsoft-windows | -| microsoft-word | ✅ WebPPNGSVG | microsoft-word | -| midjourney | ✅ WebPPNG ❌ SVG | midjourney | -| midjourney-light | ✅ WebPPNG ❌ SVG | midjourney-light | -| mikrotik | ✅ WebPPNGSVG | mikrotik | -| mikrotik-light | ✅ WebPPNGSVG | mikrotik-light | -| minecraft | ✅ WebPPNGSVG | minecraft | -| mineos | ✅ WebPPNG ❌ SVG | mineos | -| miniflux | ✅ WebPPNGSVG | miniflux | -| miniflux-light | ✅ WebPPNGSVG | miniflux-light | -| minimserver | ✅ WebPPNG ❌ SVG | minimserver | -| minio | ✅ WebPPNGSVG | minio | -| minio-light | ✅ WebPPNGSVG | minio-light | -| misp | ✅ WebPPNG ❌ SVG | misp | -| misskey | ✅ WebPPNGSVG | misskey | -| misskey-light | ✅ WebPPNGSVG | misskey-light | -| mitra | ✅ WebPPNGSVG | mitra | -| mixpost | ✅ WebPPNGSVG | mixpost | -| mkdocs | ✅ WebPPNGSVG | mkdocs | -| mkdocs-light | ✅ WebPPNGSVG | mkdocs-light | -| mkvtoolnix | ✅ WebPPNG ❌ SVG | mkvtoolnix | -| mobaxterm | ✅ WebPPNG ❌ SVG | mobaxterm | -| mobilizon | ✅ WebPPNGSVG | mobilizon | -| mobotix | ✅ WebPPNGSVG | mobotix | -| mobotix-light | ✅ WebPPNGSVG | mobotix-light | -| mochahost | ✅ WebPPNG ❌ SVG | mochahost | -| modrinth | ✅ WebPPNGSVG | modrinth | -| mojeek | ✅ WebPPNGSVG | mojeek | -| molecule | ✅ WebPPNG ❌ SVG | molecule | -| monero | ✅ WebPPNGSVG | monero | -| mongodb | ✅ WebPPNGSVG | mongodb | -| monica | ✅ WebPPNGSVG | monica | -| monica-light | ✅ WebPPNGSVG | monica-light | -| monit | ✅ WebPPNG ❌ SVG | monit | -| moodist | ✅ WebPPNGSVG | moodist | -| moodist-dark | ✅ WebPPNGSVG | moodist-dark | -| moodle | ✅ WebPPNGSVG | moodle | -| moodle-light | ✅ WebPPNGSVG | moodle-light | -| morphos | ✅ WebPPNGSVG | morphos | -| mosquitto | ✅ WebPPNGSVG | mosquitto | -| motioneye | ✅ WebPPNGSVG | motioneye | -| motioneye-dark | ✅ WebPPNGSVG | motioneye-dark | -| mpm | ✅ WebPPNG ❌ SVG | mpm | -| mqtt | ✅ WebPPNGSVG | mqtt | -| mstream | ✅ WebPPNGSVG | mstream | -| mullvad | ✅ WebPPNGSVG | mullvad | -| mullvad-browser | ✅ WebPPNGSVG | mullvad-browser | -| mullvad-vpn | ✅ WebPPNGSVG | mullvad-vpn | -| multi-scrobbler | ✅ WebPPNGSVG | multi-scrobbler | -| mumble | ✅ WebPPNGSVG | mumble | -| mumble-light | ✅ WebPPNGSVG | mumble-light | -| music-assistant | ✅ WebPPNGSVG | music-assistant | -| music-assistant-light | ✅ WebPPNGSVG | music-assistant-light | -| musicbrainz | ✅ WebPPNGSVG | musicbrainz | -| myheats | ✅ WebPPNGSVG | myheats | -| myheats-light | ✅ WebPPNGSVG | myheats-light | -| mylar | ✅ WebPPNG ❌ SVG | mylar | -| myspeed | ✅ WebPPNGSVG | myspeed | -| mysql | ✅ WebPPNGSVG | mysql | -| n8n | ✅ WebPPNGSVG | n8n | -| nagios | ✅ WebPPNGSVG | nagios | -| name-silo | ✅ WebPPNGSVG | name-silo | -| namecheap | ✅ WebPPNGSVG | namecheap | -| nasa | ✅ WebPPNGSVG | nasa | -| nautical-backup | ✅ WebPPNG ❌ SVG | nautical-backup | -| navidrome | ✅ WebPPNGSVG | navidrome | -| navidrome-light | ✅ WebPPNGSVG | navidrome-light | -| ncore | ✅ WebPPNG ❌ SVG | ncore | -| neko | ✅ WebPPNGSVG | neko | -| neko-light | ✅ WebPPNGSVG | neko-light | -| neo4j | ✅ WebPPNGSVG | neo4j | -| neocities | ✅ WebPPNGSVG | neocities | -| neodb | ✅ WebPPNGSVG | neodb | -| neonlink | ✅ WebPPNGSVG | neonlink | -| netalertx | ✅ WebPPNGSVG | netalertx | -| netalertx-light | ✅ WebPPNGSVG | netalertx-light | -| netapp | ✅ WebPPNGSVG | netapp | -| netapp-light | ✅ WebPPNGSVG | netapp-light | -| netatmo | ✅ WebPPNGSVG | netatmo | -| netbird | ✅ WebPPNGSVG | netbird | -| netboot | ✅ WebPPNGSVG | netboot | -| netbox | ✅ WebPPNGSVG | netbox | -| netbox-dark | ✅ WebPPNGSVG | netbox-dark | -| netbox-full | ✅ WebPPNGSVG | netbox-full | -| netbox-full-dark | ✅ WebPPNGSVG | netbox-full-dark | -| netcam-studio | ✅ WebPPNG ❌ SVG | netcam-studio | -| netdata | ✅ WebPPNGSVG | netdata | -| netflix | ✅ WebPPNGSVG | netflix | -| netgear | ✅ WebPPNGSVG | netgear | -| netgear-light | ✅ WebPPNGSVG | netgear-light | -| netgear-orbi | ✅ WebPPNG ❌ SVG | netgear-orbi | -| netlify | ✅ WebPPNGSVG | netlify | -| netmaker | ✅ WebPPNG ❌ SVG | netmaker | -| netsurf | ✅ WebPPNGSVG | netsurf | -| netsurf-light | ✅ WebPPNGSVG | netsurf-light | -| network-ups-tools | ✅ WebPPNGSVG | network-ups-tools | -| network-weathermap | ✅ WebPPNG ❌ SVG | network-weathermap | -| newegg | ✅ WebPPNGSVG | newegg | -| newsblur | ✅ WebPPNGSVG | newsblur | -| nextcloud | ✅ WebPPNGSVG | nextcloud | -| nextcloud-blue | ✅ WebPPNGSVG | nextcloud-blue | -| nextcloud-calendar | ✅ WebPPNGSVG | nextcloud-calendar | -| nextcloud-contacts | ✅ WebPPNGSVG | nextcloud-contacts | -| nextcloud-cookbook | ✅ WebPPNGSVG | nextcloud-cookbook | -| nextcloud-cospend | ✅ WebPPNGSVG | nextcloud-cospend | -| nextcloud-deck | ✅ WebPPNGSVG | nextcloud-deck | -| nextcloud-files | ✅ WebPPNGSVG | nextcloud-files | -| nextcloud-ncdownloader | ✅ WebPPNGSVG | nextcloud-ncdownloader | -| nextcloud-news | ✅ WebPPNGSVG | nextcloud-news | -| nextcloud-notes | ✅ WebPPNGSVG | nextcloud-notes | -| nextcloud-photos | ✅ WebPPNGSVG | nextcloud-photos | -| nextcloud-social | ✅ WebPPNGSVG | nextcloud-social | -| nextcloud-tables | ✅ WebPPNGSVG | nextcloud-tables | -| nextcloud-talk | ✅ WebPPNG ❌ SVG | nextcloud-talk | -| nextcloud-tasks | ✅ WebPPNGSVG | nextcloud-tasks | -| nextcloud-timemanager | ✅ WebPPNGSVG | nextcloud-timemanager | -| nextcloud-white | ✅ WebPPNGSVG | nextcloud-white | -| nextcloudpi | ✅ WebPPNGSVG | nextcloudpi | -| nextdns | ✅ WebPPNGSVG | nextdns | -| nexterm | ✅ WebPPNGSVG | nexterm | -| nextjs | ✅ WebPPNGSVG | nextjs | -| nextjs-light | ✅ WebPPNGSVG | nextjs-light | -| nextpvr | ✅ WebPPNG ❌ SVG | nextpvr | -| nginx | ✅ WebPPNGSVG | nginx | -| nginx-proxy-manager | ✅ WebPPNGSVG | nginx-proxy-manager | -| nicotine-plus | ✅ WebPPNGSVG | nicotine-plus | -| nightscout | ✅ WebPPNGSVG | nightscout | -| nightscout-light | ✅ WebPPNGSVG | nightscout-light | -| nintendo-switch | ✅ WebPPNGSVG | nintendo-switch | -| nitter | ✅ WebPPNGSVG | nitter | -| nixos | ✅ WebPPNGSVG | nixos | -| no-ip | ✅ WebPPNG ❌ SVG | no-ip | -| nocobase | ✅ WebPPNG ❌ SVG | nocobase | -| nocobase-light | ✅ WebPPNG ❌ SVG | nocobase-light | -| nocodb | ✅ WebPPNGSVG | nocodb | -| node-red | ✅ WebPPNGSVG | node-red | -| nodebb | ✅ WebPPNGSVG | nodebb | -| nodejs | ✅ WebPPNGSVG | nodejs | -| nodejs-alt | ✅ WebPPNGSVG | nodejs-alt | -| nomad | ✅ WebPPNGSVG | nomad | -| nomie | ✅ WebPPNGSVG | nomie | -| nordvpn | ✅ WebPPNGSVG | nordvpn | -| note-mark | ✅ WebPPNGSVG | note-mark | -| notesnook | ✅ WebPPNGSVG | notesnook | -| notesnook-light | ✅ WebPPNGSVG | notesnook-light | -| notifiarr | ✅ WebPPNGSVG | notifiarr | -| notion | ✅ WebPPNGSVG | notion | -| notion-light | ✅ WebPPNGSVG | notion-light | -| nowshowing | ✅ WebPPNG ❌ SVG | nowshowing | -| ntfy | ✅ WebPPNGSVG | ntfy | -| ntop | ✅ WebPPNG ❌ SVG | ntop | -| ntopng | ✅ WebPPNG ❌ SVG | ntopng | -| nu-nl | ✅ WebPPNGSVG | nu-nl | -| nut | ✅ WebPPNGSVG | nut | -| nvidia | ✅ WebPPNGSVG | nvidia | -| nxfilter | ✅ WebPPNG ❌ SVG | nxfilter | -| nxlog | ✅ WebPPNG ❌ SVG | nxlog | -| nzbget | ✅ WebPPNGSVG | nzbget | -| nzbhydra | ✅ WebPPNG ❌ SVG | nzbhydra | -| nzbhydra2 | ✅ WebPPNGSVG | nzbhydra2 | -| nzbhydra2-light | ✅ WebPPNGSVG | nzbhydra2-light | -| oauth2-proxy | ✅ WebPPNGSVG | oauth2-proxy | -| obico | ✅ WebPPNGSVG | obico | -| obitalk | ✅ WebPPNG ❌ SVG | obitalk | -| observium | ✅ WebPPNG ❌ SVG | observium | -| observo-ai | ✅ WebPPNG ❌ SVG | observo-ai | -| obsidian | ✅ WebPPNGSVG | obsidian | -| obtainium | ✅ WebPPNGSVG | obtainium | -| octoeverywhere | ✅ WebPPNG ❌ SVG | octoeverywhere | -| octoprint | ✅ WebPPNGSVG | octoprint | -| ocular | ✅ WebPPNGSVG | ocular | -| oculus | ✅ WebPPNGSVG | oculus | -| oculus-light | ✅ WebPPNGSVG | oculus-light | -| odoo | ✅ WebPPNGSVG | odoo | -| odysee | ✅ WebPPNGSVG | odysee | -| odysee-full-dark | ✅ WebPPNGSVG | odysee-full-dark | -| odysee-full-light | ✅ WebPPNGSVG | odysee-full-light | -| office-365 | ✅ WebPPNGSVG | office-365 | -| olivetin | ✅ WebPPNGSVG | olivetin | -| olivetin-light | ✅ WebPPNGSVG | olivetin-light | -| ollama | ✅ WebPPNGSVG | ollama | -| omada | ✅ WebPPNGSVG | omada | -| ombi | ✅ WebPPNGSVG | ombi | -| omnidb | ✅ WebPPNGSVG | omnidb | -| omnivore | ✅ WebPPNGSVG | omnivore | -| onedev | ✅ WebPPNGSVG | onedev | -| onedev-light | ✅ WebPPNGSVG | onedev-light | -| oneuptime | ✅ WebPPNGSVG | oneuptime | -| oneuptime-light | ✅ WebPPNGSVG | oneuptime-light | -| onlyoffice | ✅ WebPPNGSVG | onlyoffice | -| open-resume | ✅ WebPPNGSVG | open-resume | -| open-source-initiative | ✅ WebPPNGSVG | open-source-initiative | -| open-webui | ✅ WebPPNGSVG | open-webui | -| open-webui-light | ✅ WebPPNGSVG | open-webui-light | -| openai | ✅ WebPPNGSVG | openai | -| openai-light | ✅ WebPPNGSVG | openai-light | -| openaudible | ✅ WebPPNG ❌ SVG | openaudible | -| openchangelog | ✅ WebPPNGSVG | openchangelog | -| openchangelog-light | ✅ WebPPNGSVG | openchangelog-light | -| openeats | ✅ WebPPNGSVG | openeats | -| openeats-light | ✅ WebPPNGSVG | openeats-light | -| openemr | ✅ WebPPNGSVG | openemr | -| openemr-light | ✅ WebPPNGSVG | openemr-light | -| opengarage | ✅ WebPPNG ❌ SVG | opengarage | -| opengist | ✅ WebPPNGSVG | opengist | -| opengist-light | ✅ WebPPNGSVG | opengist-light | -| openhab | ✅ WebPPNGSVG | openhab | -| openldap | ✅ WebPPNGSVG | openldap | -| openmaptiles | ✅ WebPPNG ❌ SVG | openmaptiles | -| openmediavault | ✅ WebPPNGSVG | openmediavault | -| openoffice | ✅ WebPPNGSVG | openoffice | -| openpanel | ✅ WebPPNGSVG | openpanel | -| openpanel-light | ✅ WebPPNGSVG | openpanel-light | -| openproject | ✅ WebPPNGSVG | openproject | -| openreads | ✅ WebPPNGSVG | openreads | -| opensearch | ✅ WebPPNGSVG | opensearch | -| openspeedtest | ✅ WebPPNGSVG | openspeedtest | -| opensprinkler | ✅ WebPPNG ❌ SVG | opensprinkler | -| openstack | ✅ WebPPNGSVG | openstack | -| openstreetmap | ✅ WebPPNGSVG | openstreetmap | -| opensuse | ✅ WebPPNGSVG | opensuse | -| opentalk | ✅ WebPPNGSVG | opentalk | -| opentofu | ✅ WebPPNGSVG | opentofu | -| openvas | ✅ WebPPNGSVG | openvas | -| openvpn | ✅ WebPPNGSVG | openvpn | -| openwrt | ✅ WebPPNGSVG | openwrt | -| openziti | ✅ WebPPNGSVG | openziti | -| opera | ✅ WebPPNGSVG | opera | -| opera-beta | ✅ WebPPNG ❌ SVG | opera-beta | -| opera-developer | ✅ WebPPNG ❌ SVG | opera-developer | -| opera-mini | ✅ WebPPNG ❌ SVG | opera-mini | -| opera-mini-beta | ✅ WebPPNG ❌ SVG | opera-mini-beta | -| opera-neon | ✅ WebPPNG ❌ SVG | opera-neon | -| opera-touch | ✅ WebPPNGSVG | opera-touch | -| opnform | ✅ WebPPNGSVG | opnform | -| opnsense | ✅ WebPPNGSVG | opnsense | -| oracle | ✅ WebPPNGSVG | oracle | -| oracle-cloud | ✅ WebPPNGSVG | oracle-cloud | -| orange | ✅ WebPPNGSVG | orange | -| orcaslicer | ✅ WebPPNG ❌ SVG | orcaslicer | -| organizr | ✅ WebPPNG ❌ SVG | organizr | -| origin | ✅ WebPPNGSVG | origin | -| oscarr | ✅ WebPPNGSVG | oscarr | -| oscarr-light | ✅ WebPPNGSVG | oscarr-light | -| osticket | ✅ WebPPNGSVG | osticket | -| outline | ✅ WebPPNGSVG | outline | -| outline-light | ✅ WebPPNGSVG | outline-light | -| overclockers | ✅ WebPPNG ❌ SVG | overclockers | -| overleaf | ✅ WebPPNGSVG | overleaf | -| overseerr | ✅ WebPPNGSVG | overseerr | -| ovh | ✅ WebPPNGSVG | ovh | -| ovirt | ✅ WebPPNGSVG | ovirt | -| ovirt-light | ✅ WebPPNGSVG | ovirt-light | -| owasp-zap | ✅ WebPPNG ❌ SVG | owasp-zap | -| owncast | ✅ WebPPNGSVG | owncast | -| owncloud | ✅ WebPPNGSVG | owncloud | -| ownphotos | ✅ WebPPNG ❌ SVG | ownphotos | -| ownphotos-light | ✅ WebPPNG ❌ SVG | ownphotos-light | -| owntone | ✅ WebPPNGSVG | owntone | -| owntracks | ✅ WebPPNGSVG | owntracks | -| oxker | ✅ WebPPNGSVG | oxker | -| oxker-light | ✅ WebPPNGSVG | oxker-light | -| p1ib | ✅ WebPPNGSVG | p1ib | -| packetfence | ✅ WebPPNGSVG | packetfence | -| packetfence-dark | ✅ WebPPNGSVG | packetfence-dark | -| packetfence-full | ✅ WebPPNGSVG | packetfence-full | -| packetfence-full-dark | ✅ WebPPNGSVG | packetfence-full-dark | -| pagerduty | ✅ WebPPNGSVG | pagerduty | -| pairdrop | ✅ WebPPNG ❌ SVG | pairdrop | -| palemoon | ✅ WebPPNGSVG | palemoon | -| palo-alto | ✅ WebPPNGSVG | palo-alto | -| paperless | ✅ WebPPNGSVG | paperless | -| paperless-ng | ✅ WebPPNGSVG | paperless-ng | -| paperless-ngx | ✅ WebPPNGSVG | paperless-ngx | -| papermark | ✅ WebPPNGSVG | papermark | -| papermark-light | ✅ WebPPNGSVG | papermark-light | -| papermerge | ✅ WebPPNGSVG | papermerge | -| papermerge-light | ✅ WebPPNGSVG | papermerge-light | -| parseable | ✅ WebPPNGSVG | parseable | -| part-db | ✅ WebPPNGSVG | part-db | -| part-db-light | ✅ WebPPNGSVG | part-db-light | -| partkeepr | ✅ WebPPNGSVG | partkeepr | -| passbolt | ✅ WebPPNGSVG | passbolt | -| passwordpusher | ✅ WebPPNG ❌ SVG | passwordpusher | -| passwordpusher-light | ✅ WebPPNG ❌ SVG | passwordpusher-light | -| passwork | ✅ WebPPNGSVG | passwork | -| pastatool | ✅ WebPPNG ❌ SVG | pastatool | -| pastatool-light | ✅ WebPPNG ❌ SVG | pastatool-light | -| pastebin | ✅ WebPPNGSVG | pastebin | -| pastebin-dark | ✅ WebPPNGSVG | pastebin-dark | -| pastey | ✅ WebPPNG ❌ SVG | pastey | -| patreon | ✅ WebPPNGSVG | patreon | -| patreon-light | ✅ WebPPNGSVG | patreon-light | -| payload | ✅ WebPPNGSVG | payload | -| payload-light | ✅ WebPPNGSVG | payload-light | -| paypal | ✅ WebPPNGSVG | paypal | -| pdfding | ✅ WebPPNGSVG | pdfding | -| pdfding-light | ✅ WebPPNGSVG | pdfding-light | -| peacock | ✅ WebPPNGSVG | peacock | -| peacock-light | ✅ WebPPNGSVG | peacock-light | -| peanut | ✅ WebPPNGSVG | peanut | -| peanut-light | ✅ WebPPNGSVG | peanut-light | -| peertube | ✅ WebPPNGSVG | peertube | -| pelican-panel | ✅ WebPPNGSVG | pelican-panel | -| penpot | ✅ WebPPNGSVG | penpot | -| penpot-light | ✅ WebPPNGSVG | penpot-light | -| peppermint | ✅ WebPPNGSVG | peppermint | -| pepperminty-wiki | ✅ WebPPNGSVG | pepperminty-wiki | -| perlite | ✅ WebPPNGSVG | perlite | -| perplexity-book-dark | ✅ WebPPNGSVG | perplexity-book-dark | -| perplexity-book-light | ✅ WebPPNGSVG | perplexity-book-light | -| perplexity-dark | ✅ WebPPNGSVG | perplexity-dark | -| perplexity-light | ✅ WebPPNGSVG | perplexity-light | -| petio | ✅ WebPPNG ❌ SVG | petio | -| pfsense | ✅ WebPPNGSVG | pfsense | -| pfsense-light | ✅ WebPPNGSVG | pfsense-light | -| pg-back-web | ✅ WebPPNGSVG | pg-back-web | -| pgadmin | ✅ WebPPNGSVG | pgadmin | -| pgbackweb-dark | ✅ WebPPNGSVG | pgbackweb-dark | -| pgbackweb-light | ✅ WebPPNGSVG | pgbackweb-light | -| phanpy | ✅ WebPPNGSVG | phanpy | -| phantombot | ✅ WebPPNG ❌ SVG | phantombot | -| phoneinfoga | ✅ WebPPNGSVG | phoneinfoga | -| phoneinfoga-light | ✅ WebPPNGSVG | phoneinfoga-light | -| phorge | ✅ WebPPNGSVG | phorge | -| phorge-light | ✅ WebPPNGSVG | phorge-light | -| phoscon | ✅ WebPPNGSVG | phoscon | -| phoscon-light | ✅ WebPPNGSVG | phoscon-light | -| photonix | ✅ WebPPNGSVG | photonix | -| photonix-light | ✅ WebPPNGSVG | photonix-light | -| photopea | ✅ WebPPNGSVG | photopea | -| photoprism | ✅ WebPPNGSVG | photoprism | -| photoprism-light | ✅ WebPPNGSVG | photoprism-light | -| photostructure | ✅ WebPPNGSVG | photostructure | -| photostructure-dark | ✅ WebPPNGSVG | photostructure-dark | -| photoview | ✅ WebPPNGSVG | photoview | -| php | ✅ WebPPNGSVG | php | -| php-light | ✅ WebPPNGSVG | php-light | -| phpipam | ✅ WebPPNG ❌ SVG | phpipam | -| phpldapadmin | ✅ WebPPNG ❌ SVG | phpldapadmin | -| phpmyadmin | ✅ WebPPNGSVG | phpmyadmin | -| pi-alert | ✅ WebPPNG ❌ SVG | pi-alert | -| pi-hole | ✅ WebPPNGSVG | pi-hole | -| pi-hole-unbound | ✅ WebPPNG ❌ SVG | pi-hole-unbound | -| pia | ✅ WebPPNGSVG | pia | -| piaware | ✅ WebPPNG ❌ SVG | piaware | -| picsur | ✅ WebPPNGSVG | picsur | -| picsur-light | ✅ WebPPNGSVG | picsur-light | -| pigallery2 | ✅ WebPPNGSVG | pigallery2 | -| pikapods | ✅ WebPPNGSVG | pikapods | -| pikvm | ✅ WebPPNGSVG | pikvm | -| pikvm-light | ✅ WebPPNGSVG | pikvm-light | -| pinchflat | ✅ WebPPNG ❌ SVG | pinchflat | -| pingdom | ✅ WebPPNGSVG | pingdom | -| pingdom-light | ✅ WebPPNGSVG | pingdom-light | -| pingvin | ✅ WebPPNGSVG | pingvin | -| pingvin-dark | ✅ WebPPNGSVG | pingvin-dark | -| pingvin-share | ✅ WebPPNGSVG | pingvin-share | -| pingvin-share-dark | ✅ WebPPNGSVG | pingvin-share-dark | -| pinkary | ✅ WebPPNGSVG | pinkary | -| pinry | ✅ WebPPNG ❌ SVG | pinry | -| pinterest | ✅ WebPPNGSVG | pinterest | -| pioneer | ✅ WebPPNGSVG | pioneer | -| pioneer-light | ✅ WebPPNGSVG | pioneer-light | -| piped | ✅ WebPPNGSVG | piped | -| pirate-proxy | ✅ WebPPNGSVG | pirate-proxy | -| pivpn | ✅ WebPPNG ❌ SVG | pivpn | -| piwigo | ✅ WebPPNGSVG | piwigo | -| pixelfed | ✅ WebPPNGSVG | pixelfed | -| plane | ✅ WebPPNGSVG | plane | -| planka | ✅ WebPPNGSVG | planka | -| planka-dark | ✅ WebPPNGSVG | planka-dark | -| plant-it | ✅ WebPPNG ❌ SVG | plant-it | -| plantuml | ✅ WebPPNGSVG | plantuml | -| plausible | ✅ WebPPNGSVG | plausible | -| playstation | ✅ WebPPNGSVG | playstation | -| pleroma | ✅ WebPPNGSVG | pleroma | -| plesk | ✅ WebPPNGSVG | plesk | -| plex | ✅ WebPPNGSVG | plex | -| plex-alt | ✅ WebPPNGSVG | plex-alt | -| plex-alt-light | ✅ WebPPNGSVG | plex-alt-light | -| plex-light | ✅ WebPPNGSVG | plex-light | -| plex-meta-manager | ✅ WebPPNG ❌ SVG | plex-meta-manager | -| plex-meta-manager-light | ✅ WebPPNG ❌ SVG | plex-meta-manager-light | -| plex-rewind | ✅ WebPPNGSVG | plex-rewind | -| plexdrive | ✅ WebPPNG ❌ SVG | plexdrive | -| plexrequests | ✅ WebPPNGSVG | plexrequests | -| plexrequests-light | ✅ WebPPNGSVG | plexrequests-light | -| plexripper | ✅ WebPPNG ❌ SVG | plexripper | -| plume | ✅ WebPPNGSVG | plume | -| pluralsight | ✅ WebPPNGSVG | pluralsight | -| pocket-casts | ✅ WebPPNGSVG | pocket-casts | -| pocket-casts-dark | ✅ WebPPNGSVG | pocket-casts-dark | -| pocket-id | ✅ WebPPNGSVG | pocket-id | -| pocket-id-light | ✅ WebPPNGSVG | pocket-id-light | -| pocketbase | ✅ WebPPNGSVG | pocketbase | -| pocketbase-dark | ✅ WebPPNGSVG | pocketbase-dark | -| podfetch | ✅ WebPPNGSVG | podfetch | -| podfetch-light | ✅ WebPPNGSVG | podfetch-light | -| podgrab | ✅ WebPPNG ❌ SVG | podgrab | -| podify | ✅ WebPPNGSVG | podify | -| podman | ✅ WebPPNGSVG | podman | -| podnapisi | ✅ WebPPNG ❌ SVG | podnapisi | -| policycontroller | ✅ WebPPNGSVG | policycontroller | -| poly | ✅ WebPPNGSVG | poly | -| polywork | ✅ WebPPNGSVG | polywork | -| porkbun | ✅ WebPPNG ❌ SVG | porkbun | -| portainer | ✅ WebPPNGSVG | portainer | -| portus | ✅ WebPPNGSVG | portus | -| postal | ✅ WebPPNGSVG | postal | -| poste | ✅ WebPPNGSVG | poste | -| postgres | ✅ WebPPNGSVG | postgres | -| postgresql | ✅ WebPPNGSVG | postgresql | -| posthog | ✅ WebPPNGSVG | posthog | -| posthog-light | ✅ WebPPNGSVG | posthog-light | -| postiz | ✅ WebPPNGSVG | postiz | -| postiz-dark | ✅ WebPPNGSVG | postiz-dark | -| powerbi | ✅ WebPPNGSVG | powerbi | -| powerdns | ✅ WebPPNGSVG | powerdns | -| powerpanel | ✅ WebPPNG ❌ SVG | powerpanel | -| premium-mobile | ✅ WebPPNG ❌ SVG | premium-mobile | -| premiumize | ✅ WebPPNGSVG | premiumize | -| prime-video | ✅ WebPPNGSVG | prime-video | -| prime-video-alt | ✅ WebPPNGSVG | prime-video-alt | -| prime-video-alt-dark | ✅ WebPPNGSVG | prime-video-alt-dark | -| prime-video-light | ✅ WebPPNGSVG | prime-video-light | -| printer | ✅ WebPPNGSVG | printer | -| pritunl | ✅ WebPPNGSVG | pritunl | -| privacyidea | ✅ WebPPNGSVG | privacyidea | -| private-internet-access | ✅ WebPPNGSVG | private-internet-access | -| privatebin | ✅ WebPPNGSVG | privatebin | -| profilarr | ✅ WebPPNGSVG | profilarr | -| projectsend | ✅ WebPPNGSVG | projectsend | -| prometheus | ✅ WebPPNGSVG | prometheus | -| proton-calendar | ✅ WebPPNGSVG | proton-calendar | -| proton-drive | ✅ WebPPNGSVG | proton-drive | -| proton-mail | ✅ WebPPNGSVG | proton-mail | -| proton-pass | ✅ WebPPNGSVG | proton-pass | -| proton-vpn | ✅ WebPPNGSVG | proton-vpn | -| proton-wallet | ✅ WebPPNGSVG | proton-wallet | -| prowlarr | ✅ WebPPNGSVG | prowlarr | -| proxmox | ✅ WebPPNGSVG | proxmox | -| proxmox-light | ✅ WebPPNGSVG | proxmox-light | -| prtg | ✅ WebPPNGSVG | prtg | -| prusa-research | ✅ WebPPNGSVG | prusa-research | -| psitransfer | ✅ WebPPNG ❌ SVG | psitransfer | -| pterodactyl | ✅ WebPPNGSVG | pterodactyl | -| pufferpanel | ✅ WebPPNGSVG | pufferpanel | -| purelymail | ✅ WebPPNGSVG | purelymail | -| pushfish | ✅ WebPPNGSVG | pushfish | -| pushover | ✅ WebPPNGSVG | pushover | -| putty | ✅ WebPPNGSVG | putty | -| pwndrop | ✅ WebPPNG ❌ SVG | pwndrop | -| pwndrop-light | ✅ WebPPNG ❌ SVG | pwndrop-light | -| pwpush | ✅ WebPPNG ❌ SVG | pwpush | -| pwpush-light | ✅ WebPPNG ❌ SVG | pwpush-light | -| pydio | ✅ WebPPNGSVG | pydio | -| pyload | ✅ WebPPNGSVG | pyload | -| python | ✅ WebPPNGSVG | python | -| qbittorrent | ✅ WebPPNGSVG | qbittorrent | -| qdirstat | ✅ WebPPNGSVG | qdirstat | -| qinglong | ✅ WebPPNGSVG | qinglong | -| qnap | ✅ WebPPNGSVG | qnap | -| quant-ux | ✅ WebPPNG ❌ SVG | quant-ux | -| questdb | ✅ WebPPNGSVG | questdb | -| quetre | ✅ WebPPNGSVG | quetre | -| quickshare | ✅ WebPPNGSVG | quickshare | -| quickwit | ✅ WebPPNGSVG | quickwit | -| qutebrowser | ✅ WebPPNGSVG | qutebrowser | -| r | ✅ WebPPNGSVG | r | -| rabbitmq | ✅ WebPPNGSVG | rabbitmq | -| racknerd | ✅ WebPPNG ❌ SVG | racknerd | -| racknerd-dark | ✅ WebPPNG ❌ SVG | racknerd-dark | -| radarr | ✅ WebPPNGSVG | radarr | -| radicale | ✅ WebPPNGSVG | radicale | -| rainloop | ✅ WebPPNGSVG | rainloop | -| rallly | ✅ WebPPNGSVG | rallly | -| rancher | ✅ WebPPNGSVG | rancher | -| raneto | ✅ WebPPNG ❌ SVG | raneto | -| raritan | ✅ WebPPNG ❌ SVG | raritan | -| raritan-light | ✅ WebPPNG ❌ SVG | raritan-light | -| raspberry-pi | ✅ WebPPNGSVG | raspberry-pi | -| raspberry-pi-light | ✅ WebPPNGSVG | raspberry-pi-light | -| raspberrymatic | ✅ WebPPNG ❌ SVG | raspberrymatic | -| rathole | ✅ WebPPNG ❌ SVG | rathole | -| rclone | ✅ WebPPNGSVG | rclone | -| rdt-client | ✅ WebPPNGSVG | rdt-client | -| reactive-resume | ✅ WebPPNGSVG | reactive-resume | -| reactive-resume-light | ✅ WebPPNGSVG | reactive-resume-light | -| readarr | ✅ WebPPNGSVG | readarr | -| readeck | ✅ WebPPNGSVG | readeck | -| readthedocs | ✅ WebPPNGSVG | readthedocs | -| readthedocs-light | ✅ WebPPNGSVG | readthedocs-light | -| real-debrid | ✅ WebPPNGSVG | real-debrid | -| realhosting | ✅ WebPPNG ❌ SVG | realhosting | -| recalbox | ✅ WebPPNGSVG | recalbox | -| receipt-wrangler | ✅ WebPPNGSVG | receipt-wrangler | -| recipesage | ✅ WebPPNGSVG | recipesage | -| recipya | ✅ WebPPNG ❌ SVG | recipya | -| reddit | ✅ WebPPNGSVG | reddit | -| redict | ✅ WebPPNGSVG | redict | -| redis | ✅ WebPPNGSVG | redis | -| redlib | ✅ WebPPNGSVG | redlib | -| redlib-light | ✅ WebPPNGSVG | redlib-light | -| rekor | ✅ WebPPNGSVG | rekor | -| remmina | ✅ WebPPNGSVG | remmina | -| remotely | ✅ WebPPNG ❌ SVG | remotely | -| renovate | ✅ WebPPNGSVG | renovate | -| reolink | ✅ WebPPNGSVG | reolink | -| reposilite | ✅ WebPPNG ❌ SVG | reposilite | -| reposilite-dark | ✅ WebPPNG ❌ SVG | reposilite-dark | -| requestly | ✅ WebPPNGSVG | requestly | -| requestrr | ✅ WebPPNGSVG | requestrr | -| resiliosync | ✅ WebPPNGSVG | resiliosync | -| resiliosync-full | ✅ WebPPNGSVG | resiliosync-full | -| resiliosync-full-dark | ✅ WebPPNGSVG | resiliosync-full-dark | -| restic | ✅ WebPPNG ❌ SVG | restic | -| restreamer | ✅ WebPPNGSVG | restreamer | -| retrom | ✅ WebPPNGSVG | retrom | -| revolt | ✅ WebPPNGSVG | revolt | -| revolt-light | ✅ WebPPNGSVG | revolt-light | -| rhasspy | ✅ WebPPNGSVG | rhasspy | -| rhasspy-dark | ✅ WebPPNGSVG | rhasspy-dark | -| rhodecode | ✅ WebPPNGSVG | rhodecode | -| richy | ✅ WebPPNGSVG | richy | -| rimgo | ✅ WebPPNGSVG | rimgo | -| rimgo-light | ✅ WebPPNGSVG | rimgo-light | -| riot | ✅ WebPPNGSVG | riot | -| riverside-fm | ✅ WebPPNGSVG | riverside-fm | -| riverside-fm-light | ✅ WebPPNGSVG | riverside-fm-light | -| rocket-chat | ✅ WebPPNGSVG | rocket-chat | -| rocky-linux | ✅ WebPPNGSVG | rocky-linux | -| romm | ✅ WebPPNGSVG | romm | -| rompya | ✅ WebPPNG ❌ SVG | rompya | -| rook | ✅ WebPPNGSVG | rook | -| roundcube | ✅ WebPPNGSVG | roundcube | -| router | ✅ WebPPNGSVG | router | -| rpi-monitor | ✅ WebPPNG ❌ SVG | rpi-monitor | -| rport | ✅ WebPPNGSVG | rport | -| rspamd | ✅ WebPPNG ❌ SVG | rspamd | -| rss-bridge | ✅ WebPPNGSVG | rss-bridge | -| rss-translator | ✅ WebPPNGSVG | rss-translator | -| rsshub | ✅ WebPPNG ❌ SVG | rsshub | -| rstudio | ✅ WebPPNGSVG | rstudio | -| rstudioserver | ✅ WebPPNGSVG | rstudioserver | -| ruby | ✅ WebPPNGSVG | ruby | -| rumble | ✅ WebPPNGSVG | rumble | -| rundeck | ✅ WebPPNGSVG | rundeck | -| runeaudio | ✅ WebPPNG ❌ SVG | runeaudio | -| runonflux | ✅ WebPPNGSVG | runonflux | -| runson | ✅ WebPPNGSVG | runson | -| runson-light | ✅ WebPPNGSVG | runson-light | -| rust | ✅ WebPPNGSVG | rust | -| rustdesk | ✅ WebPPNGSVG | rustdesk | -| rutorrent | ✅ WebPPNGSVG | rutorrent | -| ryot | ✅ WebPPNGSVG | ryot | -| ryot-light | ✅ WebPPNGSVG | ryot-light | -| sabnzbd | ✅ WebPPNGSVG | sabnzbd | -| sabnzbd-light | ✅ WebPPNGSVG | sabnzbd-light | -| safari | ✅ WebPPNGSVG | safari | -| safari-ios | ✅ WebPPNGSVG | safari-ios | -| sagemcom | ✅ WebPPNG ❌ SVG | sagemcom | -| salad | ✅ WebPPNG ❌ SVG | salad | -| saltcorn | ✅ WebPPNGSVG | saltcorn | -| samsung-internet | ✅ WebPPNGSVG | samsung-internet | -| sandstorm | ✅ WebPPNGSVG | sandstorm | -| scanservjs | ✅ WebPPNG ❌ SVG | scanservjs | -| schneider | ✅ WebPPNG ❌ SVG | schneider | -| scrcpy | ✅ WebPPNGSVG | scrcpy | -| screenconnect | ✅ WebPPNGSVG | screenconnect | -| scrutiny | ✅ WebPPNGSVG | scrutiny | -| scrutiny-light | ✅ WebPPNGSVG | scrutiny-light | -| scrypted | ✅ WebPPNG ❌ SVG | scrypted | -| seafile | ✅ WebPPNGSVG | seafile | -| searx | ✅ WebPPNGSVG | searx | -| searxng | ✅ WebPPNGSVG | searxng | -| secureai-tools | ✅ WebPPNGSVG | secureai-tools | -| secureai-tools-light | ✅ WebPPNGSVG | secureai-tools-light | -| seelf | ✅ WebPPNGSVG | seelf | -| self-hosted-gateway | ✅ WebPPNGSVG | self-hosted-gateway | -| selfh-st | ✅ WebPPNGSVG | selfh-st | -| selfh-st-light | ✅ WebPPNGSVG | selfh-st-light | -| selfhosted | ✅ WebPPNG ❌ SVG | selfhosted | -| selfhosted-light | ✅ WebPPNG ❌ SVG | selfhosted-light | -| semaphore | ✅ WebPPNGSVG | semaphore | -| semaphore-dark | ✅ WebPPNGSVG | semaphore-dark | -| send | ✅ WebPPNGSVG | send | -| sendgrid | ✅ WebPPNGSVG | sendgrid | -| sendinblue | ✅ WebPPNGSVG | sendinblue | -| sensu | ✅ WebPPNGSVG | sensu | -| sentry | ✅ WebPPNGSVG | sentry | -| sentry-light | ✅ WebPPNGSVG | sentry-light | -| seq | ✅ WebPPNG ❌ SVG | seq | -| serpbear | ✅ WebPPNG ❌ SVG | serpbear | -| servarr | ✅ WebPPNGSVG | servarr | -| servarr-light | ✅ WebPPNGSVG | servarr-light | -| serviio | ✅ WebPPNGSVG | serviio | -| serviio-light | ✅ WebPPNGSVG | serviio-light | -| session | ✅ WebPPNGSVG | session | -| sftpgo | ✅ WebPPNG ❌ SVG | sftpgo | -| shaarli | ✅ WebPPNGSVG | shaarli | -| shell | ✅ WebPPNGSVG | shell | -| shell-light | ✅ WebPPNGSVG | shell-light | -| shell-tips | ✅ WebPPNGSVG | shell-tips | -| shell-tips-light | ✅ WebPPNGSVG | shell-tips-light | -| shellhub | ✅ WebPPNGSVG | shellhub | -| shellngn | ✅ WebPPNGSVG | shellngn | -| shelly | ✅ WebPPNGSVG | shelly | -| shinobi | ✅ WebPPNG ❌ SVG | shinobi | -| shiori | ✅ WebPPNGSVG | shiori | -| shlink | ✅ WebPPNGSVG | shlink | -| shoko | ✅ WebPPNGSVG | shoko | -| shoko-server | ✅ WebPPNGSVG | shoko-server | -| shopify | ✅ WebPPNGSVG | shopify | -| sickbeard | ✅ WebPPNGSVG | sickbeard | -| sickchill | ✅ WebPPNG ❌ SVG | sickchill | -| sickgear | ✅ WebPPNG ❌ SVG | sickgear | -| signal | ✅ WebPPNGSVG | signal | -| sigstore | ✅ WebPPNGSVG | sigstore | -| silverbullet | ✅ WebPPNG ❌ SVG | silverbullet | -| simplelogin | ✅ WebPPNGSVG | simplelogin | -| simplex-chat | ✅ WebPPNGSVG | simplex-chat | -| sinusbot | ✅ WebPPNGSVG | sinusbot | -| siyuan | ✅ WebPPNGSVG | siyuan | -| skylink-fibernet | ✅ WebPPNG ❌ SVG | skylink-fibernet | -| skype | ✅ WebPPNGSVG | skype | -| slaanesh | ✅ WebPPNG ❌ SVG | slaanesh | -| slack | ✅ WebPPNGSVG | slack | -| slash | ✅ WebPPNGSVG | slash | -| slash-light | ✅ WebPPNGSVG | slash-light | -| slice | ✅ WebPPNGSVG | slice | -| slidev | ✅ WebPPNGSVG | slidev | -| slink | ✅ WebPPNG ❌ SVG | slink | -| slink-light | ✅ WebPPNG ❌ SVG | slink-light | -| slskd | ✅ WebPPNGSVG | slskd | -| smartfox | ✅ WebPPNGSVG | smartfox | -| smokeping | ✅ WebPPNG ❌ SVG | smokeping | -| snapcast | ✅ WebPPNGSVG | snapcast | -| snapchat | ✅ WebPPNGSVG | snapchat | -| snapchat-dark | ✅ WebPPNGSVG | snapchat-dark | -| snapdrop | ✅ WebPPNGSVG | snapdrop | -| snappymail | ✅ WebPPNGSVG | snappymail | -| snappymail-light | ✅ WebPPNGSVG | snappymail-light | -| snibox | ✅ WebPPNG ❌ SVG | snibox | -| snikket | ✅ WebPPNGSVG | snikket | -| snipe-it | ✅ WebPPNG ❌ SVG | snipe-it | -| snippetbox | ✅ WebPPNG ❌ SVG | snippetbox | -| socialhome | ✅ WebPPNGSVG | socialhome | -| sogo | ✅ WebPPNGSVG | sogo | -| solaar | ✅ WebPPNGSVG | solaar | -| solid-invoice | ✅ WebPPNG ❌ SVG | solid-invoice | -| solidtime | ✅ WebPPNGSVG | solidtime | -| solidtime-light | ✅ WebPPNGSVG | solidtime-light | -| sonarqube | ✅ WebPPNGSVG | sonarqube | -| sonarr | ✅ WebPPNGSVG | sonarr | -| sonarr-dark | ✅ WebPPNGSVG | sonarr-dark | -| sophos | ✅ WebPPNGSVG | sophos | -| sophos-dark | ✅ WebPPNGSVG | sophos-dark | -| soulseek | ✅ WebPPNG ❌ SVG | soulseek | -| sourcegraph | ✅ WebPPNGSVG | sourcegraph | -| spamassassin | ✅ WebPPNGSVG | spamassassin | -| spark | ✅ WebPPNGSVG | spark | -| sparkleshare | ✅ WebPPNGSVG | sparkleshare | -| specifically-clementines | ✅ WebPPNGSVG | specifically-clementines | -| specter-desktop | ✅ WebPPNG ❌ SVG | specter-desktop | -| speedtest-tracker | ✅ WebPPNG ❌ SVG | speedtest-tracker | -| sphinx | ✅ WebPPNGSVG | sphinx | -| sphinx-doc | ✅ WebPPNGSVG | sphinx-doc | -| sphinx-relay | ✅ WebPPNGSVG | sphinx-relay | -| spiderfoot | ✅ WebPPNG ❌ SVG | spiderfoot | -| spliit | ✅ WebPPNGSVG | spliit | -| splunk | ✅ WebPPNGSVG | splunk | -| spoolman | ✅ WebPPNGSVG | spoolman | -| spotify | ✅ WebPPNGSVG | spotify | -| spotnet | ✅ WebPPNG ❌ SVG | spotnet | -| sqlitebrowser | ✅ WebPPNGSVG | sqlitebrowser | -| squeezebox-server | ✅ WebPPNG ❌ SVG | squeezebox-server | -| squidex | ✅ WebPPNGSVG | squidex | -| squirrel-servers-manager | ✅ WebPPNGSVG | squirrel-servers-manager | -| sshwifty | ✅ WebPPNGSVG | sshwifty | -| stalwart | ✅ WebPPNGSVG | stalwart | -| stalwart-mail-server | ✅ WebPPNGSVG | stalwart-mail-server | -| standard-notes | ✅ WebPPNGSVG | standard-notes | -| startpage | ✅ WebPPNGSVG | startpage | -| stash | ✅ WebPPNGSVG | stash | -| statping | ✅ WebPPNG ❌ SVG | statping | -| statping-ng | ✅ WebPPNG ❌ SVG | statping-ng | -| stb-proxy | ✅ WebPPNGSVG | stb-proxy | -| steam | ✅ WebPPNGSVG | steam | -| step-ca | ✅ WebPPNGSVG | step-ca | -| stirling-pdf | ✅ WebPPNGSVG | stirling-pdf | -| storj | ✅ WebPPNGSVG | storj | -| storm | ✅ WebPPNGSVG | storm | -| stormkit | ✅ WebPPNGSVG | stormkit | -| strapi | ✅ WebPPNGSVG | strapi | -| streama | ✅ WebPPNG ❌ SVG | streama | -| stremio | ✅ WebPPNGSVG | stremio | -| stump | ✅ WebPPNGSVG | stump | -| stump-alt | ✅ WebPPNGSVG | stump-alt | -| subatic | ✅ WebPPNGSVG | subatic | -| substreamer | ✅ WebPPNG ❌ SVG | substreamer | -| sunshine | ✅ WebPPNGSVG | sunshine | -| supabase | ✅ WebPPNGSVG | supabase | -| supermicro | ✅ WebPPNGSVG | supermicro | -| surveymonkey | ✅ WebPPNGSVG | surveymonkey | -| suwayomi | ✅ WebPPNGSVG | suwayomi | -| suwayomi-light | ✅ WebPPNGSVG | suwayomi-light | -| swarmpit | ✅ WebPPNGSVG | swarmpit | -| swift | ✅ WebPPNGSVG | swift | -| swizzin | ✅ WebPPNG ❌ SVG | swizzin | -| syft | ✅ WebPPNG ❌ SVG | syft | -| symmetricom | ✅ WebPPNGSVG | symmetricom | -| symmetricom-light | ✅ WebPPNGSVG | symmetricom-light | -| sympa | ✅ WebPPNG ❌ SVG | sympa | -| synapse | ✅ WebPPNGSVG | synapse | -| synapse-light | ✅ WebPPNGSVG | synapse-light | -| syncany | ✅ WebPPNG ❌ SVG | syncany | -| synclounge | ✅ WebPPNG ❌ SVG | synclounge | -| synclounge-light | ✅ WebPPNG ❌ SVG | synclounge-light | -| syncthing | ✅ WebPPNGSVG | syncthing | -| syncthing-dark | ✅ WebPPNGSVG | syncthing-dark | -| synology | ✅ WebPPNGSVG | synology | -| synology-audio-station | ✅ WebPPNG ❌ SVG | synology-audio-station | -| synology-calendar | ✅ WebPPNG ❌ SVG | synology-calendar | -| synology-chat | ✅ WebPPNG ❌ SVG | synology-chat | -| synology-cloud-sync | ✅ WebPPNG ❌ SVG | synology-cloud-sync | -| synology-contacts | ✅ WebPPNG ❌ SVG | synology-contacts | -| synology-document-viewer | ✅ WebPPNG ❌ SVG | synology-document-viewer | -| synology-download-station | ✅ WebPPNG ❌ SVG | synology-download-station | -| synology-drive | ✅ WebPPNG ❌ SVG | synology-drive | -| synology-drive-server | ✅ WebPPNG ❌ SVG | synology-drive-server | -| synology-dsm | ✅ WebPPNGSVG | synology-dsm | -| synology-file-station | ✅ WebPPNG ❌ SVG | synology-file-station | -| synology-light | ✅ WebPPNGSVG | synology-light | -| synology-mail-plus | ✅ WebPPNG ❌ SVG | synology-mail-plus | -| synology-mail-station | ✅ WebPPNG ❌ SVG | synology-mail-station | -| synology-note-station | ✅ WebPPNG ❌ SVG | synology-note-station | -| synology-office | ✅ WebPPNG ❌ SVG | synology-office | -| synology-pdfviewer | ✅ WebPPNG ❌ SVG | synology-pdfviewer | -| synology-photo-station | ✅ WebPPNG ❌ SVG | synology-photo-station | -| synology-photos | ✅ WebPPNG ❌ SVG | synology-photos | -| synology-surveillance-station | ✅ WebPPNG ❌ SVG | synology-surveillance-station | -| synology-text-editor | ✅ WebPPNG ❌ SVG | synology-text-editor | -| synology-video-station | ✅ WebPPNG ❌ SVG | synology-video-station | -| synology-vmm | ✅ WebPPNG ❌ SVG | synology-vmm | -| synology-webstation | ✅ WebPPNG ❌ SVG | synology-webstation | -| sysreptor | ✅ WebPPNGSVG | sysreptor | -| tabula | ✅ WebPPNGSVG | tabula | -| tacticalrmm | ✅ WebPPNGSVG | tacticalrmm | -| taiga | ✅ WebPPNGSVG | taiga | -| tailscale | ✅ WebPPNGSVG | tailscale | -| tailscale-light | ✅ WebPPNGSVG | tailscale-light | -| talos | ✅ WebPPNGSVG | talos | -| tandoor-recipes | ✅ WebPPNGSVG | tandoor-recipes | -| tangerine-ui | ✅ WebPPNGSVG | tangerine-ui | -| tanoshi | ✅ WebPPNG ❌ SVG | tanoshi | -| tar1090 | ✅ WebPPNG ❌ SVG | tar1090 | -| taskcafe | ✅ WebPPNGSVG | taskcafe | -| tasmoadmin | ✅ WebPPNG ❌ SVG | tasmoadmin | -| tasmocompiler | ✅ WebPPNGSVG | tasmocompiler | -| tasmota | ✅ WebPPNGSVG | tasmota | -| tasmota-light | ✅ WebPPNGSVG | tasmota-light | -| tautulli | ✅ WebPPNGSVG | tautulli | -| tdarr | ✅ WebPPNG ❌ SVG | tdarr | -| team-viewer | ✅ WebPPNGSVG | team-viewer | -| teamcity | ✅ WebPPNGSVG | teamcity | -| teamcity-light | ✅ WebPPNGSVG | teamcity-light | -| teamspeak | ✅ WebPPNGSVG | teamspeak | -| technitium | ✅ WebPPNG ❌ SVG | technitium | -| teedy | ✅ WebPPNG ❌ SVG | teedy | -| telegraf | ✅ WebPPNGSVG | telegraf | -| telegram | ✅ WebPPNGSVG | telegram | -| telekom | ✅ WebPPNGSVG | telekom | -| teleport | ✅ WebPPNGSVG | teleport | -| tenda | ✅ WebPPNGSVG | tenda | -| terminal | ✅ WebPPNGSVG | terminal | -| terraform | ✅ WebPPNGSVG | terraform | -| teslamate | ✅ WebPPNGSVG | teslamate | -| teslamate-light | ✅ WebPPNGSVG | teslamate-light | -| thanos | ✅ WebPPNGSVG | thanos | -| the-pirate-bay | ✅ WebPPNGSVG | the-pirate-bay | -| the-proxy-bay | ✅ WebPPNGSVG | the-proxy-bay | -| theia | ✅ WebPPNGSVG | theia | -| theia-light | ✅ WebPPNGSVG | theia-light | -| thelounge | ✅ WebPPNGSVG | thelounge | -| themepark | ✅ WebPPNG ❌ SVG | themepark | -| theodinproject | ✅ WebPPNGSVG | theodinproject | -| thingsboard | ✅ WebPPNGSVG | thingsboard | -| threadfin | ✅ WebPPNGSVG | threadfin | -| threads | ✅ WebPPNGSVG | threads | -| threads-light | ✅ WebPPNGSVG | threads-light | -| thunderbird | ✅ WebPPNGSVG | thunderbird | -| thunderhub | ✅ WebPPNG ❌ SVG | thunderhub | -| thunderhub-light | ✅ WebPPNG ❌ SVG | thunderhub-light | -| tianji | ✅ WebPPNGSVG | tianji | -| tianji-light | ✅ WebPPNGSVG | tianji-light | -| tiddlywiki | ✅ WebPPNGSVG | tiddlywiki | -| tiddlywiki-light | ✅ WebPPNGSVG | tiddlywiki-light | -| tiktok | ✅ WebPPNGSVG | tiktok | -| tiktok-light | ✅ WebPPNGSVG | tiktok-light | -| timemachines | ✅ WebPPNG ❌ SVG | timemachines | -| timemachines-light | ✅ WebPPNG ❌ SVG | timemachines-light | -| timetagger | ✅ WebPPNGSVG | timetagger | -| timetagger-light | ✅ WebPPNGSVG | timetagger-light | -| tinypilot | ✅ WebPPNG ❌ SVG | tinypilot | -| tinytinyrss | ✅ WebPPNG ❌ SVG | tinytinyrss | -| tipi | ✅ WebPPNG ❌ SVG | tipi | -| tmdb | ✅ WebPPNGSVG | tmdb | -| todoist | ✅ WebPPNGSVG | todoist | -| todoist-dark | ✅ WebPPNGSVG | todoist-dark | -| tolgee | ✅ WebPPNGSVG | tolgee | -| tooljet | ✅ WebPPNGSVG | tooljet | -| tooljet-dark | ✅ WebPPNGSVG | tooljet-dark | -| tor | ✅ WebPPNG ❌ SVG | tor | -| torrserver | ✅ WebPPNG ❌ SVG | torrserver | -| touitomamout | ✅ WebPPNGSVG | touitomamout | -| tp-link | ✅ WebPPNGSVG | tp-link | -| tpdb | ✅ WebPPNGSVG | tpdb | -| traccar | ✅ WebPPNGSVG | traccar | -| traccar-dark | ✅ WebPPNGSVG | traccar-dark | -| traefik | ✅ WebPPNGSVG | traefik | -| traefik-proxy | ✅ WebPPNGSVG | traefik-proxy | -| traggo | ✅ WebPPNGSVG | traggo | -| trailarr | ✅ WebPPNGSVG | trailarr | -| trakt | ✅ WebPPNGSVG | trakt | -| transmission | ✅ WebPPNGSVG | transmission | -| trash-guides | ✅ WebPPNG ❌ SVG | trash-guides | -| trilium | ✅ WebPPNGSVG | trilium | -| triliumnext | ✅ WebPPNGSVG | triliumnext | -| trivy | ✅ WebPPNG ❌ SVG | trivy | -| trmnl | ✅ WebPPNGSVG | trmnl | -| troddit | ✅ WebPPNG ❌ SVG | troddit | -| trudesk | ✅ WebPPNG ❌ SVG | trudesk | -| truecommand | ✅ WebPPNGSVG | truecommand | -| truenas | ✅ WebPPNGSVG | truenas | -| truenas-core | ✅ WebPPNGSVG | truenas-core | -| truenas-enterprise | ✅ WebPPNG ❌ SVG | truenas-enterprise | -| truenas-scale | ✅ WebPPNGSVG | truenas-scale | -| tube-archivist | ✅ WebPPNG ❌ SVG | tube-archivist | -| tube-archivist-light | ✅ WebPPNG ❌ SVG | tube-archivist-light | -| tubesync | ✅ WebPPNGSVG | tubesync | -| tubesync-light | ✅ WebPPNGSVG | tubesync-light | -| tumblr | ✅ WebPPNGSVG | tumblr | -| turbopack | ✅ WebPPNGSVG | turbopack | -| turbopack-light | ✅ WebPPNGSVG | turbopack-light | -| tux | ✅ WebPPNGSVG | tux | -| tvdb | ✅ WebPPNGSVG | tvdb | -| tvheadend | ✅ WebPPNGSVG | tvheadend | -| tvp-vod | ✅ WebPPNG ❌ SVG | tvp-vod | -| tweakers | ✅ WebPPNGSVG | tweakers | -| twingate | ✅ WebPPNGSVG | twingate | -| twingate-light | ✅ WebPPNGSVG | twingate-light | -| twitch | ✅ WebPPNGSVG | twitch | -| twitter | ✅ WebPPNGSVG | twitter | -| typemill | ✅ WebPPNGSVG | typemill | -| typemill-light | ✅ WebPPNGSVG | typemill-light | -| typescript | ✅ WebPPNGSVG | typescript | -| typo3 | ✅ WebPPNGSVG | typo3 | -| ubiquiti | ✅ WebPPNGSVG | ubiquiti | -| ubiquiti-networks | ✅ WebPPNGSVG | ubiquiti-networks | -| ubiquiti-unifi | ✅ WebPPNGSVG | ubiquiti-unifi | -| ubooquity | ✅ WebPPNG ❌ SVG | ubooquity | -| ubuntu-linux | ✅ WebPPNGSVG | ubuntu-linux | -| ubuntu-linux-alt | ✅ WebPPNGSVG | ubuntu-linux-alt | -| uc-browser | ✅ WebPPNGSVG | uc-browser | -| udemy | ✅ WebPPNGSVG | udemy | -| udemy-light | ✅ WebPPNGSVG | udemy-light | -| ultimate-guitar | ✅ WebPPNGSVG | ultimate-guitar | -| ultimate-guitar-light | ✅ WebPPNGSVG | ultimate-guitar-light | -| umami | ✅ WebPPNGSVG | umami | -| umami-light | ✅ WebPPNGSVG | umami-light | -| umbrel | ✅ WebPPNGSVG | umbrel | -| unbound | ✅ WebPPNGSVG | unbound | -| uncomplicated-alert-receiver | ✅ WebPPNGSVG | uncomplicated-alert-receiver | -| undb | ✅ WebPPNGSVG | undb | -| unifi | ✅ WebPPNGSVG | unifi | -| unifi-controller | ✅ WebPPNG ❌ SVG | unifi-controller | -| unifi-dark | ✅ WebPPNGSVG | unifi-dark | -| unifi-protect | ✅ WebPPNG ❌ SVG | unifi-protect | -| unifi-voucher-site | ✅ WebPPNGSVG | unifi-voucher-site | -| unimus | ✅ WebPPNGSVG | unimus | -| universal-media-server | ✅ WebPPNG ❌ SVG | universal-media-server | -| unmanic | ✅ WebPPNG ❌ SVG | unmanic | -| unraid | ✅ WebPPNGSVG | unraid | -| untangle | ✅ WebPPNGSVG | untangle | -| updog | ✅ WebPPNG ❌ SVG | updog | -| ups | ✅ WebPPNGSVG | ups | -| upsnap | ✅ WebPPNGSVG | upsnap | -| uptime-kuma | ✅ WebPPNGSVG | uptime-kuma | -| upvote-rss | ✅ WebPPNGSVG | upvote-rss | -| urbackup | ✅ WebPPNG ❌ SVG | urbackup | -| urbackup-server | ✅ WebPPNG ❌ SVG | urbackup-server | -| valetudo | ✅ WebPPNGSVG | valetudo | -| valkey | ✅ WebPPNGSVG | valkey | -| vault | ✅ WebPPNGSVG | vault | -| vault-light | ✅ WebPPNGSVG | vault-light | -| vaultwarden | ✅ WebPPNGSVG | vaultwarden | -| vaultwarden-light | ✅ WebPPNGSVG | vaultwarden-light | -| vector | ✅ WebPPNGSVG | vector | -| veeam | ✅ WebPPNGSVG | veeam | -| vercel | ✅ WebPPNGSVG | vercel | -| vercel-light | ✅ WebPPNGSVG | vercel-light | -| verizon | ✅ WebPPNGSVG | verizon | -| vi | ✅ WebPPNGSVG | vi | -| victoriametrics | ✅ WebPPNGSVG | victoriametrics | -| victoriametrics-light | ✅ WebPPNGSVG | victoriametrics-light | -| vidzy | ✅ WebPPNGSVG | vidzy | -| viewtube | ✅ WebPPNGSVG | viewtube | -| vikunja | ✅ WebPPNGSVG | vikunja | -| virgin-media | ✅ WebPPNGSVG | virgin-media | -| virtualmin | ✅ WebPPNGSVG | virtualmin | -| virtualradarserver | ✅ WebPPNG ❌ SVG | virtualradarserver | -| viseron | ✅ WebPPNGSVG | viseron | -| viseron-light | ✅ WebPPNGSVG | viseron-light | -| visual-studio-code | ✅ WebPPNGSVG | visual-studio-code | -| vivaldi | ✅ WebPPNGSVG | vivaldi | -| vmware | ✅ WebPPNGSVG | vmware | -| vmware-esxi | ✅ WebPPNGSVG | vmware-esxi | -| vmware-horizon | ✅ WebPPNG ❌ SVG | vmware-horizon | -| vmware-vcenter | ✅ WebPPNG ❌ SVG | vmware-vcenter | -| vmware-workstation | ✅ WebPPNGSVG | vmware-workstation | -| vodafone | ✅ WebPPNGSVG | vodafone | -| voilib | ✅ WebPPNGSVG | voilib | -| voip-info | ✅ WebPPNG ❌ SVG | voip-info | -| voip-ms | ✅ WebPPNGSVG | voip-ms | -| voltaserve | ✅ WebPPNGSVG | voltaserve | -| voltaserve-light | ✅ WebPPNGSVG | voltaserve-light | -| volumio | ✅ WebPPNGSVG | volumio | -| volumio-light | ✅ WebPPNGSVG | volumio-light | -| voron | ✅ WebPPNGSVG | voron | -| vouchervault | ✅ WebPPNGSVG | vouchervault | -| vscode | ✅ WebPPNGSVG | vscode | -| vuetorrent | ✅ WebPPNGSVG | vuetorrent | -| vultr | ✅ WebPPNGSVG | vultr | -| vuplus | ✅ WebPPNG ❌ SVG | vuplus | -| wakapi | ✅ WebPPNGSVG | wakapi | -| wakatime | ✅ WebPPNGSVG | wakatime | -| wakatime-light | ✅ WebPPNGSVG | wakatime-light | -| wallabag | ✅ WebPPNGSVG | wallabag | -| wallabag-light | ✅ WebPPNGSVG | wallabag-light | -| wallos | ✅ WebPPNG ❌ SVG | wallos | -| wanderer | ✅ WebPPNGSVG | wanderer | -| wanderer-light | ✅ WebPPNGSVG | wanderer-light | -| wanikani | ✅ WebPPNG ❌ SVG | wanikani | -| ward | ✅ WebPPNG ❌ SVG | ward | -| warpgate | ✅ WebPPNGSVG | warpgate | -| watcharr | ✅ WebPPNGSVG | watcharr | -| watcharr-light | ✅ WebPPNGSVG | watcharr-light | -| watcher | ✅ WebPPNG ❌ SVG | watcher | -| watchtower | ✅ WebPPNGSVG | watchtower | -| watchyourlan | ✅ WebPPNG ❌ SVG | watchyourlan | -| watchyourports | ✅ WebPPNG ❌ SVG | watchyourports | -| waze | ✅ WebPPNGSVG | waze | -| wazuh | ✅ WebPPNGSVG | wazuh | -| wbo | ✅ WebPPNG ❌ SVG | wbo | -| wd-mycloud | ✅ WebPPNGSVG | wd-mycloud | -| web-check | ✅ WebPPNGSVG | web-check | -| web-check-dark | ✅ WebPPNGSVG | web-check-dark | -| web-whisper | ✅ WebPPNG ❌ SVG | web-whisper | -| webdav | ✅ WebPPNG ❌ SVG | webdav | -| webdb | ✅ WebPPNGSVG | webdb | -| webhook | ✅ WebPPNGSVG | webhook | -| webhookd | ✅ WebPPNGSVG | webhookd | -| webkit | ✅ WebPPNGSVG | webkit | -| webmin | ✅ WebPPNGSVG | webmin | -| webtools | ✅ WebPPNG ❌ SVG | webtools | -| webtop | ✅ WebPPNG ❌ SVG | webtop | -| webtorrent | ✅ WebPPNGSVG | webtorrent | -| webtrees | ✅ WebPPNGSVG | webtrees | -| wekan | ✅ WebPPNGSVG | wekan | -| western-digital | ✅ WebPPNGSVG | western-digital | -| wetty | ✅ WebPPNG ❌ SVG | wetty | -| wg-gen-web | ✅ WebPPNG ❌ SVG | wg-gen-web | -| wg-gen-web-light | ✅ WebPPNG ❌ SVG | wg-gen-web-light | -| wger | ✅ WebPPNGSVG | wger | -| whats-up-docker | ✅ WebPPNGSVG | whats-up-docker | -| whats-up-docker-light | ✅ WebPPNGSVG | whats-up-docker-light | -| whatsapp | ✅ WebPPNGSVG | whatsapp | -| whisparr | ✅ WebPPNGSVG | whisparr | -| whodb | ✅ WebPPNG ❌ SVG | whodb | -| whoogle | ✅ WebPPNG ❌ SVG | whoogle | -| wifiman | ✅ WebPPNG ❌ SVG | wifiman | -| wikidocs | ✅ WebPPNGSVG | wikidocs | -| wikijs | ✅ WebPPNGSVG | wikijs | -| wikijs-alt | ✅ WebPPNGSVG | wikijs-alt | -| wikipedia | ✅ WebPPNGSVG | wikipedia | -| wikipedia-light | ✅ WebPPNGSVG | wikipedia-light | -| willow | ✅ WebPPNGSVG | willow | -| windmill | ✅ WebPPNGSVG | windmill | -| windows-10 | ✅ WebPPNGSVG | windows-10 | -| windows-11 | ✅ WebPPNG ❌ SVG | windows-11 | -| windows-7 | ✅ WebPPNG ❌ SVG | windows-7 | -| windows-95 | ✅ WebPPNGSVG | windows-95 | -| windows-95-light | ✅ WebPPNGSVG | windows-95-light | -| windows-98 | ✅ WebPPNG ❌ SVG | windows-98 | -| windows-retro | ✅ WebPPNGSVG | windows-retro | -| windows-retro-light | ✅ WebPPNGSVG | windows-retro-light | -| windows-vista | ✅ WebPPNG ❌ SVG | windows-vista | -| windows-xp | ✅ WebPPNG ❌ SVG | windows-xp | -| wireguard | ✅ WebPPNGSVG | wireguard | -| wireshark | ✅ WebPPNG ❌ SVG | wireshark | -| wizarr | ✅ WebPPNGSVG | wizarr | -| wled | ✅ WebPPNG ❌ SVG | wled | -| wolfi | ✅ WebPPNGSVG | wolfi | -| wolfi-light | ✅ WebPPNGSVG | wolfi-light | -| woocommerce | ✅ WebPPNGSVG | woocommerce | -| woodpecker-ci | ✅ WebPPNGSVG | woodpecker-ci | -| wordpress | ✅ WebPPNGSVG | wordpress | -| workadventure | ✅ WebPPNG ❌ SVG | workadventure | -| worklenz | ✅ WebPPNGSVG | worklenz | -| wotdle | ✅ WebPPNGSVG | wotdle | -| wotdle-light | ✅ WebPPNGSVG | wotdle-light | -| wownero | ✅ WebPPNGSVG | wownero | -| writefreely | ✅ WebPPNGSVG | writefreely | -| writefreely-light | ✅ WebPPNGSVG | writefreely-light | -| x | ✅ WebPPNGSVG | x | -| x-light | ✅ WebPPNGSVG | x-light | -| xbackbone | ✅ WebPPNGSVG | xbackbone | -| xbox | ✅ WebPPNGSVG | xbox | -| xbox-game-pass | ✅ WebPPNGSVG | xbox-game-pass | -| xbrowsersync | ✅ WebPPNGSVG | xbrowsersync | -| xcp-ng | ✅ WebPPNGSVG | xcp-ng | -| xen-orchestra | ✅ WebPPNGSVG | xen-orchestra | -| xiaomi-global | ✅ WebPPNGSVG | xiaomi-global | -| xigmanas | ✅ WebPPNG ❌ SVG | xigmanas | -| xmr | ✅ WebPPNGSVG | xmr | -| xmrig | ✅ WebPPNGSVG | xmrig | -| xpipe | ✅ WebPPNGSVG | xpipe | -| xteve | ✅ WebPPNG ❌ SVG | xteve | -| xwiki | ✅ WebPPNGSVG | xwiki | -| yaade | ✅ WebPPNG ❌ SVG | yaade | -| yacd | ✅ WebPPNG ❌ SVG | yacd | -| yacd-blue | ✅ WebPPNGSVG | yacd-blue | -| yacht | ✅ WebPPNGSVG | yacht | -| yahoo | ✅ WebPPNGSVG | yahoo | -| yahoo-mail | ✅ WebPPNG ❌ SVG | yahoo-mail | -| yamtrack | ✅ WebPPNGSVG | yamtrack | -| yamtrack-light | ✅ WebPPNGSVG | yamtrack-light | -| yandex | ✅ WebPPNGSVG | yandex | -| yarn-social | ✅ WebPPNG ❌ SVG | yarn-social | -| yarr | ✅ WebPPNGSVG | yarr | -| yarr-light | ✅ WebPPNGSVG | yarr-light | -| ycombinator | ✅ WebPPNGSVG | ycombinator | -| ycombinator-dark | ✅ WebPPNGSVG | ycombinator-dark | -| ymarks | ✅ WebPPNG ❌ SVG | ymarks | -| ynab | ✅ WebPPNGSVG | ynab | -| your-spotify | ✅ WebPPNGSVG | your-spotify | -| yourls | ✅ WebPPNGSVG | yourls | -| youtube | ✅ WebPPNGSVG | youtube | -| youtube-dl | ✅ WebPPNGSVG | youtube-dl | -| youtube-kids | ✅ WebPPNGSVG | youtube-kids | -| youtube-music | ✅ WebPPNGSVG | youtube-music | -| yts | ✅ WebPPNGSVG | yts | -| yuno-host-light | ✅ WebPPNGSVG | yuno-host-light | -| yunohost | ✅ WebPPNGSVG | yunohost | -| z-wave-js-ui | ✅ WebPPNGSVG | z-wave-js-ui | -| zabbix | ✅ WebPPNGSVG | zabbix | -| zabka | ✅ WebPPNGSVG | zabka | -| zammad | ✅ WebPPNGSVG | zammad | -| zenarmor | ✅ WebPPNGSVG | zenarmor | -| zendesk | ✅ WebPPNGSVG | zendesk | -| zerotier | ✅ WebPPNGSVG | zerotier | -| zerotier-light | ✅ WebPPNGSVG | zerotier-light | -| zigbee2mqtt | ✅ WebPPNGSVG | zigbee2mqtt | -| zigbee2mqtt-light | ✅ WebPPNGSVG | zigbee2mqtt-light | -| zipcaptions | ✅ WebPPNGSVG | zipcaptions | -| zipline | ✅ WebPPNGSVG | zipline | -| zipline-light | ✅ WebPPNGSVG | zipline-light | -| zitadel | ✅ WebPPNGSVG | zitadel | -| zitadel-light | ✅ WebPPNGSVG | zitadel-light | -| znc | ✅ WebPPNG ❌ SVG | znc | -| zohomail | ✅ WebPPNGSVG | zohomail | -| zoneminder | ✅ WebPPNG ❌ SVG | zoneminder | -| zoom | ✅ WebPPNGSVG | zoom | -| zoom-alt | ✅ WebPPNGSVG | zoom-alt | -| zoraxy | ✅ WebPPNGSVG | zoraxy | -| zulip | ✅ WebPPNGSVG | zulip | -| zwavejs2mqtt | ✅ WebPPNG ❌ SVG | zwavejs2mqtt | -| zyxel-communications | ✅ WebPPNGSVG | zyxel-communications | -| zyxel-communications-light | ✅ WebPPNGSVG | zyxel-communications-light | -| zyxel-networks | ✅ WebPPNGSVG | zyxel-networks | -| zyxel-networks-light | ✅ WebPPNGSVG | zyxel-networks-light | - - \ No newline at end of file diff --git a/README.md b/README.md index 88556dbc..146c0dbe 100644 --- a/README.md +++ b/README.md @@ -1,116 +1,126 @@ -> [!WARNING] -> The repository has been migrated from `walkxcode` to `homarr-labs` as I no longer have the capacity to maintain it. The Homarr team will now handle management and maintenance, ensuring that functionality remains unchanged. The project will always be usable outside of Homarr and no breaking changes will be introduced. -> ― *Bjorn* -> -> The license and guidelines have been updated, so please review them. To help with maintenance, contact us at [homarr-labs@proton.me](mailto:homarr-labs@proton.me). +# Dashboard Icons -[![jsDelivr hits (GitHub)](https://img.shields.io/jsdelivr/gh/hy/homarr-labs/dashboard-icons?style=flat-square&color=%23A020F0)](https://www.jsdelivr.com/package/gh/homarr-labs/dashboard-icons) -[![jsDelivr hits (GitHub)](https://img.shields.io/jsdelivr/gh/hy/walkxcode/dashboard-icons?style=flat-square&color=%23A020F0)](https://www.jsdelivr.com/package/gh/walkxcode/dashboard-icons) +[![jsDelivr hits](https://img.shields.io/jsdelivr/gh/hy/walkxcode/dashboard-icons?style=flat-square&color=%23A020F0)](https://www.jsdelivr.com/package/gh/walkxcode/dashboard-icons) +[![jsDelivr hits](https://img.shields.io/jsdelivr/gh/hy/homarr-labs/dashboard-icons?style=flat-square&color=%23A020F0)](https://www.jsdelivr.com/package/gh/homarr-labs/dashboard-icons) +[![GitHub Stars](https://img.shields.io/github/stars/homarr-labs/dashboard-icons?style=flat-square&color=yellow)](https://github.com/homarr-labs/dashboard-icons/stargazers) +[![Contributors](https://img.shields.io/github/contributors/homarr-labs/dashboard-icons?style=flat-square&color=blue)](https://github.com/homarr-labs/dashboard-icons/graphs/contributors) -[https://icons.homarr.dev](https://icons.homarr.dev) +> **Your definitive source for dashboard icons.** -## Dashboard Icons +A collection of over 1800 curated icons for services, applications and tools, designed specifically for dashboards and app directories. -Your definitive source for dashboard icons. -[**View icons →**](https://icons.homarr.dev) +**[→ Browse the collection at dashboardicons.com](https://dashboardicons.com)** -## Table of Contents +## Why Dashboard Icons? -- [Dashboard Icons](#dashboard-icons) -- [Table of Contents](#table-of-contents) -- [Icon Requests](#icon-requests) -- [Supported Dashboards](#supported-dashboards) -- [Usage and Details](#usage-and-details) - - [Direct Links](#direct-links) - - [Base URL](#base-url) - - [Icon Name](#icon-name) - - [Formats](#formats) - - [Dark/Light Variants](#darklight-variants) - - [Downloading Icons](#downloading-icons) -- [Disclaimer](#disclaimer) +- **Comprehensive Collection**: 1800+ icons for all popular services and tools +- **Consistent Style**: Uniform visual language across different services +- **Multiple Formats**: Available in SVG, PNG, and WEBP to suit your needs +- **Light & Dark Variants**: Icons optimized for both light and dark themes +- **Community-Driven**: Easy process to request missing icons -## Icon Requests +

+ + + +

-If you’d like to add a new icon, please review our [Contribution Guidelines](CONTRIBUTING.md) and then submit a request using [our issue templates](https://github.com/homarr-labs/dashboard-icons/issues/new/choose). +## Using the Icons -## Supported Dashboards +### Website -Dashboard Icons integrate seamlessly with several popular dashboards, including: +Find and download icons at [dashboardicons.com](https://dashboardicons.com): + +1. Search for the icon you need +2. Click on an icon to view details +3. Choose your preferred format +4. Download or copy the direct link + +### Direct Links + +Use icons from CDN with this pattern: + +``` +//. +``` + +**Base URL options:** +- jsDelivr (recommended): `https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons` +- GitHub Direct: `https://raw.githubusercontent.com/homarr-labs/dashboard-icons/main` + +**Example:** +```html +Plex +``` + +### Technical Details + +- **Naming Convention**: Kebab-case (lowercase with hyphens) + - Example: "Nextcloud Calendar" → `nextcloud-calendar` + +- **Available Formats**: + - SVG: Vector format (original source) + - PNG: 512px height (auto-generated) + - WEBP: 512px height (auto-generated) + +- **Variants**: + - `-light` suffix for dark backgrounds (e.g., `github-light.svg`) + - `-dark` suffix for light backgrounds (e.g., `github-dark.svg`) + +- **Command Line**: + ```bash + # Download with curl + curl -O https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/nextcloud.svg + + # Download with wget + wget https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/nextcloud.svg + ``` + +## Dashboard Integration + +These icons integrate seamlessly with popular dashboard applications: - [Homarr](https://github.com/ajnart/homarr) - [Homepage](https://github.com/gethomepage/homepage) - [Dashy](https://github.com/Lissy93/dashy) -## Usage and Details +...and many others! -### Direct Links +## Contributing -You can use icons directly from GitHub or through the lightning-fast jsDelivr CDN. The structure of a direct link is as follows: +### Request Icons -``` -https:////. -``` +Need an icon that's not in our collection? -For example, the WEBP version of the Nextcloud Calendar icon is available at: +1. Check the [Contribution Guidelines](CONTRIBUTING.md) for specifications +2. Submit a request using our [issue templates](https://github.com/homarr-labs/dashboard-icons/issues/new/choose) +3. Provide service details and optionally upload the icon +4. Our team will review, optimize, and add it to the collection -``` -https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/webp/nextcloud-calendar.webp -``` +### Improve the Repository -#### Base URL +Want to help with the repository itself? -We recommend using jsDelivr: +- Review our [Contribution Guidelines](CONTRIBUTING.md) +- Fork the repository, make your changes, and submit a pull request +- We welcome help with documentation, website improvements, and maintenance -- `https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons` +## Support -Alternatively, you can reference the repository directly: +- **GitHub Issues**: Report bugs or request icons +- **Email**: [homarr-labs@proton.me](mailto:homarr-labs@proton.me) -- `https://raw.githubusercontent.com/homarr-labs/dashboard-icons/refs/heads/main` +## Legal -#### Icon Name +**Disclaimer**: All product names, trademarks, and registered trademarks are the property of their respective owners. Icons are used for identification purposes only and do not imply endorsement. -Icons follow kebab-case formatting (all lowercase words separated by hyphens). For example, "Nextcloud Calendar" becomes `nextcloud-calendar`. +**License**: This project is available under the terms of the [LICENSE](LICENSE) file. -#### Formats +--- -Icons are available in these formats: - -- SVG -- PNG -- WEBP - -*All icons are generated from the base SVG file. For more details, see the [Contribution Guidelines](CONTRIBUTING.md).* - -### Dark/Light Variants - -Some icons may have very light or dark colors, which might reduce visibility on certain backgrounds. In such cases, a `-light` or `-dark` suffix is appended—for instance, "2fauth" becomes `2fauth-light`. - -*More specifics are available in the [Contribution Guidelines](CONTRIBUTING.md).* - -### Downloading Icons - -1. **Browse & Download:** - Visit [https://icons.homarr.dev](https://icons.homarr.dev) to easily view and download icons. - -2. **Using the Browser:** - On the icons page ([ICONS.md](ICONS.md)), right-click any icon link and select "Save link as". - **Note:** Loading the icons page displays every icon in the repository, which may lead to high data usage, slow performance, or even browser crashes on less powerful devices. For faster access, use the direct links or download icons individually. - -3. **Using the Terminal:** - Download icons via `curl` or `wget` by using the following structure: - - ```bash - curl -O https:////. - ``` - - or - - ```bash - wget https:////. - ``` - -## Disclaimer - -Unless stated otherwise, all images and assets in this repository—including product names, trademarks, and registered trademarks—belong to their respective owners and are used solely for identification purposes. Their inclusion does not imply endorsement. - -For more details, please review the [LICENSE](LICENSE). If you have any questions or concerns, contact us at [homarr-labs@proton.me](mailto:homarr-labs@proton.me). +

+ Made with ♥ by the Homarr Labs team and contributors +

diff --git a/assets/preview.mp4 b/assets/preview.mp4 new file mode 100644 index 00000000..b020048d Binary files /dev/null and b/assets/preview.mp4 differ diff --git a/scripts/TEMPLATE.md b/scripts/TEMPLATE.md deleted file mode 100644 index cd93c76f..00000000 --- a/scripts/TEMPLATE.md +++ /dev/null @@ -1,11 +0,0 @@ -[![jsDelivr hits (GitHub)](https://img.shields.io/jsdelivr/gh/hy/homarr-labs/dashboard-icons?style=flat-square&color=%23A020F0)](https://www.jsdelivr.com/package/gh/homarr-labs/dashboard-icons) -[![jsDelivr hits (GitHub)](https://img.shields.io/jsdelivr/gh/hy/walkxcode/dashboard-icons?style=flat-square&color=%23A020F0)](https://www.jsdelivr.com/package/gh/walkxcode/dashboard-icons) - -## Dashboard Icons - -The best source for dashboard icons.
-[**← Back to repository**](https://github.com/homarr-labs/dashboard-icons/) - - - - \ No newline at end of file diff --git a/scripts/generate_icons_page.py b/scripts/generate_icons_page.py deleted file mode 100644 index e03bccec..00000000 --- a/scripts/generate_icons_page.py +++ /dev/null @@ -1,85 +0,0 @@ -import json -import pathlib -from pathlib import Path -import sys - -# Read the JSON file -def read_tree_json(file_path): - with open(file_path, 'r', encoding='UTF-8') as f: - return json.load(f) - -# Generate a table row with checkmarks for available formats and links -def generate_table_row(icon_name, formats): - # Prepare the checkmarks and links for each format if they exist - webp_check = '✅' if formats['webp'] else '❌' - png_check = '✅' if formats['png'] else '❌' - svg_check = '✅' if formats['svg'] else '❌' - - # Prepare the links for each format if they exist - webp_link = f'WebP' if formats['webp'] else 'WebP' - png_link = f'PNG' if formats['png'] else 'PNG' - svg_link = f'SVG' if formats['svg'] else 'SVG' - - # Combine checkmarks and links (or just name if not available) - webp_info = f'{webp_check} {webp_link}' if formats['webp'] else f'{webp_check} {webp_link}' - png_info = f'{png_check} {png_link}' if formats['png'] else f'{png_check} {png_link}' - svg_info = f'{svg_check} {svg_link}' if formats['svg'] else f'{svg_check} {svg_link}' - - # Generate preview using WebP - preview = f'{icon_name}' - - return f"| {icon_name} | {webp_info} {png_info} {svg_info} | {preview} |" - -if __name__ == "__main__": - # Define paths - root = pathlib.Path(__file__).parent.resolve() - tree_json_path = root.parent / "tree.json" - template_path = root / "TEMPLATE.md" - icons_md_path = root.parent / "ICONS.md" - - # Load the tree.json data - formats = read_tree_json(tree_json_path) - - # Create a dictionary to hold icons by their base name (ignoring file extensions) - icons_dict = {} - - # Check the formats and group icons by their base name - for ext, icons in formats.items(): - for icon in icons: - base_name = icon.rsplit('.', 1)[0] # Get base name (without extension) - if base_name not in icons_dict: - icons_dict[base_name] = {'webp': False, 'png': False, 'svg': False} - icons_dict[base_name][ext] = True - - # Create table for all icons (unique names) - table_rows = [] - - for icon_name in sorted(icons_dict.keys()): - table_row = generate_table_row(icon_name, icons_dict[icon_name]) - table_rows.append(table_row) - - # Prepare the table with header and rows - table_header = "| Name | Links | Preview |" - table_separator = "|------|-------|---------|" - table_content = "\n".join(table_rows) - table = f"{table_header}\n{table_separator}\n{table_content}" - - # Read the template file - with open(template_path, "r", encoding="UTF-8") as f: - template = f.read() - - # Find the line that starts with "" - try: - line_number = template.index("") - except ValueError: - print(" placeholder not found in TEMPLATE.md") - sys.exit(1) - - # Insert the table after the placeholder - updated_template = template[:line_number] + "\n" + table + template[line_number + len(""):] - - # Write the new ICONS.md file - with open(icons_md_path, "w", encoding="UTF-8") as f: - f.write(updated_template) - - print("ICONS.md has been successfully generated.") \ No newline at end of file diff --git a/web/biome.json b/web/biome.json index 1dbf24a0..6738ae2b 100644 --- a/web/biome.json +++ b/web/biome.json @@ -19,7 +19,10 @@ "linter": { "enabled": true, "rules": { - "recommended": true + "recommended": true, + "suspicious": { + "noArrayIndexKey": "off" + } } }, "javascript": { diff --git a/web/package.json b/web/package.json index 5f7cc94b..0c33be2d 100644 --- a/web/package.json +++ b/web/package.json @@ -5,7 +5,7 @@ "scripts": { "dev": "next dev --turbopack", "build": "next build", - "start": "next start", + "start": "pnpx serve@latest out", "format": "biome check --write", "lint": "biome lint --write", "ci": "biome check --write" @@ -39,15 +39,16 @@ "@radix-ui/react-toggle-group": "^1.1.3", "@radix-ui/react-tooltip": "^1.2.0", "@tanstack/react-virtual": "^3.13.6", + "canvas-confetti": "^1.9.3", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "^1.1.1", "date-fns": "^4.1.0", "embla-carousel-react": "^8.6.0", - "framer-motion": "^12.6.5", + "framer-motion": "^12.7.3", "input-otp": "^1.4.2", "lucide-react": "^0.487.0", - "motion": "^12.6.5", + "motion": "^12.7.3", "next": "15.3.0", "next-themes": "^0.4.6", "posthog-js": "^1.235.6", @@ -60,6 +61,7 @@ "recharts": "^2.15.2", "sonner": "^2.0.3", "tailwind-merge": "^3.2.0", + "tailwindcss-motion": "^1.1.0", "tw-animate-css": "^1.2.5", "vaul": "^1.1.2", "zod": "^3.24.2" @@ -67,14 +69,22 @@ "devDependencies": { "@biomejs/biome": "1.9.4", "@tailwindcss/postcss": "^4.1.3", + "@types/canvas-confetti": "^1.9.0", "@types/node": "^22.14.0", "@types/react": "^19.1.0", "@types/react-dom": "^19.1.2", "tailwindcss": "^4.1.3", - "typescript": "^5.8.3" + "typescript": "^5.8.3", + "wrangler": "^4.12.0" }, "packageManager": "pnpm@10.8.0", "pnpm": { - "onlyBuiltDependencies": ["@biomejs/biome", "sharp"] + "onlyBuiltDependencies": [ + "@biomejs/biome", + "core-js", + "esbuild", + "sharp", + "workerd" + ] } } diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index 0e56acf6..f08ff07a 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -92,6 +92,9 @@ importers: '@tanstack/react-virtual': specifier: ^3.13.6 version: 3.13.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + canvas-confetti: + specifier: ^1.9.3 + version: 1.9.3 class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -108,8 +111,8 @@ importers: specifier: ^8.6.0 version: 8.6.0(react@19.1.0) framer-motion: - specifier: ^12.6.5 - version: 12.6.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + specifier: ^12.7.3 + version: 12.7.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) input-otp: specifier: ^1.4.2 version: 1.4.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -117,8 +120,8 @@ importers: specifier: ^0.487.0 version: 0.487.0(react@19.1.0) motion: - specifier: ^12.6.5 - version: 12.6.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + specifier: ^12.7.3 + version: 12.7.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) next: specifier: 15.3.0 version: 15.3.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -155,6 +158,9 @@ importers: tailwind-merge: specifier: ^3.2.0 version: 3.2.0 + tailwindcss-motion: + specifier: ^1.1.0 + version: 1.1.0(tailwindcss@4.1.3) tw-animate-css: specifier: ^1.2.5 version: 1.2.5 @@ -171,6 +177,9 @@ importers: '@tailwindcss/postcss': specifier: ^4.1.3 version: 4.1.3 + '@types/canvas-confetti': + specifier: ^1.9.0 + version: 1.9.0 '@types/node': specifier: ^22.14.0 version: 22.14.0 @@ -186,6 +195,9 @@ importers: typescript: specifier: ^5.8.3 version: 5.8.3 + wrangler: + specifier: ^4.12.0 + version: 4.12.0 packages: @@ -250,9 +262,210 @@ packages: cpu: [x64] os: [win32] + '@cloudflare/kv-asset-handler@0.4.0': + resolution: {integrity: sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==} + engines: {node: '>=18.0.0'} + + '@cloudflare/unenv-preset@2.3.1': + resolution: {integrity: sha512-Xq57Qd+ADpt6hibcVBO0uLG9zzRgyRhfCUgBT9s+g3+3Ivg5zDyVgLFy40ES1VdNcu8rPNSivm9A+kGP5IVaPg==} + peerDependencies: + unenv: 2.0.0-rc.15 + workerd: ^1.20250320.0 + peerDependenciesMeta: + workerd: + optional: true + + '@cloudflare/workerd-darwin-64@1.20250416.0': + resolution: {integrity: sha512-aZgF8Swp9eVYxJPWOoZbAgAaYjWuYqGmEA+QJ2ecRGDBqm87rT4GEw7/mmLpxrpllny3VfEEhkk9iYCGv8nlFw==} + engines: {node: '>=16'} + cpu: [x64] + os: [darwin] + + '@cloudflare/workerd-darwin-arm64@1.20250416.0': + resolution: {integrity: sha512-FhswG1QYRfaTZ4FAlUkfVWaoM2lrlqumiBTrhbo9czMJdGR/oBXS4SGynuI6zyhApHeBf3/fZpA/SBAe4cXdgg==} + engines: {node: '>=16'} + cpu: [arm64] + os: [darwin] + + '@cloudflare/workerd-linux-64@1.20250416.0': + resolution: {integrity: sha512-G+nXEAJ/9y+A857XShwxKeRdfxok6UcjiQe6G+wQeCn/Ofkp/EWydacKdyeVU6QIm1oHS78DwJ7AzbCYywf9aw==} + engines: {node: '>=16'} + cpu: [x64] + os: [linux] + + '@cloudflare/workerd-linux-arm64@1.20250416.0': + resolution: {integrity: sha512-U6oVW0d9w1fpnDYNrjPJ9SFkDlGJWJWbXHlTBObXl6vccP16WewvuxyHkKqyUhUc8hyBaph7sxeKzKmuCFQ4SA==} + engines: {node: '>=16'} + cpu: [arm64] + os: [linux] + + '@cloudflare/workerd-windows-64@1.20250416.0': + resolution: {integrity: sha512-YAjjTzL1z9YYeN4sqYfj1dtQXd2Bblj+B+hl4Rz2aOhblpZEZAdhapZlOCRvLLkOJshKJUnRD3mDlytAdgwybQ==} + engines: {node: '>=16'} + cpu: [x64] + os: [win32] + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + '@emnapi/runtime@1.4.0': resolution: {integrity: sha512-64WYIf4UYcdLnbKn/umDlNjQDSS8AgZrI/R9+x5ilkUVFxXcA1Ebl+gQLc/6mERA4407Xof0R7wEyEuj091CVw==} + '@esbuild/aix-ppc64@0.25.2': + resolution: {integrity: sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.2': + resolution: {integrity: sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.2': + resolution: {integrity: sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.2': + resolution: {integrity: sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.2': + resolution: {integrity: sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.2': + resolution: {integrity: sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.2': + resolution: {integrity: sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.2': + resolution: {integrity: sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.2': + resolution: {integrity: sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.2': + resolution: {integrity: sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.2': + resolution: {integrity: sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.2': + resolution: {integrity: sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.2': + resolution: {integrity: sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.2': + resolution: {integrity: sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.2': + resolution: {integrity: sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.2': + resolution: {integrity: sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.2': + resolution: {integrity: sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.2': + resolution: {integrity: sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.2': + resolution: {integrity: sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.2': + resolution: {integrity: sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.2': + resolution: {integrity: sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.25.2': + resolution: {integrity: sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.2': + resolution: {integrity: sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.2': + resolution: {integrity: sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.2': + resolution: {integrity: sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@fastify/busboy@2.1.1': + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + engines: {node: '>=14'} + '@floating-ui/core@1.6.9': resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} @@ -273,33 +486,65 @@ packages: peerDependencies: react-hook-form: ^7.55.0 + '@img/sharp-darwin-arm64@0.33.5': + resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + '@img/sharp-darwin-arm64@0.34.1': resolution: {integrity: sha512-pn44xgBtgpEbZsu+lWf2KNb6OAf70X68k+yk69Ic2Xz11zHR/w24/U49XT7AeRwJ0Px+mhALhU5LPci1Aymk7A==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] + '@img/sharp-darwin-x64@0.33.5': + resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + '@img/sharp-darwin-x64@0.34.1': resolution: {integrity: sha512-VfuYgG2r8BpYiOUN+BfYeFo69nP/MIwAtSJ7/Zpxc5QF3KS22z8Pvg3FkrSFJBPNQ7mmcUcYQFBmEQp7eu1F8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] + '@img/sharp-libvips-darwin-arm64@1.0.4': + resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} + cpu: [arm64] + os: [darwin] + '@img/sharp-libvips-darwin-arm64@1.1.0': resolution: {integrity: sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==} cpu: [arm64] os: [darwin] + '@img/sharp-libvips-darwin-x64@1.0.4': + resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} + cpu: [x64] + os: [darwin] + '@img/sharp-libvips-darwin-x64@1.1.0': resolution: {integrity: sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==} cpu: [x64] os: [darwin] + '@img/sharp-libvips-linux-arm64@1.0.4': + resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} + cpu: [arm64] + os: [linux] + '@img/sharp-libvips-linux-arm64@1.1.0': resolution: {integrity: sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==} cpu: [arm64] os: [linux] + '@img/sharp-libvips-linux-arm@1.0.5': + resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} + cpu: [arm] + os: [linux] + '@img/sharp-libvips-linux-arm@1.1.0': resolution: {integrity: sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==} cpu: [arm] @@ -310,79 +555,162 @@ packages: cpu: [ppc64] os: [linux] + '@img/sharp-libvips-linux-s390x@1.0.4': + resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} + cpu: [s390x] + os: [linux] + '@img/sharp-libvips-linux-s390x@1.1.0': resolution: {integrity: sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==} cpu: [s390x] os: [linux] + '@img/sharp-libvips-linux-x64@1.0.4': + resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} + cpu: [x64] + os: [linux] + '@img/sharp-libvips-linux-x64@1.1.0': resolution: {integrity: sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==} cpu: [x64] os: [linux] + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} + cpu: [arm64] + os: [linux] + '@img/sharp-libvips-linuxmusl-arm64@1.1.0': resolution: {integrity: sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==} cpu: [arm64] os: [linux] + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} + cpu: [x64] + os: [linux] + '@img/sharp-libvips-linuxmusl-x64@1.1.0': resolution: {integrity: sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==} cpu: [x64] os: [linux] + '@img/sharp-linux-arm64@0.33.5': + resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + '@img/sharp-linux-arm64@0.34.1': resolution: {integrity: sha512-kX2c+vbvaXC6vly1RDf/IWNXxrlxLNpBVWkdpRq5Ka7OOKj6nr66etKy2IENf6FtOgklkg9ZdGpEu9kwdlcwOQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + '@img/sharp-linux-arm@0.33.5': + resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + '@img/sharp-linux-arm@0.34.1': resolution: {integrity: sha512-anKiszvACti2sGy9CirTlNyk7BjjZPiML1jt2ZkTdcvpLU1YH6CXwRAZCA2UmRXnhiIftXQ7+Oh62Ji25W72jA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] + '@img/sharp-linux-s390x@0.33.5': + resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + '@img/sharp-linux-s390x@0.34.1': resolution: {integrity: sha512-7s0KX2tI9mZI2buRipKIw2X1ufdTeaRgwmRabt5bi9chYfhur+/C1OXg3TKg/eag1W+6CCWLVmSauV1owmRPxA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] + '@img/sharp-linux-x64@0.33.5': + resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + '@img/sharp-linux-x64@0.34.1': resolution: {integrity: sha512-wExv7SH9nmoBW3Wr2gvQopX1k8q2g5V5Iag8Zk6AVENsjwd+3adjwxtp3Dcu2QhOXr8W9NusBU6XcQUohBZ5MA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + '@img/sharp-linuxmusl-arm64@0.33.5': + resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + '@img/sharp-linuxmusl-arm64@0.34.1': resolution: {integrity: sha512-DfvyxzHxw4WGdPiTF0SOHnm11Xv4aQexvqhRDAoD00MzHekAj9a/jADXeXYCDFH/DzYruwHbXU7uz+H+nWmSOQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + '@img/sharp-linuxmusl-x64@0.33.5': + resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + '@img/sharp-linuxmusl-x64@0.34.1': resolution: {integrity: sha512-pax/kTR407vNb9qaSIiWVnQplPcGU8LRIJpDT5o8PdAx5aAA7AS3X9PS8Isw1/WfqgQorPotjrZL3Pqh6C5EBg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + '@img/sharp-wasm32@0.33.5': + resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + '@img/sharp-wasm32@0.34.1': resolution: {integrity: sha512-YDybQnYrLQfEpzGOQe7OKcyLUCML4YOXl428gOOzBgN6Gw0rv8dpsJ7PqTHxBnXnwXr8S1mYFSLSa727tpz0xg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] + '@img/sharp-win32-ia32@0.33.5': + resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + '@img/sharp-win32-ia32@0.34.1': resolution: {integrity: sha512-WKf/NAZITnonBf3U1LfdjoMgNO5JYRSlhovhRhMxXVdvWYveM4kM3L8m35onYIdh75cOMCo1BexgVQcCDzyoWw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] + '@img/sharp-win32-x64@0.33.5': + resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + '@img/sharp-win32-x64@0.34.1': resolution: {integrity: sha512-hw1iIAHpNE8q3uMIRCgGOeDoz9KtFNarFLQclLxr/LK1VBkj8nby18RjFvr6aP7USRYAjTZW6yisnBWMX571Tw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@next/env@15.3.0': resolution: {integrity: sha512-6mDmHX24nWlHOlbwUiAOmMyY7KELimmi+ed8qWcJYjqXeC+G6JzPZ3QosOAfjNwgMIzwhXBiRiCgdh8axTTdTA==} @@ -1122,6 +1450,9 @@ packages: '@tanstack/virtual-core@3.13.6': resolution: {integrity: sha512-cnQUeWnhNP8tJ4WsGcYiX24Gjkc9ALstLbHcBj1t3E7EimN6n6kHH+DPV4PpDnuw00NApQp+ViojMj1GRdwYQg==} + '@types/canvas-confetti@1.9.0': + resolution: {integrity: sha512-aBGj/dULrimR1XDZLtG9JwxX1b4HPRF6CX9Yfwh3NvstZEm1ZL7RBnel4keCPSqs1ANRu1u2Aoz9R+VmtjYuTg==} + '@types/d3-array@3.2.1': resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} @@ -1160,16 +1491,31 @@ packages: '@types/react@19.1.0': resolution: {integrity: sha512-UaicktuQI+9UKyA4njtDOGBD/67t8YEBt2xdfqu8+gP9hqPUPsiXlNPcpS2gVdjmis5GKPG3fCxbQLVgxsQZ8w==} + acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + aria-hidden@1.2.4: resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} engines: {node: '>=10'} + as-table@1.0.55: + resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} + asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} axios@1.8.4: resolution: {integrity: sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==} + blake3-wasm@2.1.5: + resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} + busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} @@ -1181,6 +1527,9 @@ packages: caniuse-lite@1.0.30001713: resolution: {integrity: sha512-wCIWIg+A4Xr7NfhTuHdX+/FKh3+Op3LBbSp2N5Pfx6T/LhdQy3GTyoTg48BReaW/MyMNZAkTadsBtai3ldWK0Q==} + canvas-confetti@1.9.3: + resolution: {integrity: sha512-rFfTURMvmVEX1gyXFgn5QMn81bYk70qa0HLzcIOSVEyl57n6o9ItHeBtUSWdvKAPY0xlvBHno4/v3QPrT83q9g==} + class-variance-authority@0.7.1: resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} @@ -1215,6 +1564,10 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + core-js@3.41.0: resolution: {integrity: sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA==} @@ -1265,12 +1618,18 @@ packages: resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} engines: {node: '>=12'} + data-uri-to-buffer@2.0.2: + resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==} + date-fns@4.1.0: resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} decimal.js-light@2.5.1: resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -1322,9 +1681,21 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} + esbuild@0.25.2: + resolution: {integrity: sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==} + engines: {node: '>=18'} + hasBin: true + eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + exit-hook@2.2.1: + resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} + engines: {node: '>=6'} + + exsolve@1.0.5: + resolution: {integrity: sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg==} + fast-equals@5.2.2: resolution: {integrity: sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==} engines: {node: '>=6.0.0'} @@ -1345,8 +1716,8 @@ packages: resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} engines: {node: '>= 6'} - framer-motion@12.6.5: - resolution: {integrity: sha512-MKvnWov0paNjvRJuIy6x418w23tFqRfS6CXHhZrCiSEpXVlo/F+usr8v4/3G6O0u7CpsaO1qop+v4Ip7PRCBqQ==} + framer-motion@12.7.3: + resolution: {integrity: sha512-dNT4l5gEnUo2ytXLUBUf6AI21dZ77TMclDKE3ElaIHZ8m90nJ/NCcExW51zdSIaS0RhAS5iXcF7bEIxZe8XG2g==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 @@ -1359,6 +1730,11 @@ packages: react-dom: optional: true + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} @@ -1374,6 +1750,12 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} + get-source@2.0.12: + resolution: {integrity: sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==} + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -1501,14 +1883,24 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} - motion-dom@12.6.5: - resolution: {integrity: sha512-jpM9TQLXzYMWMJ7Ec7sAj0iis8oIuu6WvjI3yNKJLdrZyrsI/b2cRInDVL8dCl683zQQq19DpL9cSMP+k8T1NA==} + mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true - motion-utils@12.6.5: - resolution: {integrity: sha512-IsOeKsOF+FWBhxQEDFBO6ZYC8/jlidmVbbLpe9/lXSA9j9kzGIMUuIBx2SZY+0reAS0DjZZ1i7dJp4NHrjocPw==} + miniflare@4.20250416.0: + resolution: {integrity: sha512-261PhPgD9zs5/BTdbWqwiaXtWxb+Av5zKCwTU+HXrA5E4tf3qnULwh3u6SVUOAEArEroFuKJzawsQ9COtNBurQ==} + engines: {node: '>=18.0.0'} + hasBin: true - motion@12.6.5: - resolution: {integrity: sha512-X3IIy76nxyk4I87xQEm5Ah8ojQ4qisd+/H592eXF14ha+xqpbDJcWOSf9PEKCOCC0K4PN/0UBaz+MvSQUkIeXQ==} + motion-dom@12.7.3: + resolution: {integrity: sha512-IjMt1YJHrvyvruFvmpmd6bGXXGCvmygrnvSb3aZ8KhOzF4H3PulU+cMBzH+U8TBJHjC/mnmJFRIA1Cu4vBfcBA==} + + motion-utils@12.7.2: + resolution: {integrity: sha512-XhZwqctxyJs89oX00zn3OGCuIIpVevbTa+u82usWBC6pSHUd2AoNWiYa7Du8tJxJy9TFbZ82pcn5t7NOm1PHAw==} + + motion@12.7.3: + resolution: {integrity: sha512-EGhzIg7vj+USH9SLNLjHRzglldWEletUZTEtBVKW7IJF+1Ig3RI5LnJmHQBNutuOIyeUbcF36MrNFT00etlc3g==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 @@ -1521,6 +1913,10 @@ packages: react-dom: optional: true + mustache@4.2.0: + resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} + hasBin: true + nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -1557,6 +1953,15 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} + ohash@2.0.11: + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + + path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -1586,6 +1991,9 @@ packages: preact@10.26.5: resolution: {integrity: sha512-fmpDkgfGU6JYux9teDWLhj9mKN55tyepwYbxHgQuIxbWQzgFg5vk7Mrrtfx7xRxq798ynkY4DDDxZr235Kk+4w==} + printable-characters@1.0.42: + resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} + prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} @@ -1688,6 +2096,10 @@ packages: engines: {node: '>=10'} hasBin: true + sharp@0.33.5: + resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + sharp@0.34.1: resolution: {integrity: sha512-1j0w61+eVxu7DawFJtnfYcvSv6qPFvfTaqzTQ2BLknVhHTwGS8sc63ZBF4rzkWMBVKybo4S5OBtDdZahh2A1xg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -1705,6 +2117,17 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + stacktracey@2.1.8: + resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==} + + stoppable@1.1.0: + resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} + engines: {node: '>=4', npm: '>=6'} + streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} @@ -1725,6 +2148,11 @@ packages: tailwind-merge@3.2.0: resolution: {integrity: sha512-FQT/OVqCD+7edmmJpsgCsY820RTD5AkBryuG5IUqR5YQZSdj5xlH5nLgH7YPths7WsLPSpSBNneJdM8aS8aeFA==} + tailwindcss-motion@1.1.0: + resolution: {integrity: sha512-0lK6rA4+367ffJdi1TtB72GlMCxJi2TP/xRiHc6An5pZSlU6WfIHhSvLxpcGilGZfBrOqc2q4woH1DEP/lCNbQ==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + tailwindcss@4.1.3: resolution: {integrity: sha512-2Q+rw9vy1WFXu5cIxlvsabCwhU2qUwodGq03ODhLJ0jW4ek5BUtoCsnLB0qG+m8AHgEsSJcJGDSDe06FXlP74g==} @@ -1746,9 +2174,19 @@ packages: engines: {node: '>=14.17'} hasBin: true + ufo@1.6.1: + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici@5.29.0: + resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} + engines: {node: '>=14.0'} + + unenv@2.0.0-rc.15: + resolution: {integrity: sha512-J/rEIZU8w6FOfLNz/hNKsnY+fFHWnu9MH4yRbSZF3xbbGHovcetXPs7sD+9p8L6CeNC//I9bhRYAOsBt2u7/OA==} + use-callback-ref@1.3.3: resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} engines: {node: '>=10'} @@ -1781,6 +2219,39 @@ packages: web-vitals@4.2.4: resolution: {integrity: sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==} + workerd@1.20250416.0: + resolution: {integrity: sha512-Yrx/bZAKbmSvomdTAzzIpOHwpYhs0ldr2wqed22UEhQ0mIplAHY4xmY+SjAJhP/TydZrciOVzBxwM1+4T40KNA==} + engines: {node: '>=16'} + hasBin: true + + wrangler@4.12.0: + resolution: {integrity: sha512-4rfAXOi5KqM3ECvOrZJ97k3zEqxVwtdt4bijd8jcRBZ6iJYvEtjgjVi4TsfkVa/eXGhpfHTUnKu2uk8UHa8M2w==} + engines: {node: '>=18.0.0'} + hasBin: true + peerDependencies: + '@cloudflare/workers-types': ^4.20250415.0 + peerDependenciesMeta: + '@cloudflare/workers-types': + optional: true + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + youch@3.3.4: + resolution: {integrity: sha512-UeVBXie8cA35DS6+nBkls68xaBBXCye0CNznrhszZjTbRVnJKQuNsyLKBTTL4ln1o1rh2PKtv35twV7irj5SEg==} + + zod@3.22.3: + resolution: {integrity: sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==} + zod@3.24.2: resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} @@ -1827,11 +2298,117 @@ snapshots: '@biomejs/cli-win32-x64@1.9.4': optional: true + '@cloudflare/kv-asset-handler@0.4.0': + dependencies: + mime: 3.0.0 + + '@cloudflare/unenv-preset@2.3.1(unenv@2.0.0-rc.15)(workerd@1.20250416.0)': + dependencies: + unenv: 2.0.0-rc.15 + optionalDependencies: + workerd: 1.20250416.0 + + '@cloudflare/workerd-darwin-64@1.20250416.0': + optional: true + + '@cloudflare/workerd-darwin-arm64@1.20250416.0': + optional: true + + '@cloudflare/workerd-linux-64@1.20250416.0': + optional: true + + '@cloudflare/workerd-linux-arm64@1.20250416.0': + optional: true + + '@cloudflare/workerd-windows-64@1.20250416.0': + optional: true + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + '@emnapi/runtime@1.4.0': dependencies: tslib: 2.8.1 optional: true + '@esbuild/aix-ppc64@0.25.2': + optional: true + + '@esbuild/android-arm64@0.25.2': + optional: true + + '@esbuild/android-arm@0.25.2': + optional: true + + '@esbuild/android-x64@0.25.2': + optional: true + + '@esbuild/darwin-arm64@0.25.2': + optional: true + + '@esbuild/darwin-x64@0.25.2': + optional: true + + '@esbuild/freebsd-arm64@0.25.2': + optional: true + + '@esbuild/freebsd-x64@0.25.2': + optional: true + + '@esbuild/linux-arm64@0.25.2': + optional: true + + '@esbuild/linux-arm@0.25.2': + optional: true + + '@esbuild/linux-ia32@0.25.2': + optional: true + + '@esbuild/linux-loong64@0.25.2': + optional: true + + '@esbuild/linux-mips64el@0.25.2': + optional: true + + '@esbuild/linux-ppc64@0.25.2': + optional: true + + '@esbuild/linux-riscv64@0.25.2': + optional: true + + '@esbuild/linux-s390x@0.25.2': + optional: true + + '@esbuild/linux-x64@0.25.2': + optional: true + + '@esbuild/netbsd-arm64@0.25.2': + optional: true + + '@esbuild/netbsd-x64@0.25.2': + optional: true + + '@esbuild/openbsd-arm64@0.25.2': + optional: true + + '@esbuild/openbsd-x64@0.25.2': + optional: true + + '@esbuild/sunos-x64@0.25.2': + optional: true + + '@esbuild/win32-arm64@0.25.2': + optional: true + + '@esbuild/win32-ia32@0.25.2': + optional: true + + '@esbuild/win32-x64@0.25.2': + optional: true + + '@fastify/busboy@2.1.1': {} + '@floating-ui/core@1.6.9': dependencies: '@floating-ui/utils': 0.2.9 @@ -1854,84 +2431,168 @@ snapshots: '@standard-schema/utils': 0.3.0 react-hook-form: 7.55.0(react@19.1.0) + '@img/sharp-darwin-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.4 + optional: true + '@img/sharp-darwin-arm64@0.34.1': optionalDependencies: '@img/sharp-libvips-darwin-arm64': 1.1.0 optional: true + '@img/sharp-darwin-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.4 + optional: true + '@img/sharp-darwin-x64@0.34.1': optionalDependencies: '@img/sharp-libvips-darwin-x64': 1.1.0 optional: true + '@img/sharp-libvips-darwin-arm64@1.0.4': + optional: true + '@img/sharp-libvips-darwin-arm64@1.1.0': optional: true + '@img/sharp-libvips-darwin-x64@1.0.4': + optional: true + '@img/sharp-libvips-darwin-x64@1.1.0': optional: true + '@img/sharp-libvips-linux-arm64@1.0.4': + optional: true + '@img/sharp-libvips-linux-arm64@1.1.0': optional: true + '@img/sharp-libvips-linux-arm@1.0.5': + optional: true + '@img/sharp-libvips-linux-arm@1.1.0': optional: true '@img/sharp-libvips-linux-ppc64@1.1.0': optional: true + '@img/sharp-libvips-linux-s390x@1.0.4': + optional: true + '@img/sharp-libvips-linux-s390x@1.1.0': optional: true + '@img/sharp-libvips-linux-x64@1.0.4': + optional: true + '@img/sharp-libvips-linux-x64@1.1.0': optional: true + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + optional: true + '@img/sharp-libvips-linuxmusl-arm64@1.1.0': optional: true + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + optional: true + '@img/sharp-libvips-linuxmusl-x64@1.1.0': optional: true + '@img/sharp-linux-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.4 + optional: true + '@img/sharp-linux-arm64@0.34.1': optionalDependencies: '@img/sharp-libvips-linux-arm64': 1.1.0 optional: true + '@img/sharp-linux-arm@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.5 + optional: true + '@img/sharp-linux-arm@0.34.1': optionalDependencies: '@img/sharp-libvips-linux-arm': 1.1.0 optional: true + '@img/sharp-linux-s390x@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.4 + optional: true + '@img/sharp-linux-s390x@0.34.1': optionalDependencies: '@img/sharp-libvips-linux-s390x': 1.1.0 optional: true + '@img/sharp-linux-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.4 + optional: true + '@img/sharp-linux-x64@0.34.1': optionalDependencies: '@img/sharp-libvips-linux-x64': 1.1.0 optional: true + '@img/sharp-linuxmusl-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + optional: true + '@img/sharp-linuxmusl-arm64@0.34.1': optionalDependencies: '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 optional: true + '@img/sharp-linuxmusl-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + optional: true + '@img/sharp-linuxmusl-x64@0.34.1': optionalDependencies: '@img/sharp-libvips-linuxmusl-x64': 1.1.0 optional: true + '@img/sharp-wasm32@0.33.5': + dependencies: + '@emnapi/runtime': 1.4.0 + optional: true + '@img/sharp-wasm32@0.34.1': dependencies: '@emnapi/runtime': 1.4.0 optional: true + '@img/sharp-win32-ia32@0.33.5': + optional: true + '@img/sharp-win32-ia32@0.34.1': optional: true + '@img/sharp-win32-x64@0.33.5': + optional: true + '@img/sharp-win32-x64@0.34.1': optional: true + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + '@next/env@15.3.0': {} '@next/swc-darwin-arm64@15.3.0': @@ -2673,6 +3334,8 @@ snapshots: '@tanstack/virtual-core@3.13.6': {} + '@types/canvas-confetti@1.9.0': {} + '@types/d3-array@3.2.1': {} '@types/d3-color@3.1.3': {} @@ -2709,10 +3372,18 @@ snapshots: dependencies: csstype: 3.1.3 + acorn-walk@8.3.2: {} + + acorn@8.14.0: {} + aria-hidden@1.2.4: dependencies: tslib: 2.8.1 + as-table@1.0.55: + dependencies: + printable-characters: 1.0.42 + asynckit@0.4.0: {} axios@1.8.4: @@ -2723,6 +3394,8 @@ snapshots: transitivePeerDependencies: - debug + blake3-wasm@2.1.5: {} + busboy@1.6.0: dependencies: streamsearch: 1.1.0 @@ -2734,6 +3407,8 @@ snapshots: caniuse-lite@1.0.30001713: {} + canvas-confetti@1.9.3: {} + class-variance-authority@0.7.1: dependencies: clsx: 2.1.1 @@ -2778,6 +3453,8 @@ snapshots: dependencies: delayed-stream: 1.0.0 + cookie@0.7.2: {} + core-js@3.41.0: {} csstype@3.1.3: {} @@ -2820,10 +3497,14 @@ snapshots: d3-timer@3.0.1: {} + data-uri-to-buffer@2.0.2: {} + date-fns@4.1.0: {} decimal.js-light@2.5.1: {} + defu@6.1.4: {} + delayed-stream@1.0.0: {} detect-libc@2.0.3: {} @@ -2873,8 +3554,40 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 + esbuild@0.25.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.2 + '@esbuild/android-arm': 0.25.2 + '@esbuild/android-arm64': 0.25.2 + '@esbuild/android-x64': 0.25.2 + '@esbuild/darwin-arm64': 0.25.2 + '@esbuild/darwin-x64': 0.25.2 + '@esbuild/freebsd-arm64': 0.25.2 + '@esbuild/freebsd-x64': 0.25.2 + '@esbuild/linux-arm': 0.25.2 + '@esbuild/linux-arm64': 0.25.2 + '@esbuild/linux-ia32': 0.25.2 + '@esbuild/linux-loong64': 0.25.2 + '@esbuild/linux-mips64el': 0.25.2 + '@esbuild/linux-ppc64': 0.25.2 + '@esbuild/linux-riscv64': 0.25.2 + '@esbuild/linux-s390x': 0.25.2 + '@esbuild/linux-x64': 0.25.2 + '@esbuild/netbsd-arm64': 0.25.2 + '@esbuild/netbsd-x64': 0.25.2 + '@esbuild/openbsd-arm64': 0.25.2 + '@esbuild/openbsd-x64': 0.25.2 + '@esbuild/sunos-x64': 0.25.2 + '@esbuild/win32-arm64': 0.25.2 + '@esbuild/win32-ia32': 0.25.2 + '@esbuild/win32-x64': 0.25.2 + eventemitter3@4.0.7: {} + exit-hook@2.2.1: {} + + exsolve@1.0.5: {} + fast-equals@5.2.2: {} fflate@0.4.8: {} @@ -2888,15 +3601,18 @@ snapshots: es-set-tostringtag: 2.1.0 mime-types: 2.1.35 - framer-motion@12.6.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + framer-motion@12.7.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: - motion-dom: 12.6.5 - motion-utils: 12.6.5 + motion-dom: 12.7.3 + motion-utils: 12.7.2 tslib: 2.8.1 optionalDependencies: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) + fsevents@2.3.3: + optional: true + function-bind@1.1.2: {} get-intrinsic@1.3.0: @@ -2919,6 +3635,13 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 + get-source@2.0.12: + dependencies: + data-uri-to-buffer: 2.0.2 + source-map: 0.6.1 + + glob-to-regexp@0.4.1: {} + gopd@1.2.0: {} graceful-fs@4.2.11: {} @@ -3010,20 +3733,41 @@ snapshots: dependencies: mime-db: 1.52.0 - motion-dom@12.6.5: - dependencies: - motion-utils: 12.6.5 + mime@3.0.0: {} - motion-utils@12.6.5: {} - - motion@12.6.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + miniflare@4.20250416.0: dependencies: - framer-motion: 12.6.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@cspotcode/source-map-support': 0.8.1 + acorn: 8.14.0 + acorn-walk: 8.3.2 + exit-hook: 2.2.1 + glob-to-regexp: 0.4.1 + stoppable: 1.1.0 + undici: 5.29.0 + workerd: 1.20250416.0 + ws: 8.18.0 + youch: 3.3.4 + zod: 3.22.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + motion-dom@12.7.3: + dependencies: + motion-utils: 12.7.2 + + motion-utils@12.7.2: {} + + motion@12.7.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + dependencies: + framer-motion: 12.7.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) tslib: 2.8.1 optionalDependencies: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) + mustache@4.2.0: {} + nanoid@3.3.11: {} next-themes@0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0): @@ -3058,6 +3802,12 @@ snapshots: object-assign@4.1.1: {} + ohash@2.0.11: {} + + path-to-regexp@6.3.0: {} + + pathe@2.0.3: {} + picocolors@1.1.1: {} postcss@8.4.31: @@ -3087,6 +3837,8 @@ snapshots: preact@10.26.5: {} + printable-characters@1.0.42: {} + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 @@ -3188,6 +3940,33 @@ snapshots: semver@7.7.1: optional: true + sharp@0.33.5: + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + semver: 7.7.1 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.33.5 + '@img/sharp-darwin-x64': 0.33.5 + '@img/sharp-libvips-darwin-arm64': 1.0.4 + '@img/sharp-libvips-darwin-x64': 1.0.4 + '@img/sharp-libvips-linux-arm': 1.0.5 + '@img/sharp-libvips-linux-arm64': 1.0.4 + '@img/sharp-libvips-linux-s390x': 1.0.4 + '@img/sharp-libvips-linux-x64': 1.0.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + '@img/sharp-linux-arm': 0.33.5 + '@img/sharp-linux-arm64': 0.33.5 + '@img/sharp-linux-s390x': 0.33.5 + '@img/sharp-linux-x64': 0.33.5 + '@img/sharp-linuxmusl-arm64': 0.33.5 + '@img/sharp-linuxmusl-x64': 0.33.5 + '@img/sharp-wasm32': 0.33.5 + '@img/sharp-win32-ia32': 0.33.5 + '@img/sharp-win32-x64': 0.33.5 + optional: true + sharp@0.34.1: dependencies: color: 4.2.3 @@ -3228,6 +4007,15 @@ snapshots: source-map-js@1.2.1: {} + source-map@0.6.1: {} + + stacktracey@2.1.8: + dependencies: + as-table: 1.0.55 + get-source: 2.0.12 + + stoppable@1.1.0: {} + streamsearch@1.1.0: {} styled-jsx@5.1.6(react@19.1.0): @@ -3237,6 +4025,10 @@ snapshots: tailwind-merge@3.2.0: {} + tailwindcss-motion@1.1.0(tailwindcss@4.1.3): + dependencies: + tailwindcss: 4.1.3 + tailwindcss@4.1.3: {} tapable@2.2.1: {} @@ -3249,8 +4041,22 @@ snapshots: typescript@5.8.3: {} + ufo@1.6.1: {} + undici-types@6.21.0: {} + undici@5.29.0: + dependencies: + '@fastify/busboy': 2.1.1 + + unenv@2.0.0-rc.15: + dependencies: + defu: 6.1.4 + exsolve: 1.0.5 + ohash: 2.0.11 + pathe: 2.0.3 + ufo: 1.6.1 + use-callback-ref@1.3.3(@types/react@19.1.0)(react@19.1.0): dependencies: react: 19.1.0 @@ -3294,4 +4100,39 @@ snapshots: web-vitals@4.2.4: {} + workerd@1.20250416.0: + optionalDependencies: + '@cloudflare/workerd-darwin-64': 1.20250416.0 + '@cloudflare/workerd-darwin-arm64': 1.20250416.0 + '@cloudflare/workerd-linux-64': 1.20250416.0 + '@cloudflare/workerd-linux-arm64': 1.20250416.0 + '@cloudflare/workerd-windows-64': 1.20250416.0 + + wrangler@4.12.0: + dependencies: + '@cloudflare/kv-asset-handler': 0.4.0 + '@cloudflare/unenv-preset': 2.3.1(unenv@2.0.0-rc.15)(workerd@1.20250416.0) + blake3-wasm: 2.1.5 + esbuild: 0.25.2 + miniflare: 4.20250416.0 + path-to-regexp: 6.3.0 + unenv: 2.0.0-rc.15 + workerd: 1.20250416.0 + optionalDependencies: + fsevents: 2.3.3 + sharp: 0.33.5 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + ws@8.18.0: {} + + youch@3.3.4: + dependencies: + cookie: 0.7.2 + mustache: 4.2.0 + stacktracey: 2.1.8 + + zod@3.22.3: {} + zod@3.24.2: {} diff --git a/web/public/android-chrome-192x192.png b/web/public/android-chrome-192x192.png new file mode 100644 index 00000000..d9df979a Binary files /dev/null and b/web/public/android-chrome-192x192.png differ diff --git a/web/public/android-chrome-512x512.png b/web/public/android-chrome-512x512.png new file mode 100644 index 00000000..f1b171c0 Binary files /dev/null and b/web/public/android-chrome-512x512.png differ diff --git a/web/public/apple-touch-icon.png b/web/public/apple-touch-icon.png new file mode 100644 index 00000000..508a46b7 Binary files /dev/null and b/web/public/apple-touch-icon.png differ diff --git a/web/public/favicon-16x16.png b/web/public/favicon-16x16.png new file mode 100644 index 00000000..69d271c2 Binary files /dev/null and b/web/public/favicon-16x16.png differ diff --git a/web/public/favicon-32x32.png b/web/public/favicon-32x32.png new file mode 100644 index 00000000..44432c41 Binary files /dev/null and b/web/public/favicon-32x32.png differ diff --git a/web/public/favicon.ico b/web/public/favicon.ico index 98fa22ce..bc326dc6 100644 Binary files a/web/public/favicon.ico and b/web/public/favicon.ico differ diff --git a/web/public/favicon.png b/web/public/favicon.png deleted file mode 100644 index c3275d00..00000000 Binary files a/web/public/favicon.png and /dev/null differ diff --git a/web/public/favicon.svg b/web/public/favicon.svg deleted file mode 100644 index d3f858ca..00000000 --- a/web/public/favicon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/web/public/site.webmanifest b/web/public/site.webmanifest new file mode 100644 index 00000000..3c963dc8 --- /dev/null +++ b/web/public/site.webmanifest @@ -0,0 +1,26 @@ +{ + "name": "Dashboard Icons", + "short_name": "DashIcons", + "description": "A collection of curated icons for services, applications and tools, designed specifically for dashboards and app directories.", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "any maskable" + }, + { + "src": "/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "any maskable" + } + ], + "theme_color": "#FA5252", + "background_color": "#1B1B1D", + "start_url": "/", + "display": "standalone", + "orientation": "portrait", + "scope": "/", + "categories": ["tools", "utilities", "productivity"] +} diff --git a/web/src/app/error.tsx b/web/src/app/error.tsx new file mode 100644 index 00000000..3b332632 --- /dev/null +++ b/web/src/app/error.tsx @@ -0,0 +1,51 @@ +"use client" + +import { Button } from "@/components/ui/button" +import { AlertTriangle, ArrowLeft, RefreshCcw } from "lucide-react" +import Link from "next/link" +import { useRouter } from "next/navigation" +import { useEffect } from "react" + +export default function ErrorPage({ + error, + reset, +}: { + error: Error & { digest?: string } + reset: () => void +}) { + const router = useRouter() + + useEffect(() => { + // Log the error to an error reporting service + console.error("Application error:", error) + }, [error]) + + const handleGoBack = () => { + router.back() + } + + return ( +
+
+
+ +
+

Something went wrong

+

+ An unexpected error occurred while loading this page. We've been notified and are looking into it. +

+
+ + +
+ {error.digest &&

Error ID: {error.digest}

} +
+
+ ) +} diff --git a/web/src/app/globals.css b/web/src/app/globals.css index 1baebcda..43ec4467 100644 --- a/web/src/app/globals.css +++ b/web/src/app/globals.css @@ -1,48 +1,64 @@ @import "tailwindcss"; @import "tw-animate-css"; +@plugin "tailwindcss-motion"; @custom-variant dark (&:is(.dark *)); @theme inline { --color-background: var(--background); --color-foreground: var(--foreground); - --font-sans: var(--font-geist-sans); - --font-mono: var(--font-geist-mono); - --color-sidebar-ring: var(--sidebar-ring); - --color-sidebar-border: var(--sidebar-border); - --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); - --color-sidebar-accent: var(--sidebar-accent); - --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); - --color-sidebar-primary: var(--sidebar-primary); - --color-sidebar-foreground: var(--sidebar-foreground); - --color-sidebar: var(--sidebar); - --color-chart-5: var(--chart-5); - --color-chart-4: var(--chart-4); - --color-chart-3: var(--chart-3); - --color-chart-2: var(--chart-2); - --color-chart-1: var(--chart-1); - --color-ring: var(--ring); - --color-input: var(--input); - --color-border: var(--border); - --color-destructive: var(--destructive); - --color-accent-foreground: var(--accent-foreground); - --color-accent: var(--accent); - --color-muted-foreground: var(--muted-foreground); - --color-muted: var(--muted); - --color-secondary-foreground: var(--secondary-foreground); - --color-secondary: var(--secondary); - --color-primary-foreground: var(--primary-foreground); - --color-primary: var(--primary); - --color-popover-foreground: var(--popover-foreground); - --color-popover: var(--popover); - --color-card-foreground: var(--card-foreground); --color-card: var(--card); + --color-card-foreground: var(--card-foreground); + --color-popover: var(--popover); + --color-popover-foreground: var(--popover-foreground); + --color-primary: var(--primary); + --color-primary-foreground: var(--primary-foreground); + --color-secondary: var(--secondary); + --color-secondary-foreground: var(--secondary-foreground); + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); + --color-accent: var(--accent); + --color-accent-foreground: var(--accent-foreground); + --color-destructive: var(--destructive); + --color-destructive-foreground: var(--destructive-foreground); + --color-border: var(--border); + --color-input: var(--input); + --color-ring: var(--ring); + --color-chart-1: var(--chart-1); + --color-chart-2: var(--chart-2); + --color-chart-3: var(--chart-3); + --color-chart-4: var(--chart-4); + --color-chart-5: var(--chart-5); + --color-sidebar: var(--sidebar); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-ring: var(--sidebar-ring); + + --font-sans: var(--font-sans); + --font-mono: var(--font-mono); + --font-serif: var(--font-serif); + --radius-sm: calc(var(--radius) - 4px); --radius-md: calc(var(--radius) - 2px); --radius-lg: var(--radius); --radius-xl: calc(var(--radius) + 4px); - --animate-accordion-down: accordion-down 0.2s ease-out; - --animate-accordion-up: accordion-up 0.2s ease-out; + + --shadow-2xs: var(--shadow-2xs); + --shadow-xs: var(--shadow-xs); + --shadow-sm: var(--shadow-sm); + --shadow: var(--shadow); + --shadow-md: var(--shadow-md); + --shadow-lg: var(--shadow-lg); + --shadow-xl: var(--shadow-xl); + --shadow-2xl: var(--shadow-2xl); + + --animate-marquee: marquee var(--duration) infinite linear; + --animate-marquee-vertical: marquee-vertical var(--duration) linear infinite; + --animate-aurora: aurora 8s ease-in-out infinite alternate; @keyframes accordion-down { from { @@ -61,28 +77,85 @@ height: 0; } } + + @keyframes marquee { + from { + transform: translateX(0); + } + to { + transform: translateX(calc(-100% - var(--gap))); + } + } + + @keyframes marquee-vertical { + from { + transform: translateY(0); + } + to { + transform: translateY(calc(-100% - var(--gap))); + } + } + + @keyframes aurora { + 0% { + background-position: 0% 50%; + transform: rotate(-5deg) scale(0.9); + } + 25% { + background-position: 50% 100%; + transform: rotate(5deg) scale(1.1); + } + 50% { + background-position: 100% 50%; + transform: rotate(-3deg) scale(0.95); + } + 75% { + background-position: 50% 0%; + transform: rotate(3deg) scale(1.05); + } + 100% { + background-position: 0% 50%; + transform: rotate(-5deg) scale(0.9); + } + } + + --animate-shiny-text: shiny-text 8s infinite; + @keyframes shiny-text { + 0%, + 90%, + 100% { + background-position: calc(-100% - var(--shiny-width)) 0; + } + 30%, + 60% { + background-position: calc(100% + var(--shiny-width)) 0; + } + } } :root { - --radius: 0.3rem; - --background: oklch(1 0 0); - --foreground: oklch(0.141 0.005 285.823); - --card: oklch(1 0 0); - --card-foreground: oklch(0.141 0.005 285.823); - --popover: oklch(1 0 0); - --popover-foreground: oklch(0.141 0.005 285.823); - --primary: oklch(0.637 0.237 25.331); - --primary-foreground: oklch(0.971 0.013 17.38); - --secondary: oklch(0.967 0.001 286.375); - --secondary-foreground: oklch(0.21 0.006 285.885); - --muted: oklch(0.967 0.001 286.375); - --muted-foreground: oklch(0.552 0.016 285.938); + --radius: 0.4rem; + + --background: oklch(0.99 0 0); + --foreground: oklch(0.32 0 0); + --card: oklch(1.0 0 0); + --card-foreground: oklch(0.32 0 0); + --popover: oklch(1.0 0 0); + --popover-foreground: oklch(0.32 0 0); + --primary: oklch(0.67 0.2 23.8); + --primary-foreground: oklch(1.0 0 0); + --secondary: oklch(0.97 0.0 264.54); + --secondary-foreground: oklch(0.45 0.03 256.8); + --muted: oklch(0.98 0.0 247.84); + --muted-foreground: oklch(0.55 0.02 264.36); --accent: oklch(0.967 0.001 286.375); --accent-foreground: oklch(0.21 0.006 285.885); - --destructive: oklch(0.577 0.245 27.325); - --border: oklch(0.92 0.004 286.32); + --destructive: oklch(0.64 0.21 25.33); + --destructive-foreground: oklch(1.0 0 0); + --border: oklch(0.9 0.01 247.88); + --input: oklch(0.92 0.004 286.32); - --ring: oklch(0.637 0.237 25.331); + --chart-1: oklch(0.646 0.222 41.116); --chart-2: oklch(0.6 0.118 184.704); --chart-3: oklch(0.398 0.07 227.392); @@ -96,25 +169,41 @@ --sidebar-accent-foreground: oklch(0.21 0.006 285.885); --sidebar-border: oklch(0.92 0.004 286.32); --sidebar-ring: oklch(0.637 0.237 25.331); + + --shadow-2xs: 0px 1px 3px 0px hsl(0 0% 0% / 0.05); + --shadow-xs: 0px 1px 3px 0px hsl(0 0% 0% / 0.05); + --shadow-sm: 0px 1px 3px 0px hsl(0 0% 0% / 0.1), 0px 1px 2px -1px + hsl(0 0% 0% / 0.1); + --shadow: 0px 1px 3px 0px hsl(0 0% 0% / 0.1), 0px 1px 2px -1px + hsl(0 0% 0% / 0.1); + --shadow-md: 0px 1px 3px 0px hsl(0 0% 0% / 0.1), 0px 2px 4px -1px + hsl(0 0% 0% / 0.1); + --shadow-lg: 0px 1px 3px 0px hsl(0 0% 0% / 0.1), 0px 4px 6px -1px + hsl(0 0% 0% / 0.1); + --shadow-xl: 0px 1px 3px 0px hsl(0 0% 0% / 0.1), 0px 8px 10px -1px + hsl(0 0% 0% / 0.1); + --shadow-2xl: 0px 1px 3px 0px hsl(0 0% 0% / 0.25); } .dark { --background: oklch(0.141 0.005 285.823); - --foreground: oklch(0.985 0 0); - --card: oklch(0.21 0.006 285.885); - --card-foreground: oklch(0.985 0 0); - --popover: oklch(0.21 0.006 285.885); - --popover-foreground: oklch(0.985 0 0); - --primary: oklch(0.637 0.237 25.331); - --primary-foreground: oklch(0.971 0.013 17.38); - --secondary: oklch(0.274 0.006 286.033); - --secondary-foreground: oklch(0.985 0 0); - --muted: oklch(0.274 0.006 286.033); - --muted-foreground: oklch(0.705 0.015 286.067); - --accent: oklch(0.274 0.006 286.033); - --accent-foreground: oklch(0.985 0 0); - --destructive: oklch(0.704 0.191 22.216); - --border: oklch(1 0 0 / 10%); + --foreground: oklch(0.92 0 0); + --card: oklch(0.31 0.03 268.64); + --card-foreground: oklch(0.92 0 0); + --popover: oklch(0.29 0.02 268.4); + --popover-foreground: oklch(0.92 0 0); + --primary: oklch(0.67 0.2 23.8); + --primary-foreground: oklch(1.0 0 0); + --secondary: oklch(0.31 0.03 266.71); + --secondary-foreground: oklch(0.92 0 0); + --muted: oklch(0.31 0.03 266.71); + --muted-foreground: oklch(0.72 0 0); + --accent: oklch(0.34 0.06 267.59); + --accent-foreground: oklch(0.88 0.06 254.13); + --destructive: oklch(0.64 0.21 25.33); + --destructive-foreground: oklch(1.0 0 0); + --border: oklch(0.38 0.03 269.73); + --input: oklch(1 0 0 / 15%); --ring: oklch(0.637 0.237 25.331); --chart-1: oklch(0.488 0.243 264.376); @@ -130,6 +219,20 @@ --sidebar-accent-foreground: oklch(0.985 0 0); --sidebar-border: oklch(1 0 0 / 10%); --sidebar-ring: oklch(0.637 0.237 25.331); + + --shadow-2xs: 0px 1px 3px 0px hsl(0 0% 0% / 0.05); + --shadow-xs: 0px 1px 3px 0px hsl(0 0% 0% / 0.05); + --shadow-sm: 0px 1px 3px 0px hsl(0 0% 0% / 0.1), 0px 1px 2px -1px + hsl(0 0% 0% / 0.1); + --shadow: 0px 1px 3px 0px hsl(0 0% 0% / 0.1), 0px 1px 2px -1px + hsl(0 0% 0% / 0.1); + --shadow-md: 0px 1px 3px 0px hsl(0 0% 0% / 0.1), 0px 2px 4px -1px + hsl(0 0% 0% / 0.1); + --shadow-lg: 0px 1px 3px 0px hsl(0 0% 0% / 0.1), 0px 4px 6px -1px + hsl(0 0% 0% / 0.1); + --shadow-xl: 0px 1px 3px 0px hsl(0 0% 0% / 0.1), 0px 8px 10px -1px + hsl(0 0% 0% / 0.1); + --shadow-2xl: 0px 1px 3px 0px hsl(0 0% 0% / 0.25); } @layer base { @@ -140,3 +243,21 @@ @apply bg-background text-foreground; } } + +@layer utilities { + .hover-lift { + @apply transition-transform duration-300 hover:-translate-y-1; + } + + .soft-shadow { + @apply shadow-[0_8px_30px_rgba(0,0,0,0.06)]; + } + + .card-hover { + @apply transition-all duration-300 hover:shadow-md; + } + + .glass-effect { + @apply backdrop-blur-sm; + } +} diff --git a/web/src/app/icons/[icon]/opengraph-image.tsx b/web/src/app/icons/[icon]/opengraph-image.tsx new file mode 100644 index 00000000..b7321e7b --- /dev/null +++ b/web/src/app/icons/[icon]/opengraph-image.tsx @@ -0,0 +1,254 @@ +import { getAllIcons } from "@/lib/api" +import { ImageResponse } from "next/og" +import { readFile } from "node:fs/promises" +import { join } from "node:path" + +export const dynamic = "force-static" + +export async function generateStaticParams() { + const iconsData = await getAllIcons() + return Object.keys(iconsData).map((icon) => ({ + icon, + })) +} + +export const size = { + width: 1200, + height: 630, +} +export default async function Image({ params }: { params: { icon: string } }) { + const { icon } = params + const iconsData = await getAllIcons() + const totalIcons = Object.keys(iconsData).length + const index = Object.keys(iconsData).indexOf(icon) + + // Format the icon name for display + const formattedIconName = icon + .split("-") + .map((word) => word.charAt(0).toUpperCase() + word.slice(1)) + .join(" ") + + // Read the icon file from local filesystem + let iconData: Buffer | null = null + try { + const iconPath = join(process.cwd(), `../png/${icon}.png`) + console.log(`Generating opengraph image for ${icon} (${index + 1} / ${totalIcons}) from path ${iconPath}`) + iconData = await readFile(iconPath) + } catch (error) { + console.error(`Icon ${icon} was not found locally`) + } + + // Convert the image data to a data URL or use placeholder + const iconUrl = iconData + ? `data:image/png;base64,${iconData.toString("base64")}` + : `https://placehold.co/600x400?text=${formattedIconName}` + + return new ImageResponse( +
+ {/* Background blur blobs */} +
+
+ + {/* Main content layout */} +
+ {/* Icon container */} +
+
+ {formattedIconName} +
+ + {/* Text content */} +
+
+ Download {formattedIconName} icon for free +
+ +
+ Amongst {totalIcons} other high-quality dashboard icons +
+ +
+ {["SVG", "PNG", "WEBP"].map((format) => ( +
+ {format} +
+ ))} +
+
+
+ + {/* Footer */} +
+
+
+ dashboardicons.com +
+
+
, + { + ...size, + }, + ) +} diff --git a/web/src/app/icons/[icon]/page.tsx b/web/src/app/icons/[icon]/page.tsx index 6e685a3c..894a6c0d 100644 --- a/web/src/app/icons/[icon]/page.tsx +++ b/web/src/app/icons/[icon]/page.tsx @@ -1,5 +1,5 @@ import { IconDetails } from "@/components/icon-details" -import { BASE_URL } from "@/constants" +import { BASE_URL, WEB_URL } from "@/constants" import { getAllIcons, getAuthorData } from "@/lib/api" import type { Metadata, ResolvingMetadata } from "next" import { notFound } from "next/navigation" @@ -26,20 +26,32 @@ export async function generateMetadata({ params, searchParams }: Props, parent: if (!iconsData[icon]) { notFound() } - const previousImages = (await parent).openGraph?.images || [] const authorData = await getAuthorData(iconsData[icon].update.author.id) const authorName = authorData.name || authorData.login const updateDate = new Date(iconsData[icon].update.timestamp) + const totalIcons = Object.keys(iconsData).length console.debug(`Generated metadata for ${icon} by ${authorName} (${authorData.html_url}) updated at ${updateDate.toLocaleString()}`) const iconImageUrl = `${BASE_URL}/png/${icon}.png` - const pageUrl = `${BASE_URL}/icons/${icon}` + const pageUrl = `${WEB_URL}/icons/${icon}` + const formattedIconName = icon + .split("-") + .map((word) => word.charAt(0).toUpperCase() + word.slice(1)) + .join(" ") return { - title: `${icon} icon · Dashboard Icons`, - description: `Download and use the ${icon} icon from Dashboard Icons for your applications`, - keywords: [`${icon} icon`, "dashboard icon", "free icon", "open source icon", "application icon"], + title: `${formattedIconName} Icon | Dashboard Icons`, + description: `Download the ${formattedIconName} icon in SVG, PNG, and WEBP formats for FREE. Part of a collection of ${totalIcons} curated icons for services, applications and tools, designed specifically for dashboards and app directories.`, + keywords: [ + `${formattedIconName} icon`, + "dashboard icon", + "service icon", + "application icon", + "tool icon", + "web dashboard", + "app directory", + ], authors: [ { name: "homarr", @@ -51,30 +63,20 @@ export async function generateMetadata({ params, searchParams }: Props, parent: }, ], openGraph: { - title: `${icon} icon · Dashboard Icons`, - description: `Download and use the ${icon} icon from Dashboard Icons for your applications`, + title: `${formattedIconName} Icon | Dashboard Icons`, + description: `Download the ${formattedIconName} icon in SVG, PNG, and WEBP formats for FREE. Part of a collection of ${totalIcons} curated icons for services, applications and tools, designed specifically for dashboards and app directories.`, type: "article", url: pageUrl, - images: [ - { - url: iconImageUrl, - width: 512, - height: 512, - alt: `${icon} icon`, - type: "image/png", - }, - ...previousImages, - ], authors: [authorName, "homarr"], publishedTime: updateDate.toISOString(), modifiedTime: updateDate.toISOString(), }, twitter: { card: "summary_large_image", - title: `${icon} icon · Dashboard Icons`, - description: `Download and use the ${icon} icon from Dashboard Icons for your applications`, + title: `${formattedIconName} Icon | Dashboard Icons`, + description: `Download the ${formattedIconName} icon in SVG, PNG, and WEBP formats for FREE. Part of a collection of ${totalIcons} curated icons for services, applications and tools, designed specifically for dashboards and app directories.`, images: [iconImageUrl], - creator: "@ajnavocado", + creator: "@homarr_app", }, alternates: { canonical: pageUrl, @@ -91,9 +93,7 @@ export default async function IconPage({ params }: { params: Promise<{ icon: str notFound() } - // Pass originalIconData directly, assuming IconDetails can handle it - const iconData = originalIconData - const authorData = await getAuthorData(originalIconData.update.author.id) + return } diff --git a/web/src/app/icons/components.tsx b/web/src/app/icons/components.tsx index 19773e1f..4212afa1 100644 --- a/web/src/app/icons/components.tsx +++ b/web/src/app/icons/components.tsx @@ -46,11 +46,11 @@ export function IconSearch({ icons, initialQuery = "" }: IconSearchProps) { return ( <>
- + handleSearch(e.target.value)} /> diff --git a/web/src/app/icons/components/icon-search.tsx b/web/src/app/icons/components/icon-search.tsx index 35b83185..7502878b 100644 --- a/web/src/app/icons/components/icon-search.tsx +++ b/web/src/app/icons/components/icon-search.tsx @@ -1,63 +1,144 @@ "use client" import { IconSubmissionContent } from "@/components/icon-submission-form" +import { MagicCard } from "@/components/magicui/magic-card" +import { Badge } from "@/components/ui/badge" +import { Button } from "@/components/ui/button" +import { + DropdownMenu, + DropdownMenuCheckboxItem, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuRadioGroup, + DropdownMenuRadioItem, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu" import { Input } from "@/components/ui/input" +import { Separator } from "@/components/ui/separator" import { BASE_URL } from "@/constants" -import type { IconSearchProps } from "@/types/icons" -import { Search } from "lucide-react" +import type { Icon, IconSearchProps } from "@/types/icons" +import { ArrowDownAZ, ArrowUpZA, Calendar, Filter, Search, SortAsc, X } from "lucide-react" +import { useTheme } from "next-themes" import Image from "next/image" import Link from "next/link" import { usePathname, useRouter, useSearchParams } from "next/navigation" -import { useCallback, useEffect, useRef, useState } from "react" +import { useCallback, useEffect, useMemo, useRef, useState } from "react" + +type SortOption = "relevance" | "alphabetical-asc" | "alphabetical-desc" | "newest" export function IconSearch({ icons }: IconSearchProps) { const searchParams = useSearchParams() const initialQuery = searchParams.get("q") + const initialCategories = searchParams.getAll("category") + const initialSort = (searchParams.get("sort") as SortOption) || "relevance" const router = useRouter() const pathname = usePathname() const [searchQuery, setSearchQuery] = useState(initialQuery ?? "") + const [selectedCategories, setSelectedCategories] = useState(initialCategories ?? []) + const [sortOption, setSortOption] = useState(initialSort) const timeoutRef = useRef(null) - const [filteredIcons, setFilteredIcons] = useState(() => { - if (!initialQuery?.trim()) return icons + const { resolvedTheme } = useTheme() - const q = initialQuery.toLowerCase() - return icons.filter(({ name, data }) => { - if (name.toLowerCase().includes(q)) return true - if (data.aliases.some((alias) => alias.toLowerCase().includes(q))) return true - if (data.categories.some((category) => category.toLowerCase().includes(q))) return true + // Extract all unique categories + const allCategories = useMemo(() => { + const categories = new Set() + for (const icon of icons) { + for (const category of icon.data.categories) { + categories.add(category) + } + } + return Array.from(categories).sort() + }, [icons]) - return false - }) - }) + // Simple filter function using substring matching const filterIcons = useCallback( - (query: string) => { - if (!query.trim()) { - return icons + (query: string, categories: string[], sort: SortOption) => { + // First filter by categories if any are selected + let filtered = icons + if (categories.length > 0) { + filtered = filtered.filter(({ data }) => + data.categories.some((cat) => categories.some((selectedCat) => cat.toLowerCase() === selectedCat.toLowerCase())), + ) } - const q = query.toLowerCase() - return icons.filter(({ name, data }) => { - if (name.toLowerCase().includes(q)) return true - if (data.aliases.some((alias) => alias.toLowerCase().includes(q))) return true - if (data.categories.some((category) => category.toLowerCase().includes(q))) return true + // Then filter by search query + if (query.trim()) { + const q = query.toLowerCase() + filtered = filtered.filter(({ name, data }) => { + if (name.toLowerCase().includes(q)) return true + if (data.aliases.some((alias) => alias.toLowerCase().includes(q))) return true + if (data.categories.some((category) => category.toLowerCase().includes(q))) return true + return false + }) + } - return false - }) + // Apply sorting + if (sort === "alphabetical-asc") { + return filtered.sort((a, b) => a.name.localeCompare(b.name)) + } + if (sort === "alphabetical-desc") { + return filtered.sort((a, b) => b.name.localeCompare(a.name)) + } + if (sort === "newest") { + return filtered.sort((a, b) => { + return new Date(b.data.update.timestamp).getTime() - new Date(a.data.update.timestamp).getTime() + }) + } + + // Default sort (relevance or fallback to alphabetical) + return filtered.sort((a, b) => a.name.localeCompare(b.name)) }, [icons], ) + + // Find matched aliases for display purposes + const matchedAliases = useMemo(() => { + if (!searchQuery.trim()) return {} + + const q = searchQuery.toLowerCase() + const matches: Record = {} + + for (const { name, data } of icons) { + // If name doesn't match but an alias does, store the first matching alias + if (!name.toLowerCase().includes(q)) { + const matchingAlias = data.aliases.find((alias) => alias.toLowerCase().includes(q)) + if (matchingAlias) { + matches[name] = matchingAlias + } + } + } + + return matches + }, [icons, searchQuery]) + + // Use useMemo for filtered icons + const filteredIcons = useMemo(() => { + return filterIcons(searchQuery, selectedCategories, sortOption) + }, [filterIcons, searchQuery, selectedCategories, sortOption]) + const updateResults = useCallback( - (query: string) => { - setFilteredIcons(filterIcons(query)) + (query: string, categories: string[], sort: SortOption) => { const params = new URLSearchParams() if (query) params.set("q", query) - const newUrl = query ? `${pathname}?${params.toString()}` : pathname + // Clear existing category params and add new ones + for (const category of categories) { + params.append("category", category) + } + // Add sort parameter if not default + if (sort !== "relevance" || initialSort !== "relevance") { + params.set("sort", sort) + } + + const newUrl = params.toString() ? `${pathname}?${params.toString()}` : pathname router.push(newUrl, { scroll: false }) }, - [filterIcons, pathname, router], + [pathname, router, initialSort], ) + const handleSearch = useCallback( (query: string) => { setSearchQuery(query) @@ -65,11 +146,45 @@ export function IconSearch({ icons }: IconSearchProps) { clearTimeout(timeoutRef.current) } timeoutRef.current = setTimeout(() => { - updateResults(query) - }, 100) + updateResults(query, selectedCategories, sortOption) + }, 200) // Changed from 100ms to 200ms }, - [updateResults], + [updateResults, selectedCategories, sortOption], ) + + const handleCategoryChange = useCallback( + (category: string) => { + let newCategories: string[] + + if (selectedCategories.includes(category)) { + // Remove the category if it's already selected + newCategories = selectedCategories.filter((c) => c !== category) + } else { + // Add the category if it's not selected + newCategories = [...selectedCategories, category] + } + + setSelectedCategories(newCategories) + updateResults(searchQuery, newCategories, sortOption) + }, + [updateResults, searchQuery, selectedCategories, sortOption], + ) + + const handleSortChange = useCallback( + (sort: SortOption) => { + setSortOption(sort) + updateResults(searchQuery, selectedCategories, sort) + }, + [updateResults, searchQuery, selectedCategories], + ) + + const clearFilters = useCallback(() => { + setSearchQuery("") + setSelectedCategories([]) + setSortOption("relevance") + updateResults("", [], "relevance") + }, [updateResults]) + useEffect(() => { return () => { if (timeoutRef.current) { @@ -80,48 +195,258 @@ export function IconSearch({ icons }: IconSearchProps) { if (!searchParams) return null + const getSortLabel = (sort: SortOption) => { + switch (sort) { + case "relevance": + return "Best match" + case "alphabetical-asc": + return "A to Z" + case "alphabetical-desc": + return "Z to A" + case "newest": + return "Newest first" + default: + return "Sort" + } + } + + const getSortIcon = (sort: SortOption) => { + switch (sort) { + case "relevance": + return + case "alphabetical-asc": + return + case "alphabetical-desc": + return + case "newest": + return + default: + return + } + } + return ( <> -
- - handleSearch(e.target.value)} - /> +
+ {/* Search input */} +
+
+ +
+ handleSearch(e.target.value)} + /> +
+ + {/* Filter and sort controls */} +
+ {/* Filter dropdown */} + + + + + + Categories + + +
+ {allCategories.map((category) => ( + handleCategoryChange(category)} + className="cursor-pointer capitalize" + > + {category.replace(/-/g, " ").replace(/\b\w/g, (c) => c.toUpperCase())} + + ))} +
+ + {selectedCategories.length > 0 && ( + <> + + { + setSelectedCategories([]) + updateResults(searchQuery, [], sortOption) + }} + className="cursor-pointer focus: focus:bg-rose-50 dark:focus:bg-rose-950/20" + > + Clear all filters + + + )} +
+
+ + {/* Sort dropdown */} + + + + + + Sort By + + handleSortChange(value as SortOption)}> + + + Best match + + + A to Z + + + Z to A + + + + Newest first + + + + + + {/* Clear all button */} + {(searchQuery || selectedCategories.length > 0 || sortOption !== "relevance") && ( + + )} +
+ + {/* Active filter badges */} + {selectedCategories.length > 0 && ( +
+ Filters: +
+ {selectedCategories.map((category) => ( + + {category.replace(/-/g, " ").replace(/\b\w/g, (c) => c.toUpperCase())} + + + ))} +
+ + +
+ )} + +
{filteredIcons.length === 0 ? (
-

We don't have this one...yet!

+

We don't have this one...yet!

+

+ {searchQuery && selectedCategories.length > 0 + ? `No icons found matching "${searchQuery}" with the selected filters.` + : searchQuery + ? `No icons found matching "${searchQuery}".` + : selectedCategories.length > 0 + ? "No icons found with the selected filters." + : "No icons found matching your criteria."} +

) : ( -
- {filteredIcons.map(({ name, data }) => ( - -
- {`${name} -
- {name.replace(/-/g, " ")} - - ))} -
+ <> +
+

+ Found {filteredIcons.length} icon + {filteredIcons.length !== 1 ? "s" : ""}. +

+
+ {getSortIcon(sortOption)} + {getSortLabel(sortOption)} +
+
+ + + )} ) } + +function IconCard({ + name, + data: iconData, + matchedAlias, +}: { + name: string + data: Icon + matchedAlias?: string | null +}) { + return ( + + +
+ {`${name} +
+ + {name.replace(/-/g, " ")} + + + {matchedAlias && Alias: {matchedAlias}} + +
+ ) +} + +interface IconsGridProps { + filteredIcons: { name: string; data: Icon }[] + matchedAliases: Record +} + +function IconsGrid({ filteredIcons, matchedAliases }: IconsGridProps) { + return ( + <> +
+ {filteredIcons.slice(0, 120).map(({ name, data }) => ( + + ))} +
+ {filteredIcons.length > 120 &&

And {filteredIcons.length - 120} more...

} + + ) +} diff --git a/web/src/app/icons/layout.tsx b/web/src/app/icons/layout.tsx new file mode 100644 index 00000000..2a9e1207 --- /dev/null +++ b/web/src/app/icons/layout.tsx @@ -0,0 +1,23 @@ +import { cn } from "@/lib/utils" +import type React from "react" + +interface BackgroundWrapperProps { + children: React.ReactNode +} + +export default function BackgroundWrapper({ children }: BackgroundWrapperProps) { + return ( + <> +
+
+
{children}
+ + ) +} diff --git a/web/src/app/icons/page.tsx b/web/src/app/icons/page.tsx index eb825316..a218be25 100644 --- a/web/src/app/icons/page.tsx +++ b/web/src/app/icons/page.tsx @@ -3,34 +3,48 @@ import { getIconsArray } from "@/lib/api" import type { Metadata } from "next" import { IconSearch } from "./components/icon-search" -export const metadata: Metadata = { - title: "Browse icons | Dashboard Icons", - description: "Search and browse through our collection of beautiful dashboard icons for your applications", - keywords: ["dashboard icons", "browse icons", "icon search", "free icons", "open source icons"], - openGraph: { - title: "Browse Dashboard Icons Collection", - description: "Search and browse through our collection of beautiful dashboard icons for your applications", - type: "website", - url: `${BASE_URL}/icons`, - images: [ - { - url: "/og-image-browse.png", - width: 1200, - height: 630, - alt: "Browse Dashboard Icons", - type: "image/png", - }, +export async function generateMetadata(): Promise { + const icons = await getIconsArray() + const totalIcons = icons.length + + return { + title: "Browse Icons | Free Dashboard Icons", + description: `Search and browse through our collection of ${totalIcons} curated icons for services, applications and tools, designed specifically for dashboards and app directories.`, + keywords: [ + "browse icons", + "dashboard icons", + "icon search", + "service icons", + "application icons", + "tool icons", + "web dashboard", + "app directory", ], - }, - twitter: { - card: "summary_large_image", - title: "Browse Dashboard Icons Collection", - description: "Search and browse through our collection of beautiful dashboard icons for your applications", - images: ["/og-image-browse.png"], - }, - alternates: { - canonical: `${BASE_URL}/icons`, - }, + openGraph: { + title: "Browse Icons | Free Dashboard Icons", + description: `Search and browse through our collection of ${totalIcons} curated icons for services, applications and tools, designed specifically for dashboards and app directories.`, + type: "website", + url: `${BASE_URL}/icons`, + images: [ + { + url: "/og-image.png", + width: 1200, + height: 630, + alt: "Browse Dashboard Icons Collection", + type: "image/png", + }, + ], + }, + twitter: { + card: "summary_large_image", + title: "Browse Icons | Free Dashboard Icons", + description: `Search and browse through our collection of ${totalIcons} curated icons for services, applications and tools, designed specifically for dashboards and app directories.`, + images: ["/og-image-browse.png"], + }, + alternates: { + canonical: `${BASE_URL}/icons`, + }, + } } export const dynamic = "force-static" @@ -38,16 +52,18 @@ export const dynamic = "force-static" export default async function IconsPage() { const icons = await getIconsArray() return ( -
-
-
-
-

Browse icons

-

Search through our collection of {icons.length} beautiful icons.

+
+
+
+
+
+

Browse icons

+

Search through our collection of {icons.length} beautiful icons.

+
-
- + +
) diff --git a/web/src/app/layout.tsx b/web/src/app/layout.tsx index cdb8e9d0..0734f2e8 100644 --- a/web/src/app/layout.tsx +++ b/web/src/app/layout.tsx @@ -1,114 +1,110 @@ -import { PostHogProvider } from "@/components/PostHogProvider"; -import { Header } from "@/components/header"; -import { LicenseNotice } from "@/components/license-notice"; -import type { Metadata, Viewport } from "next"; -import { Inter } from "next/font/google"; -import { Toaster } from "sonner"; -import "./globals.css"; -import { ThemeProvider } from "./theme-provider"; +import { PostHogProvider } from "@/components/PostHogProvider" +import { Footer } from "@/components/footer" +import { HeaderWrapper } from "@/components/header-wrapper" +import { LicenseNotice } from "@/components/license-notice" +import { getTotalIcons } from "@/lib/api" +import type { Metadata, Viewport } from "next" +import { Inter } from "next/font/google" +import { Toaster } from "sonner" +import "./globals.css" +import { ThemeProvider } from "./theme-provider" +import { getDescription, websiteTitle } from "@/constants" const inter = Inter({ variable: "--font-inter", subsets: ["latin"], -}); +}) export const viewport: Viewport = { width: "device-width", initialScale: 1, + minimumScale: 1, + maximumScale: 5, + userScalable: true, themeColor: "#ffffff", -}; + viewportFit: "cover", +} -export const metadata: Metadata = { - metadataBase: new URL("https://icons.homarr.dev"), - title: "Dashboard Icons", - description: "Curated icons for your dashboard", - keywords: [ - "dashboard", - "icons", - "open source", - "free icons", - "dashboard design", - ], - robots: { - index: true, - follow: true, - "max-image-preview": "large", - "max-snippet": -1, - "max-video-preview": -1, - googleBot: "index, follow", - }, - openGraph: { - siteName: "Dashboard Icons", - type: "website", - locale: "en_US", - title: "Dashboard Icons", - description: "Curated icons for your dashboard", - url: "https://icons.homarr.dev", - images: [ - { - url: "/og-image.png", - width: 1200, - height: 630, - alt: "Dashboard Icons", - type: "image/png", - }, - ], - }, - twitter: { - card: "summary_large_image", - site: "@homarr_app", - creator: "@homarr_app", - title: "Dashboard Icons", - description: "Curated icons for your dashboard", - images: ["/og-image.png"], - }, - applicationName: "Dashboard Icons", - appleWebApp: { - title: "Dashboard Icons", - statusBarStyle: "default", - capable: true, - }, - alternates: { - types: { - "application/rss+xml": "https://icons.homarr.dev/rss.xml", +export async function generateMetadata(): Promise { + const { totalIcons } = await getTotalIcons() + + return { + metadataBase: new URL("https://dashboardicons.com"), + title: websiteTitle, + description: getDescription(totalIcons), + keywords: ["dashboard icons", "service icons", "application icons", "tool icons", "web dashboard", "app directory"], + robots: { + index: true, + follow: true, + "max-image-preview": "large", + "max-snippet": -1, + "max-video-preview": -1, + googleBot: "index, follow", }, - }, - icons: { - icon: [ - { - url: "/favicon.ico", - type: "image/x-icon", - }, - ], - shortcut: [ - { - url: "/favicon.ico", - type: "image/x-icon", - }, - ], - }, -}; + openGraph: { + siteName: "Dashboard Icons", + type: "website", + locale: "en_US", + title: websiteTitle, + description: getDescription(totalIcons), + url: "https://dashboardicons.com", + images: [ + { + url: "/og-image.png", + width: 1200, + height: 630, + alt: "Dashboard Icons", + type: "image/png", + }, + ], + }, + twitter: { + card: "summary_large_image", + site: "@homarr_app", + creator: "@homarr_app", + title: websiteTitle, + description: getDescription(totalIcons), + images: ["/og-image.png"], + }, + applicationName: "Dashboard Icons", + appleWebApp: { + title: "Dashboard Icons", + statusBarStyle: "default", + capable: true, + }, + icons: { + icon: [ + { url: "/favicon.ico", sizes: "any" }, + { url: "/favicon-16x16.png", sizes: "16x16", type: "image/png" }, + { url: "/favicon-32x32.png", sizes: "32x32", type: "image/png" }, + ], + apple: [{ url: "/apple-touch-icon.png", sizes: "180x180", type: "image/png" }], + other: [ + { + rel: "mask-icon", + url: "/safari-pinned-tab.svg", + color: "#000000", + }, + ], + }, + manifest: "/site.webmanifest", + } +} -export default function RootLayout({ - children, -}: Readonly<{ children: React.ReactNode }>) { +export default function RootLayout({ children }: Readonly<{ children: React.ReactNode }>) { return ( - + - -
-
{children}
+ + +
{children}
+