A lightweight, reactive, embeddable database for .NET
Nutty by design. Practically production-ready.
// Install via NuGet
dotnet add package AcornDB
// Start using it
var tree = new Tree<User>();
tree.Stash(new User {
Name = "Squirrely Stan"
});
Most apps don't need Cosmos DB, Kafka, or a $400/month cloud bill to store 5MB of JSON.
For edge, desktop, mobile and embedded apps. Fast, zero-config persistence that works offline.
Free sync when you're ready. S3, Azure Blob, PostgreSQL, MySQL, or HTTP mesh networks.
Like a squirrel on caffeine. Updates propagate in milliseconds with built-in subscriptions.
No YAML. No connection strings. Just new Tree<T>()
and you're done.
In-process tree-to-tree sync or distributed HTTP mesh. No server required for basic sync.
These acorns advocate for themselves. Memorable APIs: Stash, Crack, Toss, Shake, Squabble.
Trees stash your nuts, where branches grow across nodes. A collection of documents with built-in caching, TTL, and versioning.
Groves sync trees when you'd otherwise be gathering acorns manually. Container managing multiple Trees with unified sync.
Canopy signals acorn changes like a well-honed hindbrain. Web dashboard for real-time visualization and management.
Serious software. Zero seriousness.
Stash(), Crack(), Toss() - squirrel-style CRUD
Automatic extraction from Id or Key properties
Subscribe() for real-time change notifications
Direct tree-to-tree sync without HTTP
TreeBark server for distributed sync
Timestamps, TTL, conflict detection built-in
Pluggable IConflictJudge
Automatic eviction with configurable limits
Auto-cleanup of expired items
GitHubTrunk - every stash is a Git commit!
Dynamic trunk discovery and factory pattern
S3, Azure Blob via extension packages
SQLite, SQL Server, PostgreSQL, MySQL
AES with password or custom provider
Gzip/Brotli storage optimization
GetAll() returns IEnumerable
Swap backends without changing your code. From file to cloud in one line.
Simple & fast local storage
Every stash is a commit
Cloud object storage
SQLite, PostgreSQL, MySQL
// Local file storage (default)
var tree = new Acorn<User>().Sprout();
// Git storage - every stash is a commit
var gitTree = new Acorn<User>()
.WithGitTrunk("./my_repo", authorName: "Alice")
.Sprout();
// Cloud storage with encryption + compression
var s3Tree = new Acorn<User>()
.WithS3Trunk(accessKey, secretKey, bucketName)
.WithEncryption("my-password")
.WithCompression()
.Sprout();
// Dynamic discovery via Nursery
var dynamicTree = new Acorn<User>()
.WithTrunk("postgresql", new() {
{ "connectionString", "Host=localhost;Database=acorn" }
})
.Sprout();
var tree = new Acorn<Document>()
.WithStoragePath("./user_data")
.WithLRUCache(5000)
.Sprout();
tree.Subscribe(doc =>
Console.WriteLine($"Changed: {doc.Title}")
);
var edgeTree = new Acorn<SensorReading>()
.WithStoragePath("./local_cache")
.Sprout();
var cloudBranch = new Branch(
"https://api.example.com/sync"
);
grove.Oversee<SensorReading>(cloudBranch);
string GetTenantPath(string tenantId) =>
$"./data/{tenantId}";
var tenantTree = new Acorn<Order>()
.WithStoragePath(GetTenantPath(currentTenantId))
.Sprout();
var auditLog = new Acorn<AuditEntry>()
.WithGitTrunk("./audit_log",
authorName: "System")
.Sprout();
auditLog.Stash(new AuditEntry {
Action = "Login", User = "alice"
});
// Git commit created with full history!
Built for developers who'd rather ship products than manage infrastructure
We built AcornDB because we were tired of paying $$$ to store JSON,
managing Kubernetes for simple persistence, and writing
DataClientServiceManagerFactoryFactory
.
We believe:
✨ Developers deserve tools that make them smile
🔄 Syncing JSON shouldn't require a PhD
🏠 Local-first is the future
🐿️ API names should be memorable
If you've ever rage-quit YAML or cried syncing offline-first apps — welcome home. 🌳
From zero to production in 3 lines of code
// 1. Install via NuGet
dotnet add package AcornDB
// 2. Create a tree
var tree = new Tree<User>();
// 3. Start stashing
tree.Stash(new User {
Id = "alice",
Name = "Alice Acorn"
});
// That's it! ✨