Motivation
Currently, after a trial license expires, the silkpanel‑cms backend remains usable – only updates are blocked. For paid licenses (1/3/12‑month plans) we need stronger enforcement. Once a paid license expires, the admin panel must become completely inaccessible. The user should see a permanent modal overlay that cannot be dismissed, effectively locking them out until they renew their license.
This behavior must be shipped as a separate Composer package (silkpanel/license-enforcement) distributed through https://composer.devso.me. The private repository already blocks package downloads when a license is invalid or expired, so the enforcement package itself cannot be updated once the license expires. However, the installed package remains present and continues to enforce the lock, ensuring the admin panel stays blocked.
Proposed solution
-
License enforcement package
A new package silkpanel/license-enforcement is created and made available via the private composer repository. It contains:
- A middleware that runs on all admin routes.
- A permanent modal component (Filament modal or dedicated overlay).
- A service that checks the license status, either by caching the latest heartbeat response from
devso.me or by calling the license endpoint directly.
-
Lock logic
On every admin request, the middleware inspects the current license status:
- Paid license expired → The response is replaced by a view/modal that covers the entire screen. The modal displays a message (e.g., “Your license has expired. Please renew to regain access.”) and has no close button, no dismiss action, no escape route. All admin URLs return this modal.
- Trial expired → No hard lock; the existing behavior is kept (backend usable, updates blocked).
- Active paid license → Normal access.
- License server unreachable → A grace period (e.g., 7 days) applies; after that, the hard lock is triggered to prevent abuse. The last known valid status is retained locally.
Important: This logic depends on the license server returning not just valid = true/false, but also additional fields that indicate whether the user has ever been a paying customer. See the required API changes below (sub‑ticket).
-
Permanent modal implementation
The modal is rendered as a full‑page overlay, not a simple pop‑up. It must not be closable via keyboard, click, or URL manipulation. The middleware returns this modal for any admin route, including Filament’s root URL and all child paths.
-
Documentation update
The official documentation will be revised to clearly explain the difference between trial expiration and paid license expiration. It will describe the lockout screen, how to renew (via devso.me), and that once renewed, the lock is automatically lifted after the next successful license heartbeat.
-
Package update restriction (by design)
Because composer.devso.me requires a valid license key to download packages, an expired license prevents the enforcement package from being updated. However, the already installed package continues to function and enforces the lock. This ensures a user cannot simply update to a version without the lock while their license is expired.
Motivation
Currently, after a trial license expires, the silkpanel‑cms backend remains usable – only updates are blocked. For paid licenses (1/3/12‑month plans) we need stronger enforcement. Once a paid license expires, the admin panel must become completely inaccessible. The user should see a permanent modal overlay that cannot be dismissed, effectively locking them out until they renew their license.
This behavior must be shipped as a separate Composer package (
silkpanel/license-enforcement) distributed throughhttps://composer.devso.me. The private repository already blocks package downloads when a license is invalid or expired, so the enforcement package itself cannot be updated once the license expires. However, the installed package remains present and continues to enforce the lock, ensuring the admin panel stays blocked.Proposed solution
License enforcement package
A new package
silkpanel/license-enforcementis created and made available via the private composer repository. It contains:devso.meor by calling the license endpoint directly.Lock logic
On every admin request, the middleware inspects the current license status:
Important: This logic depends on the license server returning not just
valid = true/false, but also additional fields that indicate whether the user has ever been a paying customer. See the required API changes below (sub‑ticket).Permanent modal implementation
The modal is rendered as a full‑page overlay, not a simple pop‑up. It must not be closable via keyboard, click, or URL manipulation. The middleware returns this modal for any admin route, including Filament’s root URL and all child paths.
Documentation update
The official documentation will be revised to clearly explain the difference between trial expiration and paid license expiration. It will describe the lockout screen, how to renew (via
devso.me), and that once renewed, the lock is automatically lifted after the next successful license heartbeat.Package update restriction (by design)
Because
composer.devso.merequires a valid license key to download packages, an expired license prevents the enforcement package from being updated. However, the already installed package continues to function and enforces the lock. This ensures a user cannot simply update to a version without the lock while their license is expired.