Good First Issues in PHP
Explore curated starter issues in high-scoring PHP repositories. Every listed issue belongs to a welcoming repository scored by C-Rank™ on PR merge rates, review responsiveness, and first-timer acceptance.
Arm Issue Sniper for fresh PHP beginner issues
Beginner issues in welcoming S/A-Tier repositories get snatched within 15 minutes. Receive instant alerts on Discord, Telegram, or Email the minute a maintainer opens a new task.
Live Good First Issues (30)
Good First Issue Difficulty: Beginner Estimated time: Area: Primary files: Task Describe one concrete change. Acceptance criteria The requested change is implemented. The Pull Request stays focused. Relevant validation passes. Contribution steps Star our repo. Fork the repository. Comment if you want to work on this issue. Create a focused branch. Make the change. Run relevant validation. Open a Pull Request. Add Closes #ISSUE_NUMBER to the Pull Request description. See BEGINNER_CONTRIBUTING.md for the full walkthrough.
Explain the Problem Atom 1.0 allows entries to have multiple authors by providing multiple <author></author> blocks. However, when there are multiple authors, the Nextcloud News app only shows the LAST author. The News app should either list all authors, or as a worst case scenario, only provide the FIRST author. Steps to Reproduce Create an RSS entry with multiple Authors. Open the post in the Nextcloud News reader and you will see that it says "by Last Author Name". System Information News app version: 28.6.0 Nextcloud version: 34.0.1 Cron type: (system cron/python updater/...) PHP version: Database and version: Browser and version: OS and version:
The screenshot used to show the LibreSign request signature interface is currently updated manually. We should automate its generation, so developers can recreate it with a single command when the interface changes. The generated screenshot must replace: img/screenshot/request-signature.png A similar approach is already used by profile_fields, where a script from package.json runs a Playwright script responsible for preparing the page and generating screenshots. What should be done Add a script to package.json to generate the request signature screenshot. For example: "screenshots:refresh": "node playwright/generate-screenshots.mjs" The exact script and file names can be adjusted to fit the LibreSign structure. The Playwright script should: log in using the existing Playwright helpers; open the LibreSign Request Signatures page; wait until the upload interface is fully loaded; expand the Settings section in the left sidebar; keep the upload interface visible, before any document is up
What problem does this address? At the moment, we have a fairly small hardcoded list of languages you can choose from when using the Content Translation experiment. This list is passed through a filter (wpai_content_translation_languages) allowing others to extend that list as needed. Opening this Issue to raise discussion on if that approach is good enough and we leave the list as-is or if there are languages missing from this list that we should always support by default. What is your proposed solution? Look to add additional languages to our get_supported_languages method. As mentioned above, we may end up deciding the languages we have there are already good enough and anyone wanting different languages can utilize the wpai_content_translation_languages filter. Why is this important to you? No response I have searched existing issues and this is not a duplicate. Yes
What problem does this address? Most of our other experiments will integrate into the WordPress Guidelines/Knowledge that currently ships with the Gutenberg plugin. This allows you to set site-wide and block-specific guidelines that if found, we pass those guidelines to the LLM when generating a request. Content Translation (shipped in #747) doesn't do this though would be helpful for things like providing a glossary of words and how they should be translated or other copy things to keep in mind when doing the translation. What is your proposed solution? Enhance the Content Translation Ability to declare support for guidelines using the guideline_categories method. Likely start with Site, Copy and Additional as our categories. Worth noting the Guidelines experiment in Gutenberg has changed names a few times and our integration isn't currently working due to another naming change. This will need fixed first (or alongside) the changes needed here. Why is this important to you? No respons
LibreSign currently uses JSignPdf 2.3.0: https://github.com/LibreSign/libresign/blob/main/lib/Service/Install/InstallService.php#L53 JSignPdf already has stable 3.x releases with important changes to its CLI, packaging and signing behavior. Before updating LibreSign, the PHP wrapper must support JSignPdf 3.x: JSignPdf/jsignpdf-php#52 This issue should be worked on after that issue is completed and a new version of jsignpdf-php is available. What needs to be done Update LibreSign to the new jsignpdf-php version with JSignPdf 3.x support. Update the JSignPdf version, download source, checksum and installation logic in InstallService. Check the JSignPdf 3.x package structure and choose the correct package for LibreSign. JSignPdf 3.1 removed the old fat JAR and provides a minimal package for headless/CLI use, so changing only the version and checksum may not be enough. Review JSignPdfHandler and confirm that the current JSignPdf options still work correctly, including visible signatures,
Describe your feature request precisely Hi, would it be possible to filter user groups or at least to sort them by alphabetical order? It would also be good to quickly see all the user groups in which is a specific user. We have a lot of them and it is getting complicated to locate the correct group to add/remove users. Thank you! Pro Support No response
We must add multi-instance server. I've try but nothing conclusive. Each server must have his own config file and his own admin moderation. Add new server must be possible from the main server. Install main server after access admin panel and config another server @Ferywir maybe you can do that possible
LibreSign now uses Infection to help check the quality of the PHP tests. Code coverage tells us which code was executed by tests. However, it does not tell us if the tests can detect wrong behavior. Mutation testing helps us check this. Infection makes small changes to the source code. These changes are called mutants. After each change, Infection runs the tests again: If a test fails, the mutant is killed. This is good because the test detected the change. If all tests still pass, the mutant escaped. This can mean that an important behavior is not well tested. A mutant can also cause a timeout or an error. These cases need to be checked before deciding what should be changed. The first full LibreSign run generated more than 15,000 mutants and took a long time to run. It also found many escaped mutants, errors and timeouts. Initial run: https://github.com/LibreSign/libresign/actions/runs/32801594308/job/97663483870 Because of this, the full Infection suite is not ready to be required
Description The PR title lint workflow in .github/workflows/lint-pr-title.yml is not working as expected. The workflow previously mentioned the contributor in a PR comment when the PR title failed the Conventional Commits validation. Currently, the GitHub Actions logs correctly show the PR title linting error, but the expected contributor comment is not being posted. An invalid PR title also results in a ❌ status at the end of the PR. The workflow uses amannn/action-semantic-pull-request@v6 for validation and marocchino/sticky-pull-request-comment@v3 for the PR comment. Expected Behavior Detect an invalid PR title. Comment on the PR mentioning the contributor with the linting error. Provide an example of the correct Conventional Commits format. Remove the warning comment once the title is fixed. Task Investigate why the contributor comment is no longer being posted and fix the workflow so that the PR title linting and notification work as intended. Reference file https://github.co
The Dependabot PR #7876 updates @nextcloud/eslint-config from v8 to v9. This update also brings ESLint 10 and many new lint rules. After applying the new configuration, LibreSign reports many lint problems in the existing code. The goal of this issue is to review these problems, fix the code when the rule makes sense for LibreSign, and enable as many rules as possible instead of simply disabling them. This work should be done on top of #7876. The current list of pending rules is maintained in the libresign/disabled-during-migration section of eslint.config.mjs. Please use this file as the source of truth. What to do Work on one ESLint rule at a time. For each rule: Remove it from libresign/disabled-during-migration. Run npm run lint. Review all reported cases and understand what the rule is trying to improve. Fix all cases in a way that makes sense for LibreSign. Run related tests when the change can affect behavior. Create one commit for that rule. For example: fix(lint): enable no-
A CSV export would be a useful enhancement — we want the full filtered result, not just the visible page. The Models/Grid/*/Query.php classes already build filtered, ordered SQL. Reuse them with the limit lifted and stream the result. Use fputcsv() PHP built-in function to produce CSV lines. UI: export button sits to the right of the table title, next to the refresh button. Disabled while an export is running so users can't fire off several by accident. What's needed: new route per grid, or one /csv_export taking the same filter params the grid uses; reuse assertCanView(): export must not become an RBAC bypass, and must stay scoped to the current API key; stream rows, don't buffer: the existing execQuery() returns a full array, which will OOM on large exports. Use a cursor or keyset pagination and flush as you go; server-side lock: one export in flight per operator, with a timeout so a stuck job doesn't block them permanently. The disabled button is UX only — the endpoint can stil
Make FreeScout design look more modern by changing only CSS and keeping same blue-white-grey color scheme.
I like the query-share feature but in HTML mode it shares only in 'Reader' mode which is not very information-dense, 'Norma' view with openable items is much more suitable for me, is it possible to share in that mode?
F3 Dictionary is already there app/Dictionary/en/, and DictManager builds paths from LOCALES + LANGUAGE. Both are hardcoded in index.php, so today the only way to change language is editing source. What's needed: language column on dshb_operators; migration in app/Updates/; set default language for operator guest as en. set language in selector in Settings, right after Time zone; set language in selector in Sign UP, right after Time zone; check ui/js/ for hardcoded strings; Goal: adding a language means adding app/Dictionary// and nothing else. Missing keys fall back to english.
Description The calendar checks are currently implemented as a standalone PHP script and executed through a dedicated GitHub Actions workflow. They should be integrated into the existing PHPUnit unit test suite instead. Tasks Delete .github/workflows/calendar-test.yml and remove the dedicated calendar-test workflow. Move tests/calendar-test.php into tests/unit/. Convert the standalone assertions into proper PHPUnit test methods and extend WP_UnitTestCase as appropriate. Rename the test file/class according to the naming conventions documented in tests/README.md. Ensure the calendar tests are discovered and executed by the existing composer test / PHPUnit test suite. Remove standalone CLI-specific test scaffolding and assertions where they are no longer needed because the WordPress PHPUnit environment provides the required functionality. Keep coverage for calendar ICS generation, Google Calendar URL generation, timezone formatting, timed/all-day events, and invalid/missing event
🟢 Tiny browser-only contribution Estimated time: 2–5 minutes Difficulty: Absolute beginner Install Moodle: No Clone locally: No Coding experience: Not required Task Write one short prompt that asks the tutor to identify the key terms from a course section and quiz the learner on their meanings one at a time. Create exactly this file: community/micro-contributions/prompts/key-terms-review.json Use this skeleton and replace every REPLACE_ME value: {"name":"Key terms review","prompt":"REPLACE_ME"} Fast contribution path ⭐ Star our repo to support the project. 🍴 Fork this repository. In your fork, open community/micro-contributions/prompts. Choose Add file → Create new file. Create the exact filename shown above. Paste the JSON skeleton and replace the placeholder text with your own useful content. Commit the file in your fork. Open a Pull Request. Put Closes # in the PR description. ⭐ A star is appreciated, but never required for review or merge. Acceptance criteria
🟢 Tiny browser-only contribution Estimated time: 2–5 minutes Difficulty: Absolute beginner Install Moodle: No Clone locally: No Coding experience: Not required Task Write one short prompt that ends a study session with a concise recap of what was covered, what needs more practice, and one suggested next step. Create exactly this file: community/micro-contributions/prompts/end-session-recap.json Use this skeleton and replace every REPLACE_ME value: {"name":"End session recap","prompt":"REPLACE_ME"} Fast contribution path ⭐ Star our repo to support the project. 🍴 Fork this repository. In your fork, open community/micro-contributions/prompts. Choose Add file → Create new file. Create the exact filename shown above. Paste the JSON skeleton and replace the placeholder text with your own useful content. Commit the file in your fork. Open a Pull Request. Put Closes # in the PR description. ⭐ A star is appreciated, but never required for review or merge. Acceptance criter
🟢 Tiny browser-only contribution Estimated time: 2–5 minutes Difficulty: Absolute beginner Install Moodle: No Clone locally: No Coding experience: Not required Task Write one short prompt that asks the tutor to show one clear example and one close non-example of a course concept, then explain the difference. Create exactly this file: community/micro-contributions/prompts/example-vs-nonexample.json Use this skeleton and replace every REPLACE_ME value: {"name":"Example vs non-example","prompt":"REPLACE_ME"} Fast contribution path ⭐ Star our repo to support the project. 🍴 Fork this repository. In your fork, open community/micro-contributions/prompts. Choose Add file → Create new file. Create the exact filename shown above. Paste the JSON skeleton and replace the placeholder text with your own useful content. Commit the file in your fork. Open a Pull Request. Put Closes # in the PR description. ⭐ A star is appreciated, but never required for review or merge. Acceptanc
🟢 Tiny browser-only contribution Estimated time: 2–5 minutes Difficulty: Absolute beginner Install Moodle: No Clone locally: No Coding experience: Not required Task Write one short prompt that asks the tutor to adjust the difficulty of the next practice task based on how well the learner handled the previous one. Create exactly this file: community/micro-contributions/prompts/difficulty-adjustment.json Use this skeleton and replace every REPLACE_ME value: {"name":"Difficulty adjustment","prompt":"REPLACE_ME"} Fast contribution path ⭐ Star our repo to support the project. 🍴 Fork this repository. In your fork, open community/micro-contributions/prompts. Choose Add file → Create new file. Create the exact filename shown above. Paste the JSON skeleton and replace the placeholder text with your own useful content. Commit the file in your fork. Open a Pull Request. Put Closes # in the PR description. ⭐ A star is appreciated, but never required for review or merge. Accep
🟢 Tiny browser-only contribution Estimated time: 2–5 minutes Difficulty: Absolute beginner Install Moodle: No Clone locally: No Coding experience: Not required Task Write one short prompt that helps a learner replace a detected misconception with a clearer correct explanation and one quick check for understanding. Create exactly this file: community/micro-contributions/prompts/misconception-repair.json Use this skeleton and replace every REPLACE_ME value: {"name":"Misconception repair","prompt":"REPLACE_ME"} Fast contribution path ⭐ Star our repo to support the project. 🍴 Fork this repository. In your fork, open community/micro-contributions/prompts. Choose Add file → Create new file. Create the exact filename shown above. Paste the JSON skeleton and replace the placeholder text with your own useful content. Commit the file in your fork. Open a Pull Request. Put Closes # in the PR description. ⭐ A star is appreciated, but never required for review or merge. Accept
🟢 Tiny browser-only contribution Estimated time: 2–5 minutes Difficulty: Absolute beginner Install Moodle: No Clone locally: No Coding experience: Not required Task Write one short prompt that helps a learner turn several course topics into a simple prioritized study plan with manageable next steps. Create exactly this file: community/micro-contributions/prompts/study-plan.json Use this skeleton and replace every REPLACE_ME value: {"name":"Study plan","prompt":"REPLACE_ME"} Fast contribution path ⭐ Star our repo to support the project. 🍴 Fork this repository. In your fork, open community/micro-contributions/prompts. Choose Add file → Create new file. Create the exact filename shown above. Paste the JSON skeleton and replace the placeholder text with your own useful content. Commit the file in your fork. Open a Pull Request. Put Closes # in the PR description. ⭐ A star is appreciated, but never required for review or merge. Acceptance criteria One new JSON file o
🟢 Tiny browser-only contribution Estimated time: 2–5 minutes Difficulty: Absolute beginner Install Moodle: No Clone locally: No Coding experience: Not required Task Write one short prompt that asks the tutor to state when the available course material is insufficient to answer confidently instead of inventing missing details. Create exactly this file: community/micro-contributions/prompts/uncertainty-check.json Use this skeleton and replace every REPLACE_ME value: {"name":"Uncertainty check","prompt":"REPLACE_ME"} Fast contribution path ⭐ Star our repo to support the project. 🍴 Fork this repository. In your fork, open community/micro-contributions/prompts. Choose Add file → Create new file. Create the exact filename shown above. Paste the JSON skeleton and replace the placeholder text with your own useful content. Commit the file in your fork. Open a Pull Request. Put Closes # in the PR description. ⭐ A star is appreciated, but never required for review or merge.
We already have PHPUnit tests and code coverage for the PHP code, but coverage alone does not tell us how well the tests detect changes in the code. Add Infection to LibreSign to introduce mutation testing for the PHP test suite. The xobject-template package can be used as a reference, but the implementation should follow the current LibreSign structure and dependencies. Acceptance criteria Infection is installed using the existing bamarni/composer-bin-plugin pattern, with its dependencies isolated under vendor-bin/infection. An infection.json5 configuration file is added to the repository root, configured to run mutation testing against the PHP source code in lib/. Infection uses the existing PHPUnit setup. A mutation:test script is added to the root composer.json, so mutation tests can be executed with: composer mutation:test A GitHub Actions workflow runs mutation tests for relevant PHP changes and prevents the check from passing when the configured mutation score is
Hello, There are some translation work needed for Uzbek (uz) and we are looking for a native speaker to help us out. Here is a short example of what you need to do. There are 4 rules: You must be a Uzbek (uz) native speaker You must look at the existing translations and follow the same "style" or "tone" You must make your PR to branch 6.4 You must use the correct indentation (number of spaces) These are the files that should be updated: src/Symfony/Component/Validator/Resources/translations/validators.uz.xlf Show related strings src/Symfony/Component/Validator/Resources/translations/validators.uz.xlf Id English Translation Status 147 The referenced entity does not exist. Havola qilingan obyekt mavjud emas. Needs review 148 This is not a valid ULID. Bu qiymat haqiqiy ULID emas. Needs review NoteIf you want to work on this issue, add a comment to assign it to yourself and let others know that this is already taken.
Hello, There are some translation work needed for Urdu (ur) and we are looking for a native speaker to help us out. Here is a short example of what you need to do. There are 4 rules: You must be a Urdu (ur) native speaker You must look at the existing translations and follow the same "style" or "tone" You must make your PR to branch 6.4 You must use the correct indentation (number of spaces) These are the files that should be updated: src/Symfony/Component/Validator/Resources/translations/validators.ur.xlf Show related strings src/Symfony/Component/Validator/Resources/translations/validators.ur.xlf Id English Translation Status 147 The referenced entity does not exist. حوالہ کردہ وجود موجود نہیں ہے Needs review 148 This is not a valid ULID. یہ ویلیو درست ULID نہیں ہے Needs review NoteIf you want to work on this issue, add a comment to assign it to yourself and let others know that this is already taken.
Hello, There are some translation work needed for Ukrainian (uk) and we are looking for a native speaker to help us out. Here is a short example of what you need to do. There are 4 rules: You must be a Ukrainian (uk) native speaker You must look at the existing translations and follow the same "style" or "tone" You must make your PR to branch 6.4 You must use the correct indentation (number of spaces) These are the files that should be updated: src/Symfony/Component/Validator/Resources/translations/validators.uk.xlf Show related strings src/Symfony/Component/Validator/Resources/translations/validators.uk.xlf Id English Translation Status 147 The referenced entity does not exist. Сутність, на яку посилаються, не існує. Needs review 148 This is not a valid ULID. Це значення не є дійсним ULID. Needs review NoteIf you want to work on this issue, add a comment to assign it to yourself and let others know that this is alrea
Hello, There are some translation work needed for Turkish (tr) and we are looking for a native speaker to help us out. Here is a short example of what you need to do. There are 4 rules: You must be a Turkish (tr) native speaker You must look at the existing translations and follow the same "style" or "tone" You must make your PR to branch 6.4 You must use the correct indentation (number of spaces) These are the files that should be updated: src/Symfony/Component/Validator/Resources/translations/validators.tr.xlf Show related strings src/Symfony/Component/Validator/Resources/translations/validators.tr.xlf Id English Translation Status 147 The referenced entity does not exist. Başvurulan varlık mevcut değil. Needs review 148 This is not a valid ULID. Bu değer geçerli bir ULID değildir. Needs review NoteIf you want to work on this issue, add a comment to assign it to yourself and let others know that this is already taken.
Hello, There are some translation work needed for Tagalog (tl) and we are looking for a native speaker to help us out. Here is a short example of what you need to do. There are 4 rules: You must be a Tagalog (tl) native speaker You must look at the existing translations and follow the same "style" or "tone" You must make your PR to branch 6.4 You must use the correct indentation (number of spaces) These are the files that should be updated: src/Symfony/Component/Validator/Resources/translations/validators.tl.xlf Show related strings src/Symfony/Component/Validator/Resources/translations/validators.tl.xlf Id English Translation Status 147 The referenced entity does not exist. Ang tinutukoy na entidad ay hindi umiiral. Needs review 148 This is not a valid ULID. Ang halagang ito ay hindi isang wastong ULID. Needs review NoteIf you want to work on this issue, add a comment to assign it to yourself and let others know that this is already taken.
Hello, There are some translation work needed for Spanish (es) and we are looking for a native speaker to help us out. Here is a short example of what you need to do. There are 4 rules: You must be a Spanish (es) native speaker You must look at the existing translations and follow the same "style" or "tone" You must make your PR to branch 6.4 You must use the correct indentation (number of spaces) These are the files that should be updated: src/Symfony/Component/Validator/Resources/translations/validators.es.xlf Show related strings src/Symfony/Component/Validator/Resources/translations/validators.es.xlf Id English Translation Status 147 The referenced entity does not exist. La entidad referenciada no existe. Needs review 148 This is not a valid ULID. Este valor no es un ULID válido. Needs review NoteIf you want to work on this issue, add a comment to assign it to yourself and let others know that this is already taken.
Top PHP Repositories with Beginner Issues (20)
Updated Daily via GitHub GraphQLTravian T3.6 with user-configurable features (enable/disable).
Caching implementation with a variety of storage options, as well as codified caching strategies for callbacks, classes, and output
Control how your documents get signed
🩺⚡ Runtime Doctrine ORM analysis integrated into Symfony Web Profiler. Detect N+1 queries, security vulnerabilities, and performance issues during query execution.
Powering our community's event management needs.
:notebook: eLabFTW is the most popular open source electronic lab notebook for research labs.
AnimeThemes.moe resource management & API
The Symfony PHP framework
„... another popular solution to fight spam is Antispam Bee“ – Matt Mullenweg, Q&A WordCamp Europe 2014
📰 RSS/Atom feed reader
GLPI is a Free Asset and IT Management Software package, Data center management, ITIL Service Desk, licenses tracking and software auditing.
No repository description available.
Lightweight PHP debugger extension (forked from Xdebug, stripped to debug-only and optimized)
☁️ Nextcloud server, a safe home for all your data
Fast, extensible, server-side code highlighting for web and terminal
AI-powered Moodle plugin for tutoring, quizzes, mind maps, RAG course materials and more.
Wordpress Plugin for FOSSASIA events website
A free, self-hostable news aggregator…
Contao Open Source CMS
:rocket: GraphQL API for WordPress
How to make your first PHP open-source pull request
Finding approachable Good First Issues in PHP allows you to build real-world software engineering experience. Instead of submitting PRs to abandoned repositories, GetMerged verifies maintainer review speeds and first-timer acceptance rates before you write a single line of code.
Select any issue above to claim it directly on GitHub, or click a repository to inspect full maintainer review turnaround metrics and triage guidance!
Get this week's top welcoming repos + fresh Good First Issues for PHP
Free weekly email, scoped to PHP. No account needed - confirm once and unsubscribe anytime.