PHPackages                             posio/cabinet-kit - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. posio/cabinet-kit

ActiveLibrary

posio/cabinet-kit
=================

Base admin panel scaffolding extracted from posio.cabinet: multi-tenant accounts, per-account roles/permissions, bundled auth, settings shell, Inertia+Vue layout and UI kit.

0.3.23(1w ago)025↑115%proprietaryVuePHP ^8.2

Since Jul 17Pushed 1w agoCompare

[ Source](https://github.com/AndreiDishlenko/posio-cabinet-kit)[ Packagist](https://packagist.org/packages/posio/cabinet-kit)[ RSS](/packages/posio-cabinet-kit/feed)WikiDiscussions main Synced 1w ago

READMEChangelogDependencies (6)Versions (27)Used By (0)

posio/cabinet-kit
=================

[](#posiocabinet-kit)

Quick install
-------------

[](#quick-install)

The package is not on Packagist — it is installed straight from its git repository, so any machine with network access to GitHub can install it; no local checkout of the package is needed.

Run inside an existing Laravel 11/12 + Inertia + Vue 3 project:

```
# 1. register the package repository
composer config repositories.cabinet-kit vcs https://github.com/AndreiDishlenko/posio-cabinet-kit.git

# 2. pull the package in
composer require posio/cabinet-kit:^0.3

# 3. wire it into the host project (configs, migrations, seeds, vite/tailwind patches)
php artisan cabinet-kit:install

# 4. install the npm deps the command added to package.json, then build
npm install
npm run dev
```

Then open `/cabinet/register` and create the first user — registration also creates the account (the "Company name" field), so no separate account-creation step is needed on a fresh install.

Signing in as one of the seeded accounts (`sa` / `admin`, see `system_users`in `config/cabinet-kit.php`) instead opens the password screen and stops there: their installed password is written in that config and is the same in every project using this package, so the cabinet opens only after it has been replaced. Set `'force_system_password_change' => false` if those passwords are managed outside the application.

### Notes on the git source

[](#notes-on-the-git-source)

- Composer needs `git` on PATH; if it is missing, Composer falls back to downloading zip archives from GitHub, which also works.
- To follow the unreleased tip instead of a tagged release, require `dev-main` and set `"minimum-stability": "dev"` + `"prefer-stable": true`in the host `composer.json`.
- Private-repo / rate-limit case: authenticate Composer once with a GitHub token — `composer config --global github-oauth.github.com `.
- Write the constraint as `^0.3`, not `0.3`: a two-segment version is an *exact* version to composer (it normalizes to `0.3.0`), so `0.3` installs the very first release of the line and hides every later tag — `composer update` then reports the project as current forever. `cabinet-kit:install` and `cabinet-kit:sync-config` rewrite such a constraint to its range form, and `cabinet-kit:doctor` fails on it.
- To pin an exact release, use a full tag instead of a range, e.g. `composer require posio/cabinet-kit:0.3.31` (left alone by the commands above — a three-segment pin is read as deliberate).
- Offline machines: clone or copy the repo to that machine and point the repository at the local path — `composer config repositories.cabinet-kit vcs /path/to/posio-cabinet-kit` (a plain filesystem path works as a `vcs`source because the copy is a git repo).

### Updating

[](#updating)

```
composer update posio/cabinet-kit
php artisan migrate                   # new versions may ship migrations
php artisan cabinet-kit:doctor        # verifies frontend/backend wiring
npm install && npm run build
```

On Windows the install command drops `updcab.bat` in the project root — running it performs the whole [Update](#update) procedure in order and stops at the first failing step.

Requirements and what those commands actually do — below; the full step-by-step is in [Update](#update).

---

Base admin-panel scaffolding extracted from `posio.cabinet`: multi-tenant accounts, per-account roles/permissions (Spatie Permission teams), bundled auth (login, register, logout, password reset, email verification), a Settings shell, a log viewer, a collapsible side-menu layout, and a small Vue 3 UI kit — for bootstrapping a new Laravel + Inertia + Vue 3 project's admin part.

Not a finished product — a **shell** you extend per project. See `docs/ARCHITECTURE.md` and `docs/EXTENDING.md`.

Requirements
------------

[](#requirements)

- Laravel 11/12, PHP 8.2+
- Inertia.js (Laravel adapter) + Vue 3, Options API
- `spatie/laravel-permission`, `opcodesio/log-viewer` (pulled in automatically)
- `tightenco/ziggy` (composer) + npm: `vue`, `@inertiajs/vue3`, `ziggy-js`, `@iconify/vue`, `@headlessui/vue`, `@vuepic/vue-datepicker`, `vue-final-modal`, `vee-validate`, `vue-i18n`, `dayjs`, `axios`, `sweetalert2`, `vue3-toastify`, `date-fns`, `@fontsource/inter`, `@fontsource/roboto`, `@fontsource/open-sans`, `@fontsource/inter-tight`, `@fontsource/pt-sans` — package pages resolve URLs through `route()` and use Iconify icons/date inputs with bundled fonts, confirmation dialogs and toasts. `php artisan cabinet-kit:install`adds them to `package.json` for you; `cabinet-kit:doctor` re-checks the list.
- A `User` model with `password`/`email_verified_at` columns (Laravel's default `users` migration already has both)

Install (in a consumer project)
-------------------------------

[](#install-in-a-consumer-project)

Commands — see [Quick install](#quick-install) above.

The install command publishes `config/cabinet-kit.php` and `config/cabinet-kit-redirects.php`, enables Spatie Permission teams before migrations, resolves auth-route conflicts, scaffolds the cabinet Vite entry (`resources/_admin/js/cabinet.ts` by default), patches `vite.config`, `tailwind.config` and `app/Models/User.php` with `.bak` backups, drops `updcab.bat` (the one-step update launcher) in the project root, runs migrations, seeds base roles, and finishes with `cabinet-kit:doctor`.

If the database already contains users, the command asks whether to delete them (with their accounts, memberships and role assignments) before seeding. The default answer is **no** — say yes only on a database you are willing to reset. `--purge-users` answers that prompt up front; with `--no-interaction`and no flag nothing is deleted.

Every CabinetKit page renders into the package's own Blade root view (`cabinet-kit::app`) with its own Vite entry — the host's main app view and entry are untouched.

Visit `/cabinet/register` afterwards to create your first user + account — registration bundles account creation (a "Company name" field), so there's no separate account-creation step for a brand-new install.

Update
------

[](#update)

Windows: run `updcab.bat` from the project root — it is scaffolded by the install command and runs exactly the six steps below, stopping at the first one that fails. Everything after this paragraph describes what it does (and what to run by hand elsewhere).

Full procedure, in order:

```
# 1. pull the new package version
composer update posio/cabinet-kit

# 2. only if the post-update hook is missing (see below) — re-apply host wiring
php artisan cabinet-kit:sync-config

# 3. apply migrations a new version may have added
php artisan migrate

# 4. drop caches built from package routes/config/views
php artisan optimize:clear

# 5. rebuild the frontend (sync-config may have added npm packages)
npm install
npm run build

# 6. verify the result
php artisan cabinet-kit:doctor
```

On production, re-cache after step 4 as usual (`php artisan config:cache route:cache view:cache`) — the caches must be rebuilt because package routes and views changed, not because the update needs anything special.

`cabinet-kit:install` registers `sync-config` in your `composer.json``post-update-cmd`, so from then on `composer update` runs it for you (step 2 is then redundant): it keeps the npm dependency list and the Tailwind `content` glob for the package templates current, creates config files a new package version introduced, and only *reports* new `config/cabinet-kit.php`keys (that file is never rewritten). Rebuild assets afterwards if it patched anything.

Read its output: keys it lists are new settings your `config/cabinet-kit.php`does not have yet — copy them in by hand, otherwise the package falls back to its own defaults for them. `cabinet-kit:doctor` at the end reports anything still unwired.

Vue/SCSS/routes/migrations are read straight from `vendor/posio/cabinet-kit/`— nothing was copied into your project, so there's nothing to merge. Anything you deliberately overrode in `resources/_admin/overrides/` keeps working untouched.

### Which version you get

[](#which-version-you-get)

`composer update posio/cabinet-kit` only moves inside the range in your `composer.json` (`^0.3` stays on `0.3.*`). A bare `0.3` there is not that range — composer reads it as the single release `0.3.0` and silently stops offering updates; `cabinet-kit:doctor` reports it, and `cabinet-kit:sync-config`rewrites it to `^0.3` (run `composer update posio/cabinet-kit` once more afterwards). Breaking changes — renamed config keys, removed props on released Vue components, changed route names — arrive as a major bump, so crossing one is a deliberate edit of the constraint followed by `composer update`, plus a read of `docs/CHANGELOG.md`.

To see what is available before updating:

```
composer show posio/cabinet-kit --all | head -20   # versions offered by the repo
composer outdated posio/cabinet-kit                # installed vs latest in range
```

If a `dev-main` install stops picking up new commits, Composer is serving a cached clone — `composer clearcache`, then update again.

Customizing
-----------

[](#customizing)

- Menu items, assignable roles, log-viewer path → `config/cabinet-kit.php`(survives updates for free).
- Where sign-in, registration, email confirmation and sign-out land → `config/cabinet-kit-redirects.php`. Point `home`/`after_login` at your own route to open the cabinet on your own page.
- Styles → `resources/_admin/scss/cabinet-kit-overrides.scss` (scaffolded by install, loaded after the kit so your rules win; redefine `--ck-*` tokens or re-declare element classes — never edit the package's own scss).
- Deeper changes → `resources/_admin/overrides/pages/...` (checked before the package's own version — see `docs/EXTENDING.md`).

Uninstall (remove from a project)
---------------------------------

[](#uninstall-remove-from-a-project)

There is no uninstall command — `cabinet-kit:install` patches the host's own files, and undoing that automatically would mean rewriting files you have edited since. The steps below are the exact reverse of what install did.

Back up the database first: step 1 drops tables and columns.

**1. Roll back the package migrations** (while the package is still installed — its migration files must be readable):

```
php artisan migrate:rollback --path=vendor/posio/cabinet-kit/database/migrations --step=20
```

That removes the `accounts`, `user_has_accounts` and `admin_links` tables, the settings/social-id columns added to `users`, and the `is_system` columns on `roles`/`permissions`. Migrations recorded from other paths are skipped with a "migration not found" note — that is expected, not an error.

Spatie's own permission tables were published into `database/migrations/`, so they are the host's files now: keep them if the project still uses roles, otherwise roll them back and delete them too. Seeded rows (roles, admin links, system users) disappear with their tables.

**2. Remove the composer package:**

```
composer remove posio/cabinet-kit
```

`spatie/laravel-permission`, `opcodesio/log-viewer` and `inertiajs/inertia-laravel`came in as its dependencies and go with it. If the project keeps using any of them, `composer require` it explicitly first.

**3. Undo the host-file patches.** Each patched file has a `.bak` copy from install time — useful as a reference, but do not blindly restore it: it predates every change you made since. Edit by hand:

FileWhat to remove`composer.json`the `@php artisan cabinet-kit:sync-config --ansi` entry in `scripts.post-update-cmd``vite.config.js`/`.ts`the `cabinet-kit.js` plugin import, the `cabinetKit({ https: true })` call, and the cabinet entry in the vite-plugin `input``tailwind.config.js`/`.ts`the `tailwind-preset.cjs` import, `cabinetKitPreset` in `presets`, and the `vendor/posio/cabinet-kit/**` glob in `content``app/Models/User.php``use IsCabinetKitUser;` and its `use Posio\CabinetKit\Traits\IsCabinetKitUser;` import`package.json`the npm packages install added (see [Requirements](#requirements)) — only the ones nothing else in the project uses`config/permission.php`the CabinetKit shape (`teams`, `user_has_roles`, `user_has_permissions`, `model_morph_key`) — **only** if the project drops Spatie roles entirely; reverting those names while permission tables still hold data breaks them**4. Delete the files install created:**

```
config/cabinet-kit.php
config/cabinet-kit-redirects.php
public/cabinet-assets/
resources/_admin/overrides/
resources/_admin/scss/cabinet-kit-overrides.scss
resources/_admin/js/cabinet.ts        # the Vite entry, if it serves nothing else
updcab.bat
*.bak                                 # the install-time backups, once you are done with them

```

**5. Rebuild and clear:**

```
composer dump-autoload
php artisan optimize:clear
npm install
npm run build
```

Nothing else of the package remains in the project: Vue/SCSS/routes/views were always read from `vendor/`, which step 2 deleted. If the host relied on the bundled auth routes (`login`, `register`, `password.*`, `verification.*`), those names are now gone — restore the project's own auth routes before deploying.

Developing this package itself
------------------------------

[](#developing-this-package-itself)

Open this repo directly (`F:\Packages\posio-cabinet-kit`) and follow its own `CLAUDE.md`. Tag a new semver version after merging a change; consumer projects pick it up with `composer update posio/cabinet-kit`.

###  Health Score

42

—

FairBetter than 88% of packages

Maintenance98

Actively maintained with recent releases

Popularity9

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity46

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~1 days

Total

26

Last Release

13d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/8933bf94339f0d35c4125772f6205276e7b758cb44aecbf068595630aa5838b4?d=identicon)[Andrei Dishlenko](/maintainers/Andrei%20Dishlenko)

---

Top Contributors

[![AndreiDishlenko](https://avatars.githubusercontent.com/u/79060754?v=4)](https://github.com/AndreiDishlenko "AndreiDishlenko (45 commits)")

### Embed Badge

![Health badge](/badges/posio-cabinet-kit/health.svg)

```
[![Health](https://phpackages.com/badges/posio-cabinet-kit/health.svg)](https://phpackages.com/packages/posio-cabinet-kit)
```

###  Alternatives

[erag/laravel-lang-sync-inertia

A powerful Laravel package for syncing and managing language translations across backend and Inertia.js (Vue/React/Svelte) frontends, offering effortless localization, auto-sync features, and smooth multi-language support for modern Laravel applications.

6036.2k](/packages/erag-laravel-lang-sync-inertia)[emargareten/inertia-modal

Inertia Modal is a Laravel package that lets you implement backend-driven modal dialogs for Inertia apps.

90173.3k](/packages/emargareten-inertia-modal)[fleetbase/core-api

Core Framework and Resources for Fleetbase API

1346.4k29](/packages/fleetbase-core-api)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
