Skip to main content

LDMS – Document Validity Manager

Updated Oct 8, 2026 1,284 words 7 min read 10 sections

Version 2.0.0 · October 2026

LDMS documentation#

Secure document management, expiry monitoring, renewal history, notifications, and reporting for organizations.

Overview#

LDMS stores evidence in private application storage, associates each document with a type and owner, tracks issue and expiry dates, keeps immutable file versions, and schedules auditable reminder deliveries. The dashboard and reports help administrators prioritize missing, expiring, expired, and failed-notification work.

Product boundary: this package is the LDMS document-management release. Supplier self-service, requirement assignments, submissions, reviewer decisions, and compliance scoring are reserved for the Supplier Compliance edition.

Server requirements#

ComponentRequirement
PHP8.3 or newer, with BCMath, Ctype, cURL, DOM, Fileinfo, JSON, Mbstring, OpenSSL, PDO, Tokenizer, and XML extensions
DatabaseMySQL 8.0+ or MariaDB 10.6+
Dependency managerComposer 2.x
Web serverApache or Nginx; document root must point to the application’s public/ directory
Background servicesCron once per minute and one continuously running Laravel queue worker
BrowserCurrent and previous major versions of Chrome, Edge, Firefox, and Safari

Node.js is required only when editing frontend source. The release archive already includes compiled assets in public/build/.

Installation#

  1. Upload the contents of the ldms/ directory inside your desired directory in your hosts document root.
  2. Create an empty MySQL or MariaDB database and a database user with permission to create tables and read/write data. The installer connects to an existing database; it does not create the database itself.
  3. Make .env readable and writable, and make storage/, its framework subdirectories, and bootstrap/cache/ writable by the PHP/web-server user.

Step 1: Server requirements#

Open your site in a browser. When DB_DATABASE is blank, LDMS redirects to /install. You can also open /install/requirements directly.

The requirements page checks PHP 8.3 or newer, PDO, PDO MySQL, cURL, Fileinfo, GD, ZIP, Calendar, Mbstring, OpenSSL, Ctype, DOM and XML extensions, allow_url_fopen, and file/directory permissions. Resolve any item marked Action needed, then click Check again. When all checks pass, click Continue to database setup.

Step 2: Database and administrator#

On /install/database, enter the database host (for example, localhost or 127.0.0.1), database name, database username, and database password. Leave the database password blank only if that database user has no password. The host you enter is used to test the connection and saved as DB_HOST in .env. The port is taken from DB_PORT in .env.

Enter the administrator’s name, email address, password (at least eight characters), and password confirmation. Click Install LDMS. No purchase code or purchase verification is required.

The installer checks the database connection and confirms that the database is empty, runs the migrations, creates the administrator with full permissions, saves the database credentials to .env, and clears cached configuration. Keep this page open until installation finishes.

Finish installation#

When Installation complete appears, click Go to login and sign in using the administrator email and password you entered. Once the database is configured, installer routes redirect to the login page. Administrators can create additional accounts from Users; public registration is disabled.

If installation fails: check database credentials, database-user permissions, and .env write permission. Review storage/logs/laravel.log for the specific error. If migrations partially created tables, retry with a new empty database or clear only the disposable installation database after verifying it contains no data you need. Never make the full project world-writable.

Scheduler and queue#

Scheduler#

Add one cron entry under the application owner. The Laravel scheduler determines when the daily reminder scan runs.

* * * * * cd /absolute/path/to/ldms && php artisan schedule:run >> /dev/null 2>&1

Queue worker#

Expiry delivery is queued. Use Supervisor, systemd, or your hosting control panel to keep this process running:

php artisan queue:work database --sleep=3 --tries=3 --timeout=90 --max-time=3600

Restart workers after every deployment with php artisan queue:restart. Review failed delivery records in the application and Laravel’s failed-jobs table/logs.

Application settings#

General#

Set organization title, logo, notification preference, date format, and timezone. Display and date input follow the organization setting.

Email#

Enter SMTP host, port, encryption, from identity, username, and password under Settings → Email. Credentials are encrypted with APP_KEY and are never displayed again. Save, then use Send test email. A blank password retains the existing encrypted value.

SMS#

Twilio and Clickatell credentials are stored encrypted. A blank secret retains the current value. The current automated expiry engine sends email; SMS is used for account notification and is retained as an integration foundation.

Notification rules#

Create a global email rule or a document-type-specific rule. Warning-day values are normalized and deduplicated. The scheduler creates one delivery per document, recipient, channel, and scheduled day.

Using LDMS#

  1. Create document types and owner entities.
  2. Create roles, assign only the permissions each role needs, then create users.
  3. Add a document with dates, reference data, owner, responsible user, recipients, and a validated file.
  4. Replace an expiring file to create a new immutable version; earlier evidence remains available to authorized users.
  5. Use dashboard priority items and filters to manage expiring or expired documents.
  6. Archive inactive records. Permanent deletion is available only for archived records and removes all private versions.
  7. Export the filtered register from Reports when a CSV snapshot is required.

Accepted files are validated by content, not filename alone. Keep uploads within the limits shown by the form and use descriptive titles and reference numbers.

Security and backups#

  • Keep APP_DEBUG=false and APP_ENV=production in production.
  • Use HTTPS and set SESSION_SECURE_COOKIE=true.
  • Protect .env, storage/, database dumps, logs, and private documents from web access.
  • Use least-privilege roles. Test access with a non-administrator account.
  • Back up both the database and storage/app/private/documents/. A database-only backup is incomplete.
  • Back up APP_KEY securely. Losing it makes encrypted integration credentials unreadable.
  • Apply PHP, database, and dependency security updates in a staging environment before production.

Deployment verification#

Run the built-in check after deployment:

php artisan ldms:release-check --strict

It validates the application key, database and required tables, private storage read/write access, scheduler registration, asynchronous queue selection, and production environment flags. It does not send external email; use the Email settings test for SMTP.

Before launch, manually test login/logout, password reset, dashboard, add/edit/replace/archive/restore/download, permissions with two organizations, CSV export, responsive layouts, and current Chrome, Edge, Firefox, and Safari.

Troubleshooting#

ProblemResolution
Styles or scripts are missingConfirm public/build/manifest.json exists, the server points to public/, and APP_URL matches the live URL. Clear caches with php artisan optimize:clear.
Login returns to the base URLClear application and browser cookies, verify APP_URL and session configuration, then run php artisan optimize:clear.
Expiry emails do not arriveSend an SMTP test, check the queue worker, run php artisan schedule:list, inspect notification deliveries, failed jobs, and storage/logs/laravel.log.
Document preview is missingCheck the document’s file status and migration report. Verify storage permissions; do not copy private files into public/.
Encryption/decryption errorRestore the original APP_KEY. Do not generate a new key for an existing database unless encrypted settings are intentionally reset.
Migration says table existsRestore the pre-upgrade backup and inspect the migrations table before retrying. Do not manually delete a table that may contain data.

Support and credits#

For item support, use the support channel on the CodeCanyon item page and include your purchase code, LDMS version, PHP version, sanitized error message, and exact reproduction steps. Never send passwords, .env, private documents, or live database dumps.

Third-party credits and licenses are listed in THIRD_PARTY_LICENSES.md. The applicable Envato license notice is in LICENSE.txt.

Need a hand?

Our support team can help you continue.#

Tell us which step you are on and include a screenshot when possible.

Documentation Center Originally published Apr 28, 2026

Need a hand?

Our support team can help you continue.

Tell us which step you are on and include a screenshot when possible.

Documentation Center Originally published Oct 8, 2026