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]
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!"
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.eventto 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
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
Additional improvements:
- Added required permissions:
contents: readandpull-requests: write - Updated
actions/checkoutfrom 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:
- Adding player name captions below footballer images
- 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" }
];
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);
});
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;
}
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
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]
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
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;
}
};
Algorithm Breakdown:
- Edge Case Handling: If only 1 row or rows >= string length, return original string
- Row Simulation: Use vector of strings to represent each row
- Direction Tracking: Use multiplier (-1 or +1) to track up/down movement
- Character Placement: Place each character in current row and update direction at boundaries
- 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.mdandCONTRIBUTING.mdfiles - 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!
- GitHub: @devkumar2313
- DEV.to: [https://dev.to/devkumar2313]
- LinkedIn: [www.linkedin.com/in/devkumarpal74]
🎉 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)