Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
14674c1
build(tui): scaffold SquidStd.Tui project on Terminal.Gui v2 and Comm…
tgiachi Jun 29, 2026
c976e23
feat(tui): add PropertyPath member-expression helpers
tgiachi Jun 29, 2026
615e6cd
feat(tui): add ReentryGuard for two-way binding
tgiachi Jun 29, 2026
65e45ad
feat(tui): add ViewBinder one-way binding with marshal and disposal
tgiachi Jun 29, 2026
0620180
feat(tui): add ViewBinder two-way binding and typed expression overloads
tgiachi Jun 29, 2026
37bf874
feat(tui): add ViewBinder command binding with CanExecute tracking
tgiachi Jun 29, 2026
87bd8f9
feat(tui): add Terminal.Gui widget binder overloads (Label, Window, T…
tgiachi Jun 29, 2026
98528e3
feat(tui): add convention-based AutoBind over Terminal.Gui views
tgiachi Jun 29, 2026
8c3ed1a
feat(tui): add TuiViewModel base with navigation access and lifecycle…
tgiachi Jun 29, 2026
a5b28be
feat(tui): add ViewModel-first navigator with view registry and host …
tgiachi Jun 29, 2026
c7446cc
feat(tui): add TuiView<T> base and Terminal.Gui view host
tgiachi Jun 29, 2026
b37061f
feat(tui): add application host, DI registration extensions and README
tgiachi Jun 29, 2026
9955ede
build(tui): add runnable Counter sample and host wiring smoke tests
tgiachi Jun 29, 2026
3f6dbcb
refactor(tui): pair navigator activation hooks, cover AutoBind, drop …
tgiachi Jun 29, 2026
1ef7736
Merge pull request #14 from tgiachi/feature/tui-mvvm
tgiachi Jun 29, 2026
f672e15
feat(tui): add DSL node model and layout/bind-mode enums
tgiachi Jun 29, 2026
be4b12b
feat(tui): add UiFactory for building DSL nodes from typed lambdas
tgiachi Jun 29, 2026
1e05947
refactor(tui): add OnInitialize hook to TuiView for declarative compo…
tgiachi Jun 29, 2026
01da1b4
feat(tui): add materializer turning DSL nodes into bound Terminal.Gui…
tgiachi Jun 29, 2026
a041ab4
feat(tui): add TuiComposedView base for declarative DSL views
tgiachi Jun 29, 2026
f4796c3
build(tui): port Counter sample to the declarative DSL and document it
tgiachi Jun 29, 2026
ec5c6c5
Merge pull request #15 from tgiachi/feature/tui-dsl
tgiachi Jun 30, 2026
31eff6a
fix(tui): allow disposable transient views in RegisterView
tgiachi Jun 30, 2026
782f4db
Merge pull request #16 from tgiachi/fix/tui-disposable-transient-view
tgiachi Jun 30, 2026
524a3ba
test(core): stabilise flaky FileWatcher debounce test
tgiachi Jun 30, 2026
fe2f1ff
Merge pull request #17 from tgiachi/fix/flaky-filewatcher-debounce
tgiachi Jun 30, 2026
38562a3
style: apply repo-wide code formatting
tgiachi Jun 30, 2026
26f1e12
Merge pull request #18 from tgiachi/style/format-sweep
tgiachi Jun 30, 2026
5d145a6
chore(deps): update Redis and AWS SDK packages
tgiachi Jun 30, 2026
b9bfbb7
Merge pull request #19 from tgiachi/chore/update-packages
tgiachi Jun 30, 2026
b5d4ff0
feat(crypto): add PbkdfCost with Argon2 cost presets for PBE
tgiachi Jun 30, 2026
83d933d
feat(crypto): add versioned AAD-bound envelope codec for PBE
tgiachi Jun 30, 2026
223318b
feat(crypto): add Argon2id key derivation for PBE
tgiachi Jun 30, 2026
2544f22
feat(crypto): add PasswordCipher password-based encryption (Argon2id …
tgiachi Jun 30, 2026
6bfbec0
docs(crypto): document password-based encryption (PasswordCipher)
tgiachi Jun 30, 2026
ca8af55
harden(crypto): reject Argon2 parallelism above 255 in PbkdfCost
tgiachi Jun 30, 2026
54ba732
Merge pull request #20 from tgiachi/feature/crypto-pbe
tgiachi Jun 30, 2026
54f9aeb
feat(vfs): add DeferredWriteStream for deferred OpenWrite backends
tgiachi Jun 30, 2026
04dcb41
feat(vfs): add ReadOnlyFileSystem decorator
tgiachi Jun 30, 2026
fdf5b4e
feat(vfs): add ScopedFileSystem decorator
tgiachi Jun 30, 2026
def1548
feat(vfs): add OverlayFileSystem decorator
tgiachi Jun 30, 2026
227795e
feat(vfs): add CachingFileSystem with offline read fallback
tgiachi Jun 30, 2026
5018472
feat(vfs): add S3-compatible filesystem backend (SquidStd.Vfs.S3)
tgiachi Jun 30, 2026
dc9808e
feat(vfs): add database filesystem backend (SquidStd.Vfs.Database)
tgiachi Jun 30, 2026
27f9b30
docs(vfs): document VFS decorators and the S3/database backends
tgiachi Jun 30, 2026
1821c56
Merge pull request #21 from tgiachi/feature/vfs-backends
tgiachi Jun 30, 2026
d53cec1
docs: document TUI, password-based encryption, and the S3/database VF…
tgiachi Jun 30, 2026
09908ff
Merge pull request #22 from tgiachi/docs/session-features
tgiachi Jun 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
17 changes: 14 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,11 +44,14 @@ it bundles the foundations you reach for again and again behind small, well-defi
mailboxes), job system, timer/cron scheduler, metrics and health checks.
- **Messaging & caching** — in-memory, RabbitMQ and AWS SQS/SNS transports; in-memory and Redis caches.
- **Data & storage** — FreeSql data access, binary persistence (snapshot + WAL), local / S3 / MinIO
object storage, and a virtual filesystem (physical / zip / in-memory + an encrypted vault).
object storage, and a virtual filesystem (physical / zip / in-memory + an encrypted vault, plus
S3-compatible and database-backed backends and composable decorators).
- **Search, mail & workers** — Elasticsearch indexing with a constrained LINQ provider, IMAP/POP3
mail polling and an outbound mail queue, and a worker / manager runtime.
- **Networking, scripting & observability** — TCP/UDP servers with a framing/middleware pipeline,
Lua scripting and Scriban templating, and OpenTelemetry tracing + metrics export.
- **Terminal UI** — MVVM for terminal apps via `SquidStd.Tui`: observable ViewModels, a fluent
binder (+ `AutoBind` and a declarative DSL), ViewModel-first navigation, DryIoc wiring.

Everything is modular: take only the packages you need, each behind a clean abstraction with an
in-memory implementation for tests and an external backend for production.
Expand Down Expand Up @@ -195,13 +198,15 @@ dotnet new squidstd-manager -n Acme.Manager --messaging inmemory
| `SquidStd.Storage` | Local file storage backend (`AddFileStorage`). | [![readme](https://img.shields.io/badge/readme-1390A3.svg)](src/SquidStd.Storage/README.md) · [![NuGet](https://img.shields.io/nuget/v/SquidStd.Storage.svg)](https://www.nuget.org/packages/SquidStd.Storage/) |
| `SquidStd.Storage.S3` | S3/MinIO storage backend (`AddS3Storage`). | [![readme](https://img.shields.io/badge/readme-1390A3.svg)](src/SquidStd.Storage.S3/README.md) · [![NuGet](https://img.shields.io/nuget/v/SquidStd.Storage.S3.svg)](https://www.nuget.org/packages/SquidStd.Storage.S3/) |
| `SquidStd.Vfs.Abstractions` | Virtual filesystem contracts (`IVirtualFileSystem`, `ILockableFileSystem`, `VfsPath`). | [![readme](https://img.shields.io/badge/readme-1390A3.svg)](src/SquidStd.Vfs.Abstractions/README.md) · [![NuGet](https://img.shields.io/nuget/v/SquidStd.Vfs.Abstractions.svg)](https://www.nuget.org/packages/SquidStd.Vfs.Abstractions/) |
| `SquidStd.Vfs` | Virtual filesystem providers — physical, in-memory, and zip — plus `VfsDirectories`, a VFS-backed `DirectoriesConfig`. | [![readme](https://img.shields.io/badge/readme-1390A3.svg)](src/SquidStd.Vfs/README.md) · [![NuGet](https://img.shields.io/nuget/v/SquidStd.Vfs.svg)](https://www.nuget.org/packages/SquidStd.Vfs/) |
| `SquidStd.Vfs` | Virtual filesystem providers — physical, in-memory, and zip — plus composable decorators (`ReadOnlyFileSystem`, `ScopedFileSystem`, `OverlayFileSystem`, `CachingFileSystem`) and `VfsDirectories`. | [![readme](https://img.shields.io/badge/readme-1390A3.svg)](src/SquidStd.Vfs/README.md) · [![NuGet](https://img.shields.io/nuget/v/SquidStd.Vfs.svg)](https://www.nuget.org/packages/SquidStd.Vfs/) |
| `SquidStd.Vfs.S3` | S3-compatible VFS backend — AWS S3, MinIO, Cloudflare R2, Backblaze B2 — via the MinIO SDK (`RegisterS3FileSystem`). | [![readme](https://img.shields.io/badge/readme-1390A3.svg)](src/SquidStd.Vfs.S3/README.md) · [![NuGet](https://img.shields.io/nuget/v/SquidStd.Vfs.S3.svg)](https://www.nuget.org/packages/SquidStd.Vfs.S3/) |
| `SquidStd.Vfs.Database` | Database-backed VFS storing files as rows via SquidStd.Database / FreeSql (`RegisterDatabaseFileSystem`). | [![readme](https://img.shields.io/badge/readme-1390A3.svg)](src/SquidStd.Vfs.Database/README.md) · [![NuGet](https://img.shields.io/nuget/v/SquidStd.Vfs.Database.svg)](https://www.nuget.org/packages/SquidStd.Vfs.Database/) |

### Security — crypto & secrets

| Package | Description | Links |
|---------|-------------|-------|
| `SquidStd.Crypto` | OpenPGP key management/operations over an indexed keyring (`SquidStd.Crypto.Pgp`, `RegisterPgp`) plus the encrypted VFS vault decorator (Argon2id + per-entry AES-GCM). | [![readme](https://img.shields.io/badge/readme-1390A3.svg)](src/SquidStd.Crypto/README.md) · [![NuGet](https://img.shields.io/nuget/v/SquidStd.Crypto.svg)](https://www.nuget.org/packages/SquidStd.Crypto/) |
| `SquidStd.Crypto` | OpenPGP key management/operations over an indexed keyring (`SquidStd.Crypto.Pgp`, `RegisterPgp`), password-based encryption (`PasswordCipher`, Argon2id + AES-256-GCM with a self-describing envelope), and the encrypted VFS vault decorator. | [![readme](https://img.shields.io/badge/readme-1390A3.svg)](src/SquidStd.Crypto/README.md) · [![NuGet](https://img.shields.io/nuget/v/SquidStd.Crypto.svg)](https://www.nuget.org/packages/SquidStd.Crypto/) |
| `SquidStd.Secrets.Aws` | AWS adapters for the secret seams — KMS envelope `ISecretProtector` and Secrets Manager `ISecretStore`. | [![readme](https://img.shields.io/badge/readme-1390A3.svg)](src/SquidStd.Secrets.Aws/README.md) · [![NuGet](https://img.shields.io/nuget/v/SquidStd.Secrets.Aws.svg)](https://www.nuget.org/packages/SquidStd.Secrets.Aws/) |

### Search
Expand All @@ -227,6 +232,12 @@ dotnet new squidstd-manager -n Acme.Manager --messaging inmemory
| `SquidStd.Workers` | Worker runtime: consume jobs, dispatch to `IJobHandler`s, publish heartbeats (`AddWorkers`). | [![readme](https://img.shields.io/badge/readme-1390A3.svg)](src/SquidStd.Workers/README.md) · [![NuGet](https://img.shields.io/nuget/v/SquidStd.Workers.svg)](https://www.nuget.org/packages/SquidStd.Workers/) |
| `SquidStd.Workers.Manager` | Job enqueue, heartbeat registry, offline sweep, opt-in ASP.NET endpoints (`AddWorkerManager`). | [![readme](https://img.shields.io/badge/readme-1390A3.svg)](src/SquidStd.Workers.Manager/README.md) · [![NuGet](https://img.shields.io/nuget/v/SquidStd.Workers.Manager.svg)](https://www.nuget.org/packages/SquidStd.Workers.Manager/) |

### User interface

| Package | Description | Links |
|---------|-------------|-------|
| `SquidStd.Tui` | MVVM for terminal apps on Terminal.Gui v2 — observable ViewModels, a fluent binder (+ `AutoBind` and a declarative DSL), ViewModel-first navigation, DryIoc wiring. | [![readme](https://img.shields.io/badge/readme-1390A3.svg)](src/SquidStd.Tui/README.md) · [![NuGet](https://img.shields.io/nuget/v/SquidStd.Tui.svg)](https://www.nuget.org/packages/SquidStd.Tui/) |

### Scripting & templating

| Package | Description | Links |
Expand Down
128 changes: 66 additions & 62 deletions SquidStd.slnx
Original file line number Diff line number Diff line change
@@ -1,70 +1,74 @@
<Solution>
<Folder Name="/src/">
<Project Path="src/SquidStd.Abstractions/SquidStd.Abstractions.csproj" />
<Project Path="src/SquidStd.Generators/SquidStd.Generators.csproj" />
<Project Path="src/SquidStd.Telemetry.Abstractions/SquidStd.Telemetry.Abstractions.csproj" />
<Project Path="src/SquidStd.Telemetry.OpenTelemetry/SquidStd.Telemetry.OpenTelemetry.csproj" />
<Project Path="src/SquidStd.Aws.Abstractions/SquidStd.Aws.Abstractions.csproj" />
<Project Path="src/SquidStd.Actors/SquidStd.Actors.csproj" />
<Project Path="src/SquidStd.AspNetCore/SquidStd.AspNetCore.csproj" />
<Project Path="src/SquidStd.Caching.Abstractions/SquidStd.Caching.Abstractions.csproj" />
<Project Path="src/SquidStd.Caching.Redis/SquidStd.Caching.Redis.csproj" />
<Project Path="src/SquidStd.Caching/SquidStd.Caching.csproj" />
<Project Path="src/SquidStd.Core/SquidStd.Core.csproj" />
<Project Path="src/SquidStd.Database.Abstractions/SquidStd.Database.Abstractions.csproj" />
<Project Path="src/SquidStd.Database/SquidStd.Database.csproj" />
<Project Path="src/SquidStd.Messaging.Abstractions/SquidStd.Messaging.Abstractions.csproj" />
<Project Path="src/SquidStd.Messaging.RabbitMq/SquidStd.Messaging.RabbitMq.csproj" />
<Project Path="src/SquidStd.Messaging.Sqs/SquidStd.Messaging.Sqs.csproj" />
<Project Path="src/SquidStd.Messaging/SquidStd.Messaging.csproj" />
<Project Path="src/SquidStd.Network/SquidStd.Network.csproj" />
<Project Path="src/SquidStd.Persistence.Abstractions/SquidStd.Persistence.Abstractions.csproj" />
<Project Path="src/SquidStd.Persistence/SquidStd.Persistence.csproj" />
<Project Path="src/SquidStd.Persistence.MessagePack/SquidStd.Persistence.MessagePack.csproj" />
<Project Path="src/SquidStd.Plugin.Abstractions/SquidStd.Plugin.Abstractions.csproj" />
<Project Path="src/SquidStd.Scripting.Lua/SquidStd.Scripting.Lua.csproj" />
<Project Path="src/SquidStd.Services.Core/SquidStd.Services.Core.csproj" />
<Project Path="src/SquidStd.Storage.Abstractions/SquidStd.Storage.Abstractions.csproj" />
<Project Path="src/SquidStd.Storage.S3/SquidStd.Storage.S3.csproj" />
<Project Path="src/SquidStd.Storage/SquidStd.Storage.csproj" />
<Project Path="src/SquidStd.Templating/SquidStd.Templating.csproj" />
<Project Path="src/SquidStd.Workers.Abstractions/SquidStd.Workers.Abstractions.csproj" />
<Project Path="src/SquidStd.Workers/SquidStd.Workers.csproj" />
<Project Path="src/SquidStd.Workers.Manager/SquidStd.Workers.Manager.csproj" />
<Project Path="src/SquidStd.Templates/SquidStd.Templates.csproj" />
<Project Path="src/SquidStd.Search.Abstractions/SquidStd.Search.Abstractions.csproj" />
<Project Path="src/SquidStd.Search.Elasticsearch/SquidStd.Search.Elasticsearch.csproj" />
<Project Path="src/SquidStd.Mail.Abstractions/SquidStd.Mail.Abstractions.csproj" />
<Project Path="src/SquidStd.Mail.MailKit/SquidStd.Mail.MailKit.csproj" />
<Project Path="src/SquidStd.Mail.Queue/SquidStd.Mail.Queue.csproj" />
<Project Path="src/SquidStd.Crypto/SquidStd.Crypto.csproj" />
<Project Path="src/SquidStd.Vfs.Abstractions/SquidStd.Vfs.Abstractions.csproj" />
<Project Path="src/SquidStd.Vfs/SquidStd.Vfs.csproj" />
<Project Path="src/SquidStd.Secrets.Aws/SquidStd.Secrets.Aws.csproj" />
<Project Path="src/SquidStd.Abstractions/SquidStd.Abstractions.csproj"/>
<Project Path="src/SquidStd.Generators/SquidStd.Generators.csproj"/>
<Project Path="src/SquidStd.Telemetry.Abstractions/SquidStd.Telemetry.Abstractions.csproj"/>
<Project Path="src/SquidStd.Telemetry.OpenTelemetry/SquidStd.Telemetry.OpenTelemetry.csproj"/>
<Project Path="src/SquidStd.Aws.Abstractions/SquidStd.Aws.Abstractions.csproj"/>
<Project Path="src/SquidStd.Actors/SquidStd.Actors.csproj"/>
<Project Path="src/SquidStd.AspNetCore/SquidStd.AspNetCore.csproj"/>
<Project Path="src/SquidStd.Caching.Abstractions/SquidStd.Caching.Abstractions.csproj"/>
<Project Path="src/SquidStd.Caching.Redis/SquidStd.Caching.Redis.csproj"/>
<Project Path="src/SquidStd.Caching/SquidStd.Caching.csproj"/>
<Project Path="src/SquidStd.Core/SquidStd.Core.csproj"/>
<Project Path="src/SquidStd.Database.Abstractions/SquidStd.Database.Abstractions.csproj"/>
<Project Path="src/SquidStd.Database/SquidStd.Database.csproj"/>
<Project Path="src/SquidStd.Messaging.Abstractions/SquidStd.Messaging.Abstractions.csproj"/>
<Project Path="src/SquidStd.Messaging.RabbitMq/SquidStd.Messaging.RabbitMq.csproj"/>
<Project Path="src/SquidStd.Messaging.Sqs/SquidStd.Messaging.Sqs.csproj"/>
<Project Path="src/SquidStd.Messaging/SquidStd.Messaging.csproj"/>
<Project Path="src/SquidStd.Network/SquidStd.Network.csproj"/>
<Project Path="src/SquidStd.Persistence.Abstractions/SquidStd.Persistence.Abstractions.csproj"/>
<Project Path="src/SquidStd.Persistence/SquidStd.Persistence.csproj"/>
<Project Path="src/SquidStd.Persistence.MessagePack/SquidStd.Persistence.MessagePack.csproj"/>
<Project Path="src/SquidStd.Plugin.Abstractions/SquidStd.Plugin.Abstractions.csproj"/>
<Project Path="src/SquidStd.Scripting.Lua/SquidStd.Scripting.Lua.csproj"/>
<Project Path="src/SquidStd.Services.Core/SquidStd.Services.Core.csproj"/>
<Project Path="src/SquidStd.Storage.Abstractions/SquidStd.Storage.Abstractions.csproj"/>
<Project Path="src/SquidStd.Storage.S3/SquidStd.Storage.S3.csproj"/>
<Project Path="src/SquidStd.Storage/SquidStd.Storage.csproj"/>
<Project Path="src/SquidStd.Templating/SquidStd.Templating.csproj"/>
<Project Path="src/SquidStd.Workers.Abstractions/SquidStd.Workers.Abstractions.csproj"/>
<Project Path="src/SquidStd.Workers/SquidStd.Workers.csproj"/>
<Project Path="src/SquidStd.Workers.Manager/SquidStd.Workers.Manager.csproj"/>
<Project Path="src/SquidStd.Templates/SquidStd.Templates.csproj"/>
<Project Path="src/SquidStd.Search.Abstractions/SquidStd.Search.Abstractions.csproj"/>
<Project Path="src/SquidStd.Search.Elasticsearch/SquidStd.Search.Elasticsearch.csproj"/>
<Project Path="src/SquidStd.Mail.Abstractions/SquidStd.Mail.Abstractions.csproj"/>
<Project Path="src/SquidStd.Mail.MailKit/SquidStd.Mail.MailKit.csproj"/>
<Project Path="src/SquidStd.Mail.Queue/SquidStd.Mail.Queue.csproj"/>
<Project Path="src/SquidStd.Crypto/SquidStd.Crypto.csproj"/>
<Project Path="src/SquidStd.Vfs.Abstractions/SquidStd.Vfs.Abstractions.csproj"/>
<Project Path="src/SquidStd.Vfs/SquidStd.Vfs.csproj"/>
<Project Path="src/SquidStd.Vfs.S3/SquidStd.Vfs.S3.csproj"/>
<Project Path="src/SquidStd.Vfs.Database/SquidStd.Vfs.Database.csproj"/>
<Project Path="src/SquidStd.Secrets.Aws/SquidStd.Secrets.Aws.csproj"/>
<Project Path="src/SquidStd.Tui/SquidStd.Tui.csproj"/>
</Folder>
<Folder Name="/samples/">
<Project Path="samples/SquidStd.Samples.WorkerSystem/SquidStd.Samples.WorkerSystem.csproj" />
<Project Path="samples/SquidStd.Samples.Templating/SquidStd.Samples.Templating.csproj" />
<Project Path="samples/SquidStd.Samples.Storage/SquidStd.Samples.Storage.csproj" />
<Project Path="samples/SquidStd.Samples.Search/SquidStd.Samples.Search.csproj" />
<Project Path="samples/SquidStd.Samples.ScriptingLua/SquidStd.Samples.ScriptingLua.csproj" />
<Project Path="samples/SquidStd.Samples.Plugins/SquidStd.Samples.Plugins.csproj" />
<Project Path="samples/SquidStd.Samples.Networking/SquidStd.Samples.Networking.csproj" />
<Project Path="samples/SquidStd.Samples.Persistence/SquidStd.Samples.Persistence.csproj" />
<Project Path="samples/SquidStd.Samples.Commands/SquidStd.Samples.Commands.csproj" />
<Project Path="samples/SquidStd.Samples.Email/SquidStd.Samples.Email.csproj" />
<Project Path="samples/SquidStd.Samples.Database/SquidStd.Samples.Database.csproj" />
<Project Path="samples/SquidStd.Samples.AspNetCore/SquidStd.Samples.AspNetCore.csproj" />
<Project Path="samples/SquidStd.Samples.Messaging/SquidStd.Samples.Messaging.csproj" />
<Project Path="samples/SquidStd.Samples.Caching/SquidStd.Samples.Caching.csproj" />
<Project Path="samples/SquidStd.Samples.EventsJobsScheduling/SquidStd.Samples.EventsJobsScheduling.csproj" />
<Project Path="samples/SquidStd.Samples.GettingStarted/SquidStd.Samples.GettingStarted.csproj" />
<Project Path="samples/SquidStd.Samples.Crypto/SquidStd.Samples.Crypto.csproj" />
<Project Path="samples/SquidStd.Samples.Vfs/SquidStd.Samples.Vfs.csproj" />
<Project Path="samples/SquidStd.Samples.Secrets/SquidStd.Samples.Secrets.csproj" />
<Project Path="samples/SquidStd.Samples.Actors/SquidStd.Samples.Actors.csproj" />
<Project Path="samples/SquidStd.Samples.WorkerSystem/SquidStd.Samples.WorkerSystem.csproj"/>
<Project Path="samples/SquidStd.Samples.Templating/SquidStd.Samples.Templating.csproj"/>
<Project Path="samples/SquidStd.Samples.Storage/SquidStd.Samples.Storage.csproj"/>
<Project Path="samples/SquidStd.Samples.Search/SquidStd.Samples.Search.csproj"/>
<Project Path="samples/SquidStd.Samples.ScriptingLua/SquidStd.Samples.ScriptingLua.csproj"/>
<Project Path="samples/SquidStd.Samples.Plugins/SquidStd.Samples.Plugins.csproj"/>
<Project Path="samples/SquidStd.Samples.Networking/SquidStd.Samples.Networking.csproj"/>
<Project Path="samples/SquidStd.Samples.Persistence/SquidStd.Samples.Persistence.csproj"/>
<Project Path="samples/SquidStd.Samples.Commands/SquidStd.Samples.Commands.csproj"/>
<Project Path="samples/SquidStd.Samples.Email/SquidStd.Samples.Email.csproj"/>
<Project Path="samples/SquidStd.Samples.Database/SquidStd.Samples.Database.csproj"/>
<Project Path="samples/SquidStd.Samples.AspNetCore/SquidStd.Samples.AspNetCore.csproj"/>
<Project Path="samples/SquidStd.Samples.Messaging/SquidStd.Samples.Messaging.csproj"/>
<Project Path="samples/SquidStd.Samples.Caching/SquidStd.Samples.Caching.csproj"/>
<Project Path="samples/SquidStd.Samples.EventsJobsScheduling/SquidStd.Samples.EventsJobsScheduling.csproj"/>
<Project Path="samples/SquidStd.Samples.GettingStarted/SquidStd.Samples.GettingStarted.csproj"/>
<Project Path="samples/SquidStd.Samples.Crypto/SquidStd.Samples.Crypto.csproj"/>
<Project Path="samples/SquidStd.Samples.Vfs/SquidStd.Samples.Vfs.csproj"/>
<Project Path="samples/SquidStd.Samples.Secrets/SquidStd.Samples.Secrets.csproj"/>
<Project Path="samples/SquidStd.Samples.Actors/SquidStd.Samples.Actors.csproj"/>
<Project Path="samples/SquidStd.Samples.Tui/SquidStd.Samples.Tui.csproj"/>
</Folder>
<Folder Name="/tests/">
<Project Path="tests/SquidStd.Tests/SquidStd.Tests.csproj" />
<Project Path="tests/SquidStd.Tests/SquidStd.Tests.csproj"/>
</Folder>
</Solution>
6 changes: 6 additions & 0 deletions docs/articles/toc.yml
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,10 @@
href: vfs-abstractions.md
- name: SquidStd.Vfs
href: vfs.md
- name: SquidStd.Vfs.S3
href: vfs-s3.md
- name: SquidStd.Vfs.Database
href: vfs-database.md
- name: SquidStd.Scripting.Lua
href: scripting-lua.md
- name: SquidStd.Templating
Expand Down Expand Up @@ -114,6 +118,8 @@
href: telemetry-opentelemetry.md
- name: SquidStd.Aws.Abstractions
href: aws-abstractions.md
- name: SquidStd.Tui
href: tui.md
- name: SquidStd.Crypto
href: crypto.md
- name: SquidStd.Secrets.Aws
Expand Down
1 change: 1 addition & 0 deletions docs/articles/tui.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
[!include[](../../src/SquidStd.Tui/README.md)]
1 change: 1 addition & 0 deletions docs/articles/vfs-database.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
[!include[](../../src/SquidStd.Vfs.Database/README.md)]
1 change: 1 addition & 0 deletions docs/articles/vfs-s3.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
[!include[](../../src/SquidStd.Vfs.S3/README.md)]
31 changes: 31 additions & 0 deletions docs/tutorials/crypto.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,37 @@ survives a restart.

[!code-csharp[](../../samples/SquidStd.Samples.Crypto/Program.cs#step-4)]

## Password-based encryption

`PasswordCipher` encrypts a payload directly under a password — no key management required. Argon2id
derives the key, AES-256-GCM seals the data, and the result is a self-describing, versioned envelope
(salt, nonce, tag and KDF cost are embedded). Decryption needs only the password and the blob.

```csharp
using SquidStd.Crypto.Password;
using SquidStd.Crypto.Password.Data;

// Bytes round-trip.
byte[] blob = PasswordCipher.Encrypt(payloadBytes, "correct horse battery staple");
byte[] back = PasswordCipher.Decrypt(blob, "correct horse battery staple");

// Text round-trip — the envelope is base64-encoded, safe to store in config or JSON.
string protectedText = PasswordCipher.EncryptString("a secret", "pw");
string clear = PasswordCipher.DecryptString(protectedText, "pw");
```

The cost of the Argon2id key derivation defaults to `PbkdfCost.Moderate`. Raise it when protecting
long-lived secrets:

```csharp
// PbkdfCost.Sensitive — slower derivation, stronger resistance to offline attacks.
byte[] strong = PasswordCipher.Encrypt(payloadBytes, "pw", PbkdfCost.Sensitive);
```

A wrong password or tampered data raises `PasswordDecryptionException`. Use `PasswordCipher` for
user-supplied passwords; for app-key or KMS encryption use `CryptoUtils` / `ISecretProtector`
instead.

## Run it

```bash
Expand Down
2 changes: 2 additions & 0 deletions docs/tutorials/toc.yml
Original file line number Diff line number Diff line change
Expand Up @@ -44,5 +44,7 @@
href: vfs.md
- name: Crypto (PGP)
href: crypto.md
- name: Terminal UI (MVVM)
href: tui.md
- name: Secrets (KMS / Secrets Manager)
href: secrets.md
Loading
Loading