ImageArchive 1.0.0

dotnet add package ImageArchive --version 1.0.0
                    
NuGet\Install-Package ImageArchive -Version 1.0.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="ImageArchive" Version="1.0.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="ImageArchive" Version="1.0.0" />
                    
Directory.Packages.props
<PackageReference Include="ImageArchive" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add ImageArchive --version 1.0.0
                    
#r "nuget: ImageArchive, 1.0.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package ImageArchive@1.0.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=ImageArchive&version=1.0.0
                    
Install as a Cake Addin
#tool nuget:?package=ImageArchive&version=1.0.0
                    
Install as a Cake Tool

ImageArchive

Embed any archive (Git repository, zip, tar, or raw bytes) inside a multi-frame APNG or animated WebP image with a visual header and footer, QR codes, and SHA-256 integrity.

The container format is defined by RFC 1.0.0: docs/ImageArchive-RFC.md.

Features

  • Fixed 1024×1024 frames (50 px header, 924 px data, 50 px footer)
  • Data region capacity 2,838,528 bytes per frame (RGB, zero-padded final frame)
  • Header: free-form text, image, or numbered folder round-robin; top-right QR
  • Footer: left QR (frame data SHA-256), Frame N of M + SHA text, right QR (tool commit URL)
  • Required camelCase text metadata (encoderName, jsonManifest, jsonSchema, …) plus streamSha256
  • Archive types: raw (default), git (compressed tar of .git + worktree), zip, tar
  • Default codec path: SkiaSharp raster + real APNG / animated WebP containers
  • Multi-target: net8.0;net9.0;net10.0
  • Tests: xUnit v3 (unit + integration, including flagship E2E)

Solution layout

ImageArchive.slnx
src/ImageArchive/                 # library
src/ImageArchive.Cli/             # encode / decode CLI
tests/ImageArchive.UnitTests/
tests/ImageArchive.IntegrationTests/
schema/imagearchive-schema.json
examples/example-manifest.json

Build and test

Requires .NET SDK 8, 9, and 10.

dotnet build ImageArchive.slnx
dotnet test ImageArchive.slnx

Nuke build

Bootstrap entrypoints: build.ps1 / build.sh (or dotnet run --project build/_build.csproj --).

Target Purpose
Clean Remove bin/obj and artifacts/
Restore / Compile Restore and build solution
Test Run unit + integration tests
PackLibrary Pack ImageArchive NuGet library to artifacts/packages/
PackCliTool Pack ImageArchive.Cli as a .NET tool (imagearchive)
Pack PackLibrary + PackCliTool
PublishLibrary Push library package (needs NuGetApiKey or NUGET_API_KEY)
PublishCliTool Push CLI tool package (same API key)
Ci Clean + Test + Pack
# Local
./build.ps1 Compile
./build.ps1 Test --configuration Release
./build.ps1 Pack --configuration Release

# Publish library to nuget.org
./build.ps1 PublishLibrary --configuration Release --nuget-api-key $env:NUGET_API_KEY

# Optional: also publish CLI tool package
./build.ps1 PublishCliTool --configuration Release --nuget-api-key $env:NUGET_API_KEY

# Install CLI tool from local pack output
dotnet tool install ImageArchive.Cli --add-source ./artifacts/packages --version 1.0.0
# then: imagearchive encode --manifest ...

Optional version override: --package-version 1.2.3. Optional source: --nuget-source https://api.nuget.org/v3/index.json.

Planning package check (docs/schema receipt):

pwsh -File docs/verify-planning-package.ps1

CLI

dotnet run --project src/ImageArchive.Cli -- encode --manifest path/to/manifest.json
dotnet run --project src/ImageArchive.Cli -- decode --input archive.png --output extracted.bin

Manifest output.path and output.format (png or webp) control encode output. Optional env IMAGEARCHIVE_TOOL_COMMIT_URL sets the footer right QR.

Exit code Meaning
0 Success
1 Validation / usage
2 Integrity failure
3 I/O or archive source
4 Unexpected internal error

Library (quick start)

using ImageArchive;
using ImageArchive.Manifest;

var manifest = ManifestJson.Deserialize(File.ReadAllText("manifest.json"));
using var archive = File.OpenRead(manifest.Archive.Source);
using var output = File.Create(manifest.Output.Path);

new ImageArchiveEncoder().Encode(manifest, archive, output, new ImageArchiveEncodeOptions
{
    WorkingDirectory = Environment.CurrentDirectory,
    ToolCommitUrl = "https://github.com/sharpninja/ImageArchive"
});

using var image = File.OpenRead(manifest.Output.Path);
var result = new ImageArchiveDecoder().Decode(image);
// result.ArchiveStream holds the recovered payload

Public entry points include IImageArchiveEncoder / IImageArchiveDecoder, IImageEncoder / IImageDecoder (Skia defaults), IManifestValidator, and FrameGeometry constants.

Documentation

Doc Purpose
docs/ImageArchive-RFC.md Format specification (canonical)
schema/imagearchive-schema.json Manifest JSON Schema (streamSha256)
docs/qr-payload-limits.md QR 47×47 payload limits
docs/plans/ImageArchive-Implementation-Plan.md Implementation plan / public API
docs/receipts-requirements-rfc-1.0.0.md FR/TR/TEST AC coverage receipt
docs/Project/ Exported requirements documents
docs/wiki.yaml Wiki publish manifest

License

GPL-3.0-only

Repository

https://github.com/sharpninja/ImageArchive

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.0.0 148 7/14/2026
0.5.1 123 7/15/2026
0.5.0 123 7/15/2026