# Build and publish a portfolio

> Edit a static portfolio, preview draft pages, upload images, and publish to the managed hostname.

Portfolio hosting publishes a static site built from HTML, CSS, JavaScript, and supported image assets. It does not run PHP, Node.js, databases, or other server-side code.

## Open the editor

Open **Dashboard → Services**, choose the portfolio service, and select **Portfolio**. The available tools include **Files**, **Images**, **Preview**, **Add-ons**, and **Contact Forms**. **Analytics** appears only when that feature is enabled.

## Edit the site files

Start with `index.html`, `styles.css`, and `script.js`. The root `index.html` is the homepage. You can create additional supported pages and choose their public paths where the editor exposes that option.

Keep asset links relative when possible. A browser cannot load a local computer path such as `C:\...` or `/Users/...` from the published site.

## Upload images

Use **Images**. AppLaunch prepares supported uploads for the portfolio image workflow. After upload, copy the resulting asset path into HTML or CSS. Give each image useful alternative text in HTML.

## Preview the draft

Open **Preview**, select the draft and page, then test:

- Navigation and every public page.
- Desktop and narrow mobile widths.
- Images, fonts, links, and downloadable files.
- Keyboard focus and form labels.
- The `404.html` page where configured.

Draft changes are not live until you publish.

## Publish

Save all changed files, run the preview again, then use the publish action. Wait for the success message and open the live managed hostname in a private window. A private window helps distinguish the deployed site from a logged-in preview or browser cache.

## What not to upload

Do not upload passwords, API secret keys, private documents, source maps containing secrets, database files, or server-side code. Public portfolio content must comply with AppLaunch rules and must not be used for phishing, malware, impersonation, spam, illegal content, gambling or casino content, or adult sexual content.

## Logs and errors

Portfolio hosting is static, so it does not have a PHP, container, shell, or application-runtime log stream. Use the editor's file validation errors, publish errors, browser developer tools, domain status and `last_error`, and contact-form submission status instead. A contact submission can be saved even when its email forwarding fails.

See [Understand AppLaunch service logs](/support/understand-logs/) for the exact portfolio status meanings and the log locations used by the other services.

For forms, see [Configure portfolio contact forms](/portfolio/contact-forms/). For a custom hostname, see [Connect a portfolio domain](/portfolio/custom-domain/).
