---
title: Create a CMS starter project
slug: cms-12/docs/creating-a-starter-project
docTags: 
createdAt: 2026-08-10T15:55:54.000Z
---

Start developing in an empty project for better control and understanding. If you are new to Optimizely, first [install and explore a sample site](docId\:VuiU-K4aAR6ISGicFg4lk) and review the [Optimizely user interface](docId\:AeMJVNNgrpmXo3PEFWSA-).

## Create the project

Follow [Set up a development environment](docId\:GSubUdxIh1sYZJ5EkOuXF) to install the Optimizely templates and command-line tool. Then, run the following commands. Check the command-line options for more configuration options.

```shell
dotnet new epi-cms-empty
```

### The project structure

The project creation process completes these actions:

- Installs main components through NuGet packages (`EPiServer.CMS`).
- Creates a database and database user.
- Updates configuration files, such as `appSettings.json`, with connection strings.
- Installs the Optimizely user interface components and places them under the URL */episerver*.

After setup, your project folder contains the following:

- **Properties** with the launch settings for the development server.
- **wwwroot** for client resources.
- **modules** for package modules.

![](https://api.archbee.com/api/optimize/BrbvVORKJ5iIeSMZye5kI/A4LxJkNKLfFHZtYczOAmy_c997fcd98fc44170b46e9531284a0f6984bf8371751bdb02723f4c07d003046e-image.png)

:::hint{type="info"}
**Note**
An empty site does not include a search feature. You add this later.
:::

## Create a page type

Create a simple *standard* page type based on MVC, with an editorial area and a heading. These page types inherit from the `IContent` interface in [Content model and views](docId\:rdbB05OPB9sEtCZjKlX89), providing built-in functionality used in many content types.

:::hint{type="info"}
**Note**
You must be an *administrator* for the site to create a page under the website *root*.
:::

1. Add a new class named `StandardPage.cs`.

```csharp
using EPiServer.Core;
using EPiServer.DataAbstraction;
using EPiServer.DataAnnotations;
using System.ComponentModel.DataAnnotations;

namespace MyProject.Models.Pages {
  [ContentType(
    DisplayName = "Standard page",
    GUID = "934E7266-FB8C-4DEA-B033-3B4E6AE6CBCF",
    Description = "The standard page.",
    AvailableInEditMode = true)]
  public class StandardPage: PageData {
    [CultureSpecific]
    [Display(
      Name = "Title",
      Description = "Title for the page",
      GroupName = SystemTabNames.Content,
      Order = 1)]
    public virtual string Title { get; set; }

    [CultureSpecific]
    [Display(
      Name = "Main body",
      Description = "Main body",
      GroupName = SystemTabNames.Content,
      Order = 2)]
    public virtual XhtmlString MainBody { get; set; }
  }
}
```

2. Compile your solution, log in, and go to edit view.
3. Under **Root**, create a page named *First page*. The *StandardPage* is automatically applied because this is currently the only available page type.
4. Add some text in the heading and main body properties, and publish the page. Because there is no rendering, the page will open in the **All Properties** editing view and will not be accessible on the front-end side.

## Configure the start page

After you have a set of accessible pages, configure the site from the Optimizely admin view.

1. Configure the site start page by going to **Settings** > **Manage Websites**.
2. Click **Create Website**, and enter the site name and URL ([https://localhost:5000](https://localhost:5000)).
3. Select a page in the page tree structure as the start page, and click **Create Website**.

![](https://api.archbee.com/api/optimize/BrbvVORKJ5iIeSMZye5kI/i2M-ljDgEkyU3pcgBjlZV_ef4ecf0f49067e2f0828b072862bb2b1338f97bbf40de0d9f5a7793f36ff35e6-image.png)

Notice the new start page in your page tree structure. You can now access your site from the front-end by browsing to the configured URL.

## Add page rendering

Add rendering to make the page accessible on the front-end side. Rendering also enables the **On-page editing view** for editing selected properties.

1. Add a new class named `StandardPageController.cs`

```csharp
using EPiServer.Core;
using MyProject.Models.Pages;
using EPiServer.Web.Mvc;
using EPiServer.Web.Routing;
using Microsoft.AspNetCore.Mvc;
using System;

namespace MyProject.Controllers {
  public class StandardPageController: PageController <StandardPage> 
  {
    [HttpGet]
    public IActionResult Index(StandardPage currentPage) {
      return View(currentPage);
    }
  }
}
```

2. Right-click the Project, select **Add** > **New Folder**, and name it *Views*.
3. Right-click the Views folder, select **Add** > **New Folder**, and name it *StandardPage*.
4. Right-click the **StandardPage** folder, select **Add** > **New item**, and then Razor View Empty.
5. Name the view `Index.cshtml` and click **Add**.
6. In the `Index.cshtml` file, change the model to `MyProject.Models.Pages.StandardPage`, add the rendering for the Title property with an \{'##'} tag before the **MainBody** property.

```javascript
@using EPiServer.Web.Mvc.Html
@model MyProject.Models.Pages.StandardPage
<div class="container-fluid">
    <div class="row myPage">
        <div class="col-xs-12 col-md-9">
            <h2>@Html.PropertyFor(x => x.Title)</h2>
            @Html.PropertyFor(x => x.MainBody)
        </div>
    </div>
</div>
```

7. Build your solution, and log in to the edit view. The page you created now has rendering and can be edited through the On-Page edit view.

![](https://api.archbee.com/api/optimize/BrbvVORKJ5iIeSMZye5kI/n2SiaPXizJqih0xE2R_hS_18c922b9b74a15022af60349f05739c0311b06725b07403b5d99030ec4ceca86-image.png)

8. Select **View on website** under **Publish** to verify that the page can be accessed from the front-end side. Notice the URL reflecting the language and page structure of the site.
9. Add a few more pages to your site for a page tree structure.

![](https://api.archbee.com/api/optimize/BrbvVORKJ5iIeSMZye5kI/2F60_zfvZKeX2P9qpOHPJ_658356cff1e7f8d9aba0476f1c49b75cb8481ccb5b233828abc5cb90f098c561-image.png)

You now have a working site with a start page configured. Use it as a starting point for continued development.
