---
title: Backend hosting overview
description: Choose ASP.NET Core or the lightweight Arc.Core host, then configure persistence and proxy generation separately.
---


You want one command/query model without accidentally choosing an event store or the wrong web host. Arc separates those decisions: **Arc.Core provides the application model**, and **Cratis.Arc adds ASP.NET Core integration**. Neither requires Chronicle.

## Choose the host first

| Host | Package and bootstrap | Use it when… |
| --- | --- | --- |
| ASP.NET Core | `Cratis.Arc`, `WebApplication.CreateBuilder(args)`, `builder.AddCratisArc()`, `app.UseCratisArc()` | You want ASP.NET Core routing, middleware, controllers alongside model-bound endpoints, and its authentication ecosystem |
| Lightweight host | `Cratis.Arc.Core`, `ArcApplication.CreateBuilder(args)` | You intentionally want Arc's generic-host / HttpListener-based endpoint surface without ASP.NET Core |

The [standalone getting-started path](/arc/backend/csharp/getting-started/) uses ASP.NET Core throughout. The [Arc.Core getting-started guide](/arc/backend/csharp/core/getting-started/) explains the alternative. Do not copy one host's extension-method sequence into the other.

```mermaid
flowchart TB
    ASP[Cratis.Arc ASP.NET Core integration] -->|depends on| Core[Arc.Core application model]
    Light[ArcApplication lightweight host] -->|uses| Core
    App[Application] -->|chooses| ASP
    App -->|or chooses| Light
```

Arc.Core is useful when you do not need ASP.NET Core, but that is not a guarantee of compatibility with every device, desktop, browser, AOT, or restricted runtime. Validate the selected host and dependencies on your deployment target.

## Then choose persistence and client output

Commands may call application services, write MongoDB collections, or use EF Core contexts. Add [Chronicle](/arc/backend/csharp/chronicle/) explicitly when the slice needs event persistence, projections, or reactors. Returning an event-shaped object from standalone Core is ordinary response handling, not an automatic append.

:::tip[Separate decisions from inline persistence]
Direct service and database calls remain supported. When a model-bound command can describe its writes from the available inputs, prefer a pure `Handle()` returning [command operations](/arc/backend/csharp/commands/operations/). Chronicle commands should still return events for durable facts; operations do not replace queries or `Provide()` reads.
:::

[Proxy generation](/arc/backend/csharp/proxy-generation/getting-started/) is a separate post-build tool. Install its build package and configure an output path; it inspects compiled assemblies and PDB source information rather than querying your running endpoints. Generate in Debug before type-checking the frontend.

## Continue

- [Set up standalone Arc](/arc/backend/csharp/getting-started/) — packages, imports, database configuration, and the first runnable checkpoint.
- [ASP.NET Core integration](/arc/backend/csharp/asp-net-core/) — middleware, authentication, and host-specific behavior.
- [Arc.Core overview](/arc/backend/csharp/core/overview/) — the lightweight surface and its limits.
- [Backend guide](/arc/backend/csharp/) — commands, queries, providers, identity, and tenancy.
