<!--
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.
-->

# Apache Beam website

These are the main sources of the website for Apache Beam, hosted at
https://beam.apache.org/.

## About

The Apache Beam website is built using [Hugo](https://gohugo.io/), a fast and flexible static site generator, and uses the [Docsy](https://www.docsy.dev/) theme, which is designed specifically for technical documentation and open-source projects.

For additional layout, styling, and responsive design capabilities, the site integrates [Twitter Bootstrap](https://getbootstrap.com/). This allows the documentation to maintain a consistent appearance across different devices and screen sizes.

The website content is primarily written in Markdown and organized according to Hugo’s content structure, making it easy for contributors to add or update documentation.

Documentation generated directly from source code—such as **Javadoc** for Java APIs and **Pydoc** for Python APIs—is stored and maintained separately in the
[beam-site repository](https://github.com/apache/beam-site/tree/release-docs).
This separation ensures that API reference documentation remains versioned and consistent with official releases.


## Getting started

Website development requires Docker installed if you wish to preview changes and
run website tests.

The Docsy theme required for the site to work properly is included as a git submodule. This means that after you already cloned the repository, you need to update submodules at `<ROOT_DIRECTORY>`.

`$ git submodule update --init --recursive`

The following command is used to build and serve the website locally. Note: you should run the command at `<ROOT_DIRECTORY>`.

`$ ./gradlew :website:serveWebsite`

Any changes made locally will trigger a rebuild of the website.

Websites tests may be run using this command:

`$ ./gradlew :website:testWebsite`

For a more detailed description, please refer to the [contribution guide](CONTRIBUTE.md).

## Deployment

After a PR is merged, a background Jenkins job will automatically generate and
push [website
content](https://github.com/apache/beam/tree/asf-site/website/generated-content)
to the asf-site branch. This content is later picked up and pushed to
https://beam.apache.org/.

## Contribution guide

If you'd like to contribute to the Apache Beam website, read our [contribution guide](CONTRIBUTE.md) where you can find detailed instructions on how to work with the website.

## Additional resources

If you're developing the site, you should know a little bit about Hugo and Docsy. The following external resources will help you get up and running:

- [Directory Structure](https://gohugo.io/getting-started/directory-structure/)
- [Adding Content](https://www.docsy.dev/docs/adding-content/content/)
- [Shortcodes](https://gohugo.io/content-management/shortcodes/)
- [Introduction to Hugo Templating](https://gohugo.io/templates/introduction/)
- [Partial Templates](https://gohugo.io/templates/partials/)

## Troubleshooting

### Docker Error 255 on Apple Silicon

To fix the Docker Error 255 during the Website launch on Apple Silicon:
- Open website/Dockerfile
- Replace "FROM debian:stretch-slim" with "FROM --platform=linux/amd64 debian:stretch-slim"

### Hugo server does not reload static files

The Hugo dev server waits for changes in site content, static files, configuration, and other resources. On change, the server rebuilds and reloads the site in your browser. If you're making changes to static files, and those changes are detected by the server but don't appear in the browser, you may have a caching issue.

You can tell that the server has detected a change by looking at the output. For example, if you make a change to **website/www/site/static/js/section-nav.js**, you should see something like:

```
Change of Static files detected, rebuilding site.
2021-07-16 15:25:29.730 +0000
Syncing js/section-nav.js to /
```

If the change does not appear in the browser, even after a hard refresh, try disabling the cache. For example, to disable the cache in Chrome, open dev tools, select the Network tab, and check the box labeled "Disable cache".
