snipe-it

Application

grokability/snipe-it

Open-source IT asset and license management system.

Overview

Snipe-IT is a free and open-source web-based IT asset management system. It helps organizations track hardware assets, manage software licenses, and handle depreciation. Built on Laravel, it offers a REST API and supports Docker deployment.

README Preview

\n\n[](https://crowdin.com/project/snipe-it) [](https://hub.docker.com/r/snipe/snipe-it/)  [](https://github.com/grokability/snipe-it/actions/workflows/tests-mysql.yml)\n[](#contributing) [](https://discord.gg/yZFtShAcKk)\n\n## Snipe-IT - Open Source Asset Management System\n\nThis is a FOSS project for asset management in IT Operations. Knowing who has which laptop, when it was purchased in order to depreciate it correctly, handling software licenses, etc.\n\nIt is built on [Laravel 12](http://laravel.com).\n\nSnipe-IT is actively developed and we [release quite frequently](https://github.com/grokability/snipe-it/releases). ([Check out the live demo here](https://snipeitapp.com/demo/).)\n\n> [!TIP]\n> __This is web-based software__. This means there is no executable file (aka no .exe files), and it must be run on a web server and accessed through a web browser. It runs on any Mac OSX, any flavor of Linux, as well as Windows, and we have a [Docker image](https://snipe-it.readme.io/docs/docker) available if that's what you're into.\n\n-----\n\n### Table of Contents\n* [Installation](#installation)\n* [User's Manual](#users-manual)\n* [Bug Reports & Feature Requests](#bug-reports--feature-requests)\n* [Security](#security)\n* [Upgrading](#upgrading)\n* [Translations!](#translations-)\n* [Libraries, Modules & Related Projects](#libraries-modules--related-projects)\n* [Join the Community!](#join-the-community)\n* [Contributing](#contributing)\n* [Announcement List](#announcement-list)\n\n\n-----\n\n### Installation\n\nFor instructions on installing and configuring Snipe-IT on your server, check out the [installation manual](https://snipe-it.readme.io/docs). (Please see the [requirements documentation](https://snipe-it.readme.io/docs/requirements) for full requirements.)\n\nIf you're having trouble with the installation, please check the [Common Issues](https://snipe-it.readme.io/docs/common-issues) and [Getting Help](https://snipe-it.readme.io/docs/getting-help) documen

FAQ (5)

Troubleshooting
Why does Snipe-IT API hardware pagination skip or miss assets when using limit and offset?

Snipe-IT defaults the /api/v1/hardware index sorting to created_at, which is not unique. When many assets share the same creation timestamp (e.g., batch imports), offset-based pages can overlap or silently skip records. Fix: add an explicit unique sort to every paginated request, e.g. GET /api/v1/hardware?limit=200&offset=0&sort=id&order=asc, then continue incrementing offset per page. This returns the complete inventory consistently. Also verify the issue on the latest Snipe-IT version and confirm it is not an FMCS company-scoping restriction before assuming a permissions bug.

GitHub Issue #19866
Troubleshooting
Why can't I uncheck 'Create new Snipe-IT assets' checkbox on a sync adapter in Snipe-IT?

This is a known bug in Snipe-IT v8.8.3 (affects sync adapters like Microsoft Intune). In app/SyncAdapters/SyncAdapter.php (line ~907), the code uses $request->boolean($slug.'_create_snipeit_assets_on_pull', true) — since an unchecked HTML checkbox is not submitted, the missing field falls back to the true default and always saves "1". Workaround: update the database directly:

UPDATE sync_adapter_instances
SET config = JSON_SET(config, '$.create_snipeit_assets_on_pull', '0')
WHERE slug = '<your-adapter-slug>';

Permanent fix: remove the true default in $request->boolean(...) or add a hidden 0 input in the form so the value is always submitted.

GitHub Issue #19917
Troubleshooting
Why does Snipe-IT Intune sync (snipeit:pull-inventory) run forever and never finish?

This affects Intune tenants with more than ~999 managed devices and is caused by a pagination bug in app/SyncAdapters/Intune/IntuneClient.php (managedDevices(), ~line 80). After the first Graph API page, an empty $query array is still passed to get(). Laravel forwards it as Guzzle's query option, and Guzzle replaces the request URI's query string even with an empty array — stripping the $skiptoken from Graph's @odata.nextLink cursor. Graph then serves page 1 again indefinitely, so the sync loops on the same devices and never completes. Fix: patch the line so $query is only passed when non-empty:

$response = ($query === [] ? $this->request()->get($url) : $this->request()->get($url, $query))->throw()->json();

Verify the fix with php artisan snipeit:pull-inventory <slug> --dry-run --limit=1500 — it should return 1,500 distinct device IDs instead of being capped at the first page (~999). A full pull should then finish (e.g., ~6,200 devices in about an hour).

GitHub Issue #19916
Troubleshooting
How do I fix Snipe-IT LDAP sync not disabling Active Directory users when Active Flag is blank?

In Snipe-IT v8.8.0, the new LDAP wizard can save a blank Active Flag as an empty string ('') instead of NULL. LdapSync only requests userAccountControl when the value is null, so AD-disabled users remain active. Immediate workaround: open the legacy LDAP settings form, leave Active Flag blank, save it, then run php artisan snipeit:ldap-sync. The legacy form converts the empty string to NULL. Verify with: php artisan tinker --execute="var_dump(Setting::getSettings()->ldap_active_flag);" It should output NULL. Permanent code fix: in app/Console/Commands/LdapSync.php, replace is_null($ldap_map['activated']) with blank($ldap_map['activated']) in the userAccountControl attribute request check, or make app/Livewire/LdapSettings.php persist blank optional mappings as null.

GitHub Issue #19789
Troubleshooting
How to fix empty Snipe-IT tables and "string literal contains an unescaped line break" with German de-DE locale in v8.8.0?

This is a v8.8.0 bug caused by a de-DE translation string containing a raw line break that breaks an inline JavaScript string, preventing bootstrap-table from initializing. Immediate workaround: change the affected user's language to English, or set APP_LOCALE=en in .env and restart the container. Permanent fix: upgrade to a Snipe-IT release newer than v8.8.0 containing commit 6525787ba523ea9655ce8f1dfe3310e4faaa63ee. For Docker, run docker compose pull && docker compose up -d, then hard-refresh the browser. Existing asset and license data are not lost.

GitHub Issue #19772