ImageArchive 1.0.0
dotnet add package ImageArchive --version 1.0.0
NuGet\Install-Package ImageArchive -Version 1.0.0
<PackageReference Include="ImageArchive" Version="1.0.0" />
<PackageVersion Include="ImageArchive" Version="1.0.0" />
<PackageReference Include="ImageArchive" />
paket add ImageArchive --version 1.0.0
#r "nuget: ImageArchive, 1.0.0"
#:package ImageArchive@1.0.0
#addin nuget:?package=ImageArchive&version=1.0.0
#tool nuget:?package=ImageArchive&version=1.0.0
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, …) plusstreamSha256 - 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
| Product | Versions 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. |
-
net10.0
- JsonSchema.Net (>= 7.3.4)
- QRCoder (>= 1.6.0)
- SkiaSharp (>= 3.119.0)
- ZXing.Net (>= 0.16.10)
- ZXing.Net.Bindings.SkiaSharp (>= 0.16.21)
-
net8.0
- JsonSchema.Net (>= 7.3.4)
- QRCoder (>= 1.6.0)
- SkiaSharp (>= 3.119.0)
- System.Text.Json (>= 9.0.0)
- ZXing.Net (>= 0.16.10)
- ZXing.Net.Bindings.SkiaSharp (>= 0.16.21)
-
net9.0
- JsonSchema.Net (>= 7.3.4)
- QRCoder (>= 1.6.0)
- SkiaSharp (>= 3.119.0)
- ZXing.Net (>= 0.16.10)
- ZXing.Net.Bindings.SkiaSharp (>= 0.16.21)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.