github.com/crystal-garage/device_detector
0.4.0 / published Aug 4, 2025 / repository
Device detection library will parse User Agent and detect the browser, operating system, device used (desktop, tablet, mobile, tv, cars, console, etc.), vendor and model.
Device Detector
The library for parsing User Agent and browser, operating system, device used (desktop, tablet, mobile, tv, cars, console, etc.), vendor and model detection.
- Support latest Crystal version and update script for private use or immediately updates.
- Currently it is production version and works fine more that 2 years.
- The Library uses regexes from matomo-org/device-detector.
Installation
Add this to your application's shard.yml:
dependencies:
device_detector:
github: crystal-garage/device_detector
Then run shards install
Usage
require "device_detector"
user_agent = "Mozilla/5.0 (Windows NT 6.4; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36 Edge/12.0"
response = DeviceDetector::Detector.new(user_agent).call # All parsers
response = DeviceDetector::Detector.new(user_agent).lite # Only for bot and mobile
# Check if browser detected
response.browser? #=> true
# browser name
response.browser_name #=> Microsoft Edge
# browser version
response.browser_version #=> 12.0
# get raw response with
pp response.raw
[{
"bot" => {
"name" => ""
}
},
{
"browser" => {
"name" => "", "version" => ""
}
},
{...},
{
"vendorfragment" => {
"vendor" => ""
}
}
]
Available methods:
| bot? bot_name |
browser_engine? browser_engine_name |
browser? browser_name browser_version |
camera? camera_vendor camera_model |
| car_browser? car_browser_vendor car_browser_model |
console? console_vendor console_model |
feed_reader? feed_reader_name feed_reader_version |
library? library_name library_version |
| mediaplayer? mediaplayer_name mediaplayer_version |
mobile_app? mobile_app_name mobile_app_version |
mobile_device? mobile_device_vendor mobile_device_type mobile_device_model |
os? os_name os_version |
| pim? pim_name pim_version |
portable_media_player? portable_media_player_vendor portable_media_player_model |
tv? tv_vendor tv_model |
vendorfragment? vendorfragment_vendor |
Benchmark
crystal run ./bench/raw_response.cr --release
Results:
user system total real
full: 1.645194 0.025706 1.670900 ( 1.677467)
lite: 0.766103 0.007790 0.773893 ( 0.777249)
It's mean that device_detector can work with 1000 / 1.68 ~ 595 QPS (full) and 1000 / 0.78 ~ 1282 QPS (lite).
Note: This benchmark uses 20 diverse user agents including browsers, mobile devices, and bots for realistic performance measurement.
Testing
crystal spec
Update regexes
crystal scripts/update_regexes.cr
ToDo
- Support overloading of base rules
- CLI & HTTP version
- More lighter and faster the
liteversion - Reload regexes on the fly (may be)
Contributing
- Fork it ( https://github.com/crystal-garage/device_detector/fork )
- Create your feature branch (git checkout -b my-new-feature)
- Commit your changes (git commit -am 'Add some feature')
- Push to the branch (git push origin my-new-feature)
- Create a new Pull Request
Contributors
- @creadone Sergey Fedorov - creator, maintainer
- @delef Ivan Palamarchuk - new api, code optimization
- @zaycker Yuriy Zaitsev - fix check order
- @mamantoha Anton Maminov - maintainer