BitTacklr/Projac
55.4
Adequate · 21 September 2026
9.7k
lines of production code
C#
primary language
4
measurements over time
What this system is
This system is a .NET library for building event-driven applications using a projection pattern, allowing developers to define handlers that process messages and execute corresponding SQL commands. It provides a fluent API for constructing and executing SQL statements across multiple database providers, including SQL Server, SQLite, and others. The codebase includes comprehensive test coverage and example recipes demonstrating integration with various backends like Redis, Elasticsearch, and EventStore.
How it got here
2013–2014 — Modernization and automation
4 changes.
The codebase underwent a significant modernization, migrating to .NET Standard 2.0 and adopting an SDK-style project structure for cross-platform compatibility. This period also established a fully automated build and release pipeline, while simultaneously removing legacy SQL handling components and reorganizing the solution into modular, database-specific projects.
2015–2017 — SQL and projection infrastructure expansion
11 changes.
This period focused on expanding the library's capabilities by introducing a comprehensive SQL projection and command execution infrastructure, including specific implementations for SQL Server and SQLite. The work also established a robust projection handler system and provided extensive recipe examples and unit tests to validate these new features.
Features
Add recipe examples for Enveloping and SqlStreamStore integration
Added two new recipe files demonstrating how to use the Projac library with different backends. The first, \src/Recipes/Enveloping/Usage.cs\, shows how to use the \ConnectedProjector\ with a \MemoryCache\ to handle typed envelopes for portfolio events. The second, \src/Recipes/SqlStreamStoreIntegration/Usage.cs\, demonstrates integrating with \SqlStreamStore\ using both a synchronous stream projection and an asynchronous catch-up subscription, including schema management and event handling for portfolio entities.
src/Recipes · high confidence
Added SQL projection and command execution infrastructure
Introduced new classes in the \Projac.Sql\ namespace to support SQL-based projections and command execution. This includes \AnonymousSqlProjection\ and its builder for defining handlers, \AsyncSqlProjector\ for asynchronous message projection, \ConcurrentResolve\ for handler resolution, and a suite of executors (\SqlCommandExecutor\, \ConnectedSqlCommandExecutor\, \TransactionalSqlCommandExecutor\, etc.) that handle synchronous and asynchronous execution of SQL non-query and query commands against a database.
src/Projac.Sql · high confidence
Added cross-platform .NET CLI install scripts
Added PowerShell (dotnet-install.ps1) and Bash (dotnet-install.sh) scripts to the build directory, enabling the .NET CLI to be installed and configured on Linux, macOS, and Windows. These scripts handle downloading, version selection, and environment setup for the .NET runtime and SDK.
build · high confidence
Added recipe implementations for multiple data stores
Added new example implementations for projecting events into various backends, including SQL Server, SQLite, Redis, RavenDB, MemoryCache, Elasticsearch, EventStore, and SqlStreamStore. These recipes demonstrate how to handle schema creation, data deletion, checkpointing, and specific event handling (PortfolioAdded, PortfolioRenamed, PortfolioRemoved) for each integration.
src/Projac.Recipes · high confidence
Introduce SQLite implementation for SQL syntax generation
Added a new \Projac.SQLite\ library that provides a SQLite-specific implementation of the SQL syntax generation API. This includes \SQLiteSyntax\ for composing and generating SQL commands (both query and non-query statements), and \SQLiteDbParameterValue\ to handle parameter binding and type mapping for SQLite. This enables developers to generate SQLite-compatible SQL statements using the existing fluent syntax.
src/Projac.SQLite · high confidence
Introduces automated build, test, and NuGet/MyGet publishing pipeline
The repository now includes a complete automated build and release workflow. New shell and PowerShell scripts (build.sh, build.ps1) orchestrate the .NET Core 2.0 SDK, run unit tests across all project targets, and automatically push generated NuGet packages to NuGet and MyGet feeds. This change also adds GitVersion configuration for semantic versioning, a global.json to pin the SDK version, and updates the README to reflect the new multi-store projection capabilities and contribution guidelines.
(repo-wide) · high confidence
Introduces new projection and handler infrastructure
Adds core classes for defining and executing projections, including \Projection\<TConnection\>\ and \AnonymousProjection\<TConnection\>\ to hold message handlers, and a \Projector\<TConnection\>\ to dispatch messages to matching handlers. The update also introduces a handler resolution system with \ProjectionHandlerResolver\<TConnection\>\ delegates and static \Resolve\ and \ConcurrentResolve\ classes that support exact-type and assignable-type matching strategies. A fluent \AnonymousProjectionBuilder\<TConnection\>\ is provided for constructing projections, while \TaskExtensions\ enables asynchronous execution of handler tasks. Additionally, new testing utilities (\ProjectionScenario\, \ProjectionTestSpecification\, \VerificationResult\) are added to facilitate testing of projection logic.
src/Projac · high confidence
Removals
Removed SQL statement handling components
The SQL statement handling components have been removed from the codebase. This includes the \SqlStatement\ class, the \Sql\ factory, the \ISqlStatementFlusher\ interface, the \TSqlStatementFlusher\ implementation, and the \SqlStatementCollector\. Additionally, the associated test files and test builders have been deleted, along with the \.nuget\ configuration and MSBuild targets files that supported the previous build process.
Projac · high confidence
Behavioural changes
Deprecate legacy TSql API and introduce new SqlClientSyntax
The \Projac.SqlClient\ library now provides a new \SqlClientSyntax\ class containing methods for constructing T-SQL commands (queries, non-queries, and compositions) with support for conditional execution (\If\/\Unless\ patterns). The previous \TSql\ class in the \Projac.SqlClient.Legacy\ namespace is marked as obsolete and will be removed in a future release. Users should migrate to the new syntax to ensure compatibility with upcoming versions.
src/Projac.SqlClient · high confidence
Reorganized solution structure with dedicated projects for SQL, SQLite, and test suites
The solution file has been restructured to include separate projects for the core library, SQL client, SQLite client, and their respective test suites. This change reflects a move towards a more modular architecture where database-specific implementations are isolated into their own projects, making it easier to build and test each component independently.
src · high confidence
Test coverage
Added tests for projection handlers, resolvers, and projectors; Added unit tests for SQL projection and executor components; Added unit tests for SQLite syntax and parameter handling; Added unit tests for legacy SQL command composition and data type handling.
Dependencies
Migrated to .NET Standard 2.0 and modernized project structure
The project has been upgraded to target .NET Standard 2.0, alongside .NET Framework 4.6 and 4.5.2, enabling cross-platform support and compatibility with modern .NET Core runtimes. This change includes a comprehensive migration of all project files (\.csproj\) to the SDK-style format, replacing the legacy MSBuild configuration. Additionally, the test framework was upgraded from xUnit 1.9.1 to NUnit 3.9.0, and various third-party dependencies (such as \System.Data.SqlClient\ and \NUnit3TestAdapter\) were updated to their latest compatible versions.
(dependencies) · high confidence
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
Score
- CAI 54 → 55 (+1.5)
- Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.
Lenses
- Code Health 94 → 94 (-0.2)
- Architecture 99 → 99 (+0.0)
- Maturity 48 → 48 (+0.0)
- Readiness 47 → 47 (-0.0)
- Security 67 → 86 (+19.6)
- Performance 60 → 60 (+0.0)
Resolved (34)
- Bounded contexts not declared
- Duplicate static methods with identical signatures in different classes.
- Duplicate static methods with identical signatures in different classes.
- Duplicated block (10 lines × 2) (src/Projac.SqlClient/Legacy/TSql.cs)
- Duplicated block (12 lines × 2) (src/Projac.Sql/Executors/ConnectedTransactionalSqlCommandExecutor.cs)
- Duplicated block (13 lines × 2) (src/Projac.Sql/Executors/ConnectedSqlCommandExecutor.cs)
- Duplicated block (13 lines × 2) (src/Projac.Sql/Executors/ConnectedSqlCommandExecutor.cs)
- Duplicated block (5 lines × 3) (src/Projac.SqlClient/Legacy/TSql.NonQueryStatement.cs)
- Duplicated block (9 lines × 2) (src/Projac.SqlClient/Legacy/TSql.QueryProcedure.cs)
- Duplicated block (9 lines × 2) (src/Projac.SqlClient/Legacy/TSql.QueryStatement.cs)
- Duplicated block (9 lines × 4) (src/Projac.SqlClient/Legacy/TSql.NonQueryProcedure.cs)
- High CVE: System.Net.Http 4.1.1
- High CVE: System.Net.Http 4.1.1
- High CVE: System.Net.Http 4.1.1
- High CVE: System.Net.Security 4.3.0
- High CVE: System.Net.Security 4.3.0
- High CVE: System.Net.WebSockets.Client 4.0.0
- High CVE: System.Net.WebSockets.Client 4.0.0
- Medium CVE: System.Data.SqlClient 4.4.0
- Medium CVE: System.Net.Http 4.1.1
- …and 14 more
New (43)
- Documentation: no contributor guidance (README.md)
- Documentation: no installation or build instructions (README.md)
- Documentation: no usage examples (README.md)
- Duplicate static classes with identical method signatures for the same intent in the SQL namespace. Projac.Sql.Resolve and Projac.Sql.ConcurrentResolve expose the exact same methods with identical signatures.
- Duplicate static classes with identical method signatures for the same intent. Projac.Resolve and Projac.ConcurrentResolve expose the exact same methods (WhenEqualToHandlerMessageType and WhenAssignableToHandlerMessageType) with identical signatures, differing only in the class name which implies a concurrency strategy difference that is not reflected in the method signatures or return types (both return ProjectionHandlerResolver<TConnection>).
- Duplicated block (10 lines × 2) (src/Projac.Sql/ConcurrentResolve.cs)
- Duplicated block (10 lines × 2) (src/Projac.Sql/Resolve.cs)
- Duplicated block (10 lines × 2) (src/Projac.SqlClient/Legacy/TSql.QueryStatement.cs)
- Duplicated block (10 lines × 4) (src/Projac.SqlClient/Legacy/TSql.NonQueryProcedure.cs)
- Duplicated block (11 lines × 3) (src/Projac.Sql/Executors/SqlCommandExecutor.cs)
- Duplicated block (12 lines × 2) (src/Projac.SqlClient/Legacy/TSql.QueryProcedure.cs)
- Duplicated block (12 lines × 3) (src/Projac.Sql/Executors/SqlCommandExecutor.cs)
- Duplicated block (13 lines × 2) (src/Projac.Sql/Executors/ConnectedTransactionalSqlCommandExecutor.cs)
- Duplicated block (13 lines × 2) (src/Projac.SqlClient/Legacy/TSql.cs)
- Duplicated block (13 lines × 3) (src/Projac.Sql/Executors/ConnectedSqlCommandExecutor.cs)
- Duplicated block (14 lines × 2) (src/Projac.Sql/Executors/ConnectedSqlCommandExecutor.cs)
- Duplicated block (14 lines × 2) (src/Projac.Sql/Executors/TransactionalSqlCommandExecutor.cs)
- Duplicated block (14–15 lines × 2) (src/Projac.Sql/Executors/SqlCommandExecutor.cs)
- Duplicated block (16 lines × 2) (src/Projac.Sql/Executors/ConnectedSqlCommandExecutor.cs)
- Duplicated block (17 lines × 2) (src/Projac.Sql/Executors/ConnectedTransactionalSqlCommandExecutor.cs)
- …and 23 more
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
BitTacklr/Projac was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 21 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit c5b269faee3103902e116ed4c3f2d3d1e901b06d — the exact code this score is about.
- Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-28e75b8e3254.