{"id":15030002,"url":"https://github.com/sprout-laravel/sprout","last_synced_at":"2025-05-16T09:05:29.362Z","repository":{"id":166568472,"uuid":"642076110","full_name":"sprout-laravel/sprout","owner":"sprout-laravel","description":"A flexible, seamless and easy to use multitenancy solution for Laravel","archived":false,"fork":false,"pushed_at":"2025-03-25T12:55:57.000Z","size":533,"stargazers_count":331,"open_issues_count":8,"forks_count":10,"subscribers_count":10,"default_branch":"1.x","last_synced_at":"2025-05-10T13:54:44.304Z","etag":null,"topics":["laravel","laravel-multi-tenancy","laravel-multi-tenant","laravel-multitenancy","laravel-package","multi-tenancy","multitenancy","package","php","php8"],"latest_commit_sha":null,"homepage":"https://sprout.ollieread.com","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/sprout-laravel.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE.md","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":["ollieread"]}},"created_at":"2023-05-17T19:10:08.000Z","updated_at":"2025-05-07T22:38:49.000Z","dependencies_parsed_at":"2023-08-21T16:33:54.953Z","dependency_job_id":"2c687e3b-92d0-4a99-a564-4b073aed2ea6","html_url":"https://github.com/sprout-laravel/sprout","commit_stats":null,"previous_names":["tenantedlaravel/core","tenantedlaravel/tenantedlaravel","sprout-laravel/sprout"],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sprout-laravel%2Fsprout","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sprout-laravel%2Fsprout/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sprout-laravel%2Fsprout/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sprout-laravel%2Fsprout/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sprout-laravel","download_url":"https://codeload.github.com/sprout-laravel/sprout/tar.gz/refs/heads/1.x","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254501557,"owners_count":22081528,"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":["laravel","laravel-multi-tenancy","laravel-multi-tenant","laravel-multitenancy","laravel-package","multi-tenancy","multitenancy","package","php","php8"],"created_at":"2024-09-24T20:12:12.442Z","updated_at":"2025-05-16T09:05:24.348Z","avatar_url":"https://github.com/sprout-laravel.png","language":"PHP","funding_links":["https://github.com/sponsors/ollieread"],"categories":[],"sub_categories":[],"readme":"\u003cimg src=\"sprout.png\"\u003e\n\n![Packagist Version](https://img.shields.io/packagist/v/sprout/sprout)\n![Packagist PHP Version Support](https://img.shields.io/packagist/php-v/sprout/sprout)\n\n![GitHub](https://img.shields.io/github/license/sprout-laravel/sprout)\n![Laravel](https://img.shields.io/badge/laravel-11.x-red.svg)\n[![codecov](https://codecov.io/gh/sprout-laravel/sprout/branch/1.x/graph/badge.svg?token=FHJ41NQMTA)](https://codecov.io/gh/sprout-laravel/sprout)\n\n![Unit Tests](https://github.com/sprout-laravel/sprout/actions/workflows/tests.yml/badge.svg)\n![Static Analysis](https://github.com/sprout-laravel/sprout/actions/workflows/static-analysis.yml/badge.svg)\n\n# Sprout for Laravel\nA flexible, seamless, and easy to use multitenancy solution for Laravel\n\nSprout is a multitenancy package for Laravel that fits seamlessly into your application.\nIt provides a whole host of features, with the flexibility to allow you to add your own.\nYou can read all about Sprouts features and how to get started in\nthe [documentation](https://sprout.ollieread.com/docs/1.x).\n\n## Features\n\nSprout comes out of the box with the following features:\n\n- **Tenant Identification**:\n  Sprout can identify tenants by _subdomain_, _path_, _header_, _cookie_ or session.\n  It can do this immediately once a route is matched, or during the middleware stack.\n- **Multiple Tenancies**: \n  Sprout can handle multiple tenancies, as in multiple different models that are tenants.\n- **Tenant Storage Disks**: \n  Sprout comes with a service override that allows you to create a storage disk that \n  always points to the current tenant's storage directory.\n- **Tenant Sessions \u0026 Cookies**: \n  If you're identifying tenants via a method that uses the URL (subdomain or path), \n  cookies, and therefore the session cookie, will be automatically scoped to the current tenant.\n- **Tenant Cache Stores**: \n  Just like with storage disks, Sprout allows you to create a cache store that always \n  returns the current tenants cache.\n- **Tenant Aware Jobs**: \n  When a job is dispatched, Sprout will make sure that any tenancies that are active are \n  recreated when the job is processing, along with their current tenants.\n- **Tenant Password Resets**: \n  If you're following a model where users belong to a single tenant, you'll also want to \n  make sure that password resets are scoped to the tenant.\n  Sprout can do this for you.\n- **Automatic Scoping**: \n  As well as all the automated scoping of storage disks, cache stores, jobs, password resets \n  and so on, Sprout also comes with a set of functionality for automatically scoping models, during creation and \n  querying.\n\nThere are also three upcoming first-party addons for Sprout:\n\n- [**Sprout Bud**](https://github.com/sprout-laravel/bud): \n  Bud allows you to manage tenant-specific \n  configuration, with built-in support for \n  dynamically configuring a whole of Laravels core connections and driver-based services.\n- [**Sprout Seedling**](https://github.com/sprout-laravel/seedling): \n  Seedling builds on-top of the functionality \n  provided by Sprout Bud, to bring multi-tenant-specific database support to your Laravel application.\n  As well as enabling the dynamic configuration of connections, it comes with a batch of supporting functionality to \n  make managing tenant-specific databases easier.\n- [**Sprout Terra**](https://github.com/sprout-laravel/terra): \n  Terra brings _domain_-based identification to \n  Sprout, allowing you to identify tenants based on the domain they are accessing your application from.\n  Just like with Seedling, it also comes with a bunch of supporting functionality for dealing with tenant domains.\n\n## FAQ\n\n### Does Sprout support tenant-specific databases?\nIt will do through [Sprout Seedling](https://github.com/sprout-laravel/seedling), which is currently in development.\n\n### Why are tenant-specific databases handled by an addon?\nI didn't want to just provide a barebones implementation of tenant-specific database handling, as there's a lot more \nto think about than just changing the connection on a model.\nSo, I wanted to provide the feature with a bunch of opt-in supporting functionality, which is why it's an addon.\n\n### Does sprout support domain-based identification?\nIt will do through [Sprout Terra](https://github.com/sprout-laravel/terra), which is currently in development.\n\n### Why are domain-based tenants handled by an addon?\nThe same as with Seedling, I wanted to provide a bunch of supporting functionality to make managing domain-based tenants\neasier, which is why it's an addon.\n\n### Why should I use Sprout over other multitenancy packages?\nIt will mostly come down to preference, but I've tried to make Sprout as flexible as possible, without compromising on\nany features and functionality.\nIt is built to be as seamless as possible, avoiding hacky workarounds and providing a clean API.\nNo magic to dynamically modify things, or artificial limitations, whether side effects or not.\n\n### Why did you build Sprout?\nI found that the existing multitenancy packages for Laravel were either too opinionated, not flexible enough, or\nlacking in features.\nI wanted to build something that was flexible, feature-rich, and easy to use.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsprout-laravel%2Fsprout","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsprout-laravel%2Fsprout","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsprout-laravel%2Fsprout/lists"}