├── .github └── workflows │ ├── update-readme.yml │ └── validate-templates.yml ├── README.md ├── README_template.md ├── screenshot.png └── templates.json /.github/workflows/update-readme.yml: -------------------------------------------------------------------------------- 1 | name: Update README with Starter Kits 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | - restructure 8 | 9 | permissions: 10 | contents: write 11 | 12 | jobs: 13 | update-readme: 14 | runs-on: ubuntu-latest 15 | steps: 16 | - name: Checkout code 17 | uses: actions/checkout@v3 18 | with: 19 | token: ${{ secrets.GITHUB_TOKEN }} 20 | 21 | - name: Set up Node.js 22 | uses: actions/setup-node@v3 23 | with: 24 | node-version: '18' 25 | 26 | - name: Update README with Starter Kits 27 | run: | 28 | # Create a script to update the README 29 | cat > update-readme.js << 'EOF' 30 | const fs = require('fs'); 31 | const https = require('https'); 32 | 33 | // Function to fetch package data from Packagist 34 | async function getPackageData(repo) { 35 | return new Promise((resolve, reject) => { 36 | const url = `https://packagist.org/packages/${repo}.json`; 37 | console.log(`Fetching data for ${repo} from ${url}`); 38 | https.get(url, (res) => { 39 | let data = ''; 40 | res.on('data', (chunk) => { data += chunk; }); 41 | res.on('end', () => { 42 | try { 43 | if (res.statusCode === 200) { 44 | const packageData = JSON.parse(data); 45 | console.log(`Successfully fetched data for ${repo}, installs: ${packageData.package.downloads.total}`); 46 | resolve(packageData); 47 | } else { 48 | console.log(`Package not found for ${repo}, status code: ${res.statusCode}`); 49 | // If package not found on Packagist, return null 50 | resolve(null); 51 | } 52 | } catch (e) { 53 | console.error(`Error parsing data for ${repo}: ${e.message}`); 54 | resolve(null); 55 | } 56 | }); 57 | }).on('error', (e) => { 58 | console.error(`Error fetching data for ${repo}: ${e.message}`); 59 | resolve(null); // Resolve with null on error to continue processing 60 | }); 61 | }); 62 | } 63 | 64 | // Function to format install count with commas 65 | function formatNumber(num) { 66 | return num ? num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',') : '0'; 67 | } 68 | 69 | // Main function to update README 70 | async function updateReadme() { 71 | // Read templates.json 72 | const templates = JSON.parse(fs.readFileSync('templates.json', 'utf8')); 73 | 74 | // Read README_template.md as the template 75 | let readme = fs.readFileSync('README_template.md', 'utf8'); 76 | console.log('Original README_template.md content:', readme); 77 | 78 | // Verify the template has been read correctly 79 | if (!readme || readme.trim() === '') { 80 | throw new Error('README_template.md is empty or could not be read'); 81 | } 82 | 83 | // Log the first line to verify it contains "laravel new starter" 84 | const firstLine = readme.split('\n')[0]; 85 | console.log('First line of README_template.md:', firstLine); 86 | 87 | // Generate official starter kits list with sorting by installs 88 | const officialKits = []; 89 | for (const kit of templates.official) { 90 | const packageData = await getPackageData(kit.package); 91 | // Ensure installs is a number for proper sorting 92 | const installs = packageData && packageData.package && packageData.package.downloads ? 93 | parseInt(packageData.package.downloads.total, 10) : 0; 94 | officialKits.push({ 95 | title: kit.title, 96 | package: kit.package, 97 | repo: kit.repo, 98 | installs: installs 99 | }); 100 | console.log(`Added official kit: ${kit.title}, package: ${kit.package}, repo: ${kit.repo}, installs: ${installs}`); 101 | } 102 | 103 | // Sort official kits by installs (descending) 104 | officialKits.sort((a, b) => b.installs - a.installs); 105 | console.log('Sorted official kits:', JSON.stringify(officialKits, null, 2)); 106 | 107 | // Generate the formatted list 108 | let officialList = ''; 109 | for (const kit of officialKits) { 110 | officialList += `- [${kit.title}](https://github.com/${kit.repo}) - \`${kit.package}\` - 💿 ${formatNumber(kit.installs)} installs\n`; 111 | } 112 | 113 | // Generate community starter kits list with sorting by installs 114 | const communityKits = []; 115 | for (const kit of templates.community) { 116 | const packageData = await getPackageData(kit.package); 117 | // Ensure installs is a number for proper sorting 118 | const installs = packageData && packageData.package && packageData.package.downloads ? 119 | parseInt(packageData.package.downloads.total, 10) : 0; 120 | communityKits.push({ 121 | title: kit.title, 122 | package: kit.package, 123 | repo: kit.repo, 124 | installs: installs 125 | }); 126 | console.log(`Added community kit: ${kit.title}, package: ${kit.package}, repo: ${kit.repo}, installs: ${installs}`); 127 | } 128 | 129 | // Sort community kits by installs (descending) 130 | communityKits.sort((a, b) => b.installs - a.installs); 131 | console.log('Sorted community kits:', JSON.stringify(communityKits, null, 2)); 132 | 133 | // Generate the formatted list 134 | let communityList = ''; 135 | for (const kit of communityKits) { 136 | communityList += `- [${kit.title}](https://github.com/${kit.repo}) - \`${kit.package}\` - 💾 ${formatNumber(kit.installs)} installs\n`; 137 | } 138 | 139 | // Replace placeholders in README 140 | console.log('Looking for placeholders in README_template...'); 141 | console.log('README_template before replacement:', readme); 142 | 143 | // Use regex with global flag to ensure all occurrences are replaced 144 | readme = readme.replace(/\[OFFICIAL\]/g, officialList.trim()); 145 | readme = readme.replace(/\[COMMUNITY\]/g, communityList.trim()); 146 | 147 | console.log('Generated README content (excerpt):', readme.substring(0, 500) + '...'); 148 | console.log('Official list generated:', officialList); 149 | console.log('Community list generated:', communityList); 150 | 151 | // Write updated README 152 | fs.writeFileSync('README.md', readme); 153 | 154 | // Verify the README.md was written correctly 155 | const writtenReadme = fs.readFileSync('README.md', 'utf8'); 156 | console.log('First line of written README.md:', writtenReadme.split('\n')[0]); 157 | 158 | if (writtenReadme !== readme) { 159 | console.warn('WARNING: Written README.md does not match the generated content'); 160 | } 161 | 162 | console.log('README.md has been updated with starter kits from templates.json'); 163 | } 164 | 165 | // Verify README_template.md exists before running 166 | if (!fs.existsSync('README_template.md')) { 167 | console.error('ERROR: README_template.md does not exist'); 168 | process.exit(1); 169 | } 170 | 171 | // Run the update 172 | updateReadme().catch(err => { 173 | console.error('Error updating README:', err); 174 | process.exit(1); 175 | }); 176 | EOF 177 | 178 | # Run the script 179 | node update-readme.js 180 | 181 | - name: Commit and push if changed 182 | run: | 183 | git config --local user.email "action@github.com" 184 | git config --local user.name "GitHub Action" 185 | 186 | # Check if README.md exists and show its content 187 | echo "Current README.md content (first few lines):" 188 | head README.md 189 | 190 | # Always add README.md since we're generating it from the template 191 | git add README.md 192 | 193 | # Check for changes in the staging area 194 | git status 195 | 196 | # Force the commit even if git thinks there are no changes 197 | git commit --allow-empty -m "Update README with latest starter kits from template" 198 | 199 | # Force push to ensure README.md is always updated 200 | git push --force origin HEAD:${{ github.ref }} 201 | -------------------------------------------------------------------------------- /.github/workflows/validate-templates.yml: -------------------------------------------------------------------------------- 1 | name: Validate Templates JSON 2 | 3 | on: 4 | pull_request: 5 | paths: 6 | - 'templates.json' 7 | 8 | jobs: 9 | validate-json: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - name: Checkout code 13 | uses: actions/checkout@v3 14 | 15 | - name: Validate templates.json 16 | run: | 17 | echo "Validating templates.json..." 18 | # Check if file exists 19 | if [ ! -f "templates.json" ]; then 20 | echo "Error: templates.json file not found" 21 | exit 1 22 | fi 23 | 24 | # Validate JSON syntax 25 | if ! jq empty templates.json 2>/dev/null; then 26 | echo "Error: templates.json contains invalid JSON" 27 | exit 1 28 | fi 29 | 30 | # Validate structure (must have official and community sections) 31 | if ! jq -e '.official and .community' templates.json >/dev/null; then 32 | echo "Error: templates.json must contain both 'official' and 'community' sections" 33 | exit 1 34 | fi 35 | 36 | # Validate that all values are strings (repository paths) 37 | if ! jq -e 'all(.. | objects | all(values | type == "string"))' templates.json >/dev/null; then 38 | echo "Error: All repository values in templates.json must be strings" 39 | exit 1 40 | fi 41 | 42 | echo "✅ templates.json is valid" 43 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # laravel new starter 2 | 3 | Using the [Laravel installer](https://laravel.com/docs/installation#installing-php) developers can pass the `--using` flag to the `laravel new` command, and install any community starter template. Below is a list of the available templates. 4 | 5 | ## Official Templates 6 | 7 | - [Livewire](https://github.com/laravel/livewire-starter-kit) - `laravel/livewire-starter-kit` - 💿 60,542 installs 8 | - [React](https://github.com/laravel/react-starter-kit) - `laravel/react-starter-kit` - 💿 58,258 installs 9 | - [Vue](https://github.com/laravel/vue-starter-kit) - `laravel/vue-starter-kit` - 💿 42,530 installs 10 | 11 | --- 12 | 13 | ## Community Templates 14 | 15 | - [Statamic](https://github.com/statamic/statamic) - `statamic/statamic` - 💾 137,777 installs 16 | - [Genesis](https://github.com/thedevdojo/genesis) - `devdojo/genesis` - 💾 9,083 installs 17 | - [Filament Zeus starters](https://github.com/lara-zeus/zeus) - `lara-zeus/zeus` - 💾 871 installs 18 | - [Wave](https://github.com/thedevdojo/wave) - `devdojo/wave` - 💾 567 installs 19 | - [Cachet](https://github.com/cachethq/cachet) - `cachethq/cachet` - 💾 416 installs 20 | - [TALL starter](https://github.com/mortenebak/tallstarter) - `mortenebak/tallstarter` - 💾 316 installs 21 | - [Filament](https://github.com/tnylea/filamentapp) - `tnylea/filamentapp` - 💾 271 installs 22 | - [Blade Starter Kit (with FluxUI)](https://github.com/imacrayon/blade-starter-kit) - `imacrayon/blade-starter-kit` - 💾 196 installs 23 | - [Svelte](https://github.com/oseughu/svelte-starter-kit) - `oseughu/svelte-starter-kit` - 💾 167 installs 24 | - [React JSX Starter Kit](https://github.com/YazidKHALDI/react-jsx-starter-kit) - `YazidKHALDI/react-jsx-starter-kit` - 💾 121 installs 25 | - [Justd Starter Kit](https://github.com/justdlabs/laravel) - `justd/laravel` - 💾 85 installs 26 | - [Modern Vue Starter Kit](https://github.com/shipfastlabs/modern-vue-starter-kit) - `shipfastlabs/modern-vue-starter-kit` - 💾 76 installs 27 | - [Modern React Starter Kit](https://github.com/shipfastlabs/modern-react-starter-kit) - `shipfastlabs/modern-react-starter-kit` - 💾 73 installs 28 | - [Unstyled Blade Starter Kit](https://github.com/javdome/unstyled-blade-starter-kit) - `javdome/unstyled-blade-starter-kit` - 💾 66 installs 29 | - [Bootstrap Starter Kit](https://github.com/hostmoz/laravel-bootstrap-starter-kit) - `hostmoz/laravel-bootstrap-starter-kit` - 💾 52 installs 30 | - [Tablar Starter Kit](https://github.com/takielias/tablar-starter-kit) - `takielias/tablar-starter-kit` - 💾 45 installs 31 | - [Larasonic Vue](https://github.com/shipfastlabs/larasonic-vue) - `shipfastlabs/larasonic-vue` - 💾 43 installs 32 | - [Hotwire Starter Kit](https://github.com/hotwired-laravel/hotwire-starter-kit) - `hotwired-laravel/hotwire-starter-kit` - 💾 41 installs 33 | - [React (Mantine) Starter Kit](https://github.com/adrum/laravel-react-mantine-starter-kit) - `adrum/laravel-react-mantine-starter-kit` - 💾 38 installs 34 | - [Modern Livewire Starter Kit](https://github.com/shipfastlabs/modern-livewire-starter-kit) - `shipfastlabs/modern-livewire-starter-kit` - 💾 37 installs 35 | - [Larasonic React](https://github.com/shipfastlabs/larasonic-react) - `shipfastlabs/larasonic-react` - 💾 32 installs 36 | - [MoonShine](https://github.com/moonshine-software/app) - `moonshine/app` - 💾 32 installs 37 | - [Livewire Starter](https://github.com/tnylea/livewire-starter) - `tnylea/livewire-starter` - 💾 16 installs 38 | - [Jetstream React (TypeScript)](https://github.com/adrum/laravel-jetstream-react-typescript) - `adrum/laravel-jetstream-react-typescript` - 💾 15 installs 39 | - [New Laravel React App](https://github.com/tnylea/react-starter) - `tnylea/react-starter` - 💾 14 installs 40 | - [Tabler based Laravel starter kit](https://github.com/santosvilanculos/cuirass) - `santosvilanculos/cuirass` - 💾 14 installs 41 | - [CoreUI Vue Starter Kit](https://github.com/kastsecho/coreui-vue-starter-kit) - `kastsecho/coreui-vue-starter-kit` - 💾 9 installs 42 | - [Laravel Breeze React Starter Kit](https://github.com/luis-developer-08/breeze-react-jsx-starter-kit) - `luis-developer-08/breeze-react-jsx-starter-kit` - 💾 8 installs 43 | - [New Laravel Inertia+React App](https://github.com/tnylea/react-inertia-starter) - `tnylea/react-inertia-starter` - 💾 6 installs 44 | - [Nuxt UI Starter](https://github.com/stursby/nuxt-ui-starter) - `stursby/nuxt-ui-starter` - 💾 4 installs 45 | 46 | --- 47 | 48 | ## Submit Your Own Starter Kit 49 | 50 | If you have a starter kit that you would like to be added to this list, please add your starter kit under the `community` key in the [templates.json](templates.json) file, and submit a pull request. The starter kit will dynamically be added to the Readme inside of the Github Action. 51 | 52 | --- 53 | 54 | > [!IMPORTANT] 55 | > Be cautious when installing any starter. Be sure to do research and learn more about each project. -------------------------------------------------------------------------------- /README_template.md: -------------------------------------------------------------------------------- 1 | # laravel new starter 2 | 3 | Using the [Laravel installer](https://laravel.com/docs/installation#installing-php) developers can pass the `--using` flag to the `laravel new` command, and install any community starter template. Below is a list of the available templates. 4 | 5 | ## Official Templates 6 | 7 | [OFFICIAL] 8 | 9 | --- 10 | 11 | ## Community Templates 12 | 13 | [COMMUNITY] 14 | 15 | --- 16 | 17 | ## Submit Your Own Starter Kit 18 | 19 | If you have a starter kit that you would like to be added to this list, please add your starter kit under the `community` key in the [templates.json](templates.json) file, and submit a pull request. The starter kit will dynamically be added to the Readme inside of the Github Action. 20 | 21 | --- 22 | 23 | > [!IMPORTANT] 24 | > Be cautious when installing any starter. Be sure to do research and learn more about each project. -------------------------------------------------------------------------------- /screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tnylea/laravel-new/3dc1f6c8b5d37e11948d0f27e6b1cd5c8b446d73/screenshot.png -------------------------------------------------------------------------------- /templates.json: -------------------------------------------------------------------------------- 1 | { 2 | "official": [{ 3 | "title": "React", 4 | "package": "laravel/react-starter-kit", 5 | "repo": "laravel/react-starter-kit" 6 | }, 7 | { 8 | "title": "Vue", 9 | "package": "laravel/vue-starter-kit", 10 | "repo": "laravel/vue-starter-kit" 11 | }, 12 | { 13 | "title": "Livewire", 14 | "package": "laravel/livewire-starter-kit", 15 | "repo": "laravel/livewire-starter-kit" 16 | } 17 | ], 18 | "community": [{ 19 | "title": "Statamic", 20 | "package": "statamic/statamic", 21 | "repo": "statamic/statamic" 22 | }, 23 | { 24 | "title": "Cachet", 25 | "package": "cachethq/cachet", 26 | "repo": "cachethq/cachet" 27 | }, 28 | { 29 | "title": "Svelte", 30 | "package": "oseughu/svelte-starter-kit", 31 | "repo": "oseughu/svelte-starter-kit" 32 | }, 33 | { 34 | "title": "Wave", 35 | "package": "devdojo/wave", 36 | "repo": "thedevdojo/wave" 37 | }, 38 | { 39 | "title": "Genesis", 40 | "package": "devdojo/genesis", 41 | "repo": "thedevdojo/genesis" 42 | }, 43 | { 44 | "title": "Filament", 45 | "package": "tnylea/filamentapp", 46 | "repo": "tnylea/filamentapp" 47 | }, 48 | { 49 | "title": "Livewire Starter", 50 | "package": "tnylea/livewire-starter", 51 | "repo": "tnylea/livewire-starter" 52 | }, 53 | { 54 | "title": "Larasonic React", 55 | "package": "shipfastlabs/larasonic-react", 56 | "repo": "shipfastlabs/larasonic-react" 57 | }, 58 | { 59 | "title": "Larasonic Vue", 60 | "package": "shipfastlabs/larasonic-vue", 61 | "repo": "shipfastlabs/larasonic-vue" 62 | }, 63 | { 64 | "title": "TALL starter", 65 | "package": "mortenebak/tallstarter", 66 | "repo": "mortenebak/tallstarter" 67 | }, 68 | { 69 | "title": "Filament Zeus starters", 70 | "package": "lara-zeus/zeus", 71 | "repo": "lara-zeus/zeus" 72 | }, 73 | { 74 | "title": "Modern Livewire Starter Kit", 75 | "package": "shipfastlabs/modern-livewire-starter-kit", 76 | "repo": "shipfastlabs/modern-livewire-starter-kit" 77 | }, 78 | { 79 | "title": "Modern Vue Starter Kit", 80 | "package": "shipfastlabs/modern-vue-starter-kit", 81 | "repo": "shipfastlabs/modern-vue-starter-kit" 82 | }, 83 | { 84 | "title": "Modern React Starter Kit", 85 | "package": "shipfastlabs/modern-react-starter-kit", 86 | "repo": "shipfastlabs/modern-react-starter-kit" 87 | }, 88 | { 89 | "title": "React JSX Starter Kit", 90 | "package": "YazidKHALDI/react-jsx-starter-kit", 91 | "repo": "YazidKHALDI/react-jsx-starter-kit" 92 | }, 93 | { 94 | "title": "Unstyled Blade Starter Kit", 95 | "package": "javdome/unstyled-blade-starter-kit", 96 | "repo": "javdome/unstyled-blade-starter-kit" 97 | }, 98 | { 99 | "title": "Tablar Starter Kit", 100 | "package": "takielias/tablar-starter-kit", 101 | "repo": "takielias/tablar-starter-kit" 102 | }, 103 | { 104 | "title": "MoonShine", 105 | "package": "moonshine/app", 106 | "repo": "moonshine-software/app" 107 | }, 108 | { 109 | "title": "New Laravel React App", 110 | "package": "tnylea/react-starter", 111 | "repo": "tnylea/react-starter" 112 | }, 113 | { 114 | "title": "New Laravel Inertia+React App", 115 | "package": "tnylea/react-inertia-starter", 116 | "repo": "tnylea/react-inertia-starter" 117 | }, 118 | { 119 | "title": "Bootstrap Starter Kit", 120 | "package": "hostmoz/laravel-bootstrap-starter-kit", 121 | "repo": "hostmoz/laravel-bootstrap-starter-kit" 122 | }, 123 | { 124 | "title": "Blade Starter Kit (with FluxUI)", 125 | "package": "imacrayon/blade-starter-kit", 126 | "repo": "imacrayon/blade-starter-kit" 127 | }, 128 | { 129 | "title": "React (Mantine) Starter Kit", 130 | "package": "adrum/laravel-react-mantine-starter-kit", 131 | "repo": "adrum/laravel-react-mantine-starter-kit" 132 | }, 133 | { 134 | "title": "Jetstream React (TypeScript)", 135 | "package": "adrum/laravel-jetstream-react-typescript", 136 | "repo": "adrum/laravel-jetstream-react-typescript" 137 | }, 138 | { 139 | "title": "Laravel Breeze React Starter Kit", 140 | "package": "luis-developer-08/breeze-react-jsx-starter-kit", 141 | "repo": "luis-developer-08/breeze-react-jsx-starter-kit" 142 | }, 143 | { 144 | "title": "Justd Starter Kit", 145 | "package": "justd/laravel", 146 | "repo": "justdlabs/laravel" 147 | }, 148 | { 149 | "title": "CoreUI Vue Starter Kit", 150 | "package": "kastsecho/coreui-vue-starter-kit", 151 | "repo": "kastsecho/coreui-vue-starter-kit" 152 | }, 153 | { 154 | "title": "Tabler based Laravel starter kit", 155 | "package": "santosvilanculos/cuirass", 156 | "repo": "santosvilanculos/cuirass" 157 | }, 158 | { 159 | "title": "Hotwire Starter Kit", 160 | "package": "hotwired-laravel/hotwire-starter-kit", 161 | "repo": "hotwired-laravel/hotwire-starter-kit" 162 | }, 163 | { 164 | "title": "Nuxt UI Starter", 165 | "package": "stursby/nuxt-ui-starter", 166 | "repo": "stursby/nuxt-ui-starter" 167 | } 168 | ] 169 | } 170 | --------------------------------------------------------------------------------