{"id":25008724,"url":"https://github.com/soloterm/solo","last_synced_at":"2025-05-13T22:09:21.587Z","repository":{"id":261539467,"uuid":"884529472","full_name":"soloterm/solo","owner":"soloterm","description":"Your all-in-one Laravel command to tame local development","archived":false,"fork":false,"pushed_at":"2025-03-22T15:22:59.000Z","size":1850,"stargazers_count":1133,"open_issues_count":19,"forks_count":53,"subscribers_count":7,"default_branch":"main","last_synced_at":"2025-04-30T12:16:58.214Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","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/soloterm.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":["aarondfrancis"],"patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"lfx_crowdfunding":null,"polar":null,"buy_me_a_coffee":null,"thanks_dev":null,"custom":["https://aaronfrancis.com/backstage"]}},"created_at":"2024-11-06T23:16:12.000Z","updated_at":"2025-04-28T14:16:38.000Z","dependencies_parsed_at":null,"dependency_job_id":"e8bd74c5-150a-40e7-954c-b0bcc62dbcbd","html_url":"https://github.com/soloterm/solo","commit_stats":null,"previous_names":["aarondfrancis/solo","soloterm/solo"],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/soloterm%2Fsolo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/soloterm%2Fsolo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/soloterm%2Fsolo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/soloterm%2Fsolo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/soloterm","download_url":"https://codeload.github.com/soloterm/solo/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254036830,"owners_count":22003654,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":[],"created_at":"2025-02-05T03:06:00.289Z","updated_at":"2025-05-13T22:09:16.572Z","avatar_url":"https://github.com/soloterm.png","language":"PHP","funding_links":["https://github.com/sponsors/aarondfrancis","https://aaronfrancis.com/backstage"],"categories":["PHP","Table of Contents"],"sub_categories":["Development Environment"],"readme":"\u003cp align=\"center\"\u003e\n    \u003cpicture\u003e\n      \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/soloterm/solo/refs/heads/main/art/solo_logo_dark.png\"\u003e\n      \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://raw.githubusercontent.com/soloterm/solo/refs/heads/main/art/solo_logo_light.png\"\u003e\n      \u003cimg alt=\"Solo for Laravel\" src=\"https://raw.githubusercontent.com/soloterm/solo/refs/heads/main/art/solo_logo_light.png\" style=\"max-width: 80%; height: auto;\"\u003e\n    \u003c/picture\u003e\n\u003c/p\u003e\n\n\u003ch3 align=\"center\"\u003eYour all-in-one Laravel command to tame local development\u003c/h3\u003e\n\n---\n\n# Solo for Laravel\n\n\u003e [!IMPORTANT]\n\u003e This package requires ext-pcntl, so it will not work on Windows. Sorry about that. If you know how to fix that, let me\nknow!\n\n## About\n\nSolo for Laravel is a package to run multiple commands at once, to aid in local development. All the commands needed to\nrun your application live behind a single artisan command:\n\n```shell\nphp artisan solo\n```\n\nEach command runs in its own tab in Solo. Use the left/right arrow keys to navigate between tabs and enjoy a powerful,\nunified development environment.\n\n![Screenshot](https://github.com/aarondfrancis/solo/blob/main/art/screenshot.png?raw=true)\n\n## Installation\n\n1. Require the package:\n\n```shell\ncomposer require soloterm/solo --dev\n```\n\n2. Install the package:\n\n```shell\nphp artisan solo:install\n```\n\nThis will publish the configuration file to `config/solo.php`.\n\n## Configuration\n\nSolo is entirely config-driven through `config/solo.php`. Here's a quick overview of what you can configure:\n\n### Commands\n\nDefine your commands in the `commands` array:\n\n```php\n'commands' =\u003e [\n    'About' =\u003e 'php artisan solo:about',\n    'Logs' =\u003e EnhancedTailCommand::file(storage_path('logs/laravel.log')),\n    'Vite' =\u003e 'npm run dev',\n    'Make' =\u003e new MakeCommand,\n    \n    // Lazy commands don't start automatically\n    'Dumps' =\u003e Command::from('php artisan solo:dumps')-\u003elazy(),\n    'Queue' =\u003e Command::from('php artisan queue:work')-\u003elazy(),\n    'Tests' =\u003e Command::from('php artisan test --colors=always')-\u003elazy(),\n],\n```\n\nYou can define commands in several ways:\n\n```php\n'commands' =\u003e [\n    // A simple string\n    'About' =\u003e 'php artisan solo:about',\n    \n    // A custom Command class\n    'Logs' =\u003e EnhancedTailCommand::file(storage_path('logs/laravel.log')),\n    'Make' =\u003e new MakeCommand,\n    \n    // Using the Command::from() static constructor\n    'Dumps' =\u003e Command::from('php artisan solo:dumps')-\u003elazy(),\n],\n```\n\nA simple string command is the easiest way, but if you need more control you're free to create your own custom class. The `EnhancedTailCommand` is a good example of what you can do in a custom command.\n\n#### Lazy Commands\n\nIf you want to define a command that does not start automatically, you can append `lazy()` to a Command instance:\n\n```php\n// You might need Reverb, but maybe not always, so don't autostart it.\n'Reverb' =\u003e Command::from('php artisan reverb')-\u003elazy()\n```\n \n### Themes\n\nSolo ships with both light and dark themes. Configure your preference in `config/solo.php`:\n\n```php\n'theme' =\u003e env('SOLO_THEME', 'dark'),\n\n'themes' =\u003e [\n    'light' =\u003e Themes\\LightTheme::class,\n    'dark' =\u003e Themes\\DarkTheme::class,\n],\n```\n\nYou can define your own theme if you'd like. It's probably easiest to subclass one of the existing themes.\n\n### Keybindings\n\nChoose between default and vim-style keybindings:\n\n```php\n'keybinding' =\u003e env('SOLO_KEYBINDING', 'default'),\n\n'keybindings' =\u003e [\n    'default' =\u003e Hotkeys\\DefaultHotkeys::class,\n    'vim' =\u003e Hotkeys\\VimHotkeys::class,\n],\n```\n\nAgain, you're welcome to define and register your own keybidings.\n\n## Usage\n\nStart Solo with:\n\n```shell\nphp artisan solo\n```\n\n### Key Controls\n\n\u003e Note these are the default bindings. They will be slightly different if you use the Vim bindings.\n\n- **Navigation**:\n    - \u003ckbd\u003eLeft\u003c/kbd\u003e/\u003ckbd\u003eRight\u003c/kbd\u003e arrows to switch between tabs\n    - \u003ckbd\u003eUp\u003c/kbd\u003e/\u003ckbd\u003eDown\u003c/kbd\u003e arrows to scroll output\n    - \u003ckbd\u003eShift\u003c/kbd\u003e + \u003ckbd\u003eUp\u003c/kbd\u003e/\u003ckbd\u003eDown\u003c/kbd\u003e to page scroll\n    - \u003ckbd\u003eg\u003c/kbd\u003e to quickly jump to any tab\n\n- **Command Controls**:\n    - \u003ckbd\u003es\u003c/kbd\u003e to start/stop the current command\n    - \u003ckbd\u003er\u003c/kbd\u003e to restart\n    - \u003ckbd\u003ec\u003c/kbd\u003e to clear output\n    - \u003ckbd\u003ep\u003c/kbd\u003e to pause output\n    - \u003ckbd\u003ef\u003c/kbd\u003e to resume (follow) output\n\n- **Interactive Mode**:\n    - \u003ckbd\u003ei\u003c/kbd\u003e to enter interactive mode\n    - \u003ckbd\u003eCtrl\u003c/kbd\u003e+\u003ckbd\u003eX\u003c/kbd\u003e to exit interactive mode\n\n- **Global**:\n    - \u003ckbd\u003eq\u003c/kbd\u003e or \u003ckbd\u003eCtrl\u003c/kbd\u003e+\u003ckbd\u003eC\u003c/kbd\u003e to quit Solo\n\n## Special Commands\n\n### EnhancedTailCommand\n\nThe `EnhancedTailCommand` provides improved log viewing with features like:\n\n- Vendor frame collapsing\n- Stack trace formatting\n- Toggle vendor frames with \u003ckbd\u003ev\u003c/kbd\u003e\n- File truncating\n\n```php\n'Logs' =\u003e EnhancedTailCommand::file(storage_path('logs/laravel.log')),\n```\n\n### MakeCommand\n\nSolo ships with a special `php artisan solo:make` command that proxies to all of the underlying `php artisan make:*`\ncommands. It serves as a universal entry point to Laravel's make commands.\n\nIt lives in a custom `MakeCommand` class.\n\n```php\n'Make' =\u003e new MakeCommand,\n```\n\n### `solo:dumps`\n\nSolo also ships with a custom \"[Dump Server](https://symfony.com/doc/current/components/var_dumper.html)\" that will intercept `dump` commands from your code and show them in Solo instead of inline. You can run this as a normal artisan command via `php artisan solo:dumps`.\n\n## FAQ\n\n#### My command isn't working\n\nTry these steps:\n\n1. Test if it works outside of Solo\n2. Check if it has an `--ansi` or `--colors=always` option\n3. Verify it's writing to STDOUT\n4. Look for options to force STDOUT output\n\n#### Can I run Sail commands?\n\nYes! Use this format: `vendor/bin/sail artisan schedule:work --ansi`\n\n#### Does Solo support Windows?\n\nNo, Solo requires `ext-pcntl` and other Unix-specific features. If you know how to fix that, please open a PR.\n\n#### Can I use this in production?\n\nI wouldn't! Use supervisor or similar tools for production environments.\n\n## Support\n\nThis is free! If you want to support me:\n\n- Sponsor my open source work: [aaronfrancis.com/backstage](https://aaronfrancis.com/backstage)\n- Check out my courses:\n    - [Mastering Postgres](https://masteringpostgres.com)\n    - [High Performance SQLite](https://highperformancesqlite.com)\n    - [Screencasting](https://screencasting.com)\n- Help spread the word about things I make\n\n## Credits\n\nSolo was developed by Aaron Francis. If you like it, please let me know!\n\n- Twitter: https://twitter.com/aarondfrancis\n- Website: https://aaronfrancis.com\n- YouTube: https://youtube.com/@aarondfrancis\n- GitHub: https://github.com/aarondfrancis/solo\n\nSpecial thanks to:\n\n- [Joe Tannenbaum](https://x.com/joetannenbaum) for his [Laracasts course](https://laracasts.com/series/cli-experiments)\n- Joe's [Chewie package](https://github.com/joetannenbaum/chewie)\n- [Laravel Prompts](https://laravel.com/docs/11.x/prompts)\n- [Will King](https://x.com/wking__) for the Solo logo","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsoloterm%2Fsolo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsoloterm%2Fsolo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsoloterm%2Fsolo/lists"}