# Create a new site: start a new site from scratch

> For experienced Hugo users who need a custom site structure

---

LLMS index: [llms.txt](/llms.txt)

---

Creating a site from scratch gives you Docsy's look and feel, navigation, and
other features, but you specify your own site structure. These instructions give
you a minimum file structure only, so that you build and extend your actual site
step by step.

## TL;DR: Setup for the impatient expert

Run:

<!-- prettier-ignore-start -->




<ul class="nav nav-tabs" id="tabs-0" role="tablist">
  <li class="nav-item">
      <button class="nav-link disabled"
          id="tabs-00-00-tab" data-bs-toggle="tab" data-bs-target="#tabs-00-00" role="tab"
          aria-controls="tabs-00-00" aria-selected="false">
        CLI:
      </button>
    </li><li class="nav-item">
      <button class="nav-link active"
          id="tabs-00-01-tab" data-bs-toggle="tab" data-bs-target="#tabs-00-01" role="tab"
          data-td-tp-persist="bash" aria-controls="tabs-00-01" aria-selected="true">
        Unix shell
      </button>
    </li><li class="nav-item">
      <button class="nav-link"
          id="tabs-00-02-tab" data-bs-toggle="tab" data-bs-target="#tabs-00-02" role="tab"
          data-td-tp-persist="batchfile" aria-controls="tabs-00-02" aria-selected="false">
        Windows command line
      </button>
    </li>
</ul>

<div class="tab-content" id="tabs-0-content">
    <div class="tab-pane fade"
        id="tabs-00-00" role="tabpanel" aria-labelled-by="tabs-00-00-tab" tabindex="0">
        <pre tabindex="0"><code></code></pre>
    </div>
    <div class="tab-pane fade show active"
        id="tabs-00-01" role="tabpanel" aria-labelled-by="tabs-00-01-tab" tabindex="0">
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Bash" data-lang="Bash"><span class="line"><span class="cl">hugo new site my-new-site
</span></span><span class="line"><span class="cl"><span class="nb">cd</span>  my-new-site
</span></span><span class="line"><span class="cl">hugo mod init github.com/me/my-new-site
</span></span><span class="line"><span class="cl">hugo mod get github.com/google/docsy/theme@v0.16.0
</span></span><span class="line"><span class="cl">cat &gt;&gt; hugo.toml <span class="s">&lt;&lt;EOL
</span></span></span><span class="line"><span class="cl"><span class="s">[module]
</span></span></span><span class="line"><span class="cl"><span class="s">proxy = &#34;direct&#34;
</span></span></span><span class="line"><span class="cl"><span class="s">[[module.imports]]
</span></span></span><span class="line"><span class="cl"><span class="s">path = &#34;github.com/google/docsy/theme&#34;
</span></span></span><span class="line"><span class="cl"><span class="s">EOL</span>
</span></span><span class="line"><span class="cl">npm install --save-exact --save-dev sass-embedded@1.102.0
</span></span><span class="line"><span class="cl">npm pkg <span class="nb">set</span> scripts.hugo<span class="o">=</span>hugo
</span></span><span class="line"><span class="cl">hugo mod npm pack
</span></span><span class="line"><span class="cl">npm install
</span></span><span class="line"><span class="cl">npm run hugo -- server</span></span></code></pre></div>
    </div>
    <div class="tab-pane fade"
        id="tabs-00-02" role="tabpanel" aria-labelled-by="tabs-00-02-tab" tabindex="0">
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Batchfile" data-lang="Batchfile"><span class="line"><span class="cl">hugo new site my-new-site
</span></span><span class="line"><span class="cl"><span class="k">cd</span>  my-new-site
</span></span><span class="line"><span class="cl">hugo mod init github.com/me/my-new-site
</span></span><span class="line"><span class="cl">hugo mod get github.com/google/docsy/theme@v0.16.0
</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="k">echo</span> [module]<span class="se">^
</span></span></span><span class="line"><span class="cl"><span class="se">
</span></span></span><span class="line"><span class="cl">proxy = <span class="s2">&#34;direct&#34;</span><span class="se">^
</span></span></span><span class="line"><span class="cl"><span class="se">
</span></span></span><span class="line"><span class="cl">[[module.imports]]<span class="se">^
</span></span></span><span class="line"><span class="cl"><span class="se">
</span></span></span><span class="line"><span class="cl">path = <span class="s2">&#34;github.com/google/docsy/theme&#34;</span><span class="p">)</span> <span class="p">&gt;&gt;</span> hugo.toml
</span></span><span class="line"><span class="cl">npm install --save-exact --save-dev sass-embedded@1.102.0
</span></span><span class="line"><span class="cl">npm pkg set scripts.hugo=hugo
</span></span><span class="line"><span class="cl">hugo mod npm pack
</span></span><span class="line"><span class="cl">npm install
</span></span><span class="line"><span class="cl">npm run hugo -- server</span></span></code></pre></div>
    </div>
</div>

<!-- prettier-ignore-end -->

Preview at <http://localhost:1313/>.

## Detailed Setup instructions

### Create your new skeleton project

To create a new Hugo site project and then add the Docsy theme as a Hugo module,
run the following commands from your project's root directory.

```bash
hugo new site my-new-site
cd  my-new-site
```

This will create a minimal site structure, containing the folders `archetypes`,
`content`, `data`, `layouts`, `static`, and `themes` and a configuration file
(default: `hugo.toml`).

### Import the Docsy theme module as a dependency of your site

Only sites that are Hugo Modules themselves can import other modules. To turn
your site into a Hugo Module, run the following commands in your newly created
site directory:

```bash
hugo mod init github.com/me/my-new-site
```

This creates a `go.mod` file for your site's module definitions.

Next declare the Docsy theme module as a dependency for your site.

```bash
hugo mod get github.com/google/docsy/theme@v0.16.0
```

This command adds the `docsy` theme module to your definition file `go.mod` and
records the module checksums in `go.sum`.

### Add theme module configuration settings

Add the settings in the following snippet at the end of your site's
[configuration file] (default: `hugo.toml`) and save the file.

<!-- prettier-ignore-start -->





<ul class="nav nav-tabs" id="tabs-2" role="tablist">
  <li class="nav-item">
      <button class="nav-link disabled"
          id="tabs-02-00-tab" data-bs-toggle="tab" data-bs-target="#tabs-02-00" role="tab"
          aria-controls="tabs-02-00" aria-selected="false">
        Configuration file:
      </button>
    </li><li class="nav-item">
      <button class="nav-link active"
          id="tabs-02-01-tab" data-bs-toggle="tab" data-bs-target="#tabs-02-01" role="tab"
          data-td-tp-persist="toml" aria-controls="tabs-02-01" aria-selected="true">
        hugo.toml
      </button>
    </li><li class="nav-item">
      <button class="nav-link"
          id="tabs-02-02-tab" data-bs-toggle="tab" data-bs-target="#tabs-02-02" role="tab"
          data-td-tp-persist="yaml" aria-controls="tabs-02-02" aria-selected="false">
        hugo.yaml
      </button>
    </li><li class="nav-item">
      <button class="nav-link"
          id="tabs-02-03-tab" data-bs-toggle="tab" data-bs-target="#tabs-02-03" role="tab"
          data-td-tp-persist="json" aria-controls="tabs-02-03" aria-selected="false">
        hugo.json
      </button>
    </li>
</ul>

<div class="tab-content" id="tabs-2-content">
    <div class="tab-pane fade"
        id="tabs-02-00" role="tabpanel" aria-labelled-by="tabs-02-00-tab" tabindex="2">
        <pre tabindex="0"><code></code></pre>
    </div>
    <div class="tab-pane fade show active"
        id="tabs-02-01" role="tabpanel" aria-labelled-by="tabs-02-01-tab" tabindex="2">
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="p">[</span><span class="nx">module</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">  <span class="nx">proxy</span> <span class="p">=</span> <span class="s2">&#34;direct&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="c"># uncomment line below for temporary local development of module</span>
</span></span><span class="line"><span class="cl">  <span class="c"># replacements = &#34;github.com/google/docsy/theme -&gt; ../../docsy/theme&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="p">[</span><span class="nx">module</span><span class="p">.</span><span class="nx">hugoVersion</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="nx">extended</span> <span class="p">=</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl">    <span class="nx">min</span> <span class="p">=</span> <span class="s2">&#34;0.160.1&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="p">[[</span><span class="nx">module</span><span class="p">.</span><span class="nx">imports</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl">    <span class="nx">path</span> <span class="p">=</span> <span class="s2">&#34;github.com/google/docsy/theme&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="nx">disable</span> <span class="p">=</span> <span class="kc">false</span></span></span></code></pre></div>
    </div>
    <div class="tab-pane fade"
        id="tabs-02-02" role="tabpanel" aria-labelled-by="tabs-02-02-tab" tabindex="2">
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">module</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">proxy</span><span class="p">:</span><span class="w"> </span><span class="l">direct</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">hugoVersion</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">extended</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">min</span><span class="p">:</span><span class="w"> </span><span class="m">0.160.1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">imports</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">github.com/google/docsy/theme</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">disable</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div>
    </div>
    <div class="tab-pane fade"
        id="tabs-02-03" role="tabpanel" aria-labelled-by="tabs-02-03-tab" tabindex="2">
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;module&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;proxy&#34;</span><span class="p">:</span> <span class="s2">&#34;direct&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;hugoVersion&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;extended&#34;</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;min&#34;</span><span class="p">:</span> <span class="s2">&#34;0.160.1&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;imports&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">      <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;path&#34;</span><span class="p">:</span> <span class="s2">&#34;github.com/google/docsy/theme&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;disable&#34;</span><span class="p">:</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">]</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div>
    </div>
</div>

<!-- prettier-ignore-end -->

You can find details of what these configuration settings do in the
[Hugo modules documentation](https://gohugo.io/configuration/module/#top-level-settings).
Depending on your environment you may need to tweak them slightly, for example
by adding a proxy to use when downloading remote modules.

### Install npm dependencies {#install-theme-npm-dependencies}

Install the [Dart Sass][] compiler at the version Docsy is tested with, and
define an npm script for running Hugo (see [Install Dart Sass][]). Docsy sources
its Bootstrap and Font Awesome assets from npm: generate the theme's
npm-dependency workspace (see Hugo's [Node dependencies][hugo-node-deps]) and
install it:

```bash
npm install --save-exact --save-dev sass-embedded@1.102.0
npm pkg set scripts.hugo=hugo
hugo mod npm pack
npm install
```

Re-run `hugo mod npm pack` whenever you
[update Docsy](/docs/update/hugo-module/) or otherwise edit `package.json`; Hugo
warns when the dependency set drifts. For background, see [Bootstrap and Font
Awesome via npm][blog-npm-deps] in the 0.16.0 release notes.

### Preview your site

To build and preview your site locally, run Hugo through the `hugo` npm script
you defined, which puts the `sass` CLI on Hugo's `PATH`:

```bash
npm run hugo -- server
```

By default, your site will be available at
[http://localhost:1313](http://localhost:1313/). For common issues, such as the
build failing with a missing Bootstrap import, see [Troubleshooting][]. If the
build fails with missing-parameter errors, add the required defaults per
[Basic site configuration](/docs/get-started/basic-configuration/).

## What's next?

- Add some [basic configuration](/docs/get-started/basic-configuration/)
- [Add content and customize your site](/docs/content/)
- Get some ideas from our
  [Example Site](https://github.com/google/docsy-example) and other
  [Examples and templates](/examples/).
- [Publish your site](/docs/deployment/).

<!-- prettier-ignore-start -->
[blog-npm-deps]: /blog/2026/0.16.0/#npm-deps
[configuration file]: https://gohugo.io/configuration/introduction/#configuration-file
[Dart Sass]: https://sass-lang.com/dart-sass/
[hugo-node-deps]: https://gohugo.io/hugo-modules/nodejs-dependencies/
[Install Dart Sass]: /docs/get-started/docsy-as-module/installation-prerequisites/#install-dart-sass
[Troubleshooting]: /docs/get-started/troubleshooting/
<!-- prettier-ignore-end -->
