{"id":13810372,"url":"https://github.com/ploi/roadmap","last_synced_at":"2026-04-01T21:28:13.783Z","repository":{"id":36968877,"uuid":"488116378","full_name":"ploi/roadmap","owner":"ploi","description":"Open source roadmapping software","archived":false,"fork":false,"pushed_at":"2026-03-21T07:33:14.000Z","size":6034,"stargazers_count":559,"open_issues_count":8,"forks_count":112,"subscribers_count":14,"default_branch":"main","last_synced_at":"2026-03-21T23:35:34.356Z","etag":null,"topics":["hacktoberfest","laravel","php","roadmap"],"latest_commit_sha":null,"homepage":"https://roadmap.ploi.io","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ploi.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":".github/CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"cannonb4ll"}},"created_at":"2022-05-03T07:32:43.000Z","updated_at":"2026-03-21T07:32:48.000Z","dependencies_parsed_at":"2024-01-17T18:16:06.825Z","dependency_job_id":"57e16b57-8bd3-44fd-8f3e-90295d6b3e92","html_url":"https://github.com/ploi/roadmap","commit_stats":null,"previous_names":[],"tags_count":108,"template":false,"template_full_name":null,"purl":"pkg:github/ploi/roadmap","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ploi%2Froadmap","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ploi%2Froadmap/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ploi%2Froadmap/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ploi%2Froadmap/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ploi","download_url":"https://codeload.github.com/ploi/roadmap/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ploi%2Froadmap/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31292263,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-01T21:15:39.731Z","status":"ssl_error","status_checked_at":"2026-04-01T21:15:34.046Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["hacktoberfest","laravel","php","roadmap"],"created_at":"2024-08-04T02:00:51.500Z","updated_at":"2026-04-01T21:28:13.773Z","avatar_url":"https://github.com/ploi.png","language":"PHP","funding_links":["https://github.com/sponsors/cannonb4ll","https://github.com/sponsors/Cannonb4ll"],"categories":["PHP"],"sub_categories":[],"readme":"![Roadmap screenshot](/public/screenshots/screenshot.png)\n\n# Roadmap\n\nWelcome to Roadmap, the open-source software for your roadmapping needs 🛣\n\n## Features\n\n- Completely customisable roadmapping software\n- Mention users in comments\n- Upvote items to see which has more priority\n- Automatic slug generation\n- Filament admin panel 💛\n- Simplified role system (administrator, employee \u0026 user)\n- OAuth 2 single sign-on with your own application\n- Automatic OG image generation including branding color you've setup (saves in your storage, around 70kb per image), if title is too long it will strip automatically as well, example:\n\n![OG](https://roadmap.ploi.io/storage/og-20-ssl-via-api-force-request-skip-dns-verification-site-level-request-20.jpg?v=1653765303)\n\n## Requirements\n\n- PHP \u003e= 8.4\n- Database (MySQL, PostgreSQL)\n- GD Library (\u003e=2.0) or\n- Imagick PHP extension (\u003e=6.5.7)\n- NodeJS (any version)\n\n## Installation\n\nFirst set up a database, and remember the credentials.\n\n```\ngit clone https://github.com/ploi/roadmap.git\ncd roadmap\ncomposer install --no-interaction --prefer-dist --optimize-autoloader --no-dev\nphp -r \"file_exists('.env') || copy('.env.example', '.env');\"\nphp artisan key:generate\n```\n\nNow edit your `.env` file and set up the database credentials, including the app name you want.\n\nOptionally you may set up the language with `APP_LOCALE`, if your language is not working we accept PR's for new languages. We recommend copying those files from the `lang/en` folder.\nAs well as the timezone can be set with `APP_TIMEZONE`, for example: `APP_TIMEZONE=\"Europe/Amsterdam\"`.\n\nNow run the following:\n\n```\nphp artisan roadmap:install\n```\n\nAnd login with the credentials you've provided, the user you've created will automatically be admin.\n\n## Deployment\n\nTo manage your servers and sites, we recommend using [Ploi.io](https://ploi.io/?ref=roadmap-readme) to speed up things, obviously you're free to choose however you'd like to deploy this piece of software 💙\n\nThat being said, here's an deployment script example:\n\n```sh\ncd /home/ploi/example.com\ngit pull origin main\ncomposer install --no-interaction --prefer-dist --optimize-autoloader --no-dev\necho \"\" | sudo -S service php8.2-fpm reload\n\nphp artisan roadmap:upgrade\n\nnpm ci\nnpm run production\n\necho \"🚀 Application deployed!\"\n```\n\nIf you're using queue workers (which we recommend to do) also add `php artisan queue:restart` to your deployment script.\n\n## Role system\n\nThere's a simplified role system included in this roadmapping software. There's 3 roles: administrator, employee \u0026 user.\n\nWhat are these roles allowed to do?\n\n- Administrator\n  - Obviously anything to users, items, projects, access admin\n- Employee\n  - These can access the admin, and see their assigned items (via a filter). What they can't do: settings, theme, users, CRUD projects.\n- User\n  - This is your default user when someone registers, they don't have access to the administration and can only access the frontend.\n\n## GitHub integration\n\nTo enable the GitHub integration, add these values to your .env:\n\n```\nGITHUB_ENABLED=true\nGITHUB_TOKEN=your_github_token\n```\n\nTo get a GitHub token, visit this URL: https://github.com/settings/tokens\n\nWhen enabled, you can assign a repository to each project via the admin panel.\nFor items in projects with a repo assigned, you'll be able to assign an issue or\neasily create one via the roadmap admin.\n\n## Installing SSO (OAuth 2 login with 3rd party app)\n\nIt is possible to configure OAuth 2 login with this roadmap software to make it easier to log in.\nIn this example we're going to show how to set this up with a Laravel application example, but any other OAuth 2 capable application should be able to integrate as well.\n\nStart by installing Laravel Passport into your application, [consult their docs how to do this](https://laravel.com/docs/9.x/passport#installation).\n\nNow create a fresh client by running `php artisan passport:client`\n\nIt will ask you a few questions, an example how to answer these:\n\n```\n$ php artisan passport:client\n\nWhich user ID should the client be assigned to?:\n\u003e \n\nWhat should we name the client?:\n\u003e Roadmap SSO\n\nWhere should we redirect the request after authorization? [https://my-app.com/oauth/callback]:\n\u003e \n\nNew client created successfully.\nClient ID: 3\nClient secret: 9Mqb2ssCDwk0BBiRwyRZPVupzkdphgfuBgEsgpjQ\n```\n\nEnter these credentials inside your .env file of the roadmap:\n\n```\nSSO_LOGIN_TITLE=\"Login with SSO\"\nSSO_BASE_URL=https://external-app.com\nSSO_CLIENT_ID=3\nSSO_CLIENT_SECRET=9Mqb2ssCDwk0BBiRwyRZPVupzkdphgfuBgEsgpjQ\nSSO_CALLBACK=${APP_URL}/oauth/callback\n# Mostly, your sso provider user endpoint response is wrapped in a `data` key.\n# for example: { \"data\": \"id\": \"name\": \"John Doe\", \"email\": \"john@example.com\" }\n# If you would like to use a custom key instead of data, you may define it here.\n# you can also do something like 'data.user' if its nested.\n# or you can set it to nothing (do not set it to value 'null'. just leave it empty value) \n# if sso provider user endpoint response is not wrapped in a key.\nSSO_PROVIDER_USER_ENDPOINT_DATA_WRAP_KEY=\"data\"\n# The keys that should be present in the sso provider user endpoint response\nSSO_PROVIDER_USER_ENDPOINT_KEYS=\"id,email,name\"\n# The provider id returned by the sso provider for the user identification. sometimes its `uuid` instead of `id`\nSSO_PROVIDER_ID=\"id\"\nSSO_ENDPOINT_AUTHORIZE=${SSO_BASE_URL}/oauth/authorize\nSSO_ENDPOINT_TOKEN=${SSO_BASE_URL}/oauth/token\nSSO_ENDPOINT_USER=${SSO_BASE_URL}/oauth/user\n```\n\nNext we're going to prepare the routes, controller \u0026 resource for your application.\n\nCreate these routes inside the `api.php` file:\n\n```php\nRoute::get('oauth/user', [Api\\UserOAuthController::class, 'user'])-\u003emiddleware('scopes:email');\nRoute::delete('oauth/revoke', [Api\\UserOAuthController::class, 'revoke']);\n```\n\nCreate the resource: `php artisan make:resource Api/UserOAuthResource` with the following contents in the `toArray()` method:\n\n```php\npublic function toArray($request)\n{\n    return [\n        'id' =\u003e $this-\u003eid,\n        'name' =\u003e $this-\u003ename,\n        'email' =\u003e $this-\u003eemail,\n    ];\n}\n```\n\nCreate a controller `php artisan make:controller Api/UserOAuthController` and add these functions:\n\n```php\nuse App\\Http\\Resources\\Api\\UserOAuthResource;\nuse Laravel\\Passport\\RefreshTokenRepository;\nuse Laravel\\Passport\\TokenRepository;\n\npublic function user(Request $request)\n{\n    return new UserOAuthResource($request-\u003euser());\n}\n\npublic function revoke(Request $request)\n{\n    $token = $request-\u003euser()-\u003etoken();\n\n    $tokenRepository = app(TokenRepository::class);\n    $refreshTokenRepository = app(RefreshTokenRepository::class);\n\n    $tokenRepository-\u003erevokeAccessToken($token-\u003eid);\n\n    $refreshTokenRepository-\u003erevokeRefreshTokensByAccessTokenId($token-\u003eid);\n}\n```\n\nAlso setup the tokens inside the `AppServiceProvider` inside the `boot()` method:\n\n```php\npublic function boot()\n{\n    ... \n    \n    Passport::tokensCan([\n        'email' =\u003e 'Read email'\n    ]);\n}\n```\n\nNow head over to the login page in your roadmap software and view the log in button in action. The title of the button can be set with the `.env` variable: `SSO_LOGIN_TITLE=`\n\n\n## AI endpoint\n\nEach item has an `/ai` endpoint that returns its data in a machine-readable format, useful for AI agents and automation.\n\n```\nGET /projects/{project}/items/{item}/ai\n```\n\n**Query parameters:**\n\n| Parameter | Description | Example |\n|---|---|---|\n| `format` | Response format: `json` (default), `yml`/`yaml`, `markdown`/`md` | `?format=yml` |\n| `include[comments]` | Include public comments | `?include[comments]=1` |\n\n**Examples:**\n\n```\n/projects/1-bugs/items/2-bug-in-sites-overview/ai\n/projects/1-bugs/items/2-bug-in-sites-overview/ai?include[comments]=1\n/projects/1-bugs/items/2-bug-in-sites-overview/ai?format=markdown\n/projects/1-bugs/items/2-bug-in-sites-overview/ai?format=yml\u0026include[comments]=1\n```\n\n## Docker Support\n\n### Getting up and running...\n\nGo into docker folder and run:\n`docker-compose up -d --build`\n\nSet your database .env variables:\n```\nDB_CONNECTION=mysql\nDB_HOST=roadmap-db\nDB_PORT=3306\nDB_DATABASE=roadmap\nDB_USERNAME=root\nDB_PASSWORD=secret\n```\n\nComposer Install:\n\n`docker exec -it roadmap composer install --no-interaction --prefer-dist --optimize-autoloader --no-dev`\n\nNPM Install:\n\n`docker exec -it roadmap npm ci`\n\nRunning artisan commands:\n\n`docker exec -it roadmap php artisan \u003ccommand\u003e`\n\nThe Application will be running on `localhost:1337` and PhpMyAdmin is running on `localhost:8010`\n\n### Docker Considerations\n\nThere are a few heroicons that were giving issues when running locally with docker.\n\n```\nUnable to locate a class or view for component \u003cinsert heroicon name here\u003e\n```\nThe problem was resolved by simply changing the following icons:\n\nx-heroicon-o-chevron-down -\u003e x-heroicon-s-chevron-down (group.blade.php)\nheroicon-o-chat -\u003e heroicon-s-chat (CommentResource)\nheroicon-o-archive -\u003e heroicon-s-archive (ItemResource)\nheroicon-o-x-circle -\u003e heroicon-o-collection (notifications.blade.php)\n\nRelated Issues:\n\n[laravel-filament/filament#2677](https://github.com/laravel-filament/filament/issues/2677)\n\n[blade-ui-kit/blade-heroicons#9](https://github.com/blade-ui-kit/blade-heroicons/issues/9)\n\n## Testing\n\n```bash\ncomposer test\n```\n\n## Changelog\n\nPlease see [CHANGELOG](CHANGELOG.md) for more information on what has changed recently.\n\n## Contributing\n\nPlease see [CONTRIBUTING](.github/CONTRIBUTING.md) for details.\n\n## Sponsor\n\nWe appreciate sponsors, we still maintain this repository, server, emails and domain. [You can do that here](https://github.com/sponsors/Cannonb4ll).\nEach sponsor gets listed on in this readme. #test\n\n## Paid alternatives\n\nObviously, if you do not want to self host, there's plenty of self-hosted solutions, a small rundown:\n\n- [UpVoty](https://upvoty.com)\n- [Canny](https://canny.io/)\n- [Craft](https://craft.io/)\n- [Convas](https://convas.io/)\n- [UserReport](https://www.userreport.com/)\n\n## Credits\n\n- [Cannonb4ll](https://github.com/cannonb4ll)\n- [SebastiaanKloos](https://github.com/SebastiaanKloos)\n- [Filament Admin](https://filamentadmin.com/)\n- [Laravel](https://laravel.com/)\n- [Razor UI](https://razorui.com/)\n- [Ploi](https://ploi.io)\n\n## License\n\nThe MIT License (MIT). Please see [License File](LICENSE.md) for more information.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fploi%2Froadmap","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fploi%2Froadmap","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fploi%2Froadmap/lists"}