Akira
A cross‑platform system introspection library providing unified hardware and OS telemetry across Windows, Linux, and macOS.
dotnet add package Vaporsoft.Akira --prerelease仕様Specification
構成Composition
開発Project
目次Contents
文書Document
A cross-platform .NET system state snapshot library.
Akira captures a complete, point-in-time snapshot of a machine's hardware and software state and returns it as a single, serializable .NET object. Every property is strongly typed, every DTO is immutable, and the entire pipeline is compatible with Native AOT via System.Text.Json source generation. Use it for fleet inventory, diagnostics dashboards, change detection, compliance auditing, or anywhere you need a structured view of what a machine looks like right now.
Overview
Akira provides 26 snapshot types covering BIOS, CPU, GPU, disks, memory, network adapters, services, processes, and more — totaling over 1,000 strongly-typed properties with full nullable annotations. Platform-specific providers implement a shared ISnapshotProvider<T> interface, and a single MachineSnapshotCollector aggregates everything into one envelope object with machine identification and collection metadata.
Capabilities
| Capability | Details |
|---|---|
| 26 snapshot types | BIOS, CPU, GPU, disks, memory, network, services, processes, and more |
| 1,000+ properties | Full parity with Win32/WMI class definitions |
| Immutable DTOs | Every property is { get; init; } with full nullable annotations |
MachineSnapshot |
One envelope object that bundles everything with metadata and timing |
SnapshotResult<T> |
Typed result wrapper with Ok / Fail / Unsupported factory methods |
| AOT-ready | Source-generated System.Text.Json serialization — zero reflection |
| Multi-platform | Core DTOs are platform-agnostic; providers are shipped per-platform |
Requirements
| Requirement | Version | Notes |
|---|---|---|
| .NET | 10.0 or later | SDK and runtime |
| Windows TFM | net10.0-windows |
Required for Vaporsoft.Akira.Windows (WMI / System.Management) |
| System.Management | 9.0.3 | Included transitively by the Windows package |
Linux and macOS provider packages are planned. The core
Vaporsoft.Akirapackage has zero additional dependencies.
Installation
# Core library (DTOs, interfaces, JSON serialization)
dotnet add package Vaporsoft.Akira
# Windows providers (WMI-based)
dotnet add package Vaporsoft.Akira.WindowsQuick Start
using Vaporsoft.Akira;
using Vaporsoft.Akira.Windows;
// Create a WMI executor (the default implementation talks to real WMI)
var wmi = new WmiQueryExecutor();
// Collect a single snapshot
var cpuProvider = new ProcessorSnapshotProvider(wmi);
SnapshotResult<ProcessorSnapshot[]> result = await cpuProvider.GetSnapshotAsync();
if (result.Success)
{
foreach (var cpu in result.Data!)
Console.WriteLine($"{cpu.Name} — {cpu.NumberOfCores} cores @ {cpu.MaxClockSpeed} MHz");
}Serialize to JSON (AOT-safe)
using System.Text.Json;
string json = JsonSerializer.Serialize(
result,
AkiraJsonContext.Default.SnapshotResultProcessorSnapshotArray);Collect a complete MachineSnapshot
var collector = new MachineSnapshotCollector(new WmiQueryExecutor());
MachineSnapshot snapshot = await collector.CollectAsync();
string json = JsonSerializer.Serialize(snapshot, AkiraJsonContext.Default.MachineSnapshot);CollectAsync runs all 26 providers and populates every metadata field (machine name, OS, runtime, version) automatically.
Build a selective MachineSnapshot
var snapshot = new MachineSnapshot
{
MachineName = Environment.MachineName,
CollectedAtUtc = DateTimeOffset.UtcNow,
Processors = await new ProcessorSnapshotProvider(wmi).GetSnapshotAsync(),
BIOS = await new BIOSSnapshotProvider(wmi).GetSnapshotAsync(),
DiskDrives = await new DiskDriveSnapshotProvider(wmi).GetSnapshotAsync(),
// ... add as many or as few providers as you need
};Architecture
akira/
├── src/
│ ├── Akira/ Core DTOs, interfaces, JSON context (net10.0)
│ ├── Akira.Windows/ WMI-based providers (net10.0-windows)
│ ├── Akira.Linux/ procfs / sysfs providers (planned)
│ └── Akira.MacOS/ IOKit / sysctl providers (planned)
├── tests/
│ ├── Akira.Tests/ Core DTO and serialization tests
│ └── Akira.Tests.Windows/ Windows provider tests
└── akira.slnx
Data Flow
Source: docs/diagrams/data-flow.mmd
Each platform package ships providers that implement ISnapshotProvider<T> using native OS APIs. The core Vaporsoft.Akira package contains only the DTOs, the interface, SnapshotResult<T>, and the AOT-safe JSON serialization context — it has zero dependencies.
Provider Pattern
Every provider follows the same shape:
// Singleton (one instance per machine, e.g. BIOS)
public class BIOSSnapshotProvider : WmiSnapshotProvider<BIOSSnapshot> { ... }
// Collection (multiple instances, e.g. disks, adapters)
public class DiskDriveSnapshotProvider : WmiCollectionSnapshotProvider<DiskDriveSnapshot> { ... }Both base classes accept an IWmiQueryExecutor, making every provider fully unit-testable without touching real WMI.
Snapshot Classes
Every snapshot DTO and the native data source used on each platform.
| Snapshot Class | Windows (WMI) | Linux | macOS |
|---|---|---|---|
BaseboardSnapshot |
Win32_BaseBoard |
/sys/class/dmi/id/* |
system_profiler SPHardwareDataType |
BatterySnapshot |
Win32_Battery |
/sys/class/power_supply/* |
ioreg -rc AppleSmartBattery |
BIOSSnapshot |
Win32_BIOS |
/sys/class/dmi/id/* |
system_profiler SPHardwareDataType |
ComputerSystemSnapshot |
Win32_ComputerSystem |
hostnamectl |
system_profiler SPHardwareDataType |
ComputerSystemProductSnapshot |
Win32_ComputerSystemProduct |
dmidecode |
system_profiler SPHardwareDataType |
DesktopMonitorSnapshot |
Win32_DesktopMonitor |
xrandr |
system_profiler SPDisplaysDataType |
DiskDriveSnapshot |
Win32_DiskDrive |
lsblk -J |
diskutil list -plist |
DiskPartitionSnapshot |
Win32_DiskPartition |
lsblk -Jp |
diskutil list -plist |
EnvironmentSnapshot |
Win32_Environment |
/proc/self/environ |
launchctl getenv |
FanSnapshot |
Win32_Fan |
/sys/class/hwmon/*/fan* |
SMC via IOKit |
LogicalDiskSnapshot |
Win32_LogicalDisk |
df, /proc/mounts |
df, mount |
NetworkAdapterSnapshot |
Win32_NetworkAdapter |
ip link |
networksetup |
NetworkAdapterConfigurationSnapshot |
Win32_NetworkAdapterConfiguration |
ip addr |
ifconfig, scutil |
OperatingSystemSnapshot |
Win32_OperatingSystem |
/etc/os-release |
sw_vers |
PhysicalMemorySnapshot |
Win32_PhysicalMemory |
dmidecode -t memory |
system_profiler SPMemoryDataType |
PrinterSnapshot |
Win32_Printer |
lpstat -a |
lpstat -a |
ProcessSnapshot |
Win32_Process |
/proc/[pid]/* |
sysctl kern.proc |
ProcessorSnapshot |
Win32_Processor |
/proc/cpuinfo |
sysctl hw |
ServiceSnapshot |
Win32_Service |
systemctl list-units |
launchctl list |
SoundDeviceSnapshot |
Win32_SoundDevice |
aplay -l |
system_profiler SPAudioDataType |
StartupCommandSnapshot |
Win32_StartupCommand |
systemd-analyze |
~/Library/LaunchAgents/ |
ThermalZoneTemperatureSnapshot |
MSAcpi_ThermalZoneTemperature |
/sys/class/thermal/*/temp |
SMC via IOKit |
TimeZoneSnapshot |
Win32_TimeZone |
timedatectl |
systemsetup -gettimezone |
UserAccountSnapshot |
Win32_UserAccount |
/etc/passwd |
dscl . -list /Users |
VideoControllerSnapshot |
Win32_VideoController |
lspci |
system_profiler SPDisplaysDataType |
VolumeSnapshot |
Win32_Volume |
lsblk -f |
diskutil info -all -plist |
Windows Providers
All 26 Windows providers use WMI via System.Management. Most query root\CIMV2; thermal zones query root\WMI.
| Provider | WMI Class | Type |
|---|---|---|
BaseboardSnapshotProvider |
Win32_BaseBoard |
Singleton |
BIOSSnapshotProvider |
Win32_BIOS |
Singleton |
ComputerSystemSnapshotProvider |
Win32_ComputerSystem |
Singleton |
ComputerSystemProductSnapshotProvider |
Win32_ComputerSystemProduct |
Singleton |
OperatingSystemSnapshotProvider |
Win32_OperatingSystem |
Singleton |
TimeZoneSnapshotProvider |
Win32_TimeZone |
Singleton |
BatterySnapshotProvider |
Win32_Battery |
Collection |
DesktopMonitorSnapshotProvider |
Win32_DesktopMonitor |
Collection |
DiskDriveSnapshotProvider |
Win32_DiskDrive |
Collection |
DiskPartitionSnapshotProvider |
Win32_DiskPartition |
Collection |
EnvironmentSnapshotProvider |
Win32_Environment |
Collection |
FanSnapshotProvider |
Win32_Fan |
Collection |
LogicalDiskSnapshotProvider |
Win32_LogicalDisk |
Collection |
NetworkAdapterSnapshotProvider |
Win32_NetworkAdapter |
Collection |
NetworkAdapterConfigurationSnapshotProvider |
Win32_NetworkAdapterConfiguration |
Collection |
PhysicalMemorySnapshotProvider |
Win32_PhysicalMemory |
Collection |
PrinterSnapshotProvider |
Win32_Printer |
Collection |
ProcessorSnapshotProvider |
Win32_Processor |
Collection |
ProcessSnapshotProvider |
Win32_Process |
Collection |
ServiceSnapshotProvider |
Win32_Service |
Collection |
SoundDeviceSnapshotProvider |
Win32_SoundDevice |
Collection |
StartupCommandSnapshotProvider |
Win32_StartupCommand |
Collection |
ThermalZoneTemperatureSnapshotProvider |
MSAcpi_ThermalZoneTemperature |
Collection |
UserAccountSnapshotProvider |
Win32_UserAccount |
Collection |
VideoControllerSnapshotProvider |
Win32_VideoController |
Collection |
VolumeSnapshotProvider |
Win32_Volume |
Collection |
API Reference
ISnapshotProvider<TSnapshot>
public interface ISnapshotProvider<TSnapshot>
{
Task<SnapshotResult<TSnapshot>> GetSnapshotAsync(
CancellationToken cancellationToken = default);
}SnapshotResult<T>
| Property | Type | Description |
|---|---|---|
Data |
T? |
The snapshot data, or null on failure |
Success |
bool |
Whether collection succeeded |
IsSupported |
bool |
Whether this type is supported on the current platform |
Error |
string? |
Error message on failure |
Warnings |
string[]? |
Non-fatal warnings |
Source |
string? |
Provider identifier (e.g. "WMI:Win32_Processor") |
CollectedAtUtc |
DateTimeOffset |
UTC timestamp of collection |
DurationMs |
double |
Collection duration in milliseconds |
IsPartial |
bool |
Whether only partial data was returned |
Factory methods:
SnapshotResult<T>.Ok(data, source, durationMs)
SnapshotResult<T>.Fail(source, error, durationMs)
SnapshotResult<T>.Unsupported(source)MachineSnapshot
A sealed class that aggregates every SnapshotResult<T> into one serializable envelope with machine identification (MachineName, DnsHostName, Domain), OS info (OsDescription, OsVersion), and collection metadata (CollectedAtUtc, AkiraVersion).
MachineSnapshotCollector
A convenience class in Vaporsoft.Akira.Windows that collects all 26 snapshots and metadata in a single CollectAsync() call. Accepts an IWmiQueryExecutor and supports CancellationToken.
AkiraJsonContext
Pre-configured System.Text.Json source-generated context with camelCase naming, indented output, and null-property omission. Includes serialization metadata for all 26 snapshot types and their SnapshotResult<T> wrappers.
JsonSerializer.Serialize(snapshot, AkiraJsonContext.Default.MachineSnapshot);
JsonSerializer.Deserialize(json, AkiraJsonContext.Default.MachineSnapshot);Development
dotnet restore
dotnet build --configuration Release -warnaserror
dotnet test --configuration Release --logger trx --results-directory TestResultsDeployment
- Trigger: creating a GitHub Release
- Workflow: CI — builds, tests, packs, and publishes on the
releaseevent - Targets: NuGet.org and GitHub Packages
Links
| Resource | URL |
|---|---|
| Repository | github.com/corderro-artz/akira |
| NuGet — Core | nuget.org/packages/Vaporsoft.Akira |
| NuGet — Windows | nuget.org/packages/Vaporsoft.Akira.Windows |
| GitHub Packages | github.com/corderro-artz/akira/packages |
| Releases | github.com/corderro-artz/akira/releases |
| Issues | github.com/corderro-artz/akira/issues |
| CI / CD | github.com/corderro-artz/akira/actions |
| Vaporsoft | vaporsoft.dev |
Contributing
Contributions are welcome. If you'd like to add Linux or macOS providers, open an issue first to discuss the approach.
- Fork the repository
- Create a feature branch
- Write tests for any new providers
- Submit a pull request
Copyright © 2026 Corderro Artz / Vaporsoft.
版Published
v0.3.4-alpha
Prerelease12 Apr 2026What's changed
Performance
MachineSnapshotCollector.CollectAsyncnow runs all 26 WMI providers concurrently viaTask.Run+Task.WhenAll. Each blocking WMI query executes on its own thread-pool thread, so total collection time is bounded by the slowest single provider rather than the sum of all 26. Measured 2.8× speedup on real hardware (~1.1 s vs ~3.1 s sequential).
Tests
- Added
MachineSnapshotCollectorTestscovering metadata population, full WMI failure graceful handling, partial provider failure isolation, and cancellation propagation.
Other
- Added
CLAUDE.mdrepository guidance file. - Refreshed
README.mdformatting and content.
v0.3.1-alpha
Prerelease26 Mar 2026- Remove placeholder Linux/MacOS packages from NuGet publishing
- Fix duplicate symbol package push in CI
- Only Vaporsoft.Akira and Vaporsoft.Akira.Windows are published
v0.3.0-alpha
Prerelease26 Mar 2026- Fix README rendering on NuGet (pure markdown, no HTML)
- Publish to GitHub Packages registry
v0.1.2-alpha
Prerelease26 Mar 2026v0.1.2-alpha
Release Assets:
- Compiled libraries (.zip) — Release-built DLLs + XML docs for each project
- NuGet packages (.nupkg) — ready to publish to NuGet.org
- Source code — auto-attached by GitHub
Changes
- Updated copyright to Corderro Artz / Vaporsoft
- Replaced broken 'How It Works' diagram with clean 'Data Flow' section
- Bumped version to 0.1.2-alpha
履歴Recent commits
08250b0docs: render the diagrams on the brand palette, and give them a generatoree29c76docs: widen the data-flow diagram5854d82docs: update docs/diagrams/data-flow.mmd6dc2615docs: update docs/diagrams/data-flow-dark.svg1c27cdadocs: update docs/diagrams/data-flow-light.svg5ee984edocs: render the data flow as a diagrame515139docs: add docs/diagrams/data-flow.mmdeb5f965docs: add docs/diagrams/data-flow-dark.svg