# Publish websites

Hugo and Astro sites consist of static files that the pipeline builds and delivers either to your Docker server or to an existing web space.

> Source: https://www.application-platform.com/en/docs/publish-websites/

Homepage components are the websites of your project. They are built with Hugo or Astro, and locally you start them with `ap run-local`. The build does not produce a running service but a folder of static files (`public/` for Hugo, `dist/` for Astro); that is why there are two ways to deliver a website.

## On the project's Docker server

If a [server]({{< relref "servers" >}}) is assigned to the project, the pipeline rolls out the built site like every other component: dev automatically after each merge to `main`, production with a manual job, as described in [Git workflow and deployment]({{< relref "git-workflow" >}}). Traefik forwards the domain to the homepage container, and the platform takes care of HTTPS.

| Environment | URL |
|-------------|-----|
| Dev | `<homepage>.dev.<project>.<organization-domain>`, assigned automatically |
| Production | your own domain from the project configuration |

For the production domain, you enter the domain in the project and set the DNS records from the domain detail, as described in [Configure DNS]({{< relref "domain-how-to" >}}).

## On an existing web space

Pure homepage projects without an app or backend do not need a Docker server; a conventional web space at your hosting provider is enough. You store the access under **Servers** → **Add server** with the **Webspace (FTP/SFTP)** tile and select it in the project under hosting as **Webspace (FTP/SFTP)**; projects with an app or a backend do not see this option.

The pipeline builds the site on every push to `main` and uploads it via FTP or SFTP into the stored remote path; the details are described in [Webspace (FTP/SFTP)]({{< relref "webspace-ftp" >}}).

You can enable Sentry for a website under **Features** as well; errors then appear in your Sentry project, as described in [Error tracking]({{< relref "error-tracking" >}}).

