├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ └── add-dots.yml ├── scripts │ └── auto-add-dotfile.mjs └── workflows │ └── convert.yml ├── assets └── reddit.svg ├── CONTRIBUTING.md ├── code-of-conduct.md ├── LICENCE └── README.md /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: 0pandadev -------------------------------------------------------------------------------- /assets/reddit.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing Guidelines 2 | 3 | Please note that this project is released with a [Contributor Code of Conduct](CODE-OF-CONDUCT.md). By participating in this project, you agree to abide by its terms. 4 | 5 | ## Table of Contents 6 | 7 | - [Pull Request Guidelines](#pull-request-guidelines) 8 | - [How to add to this list](#how-to-add-to-this-list) 9 | - [Updating your Pull Request](#updating-your-pull-request) 10 | 11 | ## Pull Request Guidelines 12 | 13 | Please ensure your pull request adheres to the following guidelines: 14 | 15 | - Search previous suggestions to make sure your suggestion isn't a duplicate. 16 | - Make sure each list item is useful before adding it. 17 | - Create individual pull requests/issues for each suggestion. 18 | - Use the following format: `- [Github Username](dotfiles-repo-link) - Description [![reddit][reddit]](link-to-reddit-post)` 19 | - Link additions should be added in alphabetical order in the relevant category. 20 | - New categories or changes to the existing categorization are welcome. 21 | - Check your spelling and grammar. 22 | - Make sure your text editor is set to remove trailing whitespace. 23 | - The pull request and commit should have a useful title. 24 | - Annotate your PR to clarify what you did if the diff is confusing. 25 | 26 | Thank you for your suggestions! 27 | 28 | ## How to add to this list 29 | 30 | Either make an issue with the template Add Application, which will then automatically create a pull request, or make your manual changes as follows: 31 | 32 | If you don't have a [GitHub account](https://github.com/join), make one! 33 | 34 | 1. Fork this repo. 35 | 2. Make changes under correct section in `README.md` 36 | 3. Update `Contents` (if applicable) 37 | 4. Commit and open a Pull Request 38 | 39 | ## Updating your Pull Request 40 | 41 | Sometimes, a maintainer of an awesome list will ask you to edit your Pull Request before it is included. This is normally due to spelling errors or because your PR didn't match the awesome-dotfiles list guidelines. 42 | 43 | [Here](https://github.com/RichardLitt/knowledge/blob/master/github/amending-a-commit-guide.md) is a write up on how to change a Pull Request, and the different ways you can do that. 44 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/add-dots.yml: -------------------------------------------------------------------------------- 1 | name: Add Dotfiles 2 | description: Add a dotfiles repo to the list 3 | labels: ["Add"] 4 | title: "[ADD] " 5 | assignees: 6 | - 0pandadev 7 | body: 8 | - type: markdown 9 | attributes: 10 | value: | 11 | Thanks for taking the time to suggest a dotfiles repo! 12 | Please fill out the form below to provide details about the dotfiles repo. 13 | 14 | - type: input 15 | id: dotfiles-url 16 | attributes: 17 | label: Dotfiles URL 18 | description: Provide the URL to the dotfiles repo 19 | placeholder: https://github.com/username/dotfiles 20 | validations: 21 | required: true 22 | 23 | - type: dropdown 24 | id: app-category 25 | attributes: 26 | label: DE or WM 27 | description: Which Desktop Environment or Window Manager does this dotfiles repo use? 28 | options: 29 | - dwm 30 | - Gnome 31 | - Hyprland 32 | - KDE 33 | - maomaowm 34 | - Niri 35 | - Sway 36 | - Yabai 37 | - i3 38 | - bspwm 39 | - AwesomeWM 40 | - Qtile 41 | - XFCE 42 | - Cinnamon 43 | - MATE 44 | - Budgie 45 | - LXQt 46 | - Openbox 47 | - Xmonad 48 | - Herbstluftwm 49 | - LeftWM 50 | - StumpWM 51 | - Spectrwm 52 | - DWL 53 | - River 54 | validations: 55 | required: true 56 | 57 | - type: input 58 | id: dotfiles-tagline 59 | attributes: 60 | label: Tagline 61 | description: A one sentence tagline for the dotfiles preferably the same as the r/unixporn reddit post title. 62 | validations: 63 | required: true 64 | 65 | - type: input 66 | id: reddit-url 67 | attributes: 68 | label: Reddit URL (optional) 69 | description: Provide the URL to the r/unixporn reddit post 70 | placeholder: https://www.reddit.com/r/unixporn/... 71 | validations: 72 | required: false 73 | 74 | - type: textarea 75 | id: image 76 | attributes: 77 | label: Preview Image 78 | description: Paste an image here. 79 | placeholder: It should look like this ![Image](https://github.com/user-attachments/assets/84884a94-7a7b-4b43-854b-f2a6a88d00a1) 80 | validations: 81 | required: true 82 | 83 | - type: checkboxes 84 | id: auto-convert 85 | attributes: 86 | label: Automatically Add to list 87 | description: If this is checked the issue will be converted to a PR in your name and automatically added to the list. 88 | options: 89 | - label: I want to automatically add it 90 | required: false 91 | 92 | - type: checkboxes 93 | id: terms 94 | attributes: 95 | label: Code of Conduct 96 | description: By submitting this issue, you agree to follow our [Code of Conduct](https://github.com/0pandadev/awesome-dotfiles/blob/main/code-of-conduct.md) 97 | options: 98 | - label: I agree to follow this project's Code of Conduct 99 | required: true 100 | -------------------------------------------------------------------------------- /code-of-conduct.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, gender identity and expression, level of experience, 9 | nationality, personal appearance, race, religion, or sexual identity and 10 | orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | * Using welcoming and inclusive language 18 | * Being respectful of differing viewpoints and experiences 19 | * Gracefully accepting constructive criticism 20 | * Focusing on what is best for the community 21 | * Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | * The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | * Trolling, insulting/derogatory comments, and personal or political attacks 28 | * Public or private harassment 29 | * Publishing others' private information, such as physical or electronic 30 | address, without explicit permission 31 | * Other conduct that could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team at . All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 | available at [https://contributor-covenant.org/version/1/4][version] 72 | 73 | [homepage]: https://contributor-covenant.org 74 | [version]: https://contributor-covenant.org/version/1/4/ 75 | -------------------------------------------------------------------------------- /.github/scripts/auto-add-dotfile.mjs: -------------------------------------------------------------------------------- 1 | import { readFile, writeFile } from "fs/promises"; 2 | 3 | let issueRaw = ""; 4 | for await (const chunk of process.stdin) { 5 | issueRaw += chunk; 6 | } 7 | 8 | const issue = JSON.parse(issueRaw); 9 | const issueNumber = issue.number; 10 | 11 | const getField = (id) => { 12 | const patterns = [ 13 | new RegExp( 14 | `(?:^|\\n)\\s*### ${id.replace( 15 | /[-]/g, 16 | "[-]", 17 | )}\\n([\\s\\S]*?)(?=\\n### |$)`, 18 | "i", 19 | ), 20 | new RegExp( 21 | `### ${id.replace(/[-]/g, "[-]")}\\n([\\s\\S]*?)(?=\\n### |$)`, 22 | "i", 23 | ), 24 | ]; 25 | 26 | for (const pattern of patterns) { 27 | const match = issue.body.match(pattern); 28 | if (match) { 29 | const result = match[1].trim(); 30 | console.log(`Found ${id}: "${result}"`); 31 | return result; 32 | } 33 | } 34 | 35 | console.log(`Field "${id}" not found in issue body`); 36 | return ""; 37 | }; 38 | 39 | const getCheckbox = (id, label) => { 40 | const re = new RegExp(`- \\[([ xX])\\] ${label}`); 41 | const f = issue.body.match(re); 42 | return f && f[1] !== " " ? true : false; 43 | }; 44 | 45 | const findInsertionPoint = (sectionContent, username) => { 46 | const tableRegex = /[\s\S]*?<\/table>/g; 47 | const tables = sectionContent.match(tableRegex) || []; 48 | 49 | const existingEntries = tables 50 | .map((table) => { 51 | const usernameMatch = table.match(/([^<]+)<\/a>/); 52 | return usernameMatch ? usernameMatch[1] : ""; 53 | }) 54 | .filter((name) => name); 55 | 56 | let insertionIndex = 0; 57 | for (let i = 0; i < existingEntries.length; i++) { 58 | if (username.toLowerCase() < existingEntries[i].toLowerCase()) { 59 | insertionIndex = i; 60 | break; 61 | } 62 | insertionIndex = i + 1; 63 | } 64 | 65 | return { insertionIndex, totalEntries: existingEntries.length }; 66 | }; 67 | 68 | const autoConvertChecked = getCheckbox( 69 | "auto-convert", 70 | "I want to automatically add it", 71 | ); 72 | if (!autoConvertChecked) process.exit(0); 73 | 74 | const dotfilesUrl = getField("Dotfiles URL"); 75 | const appCategory = getField("DE or WM"); 76 | const description = getField("Tagline"); 77 | const redditUrl = getField("Reddit URL \\(optional\\)"); 78 | const image = getField("Preview Image"); 79 | 80 | const username = dotfilesUrl 81 | .replace(/https:\/\/github.com\//, "") 82 | .split("/")[0]; 83 | const imgMatch = image.match(/!\[.*?\]\((.*?)\)/); 84 | const imgUrl = imgMatch ? imgMatch[1] : ""; 85 | 86 | const section = appCategory.replace(/ /g, ""); 87 | const readmePath = "README.md"; 88 | const readme = await readFile(readmePath, "utf8"); 89 | const sectionHeader = `# ${section}`; 90 | const sectionIndex = readme.indexOf(sectionHeader); 91 | if (sectionIndex === -1) process.exit(1); 92 | const nextSection = readme.indexOf("# ", sectionIndex + 1); 93 | const sectionContent = readme.slice( 94 | sectionIndex, 95 | nextSection === -1 ? undefined : nextSection, 96 | ); 97 | const beforeSection = readme.slice(0, sectionIndex); 98 | const afterSection = nextSection === -1 ? "" : readme.slice(nextSection); 99 | 100 | const validRedditUrl = 101 | redditUrl && redditUrl !== "_No response_" ? redditUrl : "#"; 102 | const table = `
\n \n \n \n \n \n \n
\n ${username} - ${description}\n
\n \n \"reddit\n \n
\n\n`; 103 | 104 | const { insertionIndex } = findInsertionPoint(sectionContent, username); 105 | 106 | const tableRegex = /[\s\S]*?<\/table>/g; 107 | const existingTables = sectionContent.match(tableRegex) || []; 108 | 109 | let newSectionContent = sectionHeader + "\n\n"; 110 | for (let i = 0; i < existingTables.length; i++) { 111 | if (i === insertionIndex) { 112 | newSectionContent += table; 113 | } 114 | newSectionContent += existingTables[i] + "\n\n"; 115 | } 116 | 117 | if (insertionIndex >= existingTables.length) { 118 | newSectionContent += table; 119 | } 120 | 121 | const newReadme = beforeSection + newSectionContent + afterSection; 122 | 123 | await writeFile(readmePath, newReadme, "utf8"); 124 | 125 | console.log("=== Extraction Results ==="); 126 | console.log(`Username: "${username}"`); 127 | console.log(`Section: "${section}"`); 128 | console.log(`Description: "${description}"`); 129 | console.log(`Dotfiles URL: "${dotfilesUrl}"`); 130 | console.log(`Reddit URL: "${redditUrl || "N/A"}"`); 131 | console.log(`Image URL: "${imgUrl}"`); 132 | console.log("========================="); 133 | 134 | console.log( 135 | `✅ Updated ${readmePath} with ${username}'s dotfiles for ${section}`, 136 | ); 137 | console.log(`📝 Description: ${description}`); 138 | console.log(`🔗 Dotfiles URL: ${dotfilesUrl}`); 139 | console.log(`📱 Reddit URL: ${redditUrl || "N/A"}`); 140 | -------------------------------------------------------------------------------- /.github/workflows/convert.yml: -------------------------------------------------------------------------------- 1 | name: Auto Convert Add Dotfiles 2 | 3 | on: 4 | issues: 5 | types: [opened] 6 | workflow_dispatch: 7 | inputs: 8 | issue_number: 9 | description: "Issue number to process" 10 | required: true 11 | type: string 12 | 13 | permissions: 14 | contents: write 15 | pull-requests: write 16 | issues: write 17 | 18 | jobs: 19 | auto-convert: 20 | runs-on: ubuntu-latest 21 | steps: 22 | - name: Get issue body (manual) 23 | if: github.event_name == 'workflow_dispatch' 24 | id: get_issue 25 | uses: actions/github-script@v7 26 | with: 27 | script: | 28 | const issue_number = context.payload.inputs.issue_number 29 | console.log('Using issue_number:', issue_number) 30 | const issue = await github.rest.issues.get({ 31 | owner: context.repo.owner, 32 | repo: context.repo.repo, 33 | issue_number: parseInt(issue_number) 34 | }) 35 | core.setOutput('body', issue.data.body) 36 | core.setOutput('json', JSON.stringify(issue.data)) 37 | - name: Check for auto-convert checkbox 38 | id: check_autoconvert 39 | run: | 40 | BODY="${{ github.event.issue.body }}" 41 | if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then 42 | BODY="${{ steps.get_issue.outputs.body }}" 43 | fi 44 | if [[ "$BODY" = *"- [x] I want to automatically add it"* ]] || [[ "$BODY" = *"- [X] I want to automatically add it"* ]]; then 45 | echo "auto_convert=true" >> $GITHUB_OUTPUT 46 | else 47 | echo "auto_convert=false" >> $GITHUB_OUTPUT 48 | fi 49 | - name: Checkout repo 50 | if: steps.check_autoconvert.outputs.auto_convert == 'true' 51 | uses: actions/checkout@v4 52 | - name: Set up Node.js 53 | if: steps.check_autoconvert.outputs.auto_convert == 'true' 54 | uses: oven-sh/setup-bun@v1 55 | with: 56 | bun-version: latest 57 | - name: Run auto-add-dotfile script 58 | if: steps.check_autoconvert.outputs.auto_convert == 'true' 59 | env: 60 | ISSUE_JSON: ${{ github.event_name == 'workflow_dispatch' && steps.get_issue.outputs.json || toJson(github.event.issue) }} 61 | run: | 62 | echo "$ISSUE_JSON" | bun .github/scripts/auto-add-dotfile.mjs 63 | - name: Extract dotfiles info for PR 64 | if: steps.check_autoconvert.outputs.auto_convert == 'true' 65 | id: dotfiles_info 66 | env: 67 | ISSUE_JSON: ${{ github.event_name == 'workflow_dispatch' && steps.get_issue.outputs.json || toJson(github.event.issue) }} 68 | run: | 69 | ISSUE_DATA=$(echo "$ISSUE_JSON") 70 | BODY=$(echo "$ISSUE_DATA" | jq -r '.body') 71 | 72 | # Extract username from dotfiles URL using more robust parsing 73 | DOTFILES_URL=$(echo "$BODY" | sed -n '/### Dotfiles URL/,/### /p' | grep "https://github.com/" | head -1 | xargs) 74 | USERNAME=$(echo "$DOTFILES_URL" | sed 's|https://github.com/||' | cut -d'/' -f1) 75 | 76 | # Extract section from DE or WM field 77 | SECTION=$(echo "$BODY" | sed -n '/### DE or WM/,/###/p' | grep -v "###" | grep -v "^$" | head -1 | xargs) 78 | 79 | # Extract issue number 80 | ISSUE_NUM=$(echo "$ISSUE_DATA" | jq -r '.number') 81 | 82 | echo "DEBUG: USERNAME='$USERNAME'" 83 | echo "DEBUG: SECTION='$SECTION'" 84 | echo "DEBUG: ISSUE_NUM='$ISSUE_NUM'" 85 | 86 | echo "username=$USERNAME" >> $GITHUB_OUTPUT 87 | echo "section=$SECTION" >> $GITHUB_OUTPUT 88 | echo "issue_number=$ISSUE_NUM" >> $GITHUB_OUTPUT 89 | - name: Create Pull Request 90 | if: steps.check_autoconvert.outputs.auto_convert == 'true' 91 | id: create_pr 92 | uses: peter-evans/create-pull-request@v5 93 | with: 94 | token: ${{ secrets.GITHUB_TOKEN }} 95 | commit-message: "feat(readme): add ${{ steps.dotfiles_info.outputs.username }} dotfiles for ${{ steps.dotfiles_info.outputs.section }}" 96 | title: "add: ${{ steps.dotfiles_info.outputs.username }} dotfiles for ${{ steps.dotfiles_info.outputs.section }}" 97 | body: | 98 | Closes #${{ steps.dotfiles_info.outputs.issue_number }} 99 | 100 | Auto-generated PR from issue #${{ steps.dotfiles_info.outputs.issue_number }} 101 | 102 | Added ${{ steps.dotfiles_info.outputs.username }}'s dotfiles to the ${{ steps.dotfiles_info.outputs.section }} section. 103 | branch: "auto/add-dotfile-${{ steps.dotfiles_info.outputs.issue_number }}" 104 | delete-branch: true 105 | assignees: 0PandaDEV 106 | - name: Comment on issue 107 | if: steps.check_autoconvert.outputs.auto_convert == 'true' && steps.create_pr.outputs.pull-request-number 108 | uses: actions/github-script@v7 109 | with: 110 | script: | 111 | const issueNumber = ${{ steps.dotfiles_info.outputs.issue_number }}; 112 | const prNumber = ${{ steps.create_pr.outputs.pull-request-number }}; 113 | const username = '${{ steps.dotfiles_info.outputs.username }}'; 114 | const section = '${{ steps.dotfiles_info.outputs.section }}'; 115 | 116 | // Comment on the issue with PR link 117 | await github.rest.issues.createComment({ 118 | owner: context.repo.owner, 119 | repo: context.repo.repo, 120 | issue_number: issueNumber, 121 | body: `🎉 **Automation Success!** 122 | 123 | Your dotfiles have been automatically processed and added to the list! 124 | 125 | **Details:** 126 | - **Username:** ${username} 127 | - **Section:** ${section} 128 | - **Pull Request:** #${prNumber} 129 | 130 | The pull request has been created and your dotfiles will be visible once it's merged. Thank you for contributing to awesome-unixporn! ✨ 131 | }); 132 | -------------------------------------------------------------------------------- /LICENCE: -------------------------------------------------------------------------------- 1 | Creative Commons Legal Code 2 | 3 | CC0 1.0 Universal 4 | 5 | CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE 6 | LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN 7 | ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS 8 | INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES 9 | REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS 10 | PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM 11 | THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED 12 | HEREUNDER. 13 | 14 | Statement of Purpose 15 | 16 | The laws of most jurisdictions throughout the world automatically confer 17 | exclusive Copyright and Related Rights (defined below) upon the creator 18 | and subsequent owner(s) (each and all, an "owner") of an original work of 19 | authorship and/or a database (each, a "Work"). 20 | 21 | Certain owners wish to permanently relinquish those rights to a Work for 22 | the purpose of contributing to a commons of creative, cultural and 23 | scientific works ("Commons") that the public can reliably and without fear 24 | of later claims of infringement build upon, modify, incorporate in other 25 | works, reuse and redistribute as freely as possible in any form whatsoever 26 | and for any purposes, including without limitation commercial purposes. 27 | These owners may contribute to the Commons to promote the ideal of a free 28 | culture and the further production of creative, cultural and scientific 29 | works, or to gain reputation or greater distribution for their Work in 30 | part through the use and efforts of others. 31 | 32 | For these and/or other purposes and motivations, and without any 33 | expectation of additional consideration or compensation, the person 34 | associating CC0 with a Work (the "Affirmer"), to the extent that he or she 35 | is an owner of Copyright and Related Rights in the Work, voluntarily 36 | elects to apply CC0 to the Work and publicly distribute the Work under its 37 | terms, with knowledge of his or her Copyright and Related Rights in the 38 | Work and the meaning and intended legal effect of CC0 on those rights. 39 | 40 | 1. Copyright and Related Rights. A Work made available under CC0 may be 41 | protected by copyright and related or neighboring rights ("Copyright and 42 | Related Rights"). Copyright and Related Rights include, but are not 43 | limited to, the following: 44 | 45 | i. the right to reproduce, adapt, distribute, perform, display, 46 | communicate, and translate a Work; 47 | ii. moral rights retained by the original author(s) and/or performer(s); 48 | iii. publicity and privacy rights pertaining to a person's image or 49 | likeness depicted in a Work; 50 | iv. rights protecting against unfair competition in regards to a Work, 51 | subject to the limitations in paragraph 4(a), below; 52 | v. rights protecting the extraction, dissemination, use and reuse of data 53 | in a Work; 54 | vi. database rights (such as those arising under Directive 96/9/EC of the 55 | European Parliament and of the Council of 11 March 1996 on the legal 56 | protection of databases, and under any national implementation 57 | thereof, including any amended or successor version of such 58 | directive); and 59 | vii. other similar, equivalent or corresponding rights throughout the 60 | world based on applicable law or treaty, and any national 61 | implementations thereof. 62 | 63 | 2. Waiver. To the greatest extent permitted by, but not in contravention 64 | of, applicable law, Affirmer hereby overtly, fully, permanently, 65 | irrevocably and unconditionally waives, abandons, and surrenders all of 66 | Affirmer's Copyright and Related Rights and associated claims and causes 67 | of action, whether now known or unknown (including existing as well as 68 | future claims and causes of action), in the Work (i) in all territories 69 | worldwide, (ii) for the maximum duration provided by applicable law or 70 | treaty (including future time extensions), (iii) in any current or future 71 | medium and for any number of copies, and (iv) for any purpose whatsoever, 72 | including without limitation commercial, advertising or promotional 73 | purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each 74 | member of the public at large and to the detriment of Affirmer's heirs and 75 | successors, fully intending that such Waiver shall not be subject to 76 | revocation, rescission, cancellation, termination, or any other legal or 77 | equitable action to disrupt the quiet enjoyment of the Work by the public 78 | as contemplated by Affirmer's express Statement of Purpose. 79 | 80 | 3. Public License Fallback. Should any part of the Waiver for any reason 81 | be judged legally invalid or ineffective under applicable law, then the 82 | Waiver shall be preserved to the maximum extent permitted taking into 83 | account Affirmer's express Statement of Purpose. In addition, to the 84 | extent the Waiver is so judged Affirmer hereby grants to each affected 85 | person a royalty-free, non transferable, non sublicensable, non exclusive, 86 | irrevocable and unconditional license to exercise Affirmer's Copyright and 87 | Related Rights in the Work (i) in all territories worldwide, (ii) for the 88 | maximum duration provided by applicable law or treaty (including future 89 | time extensions), (iii) in any current or future medium and for any number 90 | of copies, and (iv) for any purpose whatsoever, including without 91 | limitation commercial, advertising or promotional purposes (the 92 | "License"). The License shall be deemed effective as of the date CC0 was 93 | applied by Affirmer to the Work. Should any part of the License for any 94 | reason be judged legally invalid or ineffective under applicable law, such 95 | partial invalidity or ineffectiveness shall not invalidate the remainder 96 | of the License, and in such case Affirmer hereby affirms that he or she 97 | will not (i) exercise any of his or her remaining Copyright and Related 98 | Rights in the Work or (ii) assert any associated claims and causes of 99 | action with respect to the Work, in either case contrary to Affirmer's 100 | express Statement of Purpose. 101 | 102 | 4. Limitations and Disclaimers. 103 | 104 | a. No trademark or patent rights held by Affirmer are waived, abandoned, 105 | surrendered, licensed or otherwise affected by this document. 106 | b. Affirmer offers the Work as-is and makes no representations or 107 | warranties of any kind concerning the Work, express, implied, 108 | statutory or otherwise, including without limitation warranties of 109 | title, merchantability, fitness for a particular purpose, non 110 | infringement, or the absence of latent or other defects, accuracy, or 111 | the present or absence of errors, whether or not discoverable, all to 112 | the greatest extent permissible under applicable law. 113 | c. Affirmer disclaims responsibility for clearing rights of other persons 114 | that may apply to the Work or any use thereof, including without 115 | limitation any person's Copyright and Related Rights in the Work. 116 | Further, Affirmer disclaims responsibility for obtaining any necessary 117 | consents, permissions or other rights required for any use of the 118 | Work. 119 | d. Affirmer understands and acknowledges that Creative Commons is not a 120 | party to this document and has no duty or obligation with respect to 121 | this CC0 or use of the Work. 122 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![Awesome Dotfiles](https://github.com/user-attachments/assets/a65d939e-8b2f-41a0-aebd-330573736b1a) 2 | 3 | This is a collection of dotfiles from the best and most unique [r/unixporn](https://www.reddit.com/r/unixporn/) posts. All the dotfiles are grouped by the Desktop Environment or Window Manager that was used. 4 | 5 | > \[!IMPORTANT] 6 | > 7 | > **Star this list**, So you don't miss out on the latest dotfiles \~ ⭐️ 8 | > 9 | > [discord](https://discord.gg/invite/Y7SbYphVw9) - [pandadev.net](https://pandadev.net) 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
Click on the username to get to the dotfiles.
Click on the image to get to the reddit post.
21 | 22 | ###### [Check out my dotfiles](https://github.com/0PandaDEV/dotfiles) 23 | 24 | # Contents 25 | 26 | - [AwesomeWM](#awesomewm) 27 | - [bspwm](#bspwm) 28 | - [Budgie](#budgie) 29 | - [Cinnamon](#cinnamon) 30 | - [DWL](#dwl) 31 | - [dwm](#dwm) 32 | - [Gnome](#gnome) 33 | - [Herbstluftwm](#herbstluftwm) 34 | - [Hyprland](#hyprland) 35 | - [i3](#i3) 36 | - [KDE](#kde) 37 | - [LeftWM](#leftwm) 38 | - [LXQt](#lxqt) 39 | - [maomaowm](#maomaowm) 40 | - [MATE](#mate) 41 | - [Niri](#niri) 42 | - [Openbox](#openbox) 43 | - [Qtile](#qtile) 44 | - [River](#river) 45 | - [Spectrwm](#spectrwm) 46 | - [StumpWM](#stumpwm) 47 | - [Sway](#sway) 48 | - [XFCE](#xfce) 49 | - [Xmonad](#xmonad) 50 | - [Yabai](#yabai) 51 | 52 | # AwesomeWM 53 | 54 | # bspwm 55 | 56 | # Budgie 57 | 58 | # Cinnamon 59 | 60 | # DWL 61 | 62 | # dwm 63 | 64 | 65 | 66 | 69 | 70 | 71 | 76 | 77 |
67 | AlexTheGreat600 - I love dmenu. 68 |
72 | 73 | reddit post 74 | 75 |
78 | 79 | 80 | 81 | 84 | 85 | 86 | 91 | 92 |
82 | Pixel2175 - pywal but if its Fast-Minimal-Simple. 83 |
87 | 88 | reddit post 89 | 90 |
93 | 94 | 95 | 96 | 99 | 100 | 101 | 106 | 107 |
97 | sansroot - dwm or hyprland? 98 |
102 | 103 | reddit post 104 | 105 |
108 | 109 | # Gnome 110 | 111 | 112 | 113 | 116 | 117 | 118 | 123 | 124 |
114 | Aevstiel - Redo of my older rice with my own color palette. 115 |
119 | 120 | reddit post 121 | 122 |
125 | 126 | 127 | 128 | 131 | 132 | 133 | 138 | 139 |
129 | kayozxo - macOS Tahoe but BETTER. 130 |
134 | 135 | reddit post 136 | 137 |
140 | 141 | 142 | 143 | 146 | 147 | 148 | 153 | 154 |
144 | SakibShahariar - Minimal, magical, Material You 145 |
149 | 150 | reddit post 151 | 152 |
155 | 156 | # Hyprland 157 | 158 | 159 | 160 | 163 | 164 | 165 | 170 | 171 |
161 | ad1822 - Simple and Productive. 162 |
166 | 167 | reddit post 168 | 169 |
172 | 173 | 174 | 175 | 178 | 179 | 180 | 185 | 186 |
176 | Beast-Viper - My Colourful Hyprland setup. 177 |
181 | 182 | reddit post 183 | 184 |
187 | 188 | 189 | 190 | 193 | 194 | 195 | 200 | 201 |
191 | Chiron8 - My first rice (and using Gentoo!) 192 |
196 | 197 | reddit post 198 | 199 |
202 | 203 | 204 | 205 | 208 | 209 | 210 | 215 | 216 |
206 | dillacorn - Simple dynamic Hypr setup - app installation scripts included. 207 |
211 | 212 | reddit post 213 | 214 |
217 | 218 | 219 | 220 | 223 | 224 | 225 | 230 | 231 |
221 | dybdeskarhet - what are they talking about? 222 |
226 | 227 | reddit post 228 | 229 |
232 | 233 | 234 | 235 | 238 | 239 | 240 | 245 | 246 |
236 | fakesproink - Right about where it should be. 237 |
241 | 242 | reddit post 243 | 244 |
247 | 248 | 249 | 250 | 253 | 254 | 255 | 260 | 261 |
251 | GarroNinja - Minimal gruvbox themed rice. 252 |
256 | 257 | reddit post 258 | 259 |
262 | 263 | 264 | 265 | 268 | 269 | 270 | 275 | 276 |
266 | ghvchsauce - my first rice. 267 |
271 | 272 | reddit post 273 | 274 |
277 | 278 | 279 | 280 | 283 | 284 | 285 | 290 | 291 |
281 | gkkconan - Double themed hyprland dotfiles: lightweight, clean and designed for productivity. 282 |
286 | 287 | reddit post 288 | 289 |
292 | 293 | 294 | 295 | 298 | 299 | 300 | 305 | 306 |
296 | n6v26r - Now I understand the hype 297 |
301 | 302 | reddit post 303 | 304 |
307 | 308 | 309 | 310 | 313 | 314 | 315 | 320 | 321 |
311 | papengav - Minimal Catpuccin + Macchiato. 312 |
316 | 317 | reddit post 318 | 319 |
322 | 323 | 324 | 325 | 328 | 329 | 330 | 335 | 336 |
326 | Sem1Rose - My first Material Design rice with Hyprland & Fabric 327 |
331 | 332 | reddit post 333 | 334 |
337 | 338 | 339 | 340 | 343 | 344 | 345 | 350 | 351 |
341 | SherLock707 - Tiling and Ultrawide: Keeping It Fresh – The Same Colors Get Old Fast! 342 |
346 | 347 | reddit post 348 | 349 |
352 | 353 | 354 | 355 | 358 | 359 | 360 | 365 | 366 |
356 | soramannew - I <3 Quickshell. 357 |
361 | 362 | reddit post 363 | 364 |
367 | 368 | # KDE 369 | 370 | 371 | 372 | 375 | 376 | 377 | 382 | 383 |
373 | yayuuu - My Plasma thinks it's Gnome. 374 |
378 | 379 | reddit post 380 | 381 |
384 | 385 | # maomaowm 386 | 387 | 388 | 389 | 392 | 393 | 394 | 399 | 400 |
390 | DreamMaoMao - more concise style. 391 |
395 | 396 | reddit post 397 | 398 |
401 | 402 | # Niri 403 | 404 | 405 | 406 | 409 | 410 | 411 | 416 | 417 |
407 | binarylinuxx - graphite nvim. 408 |
412 | 413 | reddit post 414 | 415 |
418 | 419 | # Qtile 420 | 421 | 422 | 423 | 426 | 427 | 428 | 433 | 434 |
424 | Darkkal44 - E-Ink Cozytile. 425 |
429 | 430 | reddit post 431 | 432 |
435 | 436 | # Sway 437 | 438 | 439 | 440 | 443 | 444 | 445 | 450 | 451 |
441 | auth-xyz - simple-ish swayfx rice. 442 |
446 | 447 | reddit post 448 | 449 |
452 | 453 | 454 | 455 | 458 | 459 | 460 | 465 | 466 |
456 | RYLKYA - Red themed rice. 457 |
461 | 462 | reddit post 463 | 464 |
467 | 468 | 469 | 470 | 473 | 474 | 475 | 480 | 481 |
471 | senni-huemwang - as minimal as one can get. 472 |
476 | 477 | reddit post 478 | 479 |
482 | 483 | # Herbstluftwm 484 | 485 | # i3 486 | 487 | 488 | 489 | 492 | 493 | 494 | 499 | 500 |
490 | n6v26r - Simple and colorful - Catppuccin Mocha theme 491 |
495 | 496 | reddit post 497 | 498 |
501 | 502 | # LeftWM 503 | 504 | # LXQt 505 | 506 | # MATE 507 | 508 | # Openbox 509 | 510 | # River 511 | 512 | # Spectrwm 513 | 514 | # StumpWM 515 | 516 | # XFCE 517 | 518 | # Xmonad 519 | 520 | 521 | 522 | 525 | 526 | 527 | 532 | 533 |
523 | Limak15 - Simple, minimalistic desktop. 524 |
528 | 529 | reddit post 530 | 531 |
534 | 535 | # Yabai 536 | 537 | 538 | 539 | 542 | 543 | 544 | 549 | 550 |
540 | moonlinx - My first MacOS rice! I hope you all like it :) 541 |
545 | 546 | reddit post 547 | 548 |
551 | --------------------------------------------------------------------------------