Infrastructure,
Simplified.
Eighteen focused .NET libraries that wrap AWS in clean, source-generated C# — every layer of a production service, from data to scheduling.
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.
Type-safe NoSQL across DynamoDB, ScyllaDB, and Amazon Keyspaces — one [Repository] shape, three engines.
Learn more →Relational sibling with an Aurora DSQL provider. Same [Repository] ergonomics as NoSqlDatabase.
Learn more →Cache abstraction over DynamoDB, S3 Express, or in-memory — typed values, absolute expiry, namespaced keys.
Learn more →S3 wrapper with content-type detection, presigned URLs, and access levels.
Learn more →SQS wrapper — typed messages via IQueueManager, [QueueConsumer] batch handlers, retries, and automatic DLQ.
Learn more →One [Channel] handler, two hosts — a batching, deadline-aware drain loop that runs as a BackgroundService or inside a single Lambda invocation.
Learn more →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 →DynamoDB row changes become published events, drained in order from the table's stream — plus a transactional outbox, so no dual writes.
Learn more →[CloudFunctionHost] source-generated Lambda host — DI, config source, and cold-start reuse wired for you.
Learn more →ASP.NET Core baseline — Response<T> envelope, exception middleware, x-tenant-id resolution, source-generated [ApiEndpoints].
Learn more →Typed adapters for outbound HTTP APIs — auth, retries, and source-generated endpoints.
Learn more →First-party QR encoder with styled SVG/PNG rendering and a scannability verifier. AOT-clean.
Learn more →A queryable, DynamoDB-backed log store — write records into named groups, read them back by text and time.
Learn more →[Recurring(rate, unit)] on a method — a generated, drift-corrected recurring runner. Lambda, console, or hosted.
Learn more →[Parallel] on a method — generated, bounded fan-out with chunking, retries, timeouts, and per-item outcomes for SQS partial batches.
Learn more →In-process Extract → Transform → Load for bounded imports and migrations. CSV, JSON, DynamoDB extractors.
Learn more →The strategy pattern, generated — tag a class and it is a provider. Stripe or Paystack, with no switch statements and no factory.
Learn more →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 job | AWS gives you | You still write | Core 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. |
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.
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.
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.
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.
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.
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.
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 — DynamoDB Schema Reference
| Database Contexts | 1 |
| Repositories | 13 |
| Global Secondary Indexes | 1 |
| Expiring Records | 3 |
| Embedded Repositories | 7 |
| Unique Entities | 22 |
| Key Templates | 46 |
| Kanject Indexes | 24 |
- Quick Overview
- Core Concepts & Glossary
- Common Tasks
- Constraints & Invariants
- Do / Don't Guidance
- Generated vs. Handwritten Code
- Single Table Key Design
- Repositories 13
- Global Secondary Indexes
- Expiring Records
- Capacity & Throughput
- WCU/RCU Cost per Access Pattern
- CloudWatch Alarm Recommendations
- Security Posture & IAM Actions
- Method Quick Reference
- … 13 more sections
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.
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.
From the team — building Kanject Core.
Parallel.ForEachAsync wasn't enough. So we built our own.
The four things every batched-I/O workload needs — bounded chunked concurrency, retry policy, per-partition timeout, and partial-batch acknowledgement — none of which the BCL gives you in one place. Here's why we shipped Kanject.Core.Parallel.
How we ship source generators that survive refactors
Lessons from two years of building Roslyn generators that don't silently break when downstream code moves.
Cadence belongs on the method, not in startup
Why we built drift-corrected, attribute-driven recurring tasks with three call-site overloads — and why we don't think you should reach for Timer, PeriodicTimer, or BackgroundService directly anymore.
Simplify your cloud
journey today.
Join forward-thinking developers and businesses who trust Kanject to eliminate cloud complexity and accelerate innovation.