Thanks for your interest in improving LinkForge! Contributions of all kinds are welcome — bug fixes, features, docs, and translations.
- By contributing, you agree your work is licensed under the project's MIT License.
- Be respectful — this project follows a Code of Conduct.
- For anything non-trivial, open an issue first to discuss the approach before you start.
git clone https://github.com/sanmaxdev/linkforge.git
cd linkforge
composer install
npm install
cp .env.example .env
php artisan key:generate
# point DB_* in .env at a local MySQL/MariaDB database, then:
php artisan migrate --seed
npm run dev # Vite dev server
php artisan serveThe test suite runs on an in-memory SQLite database, so you don't need MySQL just to run tests.
Run the same checks CI runs — all must pass:
vendor/bin/pint # auto-format to the project code style
php artisan test # full test suite
npm run build # assets must compile- Code style: we use Laravel Pint. Run
vendor/bin/pintbefore committing (CI runspint --testand will fail on un-formatted code). - Tests: add or update tests for any behavior change. Keep the suite green.
- Commits: keep them focused; write clear messages. Reference the issue you're addressing.
- Scope: one logical change per PR — it's easier to review and merge.
- Fork the repo and create a branch from
main(e.g.fix/redirect-looporfeat/qr-templates). - Make your change, with tests and formatting.
- Open a PR against
main. Fill in the PR template. - CI (tests + lint + assets build) must pass, and a maintainer must approve before merge.
mainis protected — changes land only through reviewed PRs.
Releases are fully automated by .github/workflows/release.yml.
To cut a release:
- Bump the version in
config/linkforge.phpand merge it through a PR. - Tag the merge commit and push the tag:
git tag v1.1.0 git push origin v1.1.0
- The
Releaseworkflow builds two artifacts and publishes a GitHub Release with auto-generated notes:linkforge-v<version>.zip— the full, self-hostable install package (extract into your web root).linkforge-update-v<version>.zip— an incremental package (only files changed since the previous tag) for the in-app updater under Admin → Updates.
Use the issue templates. For security vulnerabilities, do not open a public issue — see SECURITY.md.
Questions or ideas? Start a Discussion.