Kanject Core

Infrastructure,
Simplified.

Eighteen focused .NET libraries that wrap AWS in clean, source-generated C# — every layer of a production service, from data to scheduling.

Runs in your own AWS account. You pay AWS directly — Kanject is a framework license, not a hosting bill.
169K+ NuGet downloads
42 Public packages
18 Core libraries
Kanject.Core.NoSqlDatabaseNoSQL Data
var order = await orders.FindOrderByCustomerAsync(id);
order.Status = OrderStatus.Shipped;
await orders.UpdateAsync(order);
// Keys, GSIs, marshalling — derived from your POCOs.

Eighteen libraries. One suite. Your AWS.

NoSQL Data
NoSqlDatabase
Kanject.Core.NoSqlDatabase

Type-safe NoSQL across DynamoDB, ScyllaDB, and Amazon Keyspaces — one [Repository] shape, three engines.

Learn more →
SQL Data
SqlDatabase
Kanject.Core.SqlDatabase

Relational sibling with an Aurora DSQL provider. Same [Repository] ergonomics as NoSqlDatabase.

Learn more →
Caching
CacheDb
Kanject.Core.CacheDb

Cache abstraction over DynamoDB, S3 Express, or in-memory — typed values, absolute expiry, namespaced keys.

Learn more →
File Storage
FileRepository
Kanject.Core.FileRepository

S3 wrapper with content-type detection, presigned URLs, and access levels.

Learn more →
Messaging Free
Queue
Kanject.Core.Queue

SQS wrapper — typed messages via IQueueManager, [QueueConsumer] batch handlers, retries, and automatic DLQ.

Learn more →
Batch Consumers Free
Channels
Kanject.Core.Channels

One [Channel] handler, two hosts — a batching, deadline-aware drain loop that runs as a BackgroundService or inside a single Lambda invocation.

Learn more →
Event Publishing Free
Events
Kanject.Core.Events

Declare an event with [EventTopic], publish it through IEventPublisher. In-process handlers by default; SNS or your own broker when the host registers one.

Learn more →
Change Capture
ChangeFeed
Kanject.Core.ChangeFeed

DynamoDB row changes become published events, drained in order from the table's stream — plus a transactional outbox, so no dual writes.

Learn more →
Compute Free
CloudFunction
Kanject.Core.CloudFunction

[CloudFunctionHost] source-generated Lambda host — DI, config source, and cold-start reuse wired for you.

Learn more →
Web API Free
Api
Kanject.Core.Api

ASP.NET Core baseline — Response<T> envelope, exception middleware, x-tenant-id resolution, source-generated [ApiEndpoints].

Learn more →
HTTP Integration Free
Adapter
Kanject.Core.Adapter

Typed adapters for outbound HTTP APIs — auth, retries, and source-generated endpoints.

Learn more →
QR Codes
Qr
Kanject.Core.Qr

First-party QR encoder with styled SVG/PNG rendering and a scannability verifier. AOT-clean.

Learn more →
Observability
Logs
Kanject.Core.Logs

A queryable, DynamoDB-backed log store — write records into named groups, read them back by text and time.

Learn more →
Scheduling
Recurring
Kanject.Core.Recurring

[Recurring(rate, unit)] on a method — a generated, drift-corrected recurring runner. Lambda, console, or hosted.

Learn more →
Fan-out Free
Parallel
Kanject.Core.Parallel

[Parallel] on a method — generated, bounded fan-out with chunking, retries, timeouts, and per-item outcomes for SQS partial batches.

Learn more →
Batch / ETL
EtlTaskManager
Kanject.Core.EtlTaskManager

In-process Extract → Transform → Load for bounded imports and migrations. CSV, JSON, DynamoDB extractors.

Learn more →
Provider Dispatch Free
Packages
Kanject.Core.Packages

The strategy pattern, generated — tag a class and it is a provider. Stripe or Paystack, with no switch statements and no factory.

Learn more →
Editions & Flags Free
Features
Kanject.Core.Features

Free, Pro and Enterprise builds from one source tree. [LockedBehind] decides what ships; IFeatureGate decides what runs.

Learn more →

Free Queue, Channels, Events, CloudFunction, Api, Adapter, Parallel, Packages & Features are free under the Community license — individuals, open source, education, and companies under $250K.

What AWS gives you. What you still write. What Core generates.

AWS already ships the SDK, Lambda Annotations, Powertools for .NET and the Aspire integrations — free, and we use them too. A Core license pays for the layer above them: the typed repositories, hosts, consumers and runners your team would otherwise hand-write, maintained and supported for the life of the subscription.

The jobAWS gives youYou still writeCore gives you
Data access The DynamoDB SDK and its object persistence model. Key templates, a repository per entity, pagination, table and namespace mapping — and all of it again when ScyllaDB or Keyspaces arrives. [Repository] + [KeyTemplate] generate the finders at build time. One shape across DynamoDB, ScyllaDB and Amazon Keyspaces.
Lambda host Lambda Annotations for handlers; Powertools for logging, tracing and idempotency. The DI container, the configuration source, and warm-start reuse across invocations. [CloudFunctionHost] — a source-generated host with DI, config and cold-start reuse wired for you.
Queues The SQS SDK and the Lambda event source. A typed message envelope, the batch handler, partial-batch acknowledgement and the dead-letter policy. [QueueConsumer] batch handlers and IQueueManager.EnqueueAsync<T> with retries and automatic DLQ — free on the Community tier.
Batch fan-out The partial-batch response for SQS-triggered Lambdas, and BatchWriteItem in the SDK. Bounded concurrency over 25-item chunks, a timeout and retry per chunk, and the per-message verdict that decides what to acknowledge. [Parallel] on a method — generated fan-out with chunking, retries and timeouts, and input-order outcomes that fill the SQS batch response. Free on the Community tier.
Scheduling EventBridge Scheduler. A drift-corrected in-process runner for the work that should not be a separate scheduled invocation. [Recurring(rate, unit)] on a method — a generated runner for Lambda, console or hosted services.
Caching DynamoDB and S3 Express as stores. Serialisation, namespaced keys, absolute expiry, and a second implementation for local runs. ICacheDb — typed values with absolute expiry over DynamoDB, S3 Express or in-memory.
Files The S3 SDK. Content-type detection, access levels, presigned access and the metadata round-trip. [FileRepository] — a generated S3 repository with content-type detection, access levels and presigned access.
Operations CloudWatch Logs. A queryable per-tenant log store, and in-process extract → transform → load for bounded imports and migrations. ILogManager — a DynamoDB-backed log store you can query by group, text and time. EtlTaskManager for the imports.
Deployment The Lambda deploy tool, CDK and the Aspire integrations. Environment configuration, promotion through dev, stage and prod, rollback, VPC, domains and CI. The Kanject CLI — one manifest that scaffolds, deploys, promotes and rolls back. Free on the Community tier.
And the license itself buys
Updates, not permission
Every version released during your term — and the perpetual fallback keeps them licensed after it ends.
Support you can email
Business-hours email support on every paid tier, next business day from Core Team.
A year of DynoStudio Pro
Workspace, visual model builder, schema diff and lint — included with every annual Core license.
Self-documenting builds
Every assembly emits a comprehensive .md spec, so the layer you bought is the layer your team can read.

Application frameworks solve a different layer — UI, multi-tenancy, application modules. Teams that adopt one still hand-write the AWS side. Core is that AWS side, and it composes with whatever sits above it.

See the code volume for yourself

Build with the same AWS services that run Airbnb, Nike, Zoom — and more.

Every Kanject Core library wraps a battle-tested AWS service running in production at the world's largest engineering teams. We give you the clean C# API. The infrastructure underneath is the same one those teams trust.

Same battle-tested infrastructure. Cleaner API. Faster ship.
Before & After

Stop writing boilerplate. Start shipping.

The same DynamoDB query — on the left, raw AWS SDK with manual credential wiring, expression attributes, and dictionary marshalling. On the right, idiomatic C# with Kanject.Core.NoSqlDatabase. Drag to compare.

60+
Lines eliminated
1
Line to register
0
Config files
Kanject.Core· clean, typed, testable
csharp
using Demo.Catalog.Data;

public class ProductService(ProductRepository products)
{
    public Task<IList<ProductEntity>> GetBySellerAsync(Guid sellerId)
        => products.FindSellerProductAsync(sellerId);

    public Task CreateAsync(ProductEntity product)
        => products.InsertAsync(product);
}

// The generated repository composes keys, queries Gsi1Index,
// marshals attributes, handles retries, and joins the unit of work.
AWS SDK· verbose, error-prone
csharp
using Amazon;
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.Model;
using Amazon.Runtime;

var credentials = new BasicAWSCredentials(
    Environment.GetEnvironmentVariable("AWS_ACCESS_KEY_ID"),
    Environment.GetEnvironmentVariable("AWS_SECRET_ACCESS_KEY"));

var client = new AmazonDynamoDBClient(credentials,
    new AmazonDynamoDBConfig { RegionEndpoint = RegionEndpoint.EUWest1 });

// Query products by seller through a GSI
var queryRequest = new QueryRequest
{
    TableName = "products",
    IndexName = "Gsi1Index",
    KeyConditionExpression = "gsi1pk = :pk",
    ExpressionAttributeValues = new Dictionary<string, AttributeValue>
    {
        { ":pk", new AttributeValue { S = "Seller#7b8b9a42-57de-4d97-b68d-762ee9c65c9a#Products" } },
    },
    Limit = 20,
};

var response = await client.QueryAsync(queryRequest);
var products = new List<Product>();
foreach (var item in response.Items)
{
    products.Add(new Product
    {
        Id          = item["id"].S,
        SellerId    = item["sellerId"].S,
        ProductName = item["productName"].S,
        Price       = decimal.Parse(item["price"].N),
    });
}

// Write a new product (manual marshalling)
await client.PutItemAsync(new PutItemRequest
{
    TableName = "products",
    Item = new Dictionary<string, AttributeValue>
    {
        { "pk",          new AttributeValue { S = "Products#f38d8d5b-b7be-4a7b-a5d5-bd2e70665b8f" } },
        { "sk",          new AttributeValue { S = "Info#7b8b9a42-57de-4d97-b68d-762ee9c65c9a" } },
        { "gsi1pk",      new AttributeValue { S = "Seller#7b8b9a42-57de-4d97-b68d-762ee9c65c9a#Products" } },
        { "gsi1sk",      new AttributeValue { S = "ProductInfo#f38d8d5b-b7be-4a7b-a5d5-bd2e70665b8f" } },
        { "id",          new AttributeValue { S = "f38d8d5b-b7be-4a7b-a5d5-bd2e70665b8f" } },
        { "sellerId",    new AttributeValue { S = "7b8b9a42-57de-4d97-b68d-762ee9c65c9a" } },
        { "productName", new AttributeValue { S = "Canvas tote" } },
        { "price",       new AttributeValue { N = "42.00" } },
    },
});
AWS SDKdrag to compareKanject.Core
Source Generators & Analyzers

You write this. We generate that.

Kanject.Core ships with Roslyn source generators and analyzers that turn a handful of attributes into a full, type-safe repository layer, compiled at build time. Each declaration you write below, on the entity or on its repository, accounts for a piece of what ships.

You write· 22 lines
using Amazon.DynamoDBv2.DataModel;
using Kanject.Core.NoSqlDatabase.Provider.DynamoDb.Annotations.Attributes;
using Demo.Marketplace.Data.Enums;

namespace Demo.Marketplace.Data.Entities.Invoices;public record InvoiceEntity : AbstractBaseEntity
{}

Pick a line to see what it generates.

Your 22 lines are 1.2% of what ships. The rest is regenerated on every build.

Kanject generates· 1,885 lines in 4 files
InvoiceEntity.KeyTemplate.Extensions.g.cs

Key composers, typed by the placeholder

Each [KeyTemplate] becomes a composer. The {InvoiceId} placeholder turns into a Guid parameter, typed from the property it names, so the key format is written once and never concatenated by hand.

public struct InvoiceEntityKeys
{
    public static string ComposeInvoicePartitionKey()
        => $"Invoices#";

    public static string ComposeInvoicePartitionKey(Guid invoiceId)
        => $"Invoices#{invoiceId}";

    public static string ComposeInvoiceSortKey()
        => $"Details";
}

Also from this record: WherePartitionKey and WhereSortKey key conditions, ordering and projection helpers, and TryGetExistingInvoice for a write that failed its condition.

Compile-time safe
Analyzers flag an entity that isn’t a DynamoDB entity, a write on a read-only repository, and a transaction with no commit — before you run a single test.
Zero reflection
Every dependency is wired at build time. Cold-start is instant; there’s no runtime scanning.
Harder to misuse
The generated API only exposes correct shapes — you literally can’t call it the wrong way.
Compile-time docs · AI-ready

Every build emits a manual.

Every Kanject Core library writes a comprehensive Markdown spec at compile time — generated repositories, key templates, indexes, queues, event topics, cache contexts. The same source-generator pass that emits typed C# also emits the README, in full. Drop the file straight into your AI assistant for instant, accurate codebase context.

csharp
using Amazon.DynamoDBv2.DataModel;using Kanject.Core.NoSqlDatabase.Provider.DynamoDb.Annotations.Attributes;using Demo.Marketplace.Data.DbContexts;​[DbContext][EnableRecordLifeTimeSupport]public partial class MarketplaceDbContext;​public record InvoiceEntity : AbstractBaseEntity{    [KeyTemplate("Invoices#{InvoiceId}")]    [DynamoDBHashKey("pk")]    public override string PartitionKey { get; set; } = "";​    [KeyTemplate("Details")]    [DynamoDBRangeKey("sk")]    public override string SortKey { get; set; } = "";​    [DynamoDBProperty] public Guid InvoiceId { get; set; }    [DynamoDBProperty] public InvoiceStatus Status { get; set; }}​[Repository(Entity = typeof(InvoiceEntity), Version = 2)][DbContext(typeof(MarketplaceDbContext))][EntityRepository<InvoicePaymentEntity>]public partial class InvoiceRepository;
Demo.Marketplace.Data.dbschema.md 352 KB

Demo.Marketplace.Data — DynamoDB Schema Reference

Auto-generated by Kanject DynamoDB Source Generator. Do not edit manually.
Database Contexts1
Repositories13
Global Secondary Indexes1
Expiring Records3
Embedded Repositories7
Unique Entities22
Key Templates46
Kanject Indexes24
  1. Quick Overview
  2. Core Concepts & Glossary
  3. Common Tasks
  4. Constraints & Invariants
  5. Do / Don't Guidance
  6. Generated vs. Handwritten Code
  7. Single Table Key Design
  8. Repositories 13
  9. Global Secondary Indexes
  10. Expiring Records
  11. Capacity & Throughput
  12. WCU/RCU Cost per Access Pattern
  13. CloudWatch Alarm Recommendations
  14. Security Posture & IAM Actions
  15. Method Quick Reference
  16. … 13 more sections
352 KB
Per assembly
Example: Demo.Marketplace.Data
28 sections
Catalogued
Repos · indexes · keys · capacity · IAM
13 repos
Generated surface
Methods mapped to native DynamoDB operations
1 file
Full AI context
Drop into Claude, Cursor, Copilot, ChatGPT

Your first package is free. The suite is one license away.

Api, the base Queue and the other Community packages are on public NuGet — pull them and start building today. The paid libraries ship from a private feed: license the suite, and your license unlocks it for your machine, your teammates, and your CI. Deploying with the CLI stays entirely optional.

Ship faster, with fewer mistakes.

Core gives you the primitives to build all of this yourself. Kanject BaaS is optional — auth, wallet, notifications, analytics and more, pre-assembled and hardened in your own AWS, for when you'd rather move faster than rebuild a ledger or an identity layer from scratch.

FileServer Forms beta Identity Identity.Server beta Insights InstantMessaging NotificationHub EventHub Wallet Workflow beta

See your data layer, visually.

Paste your annotated POCOs and DynoStudio derives the tables, the indexes, and the typed query functions — then lets you browse and query without leaving the studio. The same surface drives every Kanject demo call.

Kanject DynoStudio us-east-1
FileEditViewSchemaQueryToolsHelp
ItemsSchemaModelQueryIndexes
No connection yet
Pick an AWS profile, or paste an annotated C# schema to start exploring without a connection.
Connect to AWSPaste SchemaUse LocalStack
Ready to ship?

Simplify your cloud
journey today.

Join forward-thinking developers and businesses who trust Kanject to eliminate cloud complexity and accelerate innovation.