DEV Community

Cover image for 6 Merged PRs, 6 Different Projects, 583 Lines of Code: My Hacktoberfest 2025 Story
devkumar2313
devkumar2313

Posted on

6 Merged PRs, 6 Different Projects, 583 Lines of Code: My Hacktoberfest 2025 Story

Hacktoberfest: Contribution Chronicles

My Hacktoberfest 2025 Journey: 6 Contributions That Shaped My Growth 🚀

Hacktoberfest 2025 has been an incredible journey of learning, collaboration, and growth! I successfully completed the challenge with 6 merged pull requests across diverse open-source projects - from fixing CI/CD pipelines to implementing user-facing features. Here's my story of contribution, debugging, and what I learned along the way.

🎯 Overview of My Contributions

# Project Contribution Type Impact Key Learning
1 FreshBooks PHP SDK CI/CD Enhancement ✅ Merged PHP 8.4 support & modernizing workflows
2 CanonForces Bug Fix ✅ Merged YAML syntax & GitHub Actions debugging
3 Easy Fix Workflow Fix ✅ Merged Replacing deprecated actions
4 Footballer Predictor Feature Addition ✅ Merged Dark theme & UI/UX enhancements
5 SalamLang Repository Organization ✅ Merged Project structure best practices
6 Leetcode Solutions Algorithm Implementation ✅ Merged Problem-solving & optimization

Total Impact: 583 lines added, 53 lines deleted across 6 repositories 📊


📖 Detailed Contribution Stories

Contribution #1: FreshBooks PHP SDK - Adding PHP 8.4 Support 🐘

🔗 PR Link: #71

🏷️ Issue: #69

📊 Changes: +2 / -2 lines

⏱️ Merged: October 1, 2025

The Challenge

The FreshBooks PHP SDK needed to support PHP 8.4 (the latest PHP release) in its CI testing matrix. The project was only testing against PHP 8.0-8.3, which meant potential compatibility issues with the newest version could go undetected.

My Approach

I upgraded the GitHub Actions workflow to include PHP 8.4 in the testing matrix:

# Before
matrix:
  php: [8.0, 8.1, 8.2, 8.3]
  dependency-version: [prefer-lowest, prefer-stable]

# After
matrix:
  php: [8.0, 8.1, 8.2, 8.3, 8.4]
  dependency-version: [prefer-lowest, prefer-stable]
Enter fullscreen mode Exit fullscreen mode

Additionally, I modernized the workflow by updating actions/cache from v2 to v4 for better performance and compatibility.

What I Learned

  • Version Matrix Testing: How to properly configure CI/CD pipelines to test against multiple language versions
  • GitHub Actions Best Practices: The importance of keeping actions up-to-date
  • PHP Ecosystem: Understanding PHP's release cycle and backward compatibility considerations

Impact

This ensures the SDK remains compatible with the latest PHP version, giving developers confidence to upgrade and providing early detection of any PHP 8.4 compatibility issues.


Contribution #2: CanonForces - Fixing Critical YAML Syntax Errors 🔧

🔗 PR Link: #68

🏷️ Issue: #67

📊 Changes: +58 / -47 lines

⏱️ Merged: October 1, 2025

🏆 Labels: Easy, hacktoberfest-accepted

The Challenge

The CanonForces project had broken GitHub Actions workflows with:

  • Incorrect YAML indentation causing syntax errors
  • Hardcoded usernames (@aviralsaxena16) instead of dynamic references
  • Missing error handling for comment creation failures
  • Incomplete YAML structure closures

My Approach

I completely refactored two workflow files:

# Before - Hardcoded username
- name: Comment on issue
  run: echo "Thanks @aviralsaxena16 for creating this issue!"

# After - Dynamic username extraction
- name: Comment on issue
  run: |
    username="${{ github.event.issue.user.login }}"
    echo "Thanks @${username} for creating this issue!"
Enter fullscreen mode Exit fullscreen mode

Key improvements:

  • Fixed YAML indentation and structure
  • Added comprehensive error handling with try-catch blocks
  • Implemented dynamic username extraction using GitHub context
  • Added proper logging with core.setFailed()

What I Learned

  • YAML Syntax Mastery: Deep understanding of proper YAML formatting and common pitfalls
  • GitHub Actions Context: How to use github.event to access PR/issue metadata dynamically
  • Error Handling: Importance of robust error handling in CI/CD workflows
  • Code Review Process: Received valuable feedback from maintainers on my approach

Impact

This fix prevented silent workflow failures and personalized the automated commenting system, improving contributor experience for future participants.


Contribution #3: Easy Fix - Replacing Deprecated GitHub Action 🔄

🔗 PR Link: #106

🏷️ Issue: #103

📊 Changes: +5 / -2 lines

⏱️ Merged: October 1, 2025

The Challenge

The auto-labeling workflow was completely broken with the error:

Error: Unable to resolve action actions-ecosystem/action-labeler, repository not found
Enter fullscreen mode Exit fullscreen mode

The project was using a deprecated action that no longer exists, causing CI/CD pipeline failures.

My Approach

I replaced the non-existent action with the official GitHub labeler:

# Before (Broken)
- name: Auto-label PR based on status and content
  uses: actions-ecosystem/action-labeler@v1  # ❌ Repository not found
  with:
    configuration-path: .github/labeler.yml

# After (Fixed)
- name: Auto-label PR based on status and content
  uses: actions/labeler@v5  # ✅ Official GitHub action
  with:
    configuration-path: .github/labeler.yml
Enter fullscreen mode Exit fullscreen mode

Additional improvements:

  • Added required permissions: contents: read and pull-requests: write
  • Updated actions/checkout from v3 to v4
  • Maintained backward compatibility with existing config file

What I Learned

  • Action Deprecation: How to identify and replace deprecated GitHub Actions
  • Permissions Management: Understanding GitHub Actions permission requirements
  • Migration Strategies: Best practices for updating CI/CD dependencies

Impact

Restored the auto-labeling functionality, improving project organization and reducing manual work for maintainers.


Contribution #4: Footballer Predictor - Dark Theme & UI Enhancements 🌙⚽

🔗 PR Link: #4

🏷️ Issue: #1

📊 Changes: +446 / -1 lines (Largest contribution!)

⏱️ Merged: October 1, 2025

The Challenge

This was my most substantial contribution! The issue requested:

  1. Adding player name captions below footballer images
  2. Implementing a dark/light theme toggle with persistence

My Approach

Feature 1: Player Name Captions

// Before - Simple image array
const images = ["image1.jpg", "image2.jpg", "image3.jpg"];

// After - Structured footballer objects
const footballers = [
  { name: "Lionel Messi", image: "messi.jpg" },
  { name: "Cristiano Ronaldo", image: "ronaldo.jpg" },
  { name: "Neymar Jr", image: "neymar.jpg" }
];
Enter fullscreen mode Exit fullscreen mode

Feature 2: Theme Toggle with Persistence

// Theme toggle functionality
function toggleTheme() {
  const currentTheme = document.documentElement.getAttribute('data-theme');
  const newTheme = currentTheme === 'dark' ? 'light' : 'dark';

  document.documentElement.setAttribute('data-theme', newTheme);
  localStorage.setItem('theme', newTheme);
  updateThemeIcon(newTheme);
}

// Load saved theme on page load
window.addEventListener('DOMContentLoaded', () => {
  const savedTheme = localStorage.getItem('theme') || 'light';
  document.documentElement.setAttribute('data-theme', savedTheme);
  updateThemeIcon(savedTheme);
});
Enter fullscreen mode Exit fullscreen mode

CSS Implementation:

/* CSS Custom Properties for theming */
:root {
  --bg-primary: #ffffff;
  --text-primary: #000000;
  --card-bg: #f5f5f5;
}

[data-theme='dark'] {
  --bg-primary: #1a1a1a;
  --text-primary: #ffffff;
  --card-bg: #2d2d2d;
}
Enter fullscreen mode Exit fullscreen mode

What I Learned

  • CSS Custom Properties: How to implement maintainable theme systems using CSS variables
  • LocalStorage API: Persisting user preferences across sessions
  • Responsive Design: Making UI elements work across different screen sizes
  • Animation Techniques: Adding smooth transitions and hover effects
  • Data Structures: Converting simple arrays to more structured objects for better maintainability

Impact

Enhanced user experience significantly with:

  • Better visual identification of players
  • Reduced eye strain with dark mode option
  • Personalized experience with saved preferences
  • Improved mobile responsiveness

Contribution #5: SalamLang - Repository Structure Organization 📁

🔗 PR Link: #17

🏷️ Issue: #16

📊 Changes: +2 / -1 lines (7 commits)

⏱️ Merged: October 2, 2025

🏆 Labels: good first issue, hacktoberfest, hacktoberfest-accepted, tests

The Challenge

The repository had linter configuration files scattered in the root directory, making it cluttered and harder to maintain. The goal was to move these configs to a dedicated .github/linters/ directory.

My Approach

Reorganized the project structure:

# Before
.
├── .markdownlint.json
├── .yamllint.yaml
└── .pre-commit-config.yaml

# After
.
├── .github/
│   └── linters/
│       ├── .markdownlint.json
│       └── .yamllint.yaml
└── .pre-commit-config.yaml
Enter fullscreen mode Exit fullscreen mode

Updated .pre-commit-config.yaml to reference new locations:

# Markdownlint
- repo: https://github.com/igorshubovych/markdownlint-cli
  rev: v0.41.0
  hooks:
    - id: markdownlint
      args: [--config, .github/linters/.markdownlint.json]

# Yamllint
- repo: https://github.com/adrienverge/yamllint
  rev: v1.35.1
  hooks:
    - id: yamllint
      args: [--config-file=.github/linters/.yamllint.yaml]
Enter fullscreen mode Exit fullscreen mode

What I Learned

  • Project Organization: Best practices for structuring configuration files
  • Pre-commit Hooks: How to configure and update pre-commit hook paths
  • Git Operations: Moving files while preserving history
  • Testing Methodology: Verifying configuration changes don't break functionality

Impact

  • Cleaner repository root directory
  • Better organization following GitHub conventions
  • Easier maintenance and discovery of configuration files
  • Consistent with patterns used in main Salam repository

Contribution #6: Leetcode Solutions - Zigzag Conversion Algorithm 🧩

🔗 PR Link: #39

🏷️ Issue: #38

📊 Changes: +70 / -0 lines

⏱️ Merged: October 2, 2025

🏆 Labels: hacktoberest-accepted

The Challenge

Implement LeetCode Problem #6 - Zigzag Conversion in C++:

Problem: Convert a string to a zigzag pattern across a specified number of rows and read it line by line.

Example:

Input: s = "PAYPALISHIRING", numRows = 3
Output: "PAHNAPLSIIGYIR"

Explanation:
P   A   H   N
A P L S I I G
Y   I   R
Enter fullscreen mode Exit fullscreen mode

My Approach & Intuition

The key insight was to simulate the zigzag writing process:

class Solution {
public:
    string convert(string s, int numRows) {
        // Edge cases
        if (numRows == 1 || numRows >= s.length()) return s;

        // Create a row for each line in the zigzag
        vector<string> rows(numRows);
        int currRow = 0, direction = -1;

        // Fill rows with characters
        for (char c : s) {
            rows[currRow] += c;

            // Change direction at top and bottom
            if (currRow == 0 || currRow == numRows - 1) 
                direction *= -1;

            currRow += direction;
        }

        // Concatenate all rows
        string result;
        for (string& row : rows) result += row;
        return result;
    }
};
Enter fullscreen mode Exit fullscreen mode

Algorithm Breakdown:

  1. Edge Case Handling: If only 1 row or rows >= string length, return original string
  2. Row Simulation: Use vector of strings to represent each row
  3. Direction Tracking: Use multiplier (-1 or +1) to track up/down movement
  4. Character Placement: Place each character in current row and update direction at boundaries
  5. Result Construction: Concatenate all rows to form final string

What I Learned

  • Algorithm Design: Breaking down complex patterns into simple state machines
  • Space Complexity: Trading memory for cleaner code (O(n) space for O(n) time)
  • C++ STL: Effective use of vector<string> for dynamic data structures
  • Problem-Solving Process: Visualizing the problem helps identify the solution pattern

Impact

Contributed a well-documented, efficient solution to help other learners understand the zigzag pattern problem, complete with approach explanation and intuition.


💡 Overall Lessons Learned

Technical Skills Acquired

1. GitHub Actions & CI/CD Mastery 🔄

  • Configuring multi-version test matrices
  • Understanding action versioning and deprecation
  • Working with GitHub context variables (github.event)
  • Implementing proper error handling in workflows
  • Setting appropriate permissions for actions

2. YAML Proficiency 📝

  • Mastering YAML syntax and indentation rules
  • Debugging complex YAML parsing errors
  • Structuring workflow files for maintainability
  • Using YAML validators effectively

3. Frontend Development 🎨

  • Implementing CSS custom properties for theming
  • Using LocalStorage API for state persistence
  • Creating responsive designs with modern CSS
  • Building smooth animations and transitions
  • Understanding accessibility considerations (color contrast, focus states)

4. Algorithm Implementation 🧠

  • Simulating physical patterns in code
  • Optimizing space-time complexity trade-offs
  • Writing clean, documented algorithmic solutions
  • Using appropriate data structures (vectors, strings)

5. Project Organization 📁

  • Following repository structure best practices
  • Organizing configuration files logically
  • Maintaining consistency across projects

🚧 Challenges I Overcame

Challenge 1: Understanding Large Codebases Quickly ⏱️

The Problem: Each project had different structures, conventions, and tooling. I had limited time to understand context before contributing.

How I Solved It:

  • Started with README.md and CONTRIBUTING.md files
  • Examined existing PRs to understand coding style
  • Used GitHub's code search to find similar patterns
  • Asked clarifying questions in issue comments
  • Focused on well-scoped, beginner-friendly issues first

Challenge 2: Debugging CI/CD Without Local Environment 🔧

The Problem: GitHub Actions workflows can't be easily tested locally, making debugging iterative and time-consuming.

How I Solved It:

  • Used online YAML validators before pushing
  • Studied GitHub Actions documentation thoroughly
  • Looked at similar workflows in other repositories
  • Made small, incremental changes with clear commit messages
  • Learned from workflow run logs and error messages

Challenge 3: Handling Different Tech Stacks 🔄

The Problem: Projects used various languages and frameworks: PHP, JavaScript, C++, YAML, Python workflows.

How I Solved It:

  • Focused on transferable concepts (logic, patterns, best practices)
  • Read official documentation for unfamiliar technologies
  • Used language-agnostic problem-solving approaches
  • Embraced learning opportunities in new domains
  • Applied knowledge from one project to others

Challenge 4: Balancing Quality and Speed ⚖️

The Problem: Hacktoberfest has deadlines, but maintainers expect quality contributions.

How I Solved It:

  • Prioritized smaller, well-defined issues first
  • Wrote comprehensive PR descriptions to reduce back-and-forth
  • Self-reviewed code before submitting
  • Added tests or verification steps where possible
  • Valued quality over quantity (6 meaningful PRs vs. rushing for more)

🙏 Thank You

I want to express my gratitude to:

Maintainers 👨‍💻👩‍💻

  • @amcintosh - For maintaining FreshBooks PHP SDK and quick merge
  • @aviralsaxena16 - For reviewing CanonForces fixes
  • @vatsalsinghkv - For the Easy Fix project and welcoming environment
  • @Rishi713144 - For the opportunity to add major features to Footballer Predictor
  • @jbampton - For leading SalamLang and the warm community
  • @SjxSubham - For maintaining the Leetcode solutions repository

Special Thanks 🌟

  • The Hacktoberfest Team - For organizing this incredible event year after year
  • GitHub - For providing the platform that makes open source collaboration possible
  • DigitalOcean - For sponsoring and supporting Hacktoberfest
  • The Open Source Community - For building amazing projects and welcoming newcomers

💬 Let's Connect!

I'd love to hear about your Hacktoberfest experience or answer questions about mine!


🎉 Final Thoughts

Hacktoberfest 2025 taught me that open source is not just about code—it's about community, learning, and making an impact. Every merged PR represents hours of learning, debugging, and collaboration. It represents someone taking the time to review my work and trust me to improve their project.

To anyone considering participating in future Hacktoberfests: Do it!

You don't need to be an expert. You don't need years of experience. You just need:

  • Curiosity 🔍
  • Willingness to learn 📚
  • Patience with yourself and others 🤝
  • Respect for maintainers' time ⏰

The worst that can happen? Your PR doesn't get merged. The best? You learn something new, make connections, and contribute to tools used by thousands of developers worldwide.

**My 6 PRs are now part of:

  • An accounting SDK used by businesses
  • A competitive programming platform
  • A language accessibility project
  • Educational resources for developers**

That's pretty cool. 🚀


🏷️ Tags

Hacktoberfest #Hacktoberfest2025 #OpenSource #GitHub #GitHubActions #FirstContribution #DevJourney #100DaysOfCode #CodeNewbie #WebDev #PHP #JavaScript #CPP #YAML #CSS #DarkMode #CI CD #Algorithms #LearningInPublic #TechBlog


💖 If this post helped or inspired you, please consider:

  • ⭐ Starring the repositories I contributed to
  • 👏 Giving this post a reaction
  • 🔖 Bookmarking for your own Hacktoberfest journey
  • 💬 Sharing your experience in the comments
  • 🔄 Sharing this post with fellow developers

Happy coding, and see you in the open-source community! 🚀✨


This post is part of the DEV.to Hacktoberfest Writing Challenge - Contribution Chronicles track.

Top comments (0)