Mid to Senior .NET Engineer
The Role
You will work on the Gruntify API, the .NET service behind the web app, both mobile apps, our public API and our reporting layer. It is multi-tenant. Every workspace is a tenant and almost all data is scoped to one, which shapes nearly every query you write.
The codebase runs on .NET 10 in a layered setup. Api depends on Application, Application on Domain, and Infrastructure implements the interfaces the inner layers declare. Convention tests read the project files and fail the build when a dependency points the wrong way, so the structure holds on its own rather than by agreement.
A migration is underway. Cosmos DB is moving to PostgreSQL, and a replicator copies data across while both stores run at once. Some entities are authoritative in one store and some in the other, so knowing which comes before writing the query. Full text search has already moved. New work goes to Postgres.
Responsibilities
- Build and ship features across the API modules: requests, jobs, assets, forms, teams, roles, exports and the rest.
- Write the tests with the code. Unit tests cover anything that does not need a web application, integration tests cover anything that does, and both run on every pull request.
- Take schema changes through the migration tooling rather than hand-writing SQL, so the EF model and the SQL that ships stay in step.
- Move code out of the deprecated module projects into the layer it belongs in, in proportion to the change you are making. A small fix does not have to become a migration.
- Help finish the move from Cosmos to Postgres.
- Review pull requests properly, and expect the same back.
Requirements
- Three or more years of commercial C# and .NET, with recent work on a service other teams depend on.
- Entity Framework Core, and relational schema design you have had to live with afterwards.
- REST API design with versioned contracts. We run several DTO versions side by side, because mobile clients in the field do not all update at once.
- You write tests as part of the work rather than after it.
- Azure DevOps pipelines and Git.
- Comfortable in a codebase mid-migration, where two data stores are live and some of the old layout is still standing.
Useful, not essential: PostgreSQL and PostGIS, Azure (Storage, Cosmos, Container Apps), Auth0 or another OAuth provider, message-based integration, Stripe.
What you will work with
MSTest and FluentAssertions, with a PostGIS container started per test assembly so tests run against a real database instead of a mock. Azure Pipelines for build and release, Bicep for infrastructure, Docker for the containerised jobs. Redis for caching, Auth0 for identity, SendGrid for email, Firebase for push.
The API also backs an OData reporting layer and an AI assistant with tool calling, so there is more surface here than a CRUD service.