Luminous
Luminous provides you a lot of information about the system and a lot of handy methods to quickly get useful data on the iOS platform.
Install / Use
/learn @andrealufino/LuminousREADME
Luminous

A Swift library that gives you quick access to system information on iOS.
Requirements
- iOS 17+
- Swift 6.0
- Xcode 16+
Installation
Swift Package Manager
In Xcode: File → Add Package Dependencies, then enter:
https://github.com/andrealufino/Luminous
Or add it directly to Package.swift:
dependencies: [
.package(url: "https://github.com/andrealufino/Luminous", from: "3.0.0")
]
Usage
All API is accessed through static properties and methods on nested structs under the Luminous namespace. No instantiation needed.
import Luminous
// Disk
let free = Luminous.Disk.freeSpace(in: .gigabytes)
let total = Luminous.Disk.totalSpaceInBytes
// Network
if Luminous.Network.isInternetAvailable {
let expensive = Luminous.Network.isExpensive // true on cellular/hotspot
}
// Hardware
let cores = Luminous.Hardware.processorsNumber
let model = Luminous.Hardware.modelIdentifier // e.g. "iPhone16,1"
let thermal = Luminous.Hardware.thermalState // ProcessInfo.ThermalState
// OS version comparison
let current = Luminous.Hardware.systemVersion
let ios18 = OperatingSystemVersion(majorVersion: 18, minorVersion: 0, patchVersion: 0)
if current >= ios18 { ... }
// Battery — requires @MainActor
let level = await MainActor.run { Luminous.Battery.level } // Float? (0–100)
let state = await MainActor.run { Luminous.Battery.state } // UIDevice.BatteryState
@MainActor properties
Battery, Hardware.Screen, and Hardware.Device access UIKit APIs and must be called on the main actor:
// In a @MainActor context (e.g. a SwiftUI view or view controller):
let brightness = Luminous.Hardware.Screen.brightness
let style = Luminous.Hardware.Device.userInterfaceStyle // .light / .dark
// From a non-isolated context:
let brightness = await MainActor.run { Luminous.Hardware.Screen.brightness }
API Reference
Luminous.Application
| Property | Type | Description |
|----------|------|-------------|
| version | String | CFBundleShortVersionString (e.g. "3.0.0"); "" if absent |
| build | String | CFBundleVersion (e.g. "42"); "" if absent |
| completeAppVersion | String | "3.0.0 (42)" |
| bundleIdentifier | String? | Bundle identifier (e.g. "com.example.MyApp"); nil if absent |
| displayName | String | User-visible app name; "" if absent |
Luminous.Audio
| Property | Type | Description |
|----------|------|-------------|
| currentAudioOutputVolume | Float? | 0.0–1.0; does not activate the audio session |
| secondaryAudioShouldBeSilencedHint | Bool | Another app is playing non-mixable audio |
| isWiredHeadsetPluggedIn | Bool | 3.5 mm / Lightning / USB-C wired headset |
| isAnyHeadphoneConnected | Bool | Wired, AirPods, or any Bluetooth audio device |
Luminous.Battery — @MainActor
| Property | Type | Description |
|----------|------|-------------|
| level | Float? | 0–100; nil in Simulator |
| state | UIDevice.BatteryState | .unknown / .unplugged / .charging / .full |
| isCharging | Bool | Convenience shorthand for state == .charging |
Luminous.Disk
All size methods accept a UnitInformationStorage parameter (default: .gigabytes).
| Property / Method | Type | Description |
|-------------------|------|-------------|
| totalSpaceInBytes | Int64 | Raw total capacity |
| freeSpaceInBytes | Int64 | Available space including purgeable content |
| usedSpaceInBytes | Int64 | Used space in bytes |
| totalSpace(in:) | Double | Total capacity in the given unit |
| freeSpace(in:) | Double | Free space in the given unit |
| usedSpace(in:) | Double | Used space in the given unit |
let gb = Luminous.Disk.freeSpace(in: .gigabytes)
let mb = Luminous.Disk.usedSpace(in: .megabytes)
Luminous.Hardware
| Property / Method | Type | Description |
|-------------------|------|-------------|
| processorsNumber | Int | Total processor count |
| activeProcessorsNumber | Int | Active processor count |
| physicalMemory(in:) | Double | Physical RAM in the given unit (default .gigabytes) |
| availableMemoryInBytes | Int64 | Memory available to the process |
| availableMemory(in:) | Double | Available memory in the given unit (default .megabytes) |
| systemVersion | OperatingSystemVersion | Comparable — use >=, <, etc. |
| uptime | TimeInterval | Seconds since last boot |
| isLowPowerModeEnabled | Bool | |
| thermalState | ProcessInfo.ThermalState | .nominal / .fair / .serious / .critical |
| modelIdentifier | String | Hardware model string (e.g. "iPhone16,1") |
| isSimulator | Bool | true when running in the iOS Simulator |
Luminous.Hardware.Screen — @MainActor
| Property | Type | Description |
|----------|------|-------------|
| brightness | Float | 0.0–1.0 |
| isScreenMirrored | Bool | |
| isZoomed | Bool | Display Zoom is active |
| nativeBounds | CGRect | Physical screen bounds in pixels |
| nativeScale | Float | Physical screen scale |
| bounds | CGRect | Logical screen bounds in points |
| scale | Float | Logical screen scale |
| maximumRefreshRate | Int | 60, 120, etc. |
Luminous.Hardware.Device — @MainActor
| Property | Type | Description |
|----------|------|-------------|
| identifierForVendor | String? | Vendor UUID |
| name | String | User-assigned device name (e.g. "Andrea's iPhone") |
| orientation | UIDeviceOrientation | Current device orientation |
| systemName | String | OS name (e.g. "iPhone OS") |
| userInterfaceStyle | UIUserInterfaceStyle | .light / .dark / .unspecified |
Luminous.Locale
| Property | Type | Description |
|----------|------|-------------|
| currentLanguage | String? | BCP 47 code (e.g. "en", "it") |
| currentTimeZone | TimeZone | Current time zone |
| currentTimeZoneName | String | IANA identifier (e.g. "Europe/Rome") |
| currentCountry | String? | ISO 3166-1 (e.g. "US", "IT") |
| currentCurrency | String? | ISO 4217 (e.g. "USD", "EUR") |
| currentCurrencySymbol | String? | e.g. "$", "€" |
| usesMetricSystem | Bool | |
| decimalSeparator | String? | "." or "," |
Luminous.Network
| Property | Type | Description |
|----------|------|-------------|
| isConnectedViaWiFi | Bool | |
| isConnectedViaCellular | Bool | |
| isInternetAvailable | Bool | Any satisfied path |
| isExpensive | Bool | Cellular or personal hotspot |
| isConstrained | Bool | Low Data Mode is active |
| supportsIPv4 | Bool | |
| supportsIPv6 | Bool | |
OperatingSystemVersion — Comparable
Luminous adds retroactive Equatable and Comparable conformance to Foundation's OperatingSystemVersion, enabling direct comparison operators:
let current = Luminous.Hardware.systemVersion
let ios18 = OperatingSystemVersion(majorVersion: 18, minorVersion: 0, patchVersion: 0)
if current >= ios18 {
// iOS 18+ code path
}
Migrating from v2
Removed (no replacement)
| API | Reason |
|-----|--------|
| Luminous.Carrier | CTCarrier deprecated since iOS 16.1; no reliable replacement |
| Luminous.Hardware.Sensors | All sensors have returned true on every iPhone since 2014 |
| Luminous.Hardware.Accessory | MFi-only niche API with no broad use case |
| Luminous.Network.SSID | Dead on iOS 13+ without entitlements and location access |
| Luminous.Application.clipboardString | Triggered iOS paste permission banner as a side-effect |
| Luminous.Hardware.Screen.snapshotOfCurrentView | Used deprecated UIScreen API, no @MainActor safety |
| CocoaPods support | SPM is the standard; use Package.swift |
Renamed / Moved
| v2 | v3 |
|----|----|
| Hardware.bootTime | Hardware.uptime |
| Hardware.systemName | Hardware.Device.systemName |
| Hardware.Accessory.isHeadsetPluggedIn | Audio.isWiredHeadsetPluggedIn |
Replaced
| v2 | v3 |
|----|----|
| BatteryState (custom enum) | UIDevice.BatteryState directly |
| MeasureUnit (custom enum) | UnitInformationStorage from Foundation |
| SystemVersion struct | OperatingSystemVersion + Comparable extension (see above) |
| Disk.totalSpace(measureUnit:) | Disk.totalSpace(in: UnitInformationStorage) |
| Disk.freeSpace(measureUnit:) | Disk.freeSpace(in: UnitInformationStorage) |
| Disk.usedSpace(measureUnit:) | Disk.usedSpace(in: UnitInformationStorage) |
| Hardware.physicalMemory(with:) | Hardware.physicalMemory(in: UnitInformationStorage) |
| Audio.currentAudioOutputVolume → Double? | Audio.currentAudioOutputVolume → Float? (no session activation side-effect) |
| Deprecated Disk string properties | Use totalSpace(in:) / freeSpace(in:) / usedSpace(in:) |
New in v3
| API | Description |
|-----|-------------|
| Audio.isAnyHeadphoneConnected | Includes AirPods and all Bluetooth audio |
| Hardware.thermalState | ProcessInfo.ThermalState — nominal / fair / serious / critical |
| Hardware.modelIdentifier | Hardware model string, e.g. "iPhone16,1" |
| Hardware.availableMemoryInBytes / availableMemory(in:) | Memory available to the process |
| Hardware.Screen.maximumRefreshRate | 60, 120, etc. |
| Hardware.Device.userInterfaceStyle | Light / dark / unspecified |
| Network.isExpensive | True on cellular or personal hotspot |
| Network.isConstrained | True when Low Data Mode is active |
| Network.supportsIPv4 / supportsIPv6 | IP protocol support on current path |
| OperatingSystemVersion Comparable | Use >=, <, == directly on OS v
