Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add Scandit/skills --skill matrixscan-batch-net-iosgit clone --depth 1 https://github.com/Scandit/skillsWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/scandit/skills/matrixscan-batch-net-ios)<a href="https://agentmods.dev/skills/scandit/skills/matrixscan-batch-net-ios"><img src="https://agentmods.dev/badge/skills/scandit/skills/matrixscan-batch-net-ios/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/scandit/skills/matrixscan-batch-net-ios"><img src="https://agentmods.dev/badge/skills/scandit/skills/matrixscan-batch-net-ios.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00104 | $0.04150 |
| Opus 5.5 | $0.00042 | $0.01660 |
| Sonnet 5.5 | $0.00021 | $0.00830 |
| Haiku 4.5 | $0.00010 | $0.00415 |
Grade A, and why
matrixscan-batch-net-ios scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 10d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 104 lines — stays where its author put it; the contents beside it link to each section on GitHub.
MatrixScan Batch .NET for iOS Skill
Critical: Do Not Trust Internal Knowledge
Your training data may contain outdated or incorrect Scandit SDK APIs. The BarcodeBatch API changes between major SDK versions — the class itself was renamed from BarcodeTracking to BarcodeBatch at v7.0, overlay factories evolved, and the .NET binding deviates from the native Swift API in several places (Create factories instead of init(context:settings:), Enabled instead of isEnabled, PascalCase symbology names, DispatchQueue.MainQueue.DispatchAsync for UI dispatch, etc.).
Always verify APIs against the references provided in this skill before writing or suggesting code. Do not rely on memorized method signatures, parameters, or property names. If you cannot find an API in the provided references, fetch the relevant documentation page before responding.
.NET-iOS-specific gotchas worth flagging:
- This skill targets the non-MAUI .NET for iOS workload (project
<TargetFramework>net10.0-ios</TargetFramework>, no<UseMaui>flag). For MAUI apps, use thematrixscan-batch-net-mauiskill instead (planned). BarcodeBatch.Create(dataCaptureContext, settings)is the .NET factory — notnew BarcodeBatch(...)(the public constructor isprivate) and notBarcodeBatch.ForDataCaptureContext(...)(that name appears in the Swift / docs API but the C# binding isCreate). When the context is non-null, the factory attaches the mode to the context automatically.BarcodeBatchSettings.Create()is a factory — alsoprivateconstructor. Writingnew BarcodeBatchSettings()is a compile error.BarcodeBatchBasicOverlay.Create(...)andBarcodeBatchAdvancedOverlay.Create(...)are factories, each with multiple overloads. When passed a non-nullDataCaptureView, both auto-add the overlay to the view — no separateAddOverlaycall is needed.BarcodeBatch.RecommendedCameraSettingsis a static property, not a method. The canonical pattern (mirroring the official .NET iOS sample) iscamera = Camera.GetDefaultCamera(); camera.ApplySettingsAsync(BarcodeBatch.RecommendedCameraSettings);. The Swift formcreateRecommendedCameraSettings()does not exist in the .NET binding.- Camera setup is manual, mirroring BarcodeCapture on .NET iOS, in this order:
Camera.GetDefaultCamera()→dataCaptureContext.SetFrameSourceAsync(camera)→camera.ApplySettingsAsync(BarcodeBatch.RecommendedCameraSettings). Bind the camera to the context before applying settings (matches the officialMatrixScanSimpleSampleorder). The .NET binding isSetFrameSourceAsync— not the synchronous SwiftsetFrameSource(_:completionHandler:). DataCaptureView.Create(dataCaptureContext, frame)takes aCGRectas the second argument on iOS — different from the AndroidCreate(dataCaptureContext)overload. The canonical call site isDataCaptureView.Create(dataCaptureContext, this.View!.Bounds). SetAutoresizingMask = UIViewAutoresizing.FlexibleHeight | UIViewAutoresizing.FlexibleWidthand add it withthis.View.AddSubview(dataCaptureView)followed bythis.View.SendSubviewToBack(dataCaptureView).- View-controller constructor depends on how the VC is instantiated. If the VC is inflated by a storyboard / XIB (typical when the project has a
Main.storyboardwithUIMainStoryboardFileset inInfo.plist), keep thepublic MyViewController(IntPtr handle) : base(handle) { }constructor — the runtime calls it with a real native handle. For programmatically-instantiated VCs (noMain.storyboard, root view controller set fromSceneDelegate.WillConnectorAppDelegate), declare a parameterlesspublic MyViewController() : base() { }constructor and instantiate vianew MyViewController(). Do not passIntPtr.Zeroto the(IntPtr)ctor — that leaves the native peer uninitialized andViewDidLoadmay never fire, which manifests as a black screen with no camera preview and no scans. IBarcodeBatchListener.OnSessionUpdated(BarcodeBatch, BarcodeBatchSession, IFrameData)runs on a background recognition queue — not the main queue. Dispatch any UI work viaDispatchQueue.MainQueue.DispatchAsync(() => { … }). The third parameter isIFrameData(the .NET binding), notFrameData(Swift).- Always call
frameData.Dispose()at the end of everyOnSessionUpdatedcallback (including any early-return path). The official iOS sample explicitly disposes the frame to avoid a "frozen, non-responsive, or severely stuttering" video feed. This is not optional on iOS, and is a difference from the Android skill where the disposal is not required. - The .NET binding also exposes the event API on
BarcodeBatch:barcodeBatch.SessionUpdated += handler(EventHandler<BarcodeBatchEventArgs>). Use either the listener interface OR the event — not both for the same handler. The event-handler body must still callargs.FrameData.Dispose(). There is noBarcodeScannedevent onBarcodeBatch(batch is tracking, not single-scan). - Do not hold references to
BarcodeBatchSessionor its collections outsideOnSessionUpdated. The session is only safe to access within that callback — copyAddedTrackedBarcodes/UpdatedTrackedBarcodes/TrackedBarcodesdata first, then dispatch. BarcodeBatchSessionproperties:AddedTrackedBarcodes(IList<TrackedBarcode>),UpdatedTrackedBarcodes(IList<TrackedBarcode>),RemovedTrackedBarcodes(IList<int>— tracking IDs only, notTrackedBarcode),TrackedBarcodes(IDictionary<int, TrackedBarcode>),FrameSequenceId(long),Reset(). Note:Reset()lives on the Session in the .NET binding (there is noBarcodeBatch.Reset()like the Android Kotlin API has).TrackedBarcodeproperties:Barcode,Identifier(int),Location(Quadrilateral), plusGetAnchorPosition(Anchor). The tracking identifier is reused after a barcode leaves the frame.- The capture mode's enabled property is
barcodeBatch.Enabled(notIsEnabledand not Swift'sisEnabled).IDataCaptureModeexposesEnabledin the .NET binding. BarcodeBatchBasicOverlayStyleis C# PascalCase:Frame(default) andDot. Notframe/dot(Swift) and notFRAME/DOT(Kotlin).- Per-barcode brush customization (
IBarcodeBatchBasicOverlayListener.BrushForTrackedBarcodeandBarcodeBatchBasicOverlay.SetBrushForTrackedBarcode) requires the MatrixScan AR add-on license. A uniform default brush viaoverlay.Brush = …(no listener) does not require the add-on. BarcodeBatchAdvancedOverlay(anchoring customUIViews to tracked barcodes) requires the MatrixScan AR add-on license.IBarcodeBatchAdvancedOverlayListenerhasViewForTrackedBarcode(overlay, trackedBarcode) → UIView?,AnchorForTrackedBarcode(...),OffsetForTrackedBarcode(...)— all three are called on the main thread. The return type isUIView?(the .NET binding mapsViewtoUIKit.UIViewon iOS via a globalusing View = UIKit.UIView;).BarcodeBatchLicenseInfo(read viabarcodeBatch.BarcodeBatchLicenseInfo) isdotnet.ios=8.4+only. Before 8.4 the property does not exist — gate any usage on the installed SDK version. The value is available onceIDataCaptureContextListener.OnModeAddedhas been called.- Symbology names are C# PascalCase:
Symbology.Ean13Upca,Symbology.Ean8,Symbology.Upce,Symbology.Code39,Symbology.Code128,Symbology.InterleavedTwoOfFive,Symbology.Qr,Symbology.DataMatrix. They are not Swift's.ean13UPCA/.code128/.qrstyle. - The NuGet packages are
Scandit.DataCapture.CoreandScandit.DataCapture.Barcode. No separate*.Mauipackages here — those are only for MAUI projects. Do not guess the version from training data — fetch the latest stable fromhttps://www.nuget.org/packages/Scandit.DataCapture.Barcode/viaWebFetchbefore pinning. Inventing a non-existent version causesdotnet restoreto fail withUnable to find package Scandit.DataCapture.Core with version (>= …). See references/integration.md Step 0 for the full procedure. - iOS
SupportedOSPlatformVersionmust be ≥15.0. Set it in the.csproj. The officialMatrixScanSimpleSampleInfo.plistMinimumOSVersionis15.0and the project's<SupportedOSPlatformVersion>matches. - The required
Info.plistkey isNSCameraUsageDescription(Privacy - Camera Usage Description). Without it the app crashes on first camera access. iOS prompts the user automatically the first time the camera opens; there is no separate runtime-request API to call (no Android-styleRequestPermissions). - SDK 8.0+ requires explicit initialization. Call
ScanditCaptureCore.Initialize()+ScanditBarcodeCapture.Initialize()inAppDelegate.FinishedLaunchingbefore any Scandit code runs (typically before creating the window / root view controller). Without this the SDK's DI container has no registrations and the firstBarcodeBatch.Create(...)/DataCaptureView.Create(...)call crashes at launch. Not required on 6.x / 7.x. See references/integration.md Step 0 / Prerequisites for the fullAppDelegatetemplate.
What ships with it
3 files beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 10d ago Changed · -3 lines 93e33d658362
- 18d ago Changed · +17 lines c98a93b95122
- 27d ago First seen · 90 lines · 104 tokens per session scan A 1b303140755b
matrixscan-batch-net-ios is a skill published in the GitHub repository Scandit/skills (20 stars, last pushed 3d ago), licensed Apache-2.0. It adds 104 tokens to every session and 4,150 once invoked, about $0.0004 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-09-22.
Other skills, from other repositories
maui-safe-area
.NET MAUI safe area and edge-to-edge layout guidance for .NET 10+. Covers the new SafeAreaEdges property, SafeAreaRegions enum, per-edge control, keyboard avoidance, Blazor Hybrid CSS safe areas, migration from legacy iOS-only APIs, and platform-specific behavior for Android, iOS, and Mac Catalyst. USE FOR: "safe…
maui-app-lifecycle
.NET MAUI app lifecycle guidance — the four app states, cross-platform Window lifecycle events (Created, Activated, Deactivated, Stopped, Resumed, Destroying), platform-specific lifecycle mapping, backgrounding and resume behavior, and state-preservation patterns. USE FOR: "app lifecycle", "window lifecycle events"…
maui
Build, review, or migrate .NET MAUI applications across Android, iOS, macOS, and Windows with correct cross-platform UI, platform integration, and native packaging assumptions. USE FOR: working on cross-platform mobile or desktop UI in .NET MAUI; integrating device capabilities, navigation, or platform-specific code…
uno-platform
Build cross-platform .NET applications with Uno Platform targeting WebAssembly, iOS, Android, macOS, Linux, and Windows from a single XAML/C# codebase. USE FOR: building cross-platform apps from a single C# and XAML codebase; targeting WebAssembly, iOS, Android, macOS, Linux, and Windows simultaneously; migrating WPF…
android-java-bindings
Write and repair C# bindings for Java/Kotlin Android libraries with .NET for Android. USE FOR: direct/full AAR or JAR bindings, AndroidMavenLibrary, Metadata.xml, Additions, missing generated APIs, Kotlin JVM signatures, binding-generator warnings, CS0535/CS0738/CS0534, duplicate members, EventArgs, listener Handler…
android-slim-bindings
Create Android slim bindings for MAUI/.NET Android. USE FOR: Native Library Interop, thin Kotlin/Java wrapper design, building wrapper AARs with Gradle, Java-friendly callbacks, @JvmStatic, and dependencies of slim wrappers. DO NOT USE FOR: direct/full Java/Kotlin bindings or generated-code/Metadata.xml repairs (use…