Skip to content

Releases: atelier-socle/swift-hls-kit

0.6.1 - CI modernization & Swift 6.3 support

16 May 12:16

Choose a tag to compare

What's New

Swift 6.3 CI matrix

The CI now tests against both Swift 6.2 (Xcode 26.2) and Swift 6.3 (Xcode 26.4), ensuring forward compatibility with the latest toolchain. Coverage and Codecov upload run on the 6.2 variant only to avoid duplicates.

GitHub Actions Node 24 migration

All workflow actions have been bumped to their minimum Node 24 versions:

Action Before After
actions/checkout v4 v5
actions/upload-artifact v4 v6
actions/download-artifact v4 v7
codecov/codecov-action v5 v6
softprops/action-gh-release v2 v3
actions/upload-pages-artifact v3 v4
actions/deploy-pages v4 v5

Xcode 26.4 for platform builds & release

Platform builds (iOS, tvOS, watchOS, visionOS, Mac Catalyst), DocC deployment, and release binary compilation now use Xcode 26.4 (Swift 6.3).

No breaking changes

Library API, test suite (5,165 tests), and CLI are unchanged. This release is purely infrastructure.

New Contributors

Full Changelog: 0.6.0...0.6.1

0.6.0 — HEVC fMP4, Audio Sync Fix & Integer Timestamps

14 Mar 21:30

Choose a tag to compare

Highlights

This release adds HEVC (H.265) support to the fMP4 live segmenter, fixes a critical audio segment distribution bug, and resolves a floating-point precision issue that inflated EXT-X-TARGETDURATION. All changes have been validated end-to-end with real media files (iPhone 15 Pro HEVC 4K Dolby Vision, AAC 44.1/48kHz) using ffprobe structural analysis and ffplay HLS playback via HTTP server.

What's New

HEVC fMP4 Init Segment (hev1/hvcC)

  • CMAFWriter now generates correct HEVC init segments with hev1 sample entry and hvcC decoder configuration box (ISO 14496-15 §8.3.3.1)
  • Previously, all codecs produced avc1/avcC — HEVC video was unplayable
  • VideoConfig gains a vps: Data? field for HEVC VPS NALU (backward compatible, defaults to nil)
  • parseHEVCSPSHeader extracts profile_space, tier_flag, profile_idc, compatibility flags, constraint indicators, and level_idc from HEVC SPS
  • E2E validated: iPhone HEVC 4K Dolby Vision + MV-HEVC spatial video play correctly via HLS fMP4

Audio Segment Sync Fix

  • The audio IncrementalSegmenter inside VideoSegmenter was configured with the same targetDuration as video, causing it to auto-emit segments independently
  • Result: audio segments 0-4 contained ~1 frame each (11KB), while the final segment contained all remaining frames (110KB)
  • Fix: audio segmenter uses targetDuration = .greatestFiniteMagnitude — it only emits via forceSegmentBoundary() from the video sync logic
  • Audio frames are now uniformly distributed across segments (93-94 packets/segment, aligned with video boundaries)

B-Frame Composition Time Offset (O1)

  • EncodedFrame gains compositionTimeOffset: Int32? for CTS/CTTS support
  • trun box includes sample_composition_time_offset (flag 0x000800) when offsets are present
  • Enables correct display order for H.264 High profile and HEVC with B-frames

Integer Timestamp Accumulation (O3)

  • baseMediaDecodeTime in tfdt now accumulated as integers instead of Double multiplication
  • Fixes floating-point drift that caused ceil(2.0000000000000004) = 3 in EXT-X-TARGETDURATION
  • TARGETDURATION now correctly reports 2 for 2-second segments

Ingest Boundary Signal (O2)

  • ingest() now returns Bool indicating whether a segment boundary was emitted
  • VideoSegmenter.ingestVideo() reduced from 3 actor hops per frame to 1
  • Eliminates 90 unnecessary actor context switches per second at 30fps

Box Improvements (O4, O5)

  • stsd uses writeFullBox for ISO 14496-12 consistency
  • Audio tfhd includes explicit default_sample_flags with sample_depends_on=2 and sample_is_non_sync_sample=0 for strict CMAF compliance
  • CMAFWriterMoof.swift extracted from CMAFWriterBoxes.swift for maintainability

Bug Fixes

Bug Impact Root Cause
HEVC init segment used avc1/avcC Critical buildVideoStsd always called buildAvc1SampleEntry, ignoring codec
Audio segments unevenly distributed Critical Audio segmenter auto-emitted independently of video sync
TARGETDURATION inflated by 1 Medium Floating-point accumulation: ceil(2.0000000000000004) = 3

E2E Validation

Test Codec Audio Playback
bbb.mp4 H.264 High 1080p60 ffplay HLS ✅
IMG_1765.MOV HEVC 4K DV 10.8s AAC 48kHz ffplay HLS ✅
IMG_1284.MOV HEVC 4K DV 37s AAC 44.1kHz ffplay master A/V ✅
spatial-test.mov MV-HEVC stereo ffplay HLS ✅
Synthetic fMP4 H.264 320x240 AAC 48kHz ffprobe boxes ✅

Stats

  • 5,165 tests across 617 suites — all passing
  • 91.80% line coverage (up from 91.04%)
  • 0 warnings (swift build, SwiftLint, swift-format)
  • 5 E2E scenarios validated with ffprobe + ffplay

Standards Compliance

Verified against reference implementations (FFmpeg libavformat/movenc.c):

Aspect Standard Status
ftyp brand cmfc ISO 23000-19 §7.2
styp brand msdh ISO 23000-19 §7.3.1
tfhd default-base-is-moof ISO 23000-19 §7.3.2
tfdt version 1 (64-bit) ISO 14496-12 §8.8.12
avcC ISO 14496-15 §5.3.3.1
hvcC ISO 14496-15 §8.3.3.1 ✅ (new)
sample_flags sync/non-sync ISO 14496-12 §8.8.3.1
sample_composition_time_offset ISO 14496-12 §8.8.8 ✅ (new)

Migration

No breaking API changes. All new fields have default values:

  • VideoConfig.vps defaults to nil
  • EncodedFrame.compositionTimeOffset defaults to nil
  • ingest() return value (Bool) can be ignored with _ =

Full Changelog: 0.5.0...0.6.0

0.5.0 — fMP4 Video Fix & Async Segment Transform

11 Mar 15:15

Choose a tag to compare

What's New

fMP4 Video Sample Entry Fix

Fixed a critical bug in CMAFWriterCodecConfig where the pre_defined field of VisualSampleEntry was written as 4 bytes (writeInt32) instead of the ISO 14496-12 spec-mandated 2 bytes (writeInt16). This shifted the avcC box by 2 bytes, causing all fMP4 video init segments to be rejected by standard decoders (ffmpeg, Safari, AVPlayer). Video playback via fMP4/CMAF now works correctly with H.264 and HEVC content.

Async Segment Transform

IncrementalSegmenter.segmentTransform is now an async closure, allowing integrators to use actors and structured concurrency for custom segment processing (e.g., MPEG-TS muxing) instead of requiring @unchecked Sendable wrappers with manual locks. Existing synchronous closures continue to work without modification — sync closures are automatically promoted to async in Swift.

Transport Companion Library Compatibility

Updated version references for transport companion libraries (RTMP, SRT, Icecast) to reflect their current releases.

Changes

  • CMAFWriterCodecConfigVisualSampleEntry.pre_defined corrected from writeInt32(-1) to 2-byte write per ISO 14496-12 §12.1.3
  • IncrementalSegmenter.segmentTransform — closure signature changed to async
  • ingest(), forceSegmentBoundary(), finish(), emitCurrentSegment(), buildSegment() — now async to support async transform
  • Added fMP4 wire-format test verifying avcC box offset in init segments
  • Added async segment transform integration test
  • Version bumped to 0.5.0 across CLI, documentation, README, and tests
  • 5,130 tests passing

Compatibility

  • Swift 6.2+
  • macOS (arm64, x86_64), Linux (x86_64), iOS, iPadOS, visionOS

Full Changelog: 0.4.0...0.5.0

0.4.0 — Transport Intelligence & Spatial Computing

06 Mar 23:48

Choose a tag to compare

What's New in 0.4.0

Transport-aware live pipelines with quality monitoring and ABR, MV-HEVC stereoscopic video for Apple Vision Pro, IMSC1 subtitle support, variable substitution, and video projection specifiers. Pure Swift, cross-platform.

Highlights

  • Transport v2 contracts — quality monitoring, adaptive bitrate recommendations, health dashboards across RTMP, SRT, and Icecast transports
  • Transport-aware LivePipeline — the pipeline now reacts to transport signals with configurable ABR policy, quality thresholds, and multi-destination health tracking
  • MV-HEVC spatial video — stereoscopic fMP4 packaging for Apple Vision Pro with complete ISO BMFF spatial boxes (vexu, eyes, stri, hero) and Dolby Vision Profile 8/20
  • IMSC1 subtitles — W3C TTML parse, render, and fMP4 segmentation with stpp sample entry
  • Variable substitutionEXT-X-DEFINE with NAME/VALUE, IMPORT, and QUERYPARAM for CDN path templating and multi-tenant delivery
  • Video projection specifiersREQ-VIDEO-LAYOUT with 360°, 180°, and Apple Immersive Video support
  • 2 new CLI commandsimsc1 and mvhevc (10 total)
  • 5,127 tests across 610 suites (was 4,478)
  • 33 DocC guides (was 26)
  • Optional companion librariesswift-rtmp-kit, swift-srt-kit, swift-icecast-kit provide concrete transport implementations

New Features

📡 Transport Contract v2 — Common Abstractions

A unified quality and metrics vocabulary across all transport protocols:

  • TransportQuality — composite quality score (0.0–1.0) with grade (excellent ≥ 0.9, good ≥ 0.7, fair ≥ 0.5, poor ≥ 0.3, critical < 0.3), recommendation, and timestamp
  • TransportQualityGrade — 5-level quality grade with Comparable conformance for threshold-based decisions
  • TransportBitrateRecommendation — directional bitrate advice (increase, decrease, maintain) with confidence level and recommended bitrate
  • TransportStatisticsSnapshot — point-in-time transport metrics (bytes sent, duration, current/peak bitrate)
  • TransportRecordingState — recording lifecycle tracking (idle, recording, paused, stopped)
  • TransportEvent — 7-case event stream (connected, disconnected, reconnecting, qualityChanged, bitrateRecommendation, recordingStateChanged, error)
  • QualityAwareTransport — protocol for transports exposing quality signals
  • AdaptiveBitrateTransport — protocol for transports providing ABR recommendations
  • RecordingTransport — protocol for transports with recording capabilities

📡 RTMP Transport v2

Enhanced RTMP transport with metadata, capabilities, and platform presets:

  • RTMPServerCapabilities — server feature discovery (Enhanced RTMP, codec negotiation)
  • sendMetadata() — inject onMetaData during live publish
  • 10 platform presets.youtube() (rtmps://), .twitch() (rtmps://), .facebook(), .instagram(), .tiktok(), .twitter(), .rumble(), .kick(), .linkedin(), .trovo()
  • FLVTagType — audio, video, and script data tag identification
  • Full URL composition with stream key: RTMPPusherConfiguration.fullURL

📡 SRT Transport v2

SRT enrichments for professional contribution workflows:

  • Connection modes.caller, .listener, .rendezvous via SRTConnectionMode
  • FEC — SMPTE 2022-1 forward error correction with row/column layout via SRTFECConfiguration
  • Congestion control.live (low-latency) and .file (throughput-optimized) modes
  • ARQ modes.always, .onreq, .never via SRTARQMode
  • Bonding.broadcast, .mainBackup, .balancing via SRTBondingMode
  • SRTConnectionQuality — SRT-specific quality with .toTransportQuality() conversion
  • Extended network statssendBufferMs, receiveBufferMs, rttVariance, flowWindowSize
  • Configuration presets.rendezvous(), .highThroughput(), .fec(), .broadcast()

📡 Icecast Transport v2

Icecast enrichments with comprehensive auth and server ecosystem support:

  • 6 authentication modes.basic, .digest, .bearer, .queryToken, .shoutcast, .shoutcastV2 via IcecastAuthMode
  • 7 server presets.azuracast(), .libretime(), .radioCo(), .centovaCast(), .shoutcastDNAS(), .icecastOfficial(), .broadcastify()
  • IcecastStreamStatistics — server-side stream metrics with .toTransportStatisticsSnapshot() conversion
  • IcecastMetadata — stream title, URL, and custom fields
  • IcecastServerPresetCaseIterable enum for all supported server software

🎛️ Transport-Aware Pipeline

LivePipeline now reacts intelligently to transport signals:

  • TransportAwarePipelinePolicy — configurable policy with autoAdjustBitrate, minimumQualityGrade, and abrResponsiveness (.conservative = 3 consecutive, .responsive = 2, .immediate = 1)
  • TransportAwarePipelinePolicy.default and .disabled presets
  • TransportHealthDashboard — aggregated multi-destination health with overallGrade (worst-case), healthyCount, degradedCount, failedCount
  • TransportDestinationHealth — per-destination quality, connection state, and statistics
  • 4 new LivePipelineEvent cases:
    • .transportQualityDegraded(destination:quality:) — quality below policy threshold
    • .transportBitrateAdjusted(oldBitrate:newBitrate:reason:) — ABR recommendation applied
    • .transportDestinationFailed(destination:error:) — destination disconnect
    • .transportHealthUpdate(_:) — periodic health dashboard update
  • LivePipeline.transportHealthDashboard() — on-demand health query
  • ABR consecutive tracking — per-destination recommendation counter with direction-change reset

📝 Variable Substitution (EXT-X-DEFINE)

CDN path templating and multi-tenant delivery:

  • 3 definition formsNAME="base",VALUE="https://cdn.example.com" (static), IMPORT="token" (from parent), QUERYPARAM="session" (from playlist URL)
  • Automatic resolutionManifestParser resolves {$var} references in 8 URI types (variant, segment, rendition, key, map, etc.)
  • Builder DSLDefine(name:value:), Define(import:), Define(queryParam:)
  • Generator outputManifestGenerator emits EXT-X-DEFINE tags and auto-bumps VERSION to 8
  • Validation rulesVariableRules checks for undefined variables, duplicate definitions, circular references, import-in-media-playlist errors
  • CDN pattern{$base}/720p/playlist.m3u8?token={$token} for tokenized multi-CDN delivery

📺 IMSC1 Subtitle Support

W3C TTML profile for subtitle delivery in HLS:

  • IMSC1Parser — SAX-based XML parser for TTML/IMSC1 documents with namespace and profile validation
  • IMSC1Document — typed model with language, regions, styles, and subtitles
  • IMSC1Region — named regions with origin and extent percentages
  • IMSC1Style — font family, size, color, background color, text alignment
  • IMSC1Subtitle — timed cues with begin/end timestamps and text content
  • IMSC1Renderer — render to normalized TTML XML with IMSC1 Text Profile namespaces
  • IMSC1Segmenter — fMP4 packaging with stpp sample entry, nmhd for subtitle tracks, configurable timescale
  • SubtitleCodec.imsc1 (rawValue: stpp.ttml.im1t) and .webvtt
  • Manifest integrationCODECS="stpp.ttml.im1t" on subtitle renditions, parser and generator wired
  • Round-trip fidelity — parse → render → parse produces identical documents

🥽 MV-HEVC Stereoscopic Video

Apple Vision Pro spatial video packaging:

  • SpatialVideoConfiguration — 3 presets: .visionProStandard, .visionProHighQuality, .dolbyVisionStereo
  • VideoChannelLayout.stereo (CH-STEREO) and .mono (CH-MONO)
  • MVHEVCSampleProcessor — NALU extraction from Annex B, type identification (VPS/SPS/PPS/IDR), parameter set extraction, SPS profile parsing
  • MVHEVCPackager — fMP4 init segment with complete ISO BMFF spatial boxes:
    • hvcC with HEVCDecoderConfigurationRecord
    • vexueyesstri (stereo indication: 0x03)
    • hero (hero eye: 0x00 left)
  • SupplementalCodecs — Dolby Vision Profile 8 (dvh1.08.09/db4h) and Profile 20 (dvh1.20.09/db4h) presets
  • SUPPLEMENTAL-CODECS — manifest attribute with parser, generator, and validator support
  • MVHEVCEncoder — protocol behind #if canImport(VideoToolbox) (packaging works cross-platform, encoding requires Apple hardware)
  • LivePipelineProPresets.spatialVideo() — one-line spatial video pipeline preset

🌐 Video Projection Specifiers

REQ-VIDEO-LAYOUT for immersive content:

  • VideoProjection — 5 cases: .rectilinear, .equirectangular (360°), .halfEquirectangular (180°), .primary, .appleImmersiveVideo
  • VideoLayoutDescriptor — combines channel layout + projection with 5 presets:
    • .standard2D — flat video
    • .stereoscopicCH-STEREO
    • .immersive180CH-STEREO,PROJ-HEQU
    • .equirectangular360PROJ-EQUI
    • .appleImmersiveVideo — Apple's immersive format
  • VideoLayoutDescriptor.parse(_:) — parse from manifest string
  • VideoLayoutDescriptor.attributeValue — generate manifest string
  • Validation — Apple HLS 2.9 video layout rules
  • Full Vision Pro pattern — stereo + Dolby Vision + projection + IMSC1 subtitles in a single manifest

🖥️ CLI

Two new commands join the existing eight:

  • hlskit-cli imsc1 parse — parse and display IMSC1/TTML documents (text + JSON)
  • hlskit-cli imsc1 render — render to normalized TTML XML
  • hlskit-cli imsc1 segment — segment TTML into fMP4 with init + media segments + playlist
    ...
Read more

0.3.0 — Live Streaming Pipeline

27 Feb 20:29

Choose a tag to compare

What's New in 0.3.0

🔴 Live Streaming Pipeline

  • Complete LivePipeline with media source → encode → segment → playlist → push
  • LL-HLS support (partial segments, blocking reload, server control, delta updates)
  • DVR buffer with configurable window
  • Live recording (live-to-VOD)
  • Multi-destination segment pushing (HTTP, file, custom)
  • Live metadata injection (EXT-X-DATERANGE, EXT-X-DEFINE, SCTE-35)
  • Multi-bandwidth adaptive streaming

🎵 Audio Processing

  • Audio format conversion (sample rate, channel layout)
  • Level/loudness measurement (EBU R128, ITU-R BS.1770)
  • Silence detection

🎬 Video Features

  • I-Frame playlist generation with thumbnail extraction
  • HDR/Dolby Vision support (HDR10, HLG, Dolby Vision Profile 5/8)
  • Spatial audio (Dolby Atmos, Apple Spatial Audio, Ambisonics)
  • Hi-Res audio support (up to 192kHz/24-bit)

🔒 Security & Accessibility

  • Live DRM (FairPlay Streaming, Widevine, sample-level encryption)
  • CEA-608/708 closed captions, WebVTT subtitles, audio descriptions

🎛️ Presets & CLI

  • Production-ready presets (podcast, music, sports, news, cinema, concert...)
  • 2 new CLI commands: live, iframe (8 total)

🛠️ Infrastructure

  • Cross-platform Linux compatibility (LockedState, platform guards)
  • 4478 tests across 526 suites
  • 26 DocC documentation guides
  • Apache 2.0 license

Full Changelog: 0.2.0...0.3.0

0.2.0 — Cloud Transcoding

24 Feb 11:43

Choose a tag to compare

Delegate transcoding to Cloudflare Stream, AWS MediaConvert, or Mux — same Transcoder protocol, zero local GPU required.

New Features

ManagedTranscoder

ManagedTranscoder offloads heavy transcoding work to cloud providers while conforming to the same Transcoder protocol as AppleTranscoder and FFmpegTranscoder. Local file in, local file out — callers don't need to know whether transcoding happens locally or in the cloud.

  • Cloudflare Stream — Zero egress costs, global CDN, Bearer token auth
  • AWS MediaConvert — Enterprise-grade, SigV4 request signing, S3 storage integration
  • Mux — Simplest API, auto-adaptive bitrate, Basic Auth

Full job lifecycle management: upload → create job → poll status → download output → optional cloud asset cleanup.

Streaming Upload & Download

URLSessionHTTPClient now streams files to and from disk without loading entire files into memory. Handles 500 MB+ video files with constant memory footprint and granular progress reporting through 5 phases (upload, job creation, polling, download, complete). Uses OSAllocatedUnfairLock for compile-time Sendable safety on Darwin, with Data(contentsOf:) fallback on Linux.

Configurable Quality Presets

ManagedTranscodingConfig.defaultPreset lets users choose the default quality (.p720 by default). Set .audioOnly for podcast audio, .p1080 for HD, or any QualityPreset value.

HLSEngine Integration

HLSEngine.managedTranscoder(config:) factory method creates a cloud transcoder transparently — same API surface as local transcoders.

Fixes

  • SAMPLE-AES encryption — Fixed OpenSSL-based sample encryption for cross-platform compatibility

License

  • Relicensed from MIT to Apache 2.0 across all source and test files, with proper SPDX headers and NOTICE file

Documentation

  • New DocC article: Cloud Transcoding with ManagedTranscoder — configuration, providers, progress, job lifecycle, error handling
  • Updated landing page, Transcoding article cross-references, and README
  • 11 DocC articles (was 10), 0 warnings

Stats

Metric 0.1.0 0.2.0
Tests 1,595 1,809
Coverage 96.32% 97.29%
DocC articles 10 11
Platforms 6 6
SwiftLint violations 0 0
Build warnings 0 0

Full Changelog: 0.1.0...0.2.0

0.1.0 — Initial Release

20 Feb 05:20

Choose a tag to compare

0.1.0 — Initial Release

The first pure Swift HLS library. Full pipeline from manifest parsing to encrypted segment delivery — zero external dependencies in the core.

Highlights

  • RFC 8216 compliant M3U8 manifest parser, generator, and validator
  • Dual container format segmentation: fragmented MP4 (fMP4) and MPEG-TS
  • Two transcoding backends: Apple VideoToolbox (hardware-accelerated) and FFmpeg (cross-platform)
  • AES-128 and SAMPLE-AES encryption with automatic key management
  • Result builder DSL for type-safe manifest construction
  • 6-command CLI tool (hlskit-cli) for all operations
  • 1595 tests across 216 suites — 96.32% line coverage
  • Cross-platform: macOS, iOS, tvOS, watchOS, visionOS, Mac Catalyst, Linux

Features

Manifest Processing

  • Parse master and media playlists with full tag support (EXT-X-STREAM-INF, EXT-X-MAP, EXT-X-KEY, EXT-X-BYTERANGE, EXT-X-DATERANGE, etc.)
  • Generate spec-compliant manifests with ManifestGenerator and TagWriter
  • Builder DSL for constructing master and media playlists programmatically
  • Round-trip fidelity: parse → modify → generate preserves structure

Validation

  • HLSValidator with pluggable rule sets: RFC 8216, Apple HLS, LL-HLS
  • Severity levels (error, warning, info) with line-level diagnostics
  • Validate files, strings, or parsed manifests
  • ValidationReport with actionable messages

Segmentation

  • MP4Segmenter: MP4 → fragmented MP4 segments with correct sample tables
  • TSSegmenter: MP4 → MPEG-TS segments with PAT/PMT/PES packetization
  • Byte-range segmentation (single-file HLS)
  • Automatic playlist generation from segmentation results
  • Codec string extraction (avc1, mp4a) for variant playlists

Transcoding

  • AppleTranscoder: hardware-accelerated via AVAssetReader/Writer (Apple platforms)
  • FFmpegTranscoder: process wrapper with progress parsing (macOS + Linux)
  • QualityPreset system: 360p, 480p, 720p, 1080p, 1440p, 4K, audio-only
  • Multi-variant transcoding with automatic master playlist generation
  • Unified Transcoding protocol for custom backends

Encryption

  • SegmentEncryptor: AES-128-CBC full segment encryption
  • SampleEncryptor: SAMPLE-AES selective encryption (video NALUs + audio frames)
  • KeyManager: automatic key generation with configurable rotation intervals
  • Cross-platform crypto: CommonCrypto (Apple) / OpenSSL (Linux)

CLI (hlskit-cli)

  • hlskit-cli manifest parse — parse and display manifest structure
  • hlskit-cli manifest generate — generate playlists from media files
  • hlskit-cli validate — validate manifests against rule sets
  • hlskit-cli segment — segment media into fMP4 or TS
  • hlskit-cli transcode — transcode with quality presets or adaptive ladder
  • hlskit-cli encrypt — encrypt segments with AES-128 or SAMPLE-AES
  • hlskit-cli info — display media file information

Engine

  • HLSEngine facade: unified API for parse, generate, validate, segment, encrypt
  • Composable pipeline: segment → encrypt → generate playlist in one call

Architecture

Three SPM targets with clear separation:

  • HLSKit — core library, zero dependencies, all platforms
  • HLSKitCommands — CLI commands (depends on swift-argument-parser)
  • HLSKitCLI — executable entry point

Spec References

By the numbers

Metric Value
Tests 1,595
Test suites 216
Line coverage 96.32%
Function coverage 93.27%
Public API symbols 100
DocC articles 10
CLI commands 6
SwiftLint violations 0
Warnings 0

Compatibility

  • Swift 6.2+
  • macOS 15+ · iOS 18+ · tvOS 18+ · watchOS 11+ · visionOS 2+ · Mac Catalyst 18+
  • Linux (Ubuntu 22.04+, Swift 6.2+)

Known Issues

  • SAMPLE-AES decryption via OpenSSL CLI has a padding issue on Linux (3 tests marked as known issues)

Documentation

Full DocC documentation: atelier-socle.github.io/swift-hls-kit

Downloads

Platform File
macOS arm64 hlskit-cli-macos-arm64.tar.gz
Linux x86_64 hlskit-cli-linux-x86_64.tar.gz

License

Apache 2.0 — Copyright 2026 Atelier Socle SAS

Full Changelog: https://github.com/atelier-socle/swift-hls-kit/commits/0.1.0