Generated Computers
Locals: an Apple Silicon engine that runs local LLMs up to 3x faster. A product of Generated Computers.
Translation pending
Experience API (xAPI 2.0 / IEEE 9274.1.1 and 1.0.3) for .NET: models, validation, an LRS client with a durable outbox, and an embeddable LRS
Developer toolsC# · JavaScriptGitHub @nurullahturkogluOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Experience API (xAPI 2.0 / IEEE 9274.1.1, and 1.0.3) for .NET: models and validation, an async LRS client with a durable outbox, and a Learning Record Store you can embed in an ASP.NET Core app.
Status: 0.x. 0.3.0 is on NuGet and
the LRS image is on ghcr.io. The API can
change between minor versions until 1.0; the 1.0 milestone lists
what is left. Documentation: https://nurullahturkoglu.github.io/xapi-dotnet/
The 2.0 standard is IEEE 9274.1.1-2023, also adopted as ISO/IEC/IEEE 39274-1-1:2025.
| Package | What it is | Targets |
|---|---|---|
Xapi.Core | Statement model, strict JSON reading and writing for 1.0.3 and 2.0.0, validation, statement comparison | netstandard2.0, net10.0 |
Xapi.Client | Async client for every LRS resource, version negotiation, attachments, statement signing | netstandard2.0, net10.0 |
Xapi.Client.Outbox | Durable outbox: retries, error classification, dead letters, idempotent resend | netstandard2.0, net10.0 |
Xapi.Lrs | AddXapiLrs / MapXapiLrs: an LRS inside your ASP.NET Core app | net10.0 |
Xapi.Lrs.Sqlite | SQLite storage and migrations for Xapi.Lrs | net10.0 |
Xapi.Lrs.PostgreSql | PostgreSQL storage and migrations for Xapi.Lrs | net10.0 |
The netstandard2.0 builds are for .NET Framework 4.6.2 and later and for Unity. JSON is read and written by
hand with Utf8JsonReader and Utf8JsonWriter, without reflection, so the net10.0 builds of the Core,
Client and Outbox packages can be trimmed and published with Native AOT; CI publishes
samples/ConsoleClient that way and fails on any warning. Under Unity they pass their tests in the editor, in
IL2CPP players on macOS, Linux, Android and the iOS Simulator, and in WebGL, where requests go through
UnityWebRequestHandler from the Unity package in src/Xapi.Unity (docs/unity.md).
dotnet add package Xapi.Client
With using Xapi; and using Xapi.Client;:
using var http = new HttpClient();
var client = new XapiClient(http, new XapiClientOptions
{
Endpoint = new Uri("https://lrs.example.com/xapi/"),
Credentials = XapiCredentials.Basic(key, secret),
});
var statement = new Statement(
Agent.FromMbox("[email protected]", "Ada Learner"),
Verbs.Completed,
new Activity(new Iri("https://example.com/courses/fire-safety")));
var id = await client.SaveStatementAsync(statement);
Console.WriteLine($"The LRS stored statement {id}");
The client asks the LRS which xAPI version to use, validates the statement for that version and sends it.
To keep statements through network outages and restarts, put a
StatementOutbox in front of the client; in an ASP.NET Core app, register both with
AddXapiClient(...).AddOutbox(...) (example).
In an ASP.NET Core app with the Xapi.Lrs.Sqlite package:
var builder = WebApplication.CreateBuilder(args);
builder.Services
.AddXapiLrs(builder.Configuration.GetSection("Lrs"), options => options.MigrateOnStartup = true)
.UseSqlite("Data Source=lrs.db");
var app = builder.Build();
app.MapXapiLrs("/xapi");
app.Run();
appsettings.json lists the credentials under Lrs, without their secrets:
{
"Lrs": {
"Credentials": [ { "Key": "my-app", "Scopes": [ "all" ] } ]
}
}
The secret comes from user secrets or the environment (Lrs__Credentials__0__Secret). Clients then use
https://<your app>/xapi/ as their endpoint, with the key my-app and that secret. The LRS guide covers scopes, delegated authentication, PostgreSQL, migrations
and limits.
The LRS passes all tests of the
ADL LRS Conformance Test Suite at commit 5bc232d:
1,365 of 1,365 for xAPI 1.0.3 and 1,435 of 1,435 for 2.0.0, on SQLite and on PostgreSQL (as of commit
69bb8ff, 17 October 2026). Both batteries run against both databases in CI on every pull request, and the
gate fails on any failing or skipped test.
In two places the suite expects more than IEEE 9274.1.1 requires, and the LRS follows the suite. docs/conformance.md explains both, and how the gate works.
TinCan.NET, the library most .NET projects use today, has not changed since 2018: it targets net35,
its calls block, it exposes Newtonsoft.Json types, and it has no xAPI 2.0 support. Teams that need
durable sending end up writing their own outbox and retry logic. This project aims to be one maintained
set of packages for both sides, tested against the conformance suite. The
migration guide maps TinCan.NET calls and types to this library.
The design decisions are recorded as architecture decision records.
The Documentation site has these guides and the API
reference, built from main.
Versions follow Semantic Versioning. During 0.x, minor versions can contain breaking
changes; CHANGELOG.md lists them under "Breaking". Previews are published as
-preview.N. The storage interfaces of Xapi.Lrs are marked experimental (XAPI0001): they are not covered
by Semantic Versioning, also after 1.0, and may change in any release until they are declared stable (see
Experimental storage API).
Version 1.0.0 requires both conformance batteries to pass on both databases. What is planned for each version
is tracked in the milestones.
Contributions are welcome. Please open an issue before starting on anything larger than a small fix; see CONTRIBUTING.md. Report security problems privately as described in SECURITY.md.
Licensed under the Apache License 2.0. Third-party material is listed in THIRD-PARTY-NOTICES.md.
xAPI (Experience API) is a specification created by the Advanced Distributed Learning (ADL) Initiative and published as IEEE 9274.1.1-2023. "Tin Can API" is a former name of the specification. This project is an independent implementation and is not affiliated with, endorsed by, or certified by ADL, the U.S. Department of Defense, IEEE, or Rustici Software. IEEE is a registered trademark of The Institute of Electrical and Electronics Engineers, Inc.